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