xref: /netbsd-src/external/apache2/llvm/dist/llvm/CMakeLists.txt (revision 82d56013d7b633d116a93943de88e08335357a7c)
1# See docs/CMake.html for instructions about how to build LLVM with CMake.
2
3cmake_minimum_required(VERSION 3.13.4)
4
5# CMP0116: Ninja generators transform `DEPFILE`s from `add_custom_command()`
6# New in CMake 3.20. https://cmake.org/cmake/help/latest/policy/CMP0116.html
7if(POLICY CMP0116)
8  cmake_policy(SET CMP0116 OLD)
9endif()
10
11set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
12
13if(NOT DEFINED LLVM_VERSION_MAJOR)
14  set(LLVM_VERSION_MAJOR 13)
15endif()
16if(NOT DEFINED LLVM_VERSION_MINOR)
17  set(LLVM_VERSION_MINOR 0)
18endif()
19if(NOT DEFINED LLVM_VERSION_PATCH)
20  set(LLVM_VERSION_PATCH 0)
21endif()
22if(NOT DEFINED LLVM_VERSION_SUFFIX)
23  set(LLVM_VERSION_SUFFIX git)
24endif()
25
26if (NOT PACKAGE_VERSION)
27  set(PACKAGE_VERSION
28    "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}")
29endif()
30
31if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQUAL ""))
32  message(WARNING "Visual Studio generators use the x86 host compiler by "
33                  "default, even for 64-bit targets. This can result in linker "
34                  "instability and out of memory errors. To use the 64-bit "
35                  "host compiler, pass -Thost=x64 on the CMake command line.")
36endif()
37
38if (CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_OSX_ARCHITECTURES)
39  # Some CMake features like object libraries get confused if you don't
40  # explicitly specify an architecture setting with the Xcode generator.
41  set(CMAKE_OSX_ARCHITECTURES "x86_64")
42endif()
43
44project(LLVM
45  VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
46  LANGUAGES C CXX ASM)
47
48set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to")
49set(CMAKE_CXX_STANDARD_REQUIRED YES)
50if (CYGWIN)
51  # Cygwin is a bit stricter and lack things like 'strdup', 'stricmp', etc in
52  # c++xx mode.
53  set(CMAKE_CXX_EXTENSIONS YES)
54else()
55  set(CMAKE_CXX_EXTENSIONS NO)
56endif()
57
58if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
59  message(STATUS "No build type selected, default to Debug")
60  set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE)
61endif()
62
63# Side-by-side subprojects layout: automatically set the
64# LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
65# This allows an easy way of setting up a build directory for llvm and another
66# one for llvm+clang+... using the same sources.
67set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl")
68# The flang project is not yet part of "all" projects (see C++ requirements)
69set(LLVM_EXTRA_PROJECTS "flang")
70# List of all known projects in the mono repo
71set(LLVM_KNOWN_PROJECTS "${LLVM_ALL_PROJECTS};${LLVM_EXTRA_PROJECTS}")
72set(LLVM_ENABLE_PROJECTS "" CACHE STRING
73	"Semicolon-separated list of projects to build (${LLVM_KNOWN_PROJECTS}), or \"all\".")
74if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
75  set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
76endif()
77
78if ("flang" IN_LIST LLVM_ENABLE_PROJECTS)
79  if (NOT "mlir" IN_LIST LLVM_ENABLE_PROJECTS)
80    message(STATUS "Enabling MLIR as a dependency to flang")
81    list(APPEND LLVM_ENABLE_PROJECTS "mlir")
82  endif()
83
84  option(FLANG_BUILD_NEW_DRIVER "Build the flang compiler driver" ON)
85  if (FLANG_BUILD_NEW_DRIVER AND NOT "clang" IN_LIST LLVM_ENABLE_PROJECTS)
86    message(FATAL_ERROR "Clang is not enabled, but it's required by the new Flang driver")
87  endif()
88endif()
89
90# LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
91# `LLVM_ENABLE_PROJECTS` CMake cache variable.  This exists for
92# several reasons:
93#
94# * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
95# source of truth for which projects to build. This means we will ignore user
96# supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
97# them.
98#
99# * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
100# non-empty list but now the user wishes to disable building all other projects
101# by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
102# need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
103# building all the projects that were previously enabled.
104set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
105mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
106
107if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
108  set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
109  foreach(proj ${LLVM_KNOWN_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
110    string(TOUPPER "${proj}" upper_proj)
111    string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
112    if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
113      message(STATUS "${proj} project is enabled")
114      set(SHOULD_ENABLE_PROJECT TRUE)
115      set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
116      if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
117        message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
118      endif()
119      if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" )
120        set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE)
121      else()
122        set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "")
123      endif()
124    elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
125      message(STATUS "${proj} project is enabled")
126      set(SHOULD_ENABLE_PROJECT TRUE)
127    else()
128      message(STATUS "${proj} project is disabled")
129      set(SHOULD_ENABLE_PROJECT FALSE)
130    endif()
131    # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
132    # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
133    # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
134    # we should deprecate allowing users to set these variables by turning them
135    # into normal CMake variables rather than cache variables.
136    set(LLVM_TOOL_${upper_proj}_BUILD
137      ${SHOULD_ENABLE_PROJECT}
138      CACHE
139      BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
140    )
141  endforeach()
142endif()
143unset(SHOULD_ENABLE_PROJECT)
144
145# Build llvm with ccache if the package is present
146set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
147if(LLVM_CCACHE_BUILD)
148  find_program(CCACHE_PROGRAM ccache)
149  if(CCACHE_PROGRAM)
150      set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache")
151      set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data")
152      set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes"
153          CACHE STRING "Parameters to pass through to ccache")
154
155      set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}")
156      if (LLVM_CCACHE_MAXSIZE)
157        set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}")
158      endif()
159      if (LLVM_CCACHE_DIR)
160        set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}")
161      endif()
162      set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
163  else()
164    message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF")
165  endif()
166endif()
167
168option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF)
169
170# Some features of the LLVM build may be disallowed when dependency debugging is
171# enabled. In particular you cannot use ccache because we want to force compile
172# operations to always happen.
173if(LLVM_DEPENDENCY_DEBUGGING)
174  if(NOT CMAKE_HOST_APPLE)
175    message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.")
176  endif()
177  if(LLVM_CCACHE_BUILD)
178    message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.")
179  endif()
180endif()
181
182option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF)
183option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF)
184if(LLVM_ENABLE_GISEL_COV)
185  set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage")
186endif()
187
188# Add path for custom modules
189set(CMAKE_MODULE_PATH
190  ${CMAKE_MODULE_PATH}
191  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
192  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
193  )
194
195# Generate a CompilationDatabase (compile_commands.json file) for our build,
196# for use by clang_complete, YouCompleteMe, etc.
197set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
198
199option(LLVM_INSTALL_BINUTILS_SYMLINKS
200  "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
201
202option(LLVM_INSTALL_CCTOOLS_SYMLINKS
203  "Install symlinks from the cctools tool names to the corresponding LLVM tools." OFF)
204
205option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
206
207option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
208
209# Unfortunatly Clang is too eager to search directories for module maps, which can cause the
210# installed version of the maps to be found when building LLVM from source. Therefore we turn off
211# the installation by default. See llvm.org/PR31905.
212option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF)
213
214option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
215if ( LLVM_USE_FOLDERS )
216  set_property(GLOBAL PROPERTY USE_FOLDERS ON)
217endif()
218
219include(VersionFromVCS)
220
221option(LLVM_APPEND_VC_REV
222  "Embed the version control system revision in LLVM" ON)
223
224set(PACKAGE_NAME LLVM)
225set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
226set(PACKAGE_BUGREPORT "https://bugs.llvm.org/")
227
228set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
229  "Default URL where bug reports are to be submitted.")
230
231# Configure CPack.
232set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM")
233set(CPACK_PACKAGE_VENDOR "LLVM")
234set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
235set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
236set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH})
237set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
238set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT")
239set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32")
240if(WIN32 AND NOT UNIX)
241  set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM")
242  set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp")
243  set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
244  set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
245  set(CPACK_NSIS_MODIFY_PATH "ON")
246  set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
247  if( CMAKE_CL_64 )
248    set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
249  endif()
250endif()
251include(CPack)
252
253# Sanity check our source directory to make sure that we are not trying to
254# generate an in-source build (unless on MSVC_IDE, where it is ok), and to make
255# sure that we don't have any stray generated files lying around in the tree
256# (which would end up getting picked up by header search, instead of the correct
257# versions).
258if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
259  message(FATAL_ERROR "In-source builds are not allowed.
260Please create a directory and run cmake from there, passing the path
261to this source directory as the last argument.
262This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
263Please delete them.")
264endif()
265
266string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
267
268if (CMAKE_BUILD_TYPE AND
269    NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL)$")
270  message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
271endif()
272
273set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
274
275set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')")
276mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
277
278set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING
279    "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)")
280mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
281
282# They are used as destination of target generators.
283set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
284set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
285if(WIN32 OR CYGWIN)
286  # DLL platform -- put DLLs into bin.
287  set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
288else()
289  set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
290endif()
291
292# Each of them corresponds to llvm-config's.
293set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir
294set(LLVM_LIBRARY_DIR      ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir
295set(LLVM_MAIN_SRC_DIR     ${CMAKE_CURRENT_SOURCE_DIR}  ) # --src-root
296set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir
297set(LLVM_BINARY_DIR       ${CMAKE_CURRENT_BINARY_DIR}  ) # --prefix
298
299# Note: LLVM_CMAKE_PATH does not include generated files
300set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules)
301set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
302set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
303
304# List of all targets to be built by default:
305set(LLVM_ALL_TARGETS
306  AArch64
307  AMDGPU
308  ARM
309  AVR
310  BPF
311  Hexagon
312  Lanai
313  Mips
314  MSP430
315  NVPTX
316  PowerPC
317  RISCV
318  Sparc
319  SystemZ
320  WebAssembly
321  X86
322  XCore
323  )
324
325# List of targets with JIT support:
326set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
327
328set(LLVM_TARGETS_TO_BUILD "all"
329    CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
330
331set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
332  CACHE STRING "Semicolon-separated list of experimental targets to build.")
333
334option(BUILD_SHARED_LIBS
335  "Build all libraries as shared libraries instead of static" OFF)
336
337option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON)
338if(LLVM_ENABLE_BACKTRACES)
339  set(ENABLE_BACKTRACES 1)
340endif()
341
342option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON)
343
344option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
345if(LLVM_ENABLE_CRASH_OVERRIDES)
346  set(ENABLE_CRASH_OVERRIDES 1)
347endif()
348
349option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF)
350
351option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
352set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
353set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
354
355set(LLVM_TARGET_ARCH "host"
356  CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
357
358option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON)
359
360set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
361
362option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
363
364option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)
365
366# On z/OS, threads cannot be used because TLS is not supported.
367if (CMAKE_SYSTEM_NAME MATCHES "OS390")
368  option(LLVM_ENABLE_THREADS "Use threads if available." OFF)
369else()
370  option(LLVM_ENABLE_THREADS "Use threads if available." ON)
371endif()
372
373set(LLVM_ENABLE_ZLIB "ON" CACHE STRING "Use zlib for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
374
375set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")
376
377option(LLVM_ENABLE_Z3_SOLVER
378  "Enable Support for the Z3 constraint solver in LLVM."
379  ${LLVM_ENABLE_Z3_SOLVER_DEFAULT}
380)
381
382if (LLVM_ENABLE_Z3_SOLVER)
383  find_package(Z3 4.7.1)
384
385  if (LLVM_Z3_INSTALL_DIR)
386    if (NOT Z3_FOUND)
387      message(FATAL_ERROR "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.")
388    endif()
389  endif()
390
391  if (NOT Z3_FOUND)
392    message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.")
393  endif()
394
395  set(LLVM_WITH_Z3 1)
396endif()
397
398set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}")
399
400
401if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
402  set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
403endif()
404
405set(LLVM_TARGETS_TO_BUILD
406   ${LLVM_TARGETS_TO_BUILD}
407   ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
408list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
409
410option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
411option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
412if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
413  option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON)
414else()
415  option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
416endif()
417option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
418option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
419option(LLVM_STATIC_LINK_CXX_STDLIB "Statically link the standard library." OFF)
420option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
421option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
422option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
423
424option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF)
425
426if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
427  option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
428else()
429  option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
430endif()
431
432option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
433
434# While adding scalable vector support to LLVM, we temporarily want to
435# allow an implicit conversion of TypeSize to uint64_t, and to allow
436# code to get the fixed number of elements from a possibly scalable vector.
437# This CMake flag enables a more strict mode where it asserts that the type
438# is not a scalable vector type.
439#
440# Enabling this flag makes it easier to find cases where the compiler makes
441# assumptions on the size being 'fixed size', when building tests for
442# SVE/SVE2 or other scalable vector architectures.
443option(LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS
444       "Enable assertions that type is not scalable in implicit conversion from TypeSize to uint64_t and calls to getNumElements" OFF)
445
446set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
447  "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
448
449option(LLVM_FORCE_USE_OLD_TOOLCHAIN
450       "Set to ON to force using an old, unsupported host toolchain." OFF)
451
452set(LLVM_LOCAL_RPATH "" CACHE FILEPATH
453  "If set, an absolute path added as rpath on binaries that do not already contain an executable-relative rpath.")
454
455option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
456       "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
457
458option(LLVM_USE_INTEL_JITEVENTS
459  "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
460  OFF)
461
462if( LLVM_USE_INTEL_JITEVENTS )
463  # Verify we are on a supported platform
464  if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
465    message(FATAL_ERROR
466      "Intel JIT API support is available on Linux and Windows only.")
467  endif()
468endif( LLVM_USE_INTEL_JITEVENTS )
469
470option(LLVM_USE_OPROFILE
471  "Use opagent JIT interface to inform OProfile about JIT code" OFF)
472
473option(LLVM_EXTERNALIZE_DEBUGINFO
474  "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
475
476set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING
477  "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)")
478
479# If enabled, verify we are on a platform that supports oprofile.
480if( LLVM_USE_OPROFILE )
481  if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
482    message(FATAL_ERROR "OProfile support is available on Linux only.")
483  endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
484endif( LLVM_USE_OPROFILE )
485
486option(LLVM_USE_PERF
487  "Use perf JIT interface to inform perf about JIT code" OFF)
488
489# If enabled, verify we are on a platform that supports perf.
490if( LLVM_USE_PERF )
491  if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
492    message(FATAL_ERROR "perf support is available on Linux only.")
493  endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
494endif( LLVM_USE_PERF )
495
496set(LLVM_USE_SANITIZER "" CACHE STRING
497  "Define the sanitizer used to build binaries and tests.")
498option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
499set(LLVM_UBSAN_FLAGS
500    "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
501    CACHE STRING
502    "Compile flags set to enable UBSan. Only used if LLVM_USE_SANITIZER contains 'Undefined'.")
503set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
504  "Path to fuzzing library for linking with fuzz targets")
505
506option(LLVM_USE_SPLIT_DWARF
507  "Use -gsplit-dwarf when compiling llvm." OFF)
508
509# Define an option controlling whether we should build for 32-bit on 64-bit
510# platforms, where supported.
511if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT (WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX"))
512  # TODO: support other platforms and toolchains.
513  option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
514endif()
515
516# Define the default arguments to use with 'lit', and an option for the user to
517# override.
518set(LIT_ARGS_DEFAULT "-sv")
519if (MSVC_IDE OR XCODE)
520  set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
521endif()
522set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
523
524# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
525if( WIN32 AND NOT CYGWIN )
526  set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
527endif()
528
529set(LLVM_INTEGRATED_CRT_ALLOC "" CACHE PATH "Replace the Windows CRT allocator with any of {rpmalloc|mimalloc|snmalloc}. Only works with /MT enabled.")
530if(LLVM_INTEGRATED_CRT_ALLOC)
531  if(NOT WIN32)
532    message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC is only supported on Windows.")
533  endif()
534  if(LLVM_USE_SANITIZER)
535    message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC cannot be used along with LLVM_USE_SANITIZER!")
536  endif()
537  if(CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
538    message(FATAL_ERROR "The Debug target isn't supported along with LLVM_INTEGRATED_CRT_ALLOC!")
539  endif()
540endif()
541
542# Define options to control the inclusion and default build behavior for
543# components which may not strictly be necessary (tools, examples, and tests).
544#
545# This is primarily to support building smaller or faster project files.
546option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
547option(LLVM_BUILD_TOOLS
548  "Build the LLVM tools. If OFF, just generate build targets." ON)
549
550option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
551option(LLVM_BUILD_UTILS
552  "Build LLVM utility binaries. If OFF, just generate build targets." ON)
553
554option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
555option(LLVM_BUILD_RUNTIMES
556  "Build the LLVM runtimes. If OFF, just generate build targets." ON)
557
558option(LLVM_BUILD_RUNTIME
559  "Build the LLVM runtime libraries." ON)
560option(LLVM_BUILD_EXAMPLES
561  "Build the LLVM example programs. If OFF, just generate build targets." OFF)
562option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
563
564if(LLVM_BUILD_EXAMPLES)
565  add_definitions(-DBUILD_EXAMPLES)
566endif(LLVM_BUILD_EXAMPLES)
567
568option(LLVM_BUILD_TESTS
569  "Build LLVM unit tests. If OFF, just generate build targets." OFF)
570option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
571option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
572
573option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default
574targets. If OFF, benchmarks still could be built using Benchmarks target." OFF)
575option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON)
576
577option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
578option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
579option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
580option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
581option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
582option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
583
584set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
585    CACHE STRING "Doxygen-generated HTML documentation install directory")
586set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
587    CACHE STRING "OCamldoc-generated HTML documentation install directory")
588
589option (LLVM_BUILD_EXTERNAL_COMPILER_RT
590  "Build compiler-rt as an external project." OFF)
591
592option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
593  "Show target and host info when tools are invoked with --version." ON)
594
595# You can configure which libraries from LLVM you want to include in the
596# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
597# list of LLVM components. All component names handled by llvm-config are valid.
598if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
599  set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
600    "Semicolon-separated list of components to include in libLLVM, or \"all\".")
601endif()
602
603if(MSVC)
604  option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
605  # Set this variable to OFF here so it can't be set with a command-line
606  # argument.
607  set (LLVM_LINK_LLVM_DYLIB OFF)
608  if (BUILD_SHARED_LIBS)
609    message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.")
610  endif()
611else()
612  option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
613  option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
614  set(LLVM_BUILD_LLVM_DYLIB_default OFF)
615  if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
616    set(LLVM_BUILD_LLVM_DYLIB_default ON)
617  endif()
618  option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
619endif()
620
621if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS)
622  message(FATAL_ERROR "Cannot enable BUILD_SHARED_LIBS with LLVM_LINK_LLVM_DYLIB.  We recommend disabling BUILD_SHARED_LIBS.")
623endif()
624
625option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
626if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
627  set(LLVM_USE_HOST_TOOLS ON)
628endif()
629
630if (MSVC_IDE)
631  option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
632endif()
633
634if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR
635    LLVM_ENABLE_IR_PGO)
636  if(NOT LLVM_PROFILE_MERGE_POOL_SIZE)
637    # A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine
638    # for spining disks. Anything higher may only help on slower mediums.
639    set(LLVM_PROFILE_MERGE_POOL_SIZE "4")
640  endif()
641  if(NOT LLVM_PROFILE_FILE_PATTERN)
642    if(NOT LLVM_PROFILE_DATA_DIR)
643      file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR)
644    endif()
645    file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
646  endif()
647  if(NOT LLVM_CSPROFILE_FILE_PATTERN)
648    if(NOT LLVM_CSPROFILE_DATA_DIR)
649      file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR)
650    endif()
651    file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN)
652  endif()
653endif()
654
655if (LLVM_BUILD_STATIC)
656  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
657  # Remove shared library suffixes from use in find_library
658  foreach (shared_lib_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_IMPORT_LIBRARY_SUFFIX})
659    list(FIND CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix} shared_lib_suffix_idx)
660    if(NOT ${shared_lib_suffix_idx} EQUAL -1)
661      list(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix_idx})
662    endif()
663  endforeach()
664endif()
665
666# Use libtool instead of ar if you are both on an Apple host, and targeting Apple.
667if(CMAKE_HOST_APPLE AND APPLE)
668  include(UseLibtool)
669endif()
670
671# Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
672set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
673mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
674
675set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL
676  "Enable per-target runtimes directory")
677
678set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
679  "Profiling data file to use when compiling in order to improve runtime performance.")
680
681# All options referred to from HandleLLVMOptions have to be specified
682# BEFORE this include, otherwise options will not be correctly set on
683# first cmake run
684include(config-ix)
685
686# By default, we target the host, but this can be overridden at CMake
687# invocation time.
688set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING
689  "Default target for which LLVM will generate code." )
690set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
691message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
692message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
693
694if(WIN32 OR CYGWIN)
695  if(BUILD_SHARED_LIBS OR LLVM_BUILD_LLVM_DYLIB)
696    set(LLVM_ENABLE_PLUGINS_default ON)
697  else()
698    set(LLVM_ENABLE_PLUGINS_default OFF)
699  endif()
700else()
701  set(LLVM_ENABLE_PLUGINS_default ${LLVM_ENABLE_PIC})
702endif()
703option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default})
704
705set(ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER TRUE CACHE BOOL
706  "Enable the new pass manager by default.")
707
708include(HandleLLVMOptions)
709
710find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
711    COMPONENTS Interpreter)
712
713######
714
715# Configure all of the various header file fragments LLVM uses which depend on
716# configuration variables.
717set(LLVM_ENUM_TARGETS "")
718set(LLVM_ENUM_ASM_PRINTERS "")
719set(LLVM_ENUM_ASM_PARSERS "")
720set(LLVM_ENUM_DISASSEMBLERS "")
721foreach(t ${LLVM_TARGETS_TO_BUILD})
722  set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
723
724  list(FIND LLVM_ALL_TARGETS ${t} idx)
725  list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy)
726  # At this point, LLVMBUILDTOOL already checked all the targets passed in
727  # LLVM_TARGETS_TO_BUILD and LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, so
728  # this test just makes sure that any experimental targets were passed via
729  # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD.
730  if( idx LESS 0 AND idy LESS 0 )
731    message(FATAL_ERROR "The target `${t}' is experimental and must be passed "
732      "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.")
733  else()
734    set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n")
735  endif()
736
737  file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
738  if( asmp_file )
739    set(LLVM_ENUM_ASM_PRINTERS
740      "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
741  endif()
742  if( EXISTS ${td}/AsmParser/CMakeLists.txt )
743    set(LLVM_ENUM_ASM_PARSERS
744      "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
745  endif()
746  if( EXISTS ${td}/Disassembler/CMakeLists.txt )
747    set(LLVM_ENUM_DISASSEMBLERS
748      "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
749  endif()
750endforeach(t)
751
752# Produce the target definition files, which provide a way for clients to easily
753# include various classes of targets.
754configure_file(
755  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
756  ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
757  )
758configure_file(
759  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
760  ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
761  )
762configure_file(
763  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
764  ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
765  )
766configure_file(
767  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
768  ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
769  )
770
771# They are not referenced. See set_output_directory().
772set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
773set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
774set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
775
776if(LLVM_INCLUDE_TESTS)
777  include(GetErrcMessages)
778  get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
779endif()
780
781# For up-to-date instructions for installing the Tensorflow dependency, refer to
782# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh
783# In this case, the latest C API library is available for download from
784# https://www.tensorflow.org/install/lang_c.
785# We will expose the conditional compilation variable,
786# LLVM_HAVE_TF_API, through llvm-config.h, so that a user of the LLVM library may
787# also leverage the dependency.
788set(TENSORFLOW_C_LIB_PATH "" CACHE PATH "Path to TensorFlow C library install")
789if (TENSORFLOW_C_LIB_PATH)
790  find_library(tensorflow_c_api tensorflow PATHS ${TENSORFLOW_C_LIB_PATH}/lib NO_DEFAULT_PATH REQUIRED)
791  set(LLVM_HAVE_TF_API "ON" CACHE BOOL "Full Tensorflow API available")
792  include_directories(${TENSORFLOW_C_LIB_PATH}/include)
793endif()
794
795# For up-to-date instructions for installing the Tensorflow dependency, refer to
796# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh
797# Specifically, assuming python3 is installed:
798# python3 -m pip install --upgrade pip && python3 -m pip install --user tf_nightly==2.3.0.dev20200528
799# Then set TENSORFLOW_AOT_PATH to the package install - usually it's ~/.local/lib/python3.7/site-packages/tensorflow
800#
801set(TENSORFLOW_AOT_PATH "" CACHE PATH "Path to TensorFlow pip install dir")
802
803if (NOT TENSORFLOW_AOT_PATH STREQUAL "")
804  set(LLVM_HAVE_TF_AOT "ON" CACHE BOOL "Tensorflow AOT available")
805  set(TENSORFLOW_AOT_COMPILER
806    "${TENSORFLOW_AOT_PATH}/../../../../bin/saved_model_cli"
807    CACHE PATH "Path to the Tensorflow AOT compiler")
808  include_directories(${TENSORFLOW_AOT_PATH}/include)
809  add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src
810    ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime)
811  install(TARGETS tf_xla_runtime EXPORT LLVMExports
812    ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
813  set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime)
814endif()
815
816# Keep the legacy CMake flag ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER for
817# compatibility.
818set(LLVM_ENABLE_NEW_PASS_MANAGER ${ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER})
819
820# Configure the three LLVM configuration header files.
821configure_file(
822  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
823  ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
824configure_file(
825  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
826  ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
827configure_file(
828  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
829  ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
830
831# Add target for generating source rpm package.
832set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
833    CACHE FILEPATH ".spec file to use for srpm generation")
834set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
835set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
836
837get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository)
838string(LENGTH "${revision}" revision_length)
839set(LLVM_RPM_SPEC_REVISION "${revision}")
840
841configure_file(
842  ${LLVM_SRPM_USER_BINARY_SPECFILE}
843  ${LLVM_SRPM_BINARY_SPECFILE} @ONLY)
844
845add_custom_target(srpm
846  COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES
847  COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE})
848set_target_properties(srpm PROPERTIES FOLDER "Misc")
849
850if(APPLE AND DARWIN_LTO_LIBRARY)
851  set(CMAKE_EXE_LINKER_FLAGS
852    "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
853  set(CMAKE_SHARED_LINKER_FLAGS
854    "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
855  set(CMAKE_MODULE_LINKER_FLAGS
856    "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
857endif()
858
859# Build with _XOPEN_SOURCE on AIX, as stray macros in _ALL_SOURCE mode tend to
860# break things. In this case we need to enable the large-file API as well.
861if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
862          add_definitions("-D_XOPEN_SOURCE=700")
863          add_definitions("-D_LARGE_FILE_API")
864
865  # CMake versions less than 3.16 set default linker flags to include -brtl, as
866  # well as setting -G when building libraries, so clear them out. Note we only
867  # try to clear the form that CMake will set as part of its initial
868  # configuration, it is still possible the user may force it as part of a
869  # compound option.
870  if(CMAKE_VERSION VERSION_LESS 3.16)
871    string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS}")
872    string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_SHARED_LINKER_FLAGS  "${CMAKE_SHARED_LINKER_FLAGS}")
873    string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
874    string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS
875      "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}")
876    string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS
877      "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}")
878    string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS
879      "${CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS}")
880    string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS
881      "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}")
882    string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS
883      "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}")
884    string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS
885      "${CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS}")
886  endif()
887
888  # Modules should be built with -shared -Wl,-G, so we can use runtime linking
889  # with plugins.
890  string(APPEND CMAKE_MODULE_LINKER_FLAGS " -shared -Wl,-G")
891
892  # Also set the correct flags for building shared libraries.
893  string(APPEND CMAKE_SHARED_LINKER_FLAGS " -shared")
894endif()
895
896# Build with _XOPEN_SOURCE on z/OS.
897if (CMAKE_SYSTEM_NAME MATCHES "OS390")
898  add_definitions("-D_XOPEN_SOURCE=600")
899  add_definitions("-D_OPEN_SYS") # Needed for process information.
900  add_definitions("-D_OPEN_SYS_FILE_EXT") # Needed for EBCDIC I/O.
901endif()
902
903# Build with _FILE_OFFSET_BITS=64 on Solaris to match g++ >= 9.
904if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
905          add_definitions("-D_FILE_OFFSET_BITS=64")
906endif()
907
908set(CMAKE_INCLUDE_CURRENT_DIR ON)
909
910include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
911
912# when crosscompiling import the executable targets from a file
913if(LLVM_USE_HOST_TOOLS)
914  include(CrossCompile)
915  llvm_create_cross_target(LLVM NATIVE "" Release)
916endif(LLVM_USE_HOST_TOOLS)
917if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
918# Dummy use to avoid CMake Warning: Manually-specified variables were not used
919# (this is a variable that CrossCompile sets on recursive invocations)
920endif()
921
922if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
923   # special hack for Solaris to handle crazy system sys/regset.h
924   include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
925endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
926
927# Make sure we don't get -rdynamic in every binary. For those that need it,
928# use export_executable_symbols(target).
929set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
930
931include(AddLLVM)
932include(TableGen)
933
934include(LLVMDistributionSupport)
935
936if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
937  # People report that -O3 is unreliable on MinGW. The traditional
938  # build also uses -O2 for that reason:
939  llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
940endif()
941
942# Put this before tblgen. Else we have a circular dependence.
943add_subdirectory(lib/Demangle)
944add_subdirectory(lib/Support)
945add_subdirectory(lib/TableGen)
946
947add_subdirectory(utils/TableGen)
948
949add_subdirectory(include/llvm)
950
951add_subdirectory(lib)
952
953if( LLVM_INCLUDE_UTILS )
954  add_subdirectory(utils/FileCheck)
955  add_subdirectory(utils/PerfectShuffle)
956  add_subdirectory(utils/count)
957  add_subdirectory(utils/not)
958  add_subdirectory(utils/yaml-bench)
959else()
960  if ( LLVM_INCLUDE_TESTS )
961    message(FATAL_ERROR "Including tests when not building utils will not work.
962    Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.")
963  endif()
964endif()
965
966# Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
967if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
968  add_subdirectory(utils/LLVMVisualizers)
969endif()
970
971foreach( binding ${LLVM_BINDINGS_LIST} )
972  if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
973    add_subdirectory(bindings/${binding})
974  endif()
975endforeach()
976
977add_subdirectory(projects)
978
979if( LLVM_INCLUDE_TOOLS )
980  add_subdirectory(tools)
981endif()
982
983if( LLVM_INCLUDE_RUNTIMES )
984  add_subdirectory(runtimes)
985endif()
986
987if( LLVM_INCLUDE_EXAMPLES )
988  add_subdirectory(examples)
989endif()
990
991if( LLVM_INCLUDE_TESTS )
992  if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang)
993    include(LLVMExternalProjectUtils)
994    llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
995      USE_TOOLCHAIN
996      EXCLUDE_FROM_ALL
997      NO_INSTALL
998      ALWAYS_CLEAN)
999  endif()
1000  add_subdirectory(utils/lit)
1001  add_subdirectory(test)
1002  add_subdirectory(unittests)
1003  if( LLVM_INCLUDE_UTILS )
1004    add_subdirectory(utils/unittest)
1005  endif()
1006
1007  if (WIN32)
1008    # This utility is used to prevent crashing tests from calling Dr. Watson on
1009    # Windows.
1010    add_subdirectory(utils/KillTheDoctor)
1011  endif()
1012
1013  # Add a global check rule now that all subdirectories have been traversed
1014  # and we know the total set of lit testsuites.
1015  get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES)
1016  get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS)
1017  get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS)
1018  get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS)
1019  get_property(LLVM_ADDITIONAL_TEST_TARGETS
1020               GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS)
1021  get_property(LLVM_ADDITIONAL_TEST_DEPENDS
1022               GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS)
1023  add_lit_target(check-all
1024    "Running all regression tests"
1025    ${LLVM_LIT_TESTSUITES}
1026    PARAMS ${LLVM_LIT_PARAMS}
1027    DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS}
1028    ARGS ${LLVM_LIT_EXTRA_ARGS}
1029    )
1030  if(TARGET check-runtimes)
1031    add_dependencies(check-all check-runtimes)
1032  endif()
1033  add_custom_target(test-depends
1034                    DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS})
1035  set_target_properties(test-depends PROPERTIES FOLDER "Tests")
1036endif()
1037
1038if (LLVM_INCLUDE_DOCS)
1039  add_subdirectory(docs)
1040endif()
1041
1042add_subdirectory(cmake/modules)
1043
1044# Do this last so that all lit targets have already been created.
1045if (LLVM_INCLUDE_UTILS)
1046  add_subdirectory(utils/llvm-lit)
1047endif()
1048
1049if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1050  install(DIRECTORY include/llvm include/llvm-c
1051    DESTINATION include
1052    COMPONENT llvm-headers
1053    FILES_MATCHING
1054    PATTERN "*.def"
1055    PATTERN "*.h"
1056    PATTERN "*.td"
1057    PATTERN "*.inc"
1058    PATTERN "LICENSE.TXT"
1059    )
1060
1061  install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c
1062    DESTINATION include
1063    COMPONENT llvm-headers
1064    FILES_MATCHING
1065    PATTERN "*.def"
1066    PATTERN "*.h"
1067    PATTERN "*.gen"
1068    PATTERN "*.inc"
1069    # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
1070    PATTERN "CMakeFiles" EXCLUDE
1071    PATTERN "config.h" EXCLUDE
1072    )
1073
1074  if (LLVM_INSTALL_MODULEMAPS)
1075    install(DIRECTORY include/llvm include/llvm-c
1076            DESTINATION include
1077            COMPONENT llvm-headers
1078            FILES_MATCHING
1079            PATTERN "module.modulemap"
1080            )
1081    install(FILES include/llvm/module.install.modulemap
1082            DESTINATION include/llvm
1083            COMPONENT llvm-headers
1084            RENAME "module.extern.modulemap"
1085            )
1086  endif(LLVM_INSTALL_MODULEMAPS)
1087
1088  # Installing the headers needs to depend on generating any public
1089  # tablegen'd headers.
1090  add_custom_target(llvm-headers DEPENDS intrinsics_gen omp_gen)
1091  set_target_properties(llvm-headers PROPERTIES FOLDER "Misc")
1092
1093  if (NOT LLVM_ENABLE_IDE)
1094    add_llvm_install_targets(install-llvm-headers
1095                             DEPENDS llvm-headers
1096                             COMPONENT llvm-headers)
1097  endif()
1098
1099  # Custom target to install all libraries.
1100  add_custom_target(llvm-libraries)
1101  set_target_properties(llvm-libraries PROPERTIES FOLDER "Misc")
1102
1103  if (NOT LLVM_ENABLE_IDE)
1104    add_llvm_install_targets(install-llvm-libraries
1105                             DEPENDS llvm-libraries
1106                             COMPONENT llvm-libraries)
1107  endif()
1108
1109  get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS)
1110  if(LLVM_LIBS)
1111    list(REMOVE_DUPLICATES LLVM_LIBS)
1112    foreach(lib ${LLVM_LIBS})
1113      add_dependencies(llvm-libraries ${lib})
1114      if (NOT LLVM_ENABLE_IDE)
1115        add_dependencies(install-llvm-libraries install-${lib})
1116        add_dependencies(install-llvm-libraries-stripped install-${lib}-stripped)
1117      endif()
1118    endforeach()
1119  endif()
1120endif()
1121
1122# This must be at the end of the LLVM root CMakeLists file because it must run
1123# after all targets are created.
1124llvm_distribution_add_targets()
1125process_llvm_pass_plugins(GEN_CONFIG)
1126
1127# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
1128if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
1129  include(InstallRequiredSystemLibraries)
1130endif()
1131
1132if (LLVM_INCLUDE_BENCHMARKS)
1133  # Override benchmark defaults so that when the library itself is updated these
1134  # modifications are not lost.
1135  set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE)
1136  set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE)
1137  set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE)
1138  set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE)
1139  set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE)
1140  # Since LLVM requires C++11 it is safe to assume that std::regex is available.
1141  set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE)
1142
1143  add_subdirectory(utils/benchmark)
1144  add_subdirectory(benchmarks)
1145endif()
1146
1147if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
1148  add_subdirectory(utils/llvm-locstats)
1149endif()
1150