[AST] Use APIntStorage to fix memory leak in EnumConstantDecl. (#78311)
[llvm-project.git] / llvm / CMakeLists.txt
blob61ab69d237470f2c15ec9bd14dcf2b9f4caed2c3
1 # See docs/CMake.html for instructions about how to build LLVM with CMake.
3 cmake_minimum_required(VERSION 3.20.0)
5 set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
6 include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
7   NO_POLICY_SCOPE)
9 # Builds with custom install names and installation rpath setups may not work
10 # in the build tree. Allow these cases to use CMake's default build tree
11 # behavior by setting `LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE` to do this.
12 option(LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE "If set, use CMake's default build tree install name directory logic (Darwin only)" OFF)
13 mark_as_advanced(LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE)
14 if(NOT LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE)
15   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
16 endif()
18 if(NOT DEFINED LLVM_VERSION_MAJOR)
19   set(LLVM_VERSION_MAJOR 18)
20 endif()
21 if(NOT DEFINED LLVM_VERSION_MINOR)
22   set(LLVM_VERSION_MINOR 0)
23 endif()
24 if(NOT DEFINED LLVM_VERSION_PATCH)
25   set(LLVM_VERSION_PATCH 0)
26 endif()
27 if(NOT DEFINED LLVM_VERSION_SUFFIX)
28   set(LLVM_VERSION_SUFFIX git)
29 endif()
31 if (NOT PACKAGE_VERSION)
32   set(PACKAGE_VERSION
33     "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}")
34 endif()
36 if(NOT DEFINED LLVM_SHLIB_SYMBOL_VERSION)
37   # "Symbol version prefix for libLLVM.so"
38   set(LLVM_SHLIB_SYMBOL_VERSION "LLVM_${LLVM_VERSION_MAJOR}")
39 endif()
41 if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (MSVC_TOOLSET_VERSION LESS 142) AND (CMAKE_GENERATOR_TOOLSET STREQUAL ""))
42   message(WARNING "Visual Studio generators use the x86 host compiler by "
43                   "default, even for 64-bit targets. This can result in linker "
44                   "instability and out of memory errors. To use the 64-bit "
45                   "host compiler, pass -Thost=x64 on the CMake command line.")
46 endif()
48 if (CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_OSX_ARCHITECTURES)
49   # Some CMake features like object libraries get confused if you don't
50   # explicitly specify an architecture setting with the Xcode generator.
51   set(CMAKE_OSX_ARCHITECTURES "x86_64")
52 endif()
54 project(LLVM
55   VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
56   LANGUAGES C CXX ASM)
58 if (NOT DEFINED CMAKE_INSTALL_LIBDIR AND DEFINED LLVM_LIBDIR_SUFFIX)
59   # Must go before `include(GNUInstallDirs)`.
60   set(CMAKE_INSTALL_LIBDIR "lib${LLVM_LIBDIR_SUFFIX}")
61 endif()
63 # Must go after `DEFINED LLVM_LIBDIR_SUFFIX` check.
64 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
66 # Must go after `project(..)`.
67 include(GNUInstallDirs)
69 # This C++ standard is required to build LLVM.
70 set(LLVM_REQUIRED_CXX_STANDARD 17)
72 # If we find that the cache contains CMAKE_CXX_STANDARD it means that it's a old CMakeCache.txt
73 # and we can just inform the user and then reset it.
74 if($CACHE{CMAKE_CXX_STANDARD} AND $CACHE{CMAKE_CXX_STANDARD} LESS ${LLVM_REQUIRED_CXX_STANDARD})
75   message(WARNING "Resetting cache value for CMAKE_CXX_STANDARD to ${LLVM_REQUIRED_CXX_STANDARD}")
76   unset(CMAKE_CXX_STANDARD CACHE)
77 endif()
79 # if CMAKE_CXX_STANDARD is still set after the cache unset above it means that the user requested it
80 # and we allow it to be set to something newer than the required standard but otherwise we fail.
81 if(DEFINED CMAKE_CXX_STANDARD AND CMAKE_CXX_STANDARD LESS ${LLVM_REQUIRED_CXX_STANDARD})
82   message(FATAL_ERROR "Requested CMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD} which is less than the required ${LLVM_REQUIRED_CXX_STANDARD}.")
83 endif()
85 set(CMAKE_CXX_STANDARD ${LLVM_REQUIRED_CXX_STANDARD} CACHE STRING "C++ standard to conform to")
86 set(CMAKE_CXX_STANDARD_REQUIRED YES)
88 if (CYGWIN)
89   # Cygwin is a bit stricter and lack things like 'strdup', 'stricmp', etc in
90   # c++xx mode.
91   set(CMAKE_CXX_EXTENSIONS YES)
92 else()
93   set(CMAKE_CXX_EXTENSIONS NO)
94 endif()
96 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
97   message(FATAL_ERROR "
98 No build type selected. You need to pass -DCMAKE_BUILD_TYPE=<type> in order to configure LLVM.
99 Available options are:
100   * -DCMAKE_BUILD_TYPE=Release - For an optimized build with no assertions or debug info.
101   * -DCMAKE_BUILD_TYPE=Debug - For an unoptimized build with assertions and debug info.
102   * -DCMAKE_BUILD_TYPE=RelWithDebInfo - For an optimized build with no assertions but with debug info.
103   * -DCMAKE_BUILD_TYPE=MinSizeRel - For a build optimized for size instead of speed.
104 Learn more about these options in our documentation at https://llvm.org/docs/CMake.html#cmake-build-type
106 endif()
108 # Set default build type for cmake's try_compile module.
109 # CMake 3.17 or newer sets CMAKE_DEFAULT_BUILD_TYPE to one of the
110 # items from CMAKE_CONFIGURATION_TYPES. Logic below can be further
111 # simplified once LLVM's minimum CMake version is updated to 3.17.
112 if(CMAKE_DEFAULT_BUILD_TYPE)
113   set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_DEFAULT_BUILD_TYPE})
114 else()
115   if(CMAKE_CONFIGURATION_TYPES)
116     list(GET CMAKE_CONFIGURATION_TYPES 0 CMAKE_TRY_COMPILE_CONFIGURATION)
117   elseif(CMAKE_BUILD_TYPE)
118     set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
119   endif()
120 endif()
122 # Side-by-side subprojects layout: automatically set the
123 # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
124 # This allows an easy way of setting up a build directory for llvm and another
125 # one for llvm+clang+... using the same sources.
126 set(LLVM_ALL_PROJECTS "bolt;clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;mlir;openmp;polly;pstl")
127 # The flang project is not yet part of "all" projects (see C++ requirements)
128 set(LLVM_EXTRA_PROJECTS "flang")
129 # List of all known projects in the mono repo
130 set(LLVM_KNOWN_PROJECTS "${LLVM_ALL_PROJECTS};${LLVM_EXTRA_PROJECTS}")
131 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
132     "Semicolon-separated list of projects to build (${LLVM_KNOWN_PROJECTS}), or \"all\".")
133 # Make sure expansion happens first to not handle "all" in rest of the checks.
134 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
135   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
136 endif()
137 foreach(proj ${LLVM_ENABLE_PROJECTS})
138   if (NOT proj STREQUAL "llvm" AND NOT "${proj}" IN_LIST LLVM_KNOWN_PROJECTS)
139      MESSAGE(FATAL_ERROR "${proj} isn't a known project: ${LLVM_KNOWN_PROJECTS}. Did you mean to enable it as a runtime in LLVM_ENABLE_RUNTIMES?")
140   endif()
141 endforeach()
143 if ("flang" IN_LIST LLVM_ENABLE_PROJECTS)
144   if (NOT "mlir" IN_LIST LLVM_ENABLE_PROJECTS)
145     message(STATUS "Enabling MLIR as a dependency to flang")
146     list(APPEND LLVM_ENABLE_PROJECTS "mlir")
147   endif()
149   if (NOT "clang" IN_LIST LLVM_ENABLE_PROJECTS)
150     message(FATAL_ERROR "Clang is not enabled, but is required for the Flang driver")
151   endif()
152 endif()
154 # Select the runtimes to build
156 # As we migrate runtimes to using the bootstrapping build, the set of default runtimes
157 # should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above.
158 set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind")
159 set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc")
160 set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
161   "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
162 if(LLVM_ENABLE_RUNTIMES STREQUAL "all")
163   set(LLVM_ENABLE_RUNTIMES ${LLVM_DEFAULT_RUNTIMES})
164 endif()
165 foreach(proj IN LISTS LLVM_ENABLE_RUNTIMES)
166   if (NOT "${proj}" IN_LIST LLVM_SUPPORTED_RUNTIMES)
167     message(FATAL_ERROR "Runtime \"${proj}\" is not a supported runtime. Supported runtimes are: ${LLVM_SUPPORTED_RUNTIMES}")
168   endif()
169 endforeach()
171 if ("libc" IN_LIST LLVM_ENABLE_RUNTIMES)
172   # To build the libc runtime, we need to be able to build few libc build
173   # tools from the "libc" project. So, we add it to the list of enabled
174   # projects.
175   if (NOT "libc" IN_LIST LLVM_ENABLE_PROJECTS)
176     message(STATUS "Enabling libc project to build libc build tools")
177     list(APPEND LLVM_ENABLE_PROJECTS "libc")
178   endif()
179 endif()
181 # LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
182 # `LLVM_ENABLE_PROJECTS` CMake cache variable.  This exists for
183 # several reasons:
185 # * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
186 # source of truth for which projects to build. This means we will ignore user
187 # supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
188 # them.
190 # * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
191 # non-empty list but now the user wishes to disable building all other projects
192 # by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
193 # need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
194 # building all the projects that were previously enabled.
195 set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
196 mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
198 if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
199   set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
200   foreach(proj ${LLVM_KNOWN_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
201     string(TOUPPER "${proj}" upper_proj)
202     string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
203     if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
204       message(STATUS "${proj} project is enabled")
205       set(SHOULD_ENABLE_PROJECT TRUE)
206       set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
207       if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
208         message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
209       endif()
210       if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" )
211         set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE)
212       else()
213         set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "")
214       endif()
215     elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
216       message(STATUS "${proj} project is enabled")
217       set(SHOULD_ENABLE_PROJECT TRUE)
218     else()
219       message(STATUS "${proj} project is disabled")
220       set(SHOULD_ENABLE_PROJECT FALSE)
221     endif()
222     # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
223     # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
224     # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
225     # we should deprecate allowing users to set these variables by turning them
226     # into normal CMake variables rather than cache variables.
227     set(LLVM_TOOL_${upper_proj}_BUILD
228       ${SHOULD_ENABLE_PROJECT}
229       CACHE
230       BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
231     )
232   endforeach()
233 endif()
234 unset(SHOULD_ENABLE_PROJECT)
236 # Build llvm with ccache if the package is present
237 set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
238 if(LLVM_CCACHE_BUILD)
239   find_program(CCACHE_PROGRAM ccache)
240   if(CCACHE_PROGRAM)
241     set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache")
242     set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data")
243     set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes"
244         CACHE STRING "Parameters to pass through to ccache")
246     if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
247       set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}")
248       if (LLVM_CCACHE_MAXSIZE)
249         set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}")
250       endif()
251       if (LLVM_CCACHE_DIR)
252         set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}")
253       endif()
254       set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
255     else()
256       if(LLVM_CCACHE_MAXSIZE OR LLVM_CCACHE_DIR OR
257          NOT LLVM_CCACHE_PARAMS MATCHES "CCACHE_CPP2=yes CCACHE_HASHDIR=yes")
258         message(FATAL_ERROR "Ccache configuration through CMake is not supported on Windows. Please use environment variables.")
259       endif()
260       # RULE_LAUNCH_COMPILE should work with Ninja but currently has issues
261       # with cmd.exe and some MSVC tools other than cl.exe
262       set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
263       set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
264     endif()
265   else()
266     message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF")
267   endif()
268 endif()
270 set(LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS "" CACHE STRING
271   "Optional arguments for the native tool used in CMake --build invocations for external projects.")
272 mark_as_advanced(LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS)
274 option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF)
276 # Some features of the LLVM build may be disallowed when dependency debugging is
277 # enabled. In particular you cannot use ccache because we want to force compile
278 # operations to always happen.
279 if(LLVM_DEPENDENCY_DEBUGGING)
280   if(NOT CMAKE_HOST_APPLE)
281     message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.")
282   endif()
283   if(LLVM_CCACHE_BUILD)
284     message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.")
285   endif()
286 endif()
288 option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF)
289 option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF)
290 if(LLVM_ENABLE_GISEL_COV)
291   set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage")
292 endif()
294 # Add path for custom modules
295 list(INSERT CMAKE_MODULE_PATH 0
296   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
297   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
298   "${LLVM_COMMON_CMAKE_UTILS}/Modules"
299   )
301 # Generate a CompilationDatabase (compile_commands.json file) for our build,
302 # for use by clang_complete, YouCompleteMe, etc.
303 set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
305 option(LLVM_INSTALL_BINUTILS_SYMLINKS
306   "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
308 option(LLVM_INSTALL_CCTOOLS_SYMLINKS
309   "Install symlinks from the cctools tool names to the corresponding LLVM tools." OFF)
311 # By default we use symlinks on Unix platforms and copy binaries on Windows
312 # If you have the correct setup on Windows you can use this option to enable
313 # symlinks and save a lot of diskspace.
314 option(LLVM_USE_SYMLINKS "Use symlinks instead of copying binaries" ${CMAKE_HOST_UNIX})
316 option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
318 option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
320 # Unfortunatly Clang is too eager to search directories for module maps, which can cause the
321 # installed version of the maps to be found when building LLVM from source. Therefore we turn off
322 # the installation by default. See llvm.org/PR31905.
323 option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF)
325 option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
326 if ( LLVM_USE_FOLDERS )
327   set_property(GLOBAL PROPERTY USE_FOLDERS ON)
328 endif()
330 include(VersionFromVCS)
332 option(LLVM_APPEND_VC_REV
333   "Embed the version control system revision in LLVM" ON)
335 set(LLVM_FORCE_VC_REVISION
336   "" CACHE STRING "Force custom VC revision for LLVM_APPEND_VC_REV")
338 set(LLVM_FORCE_VC_REPOSITORY
339   "" CACHE STRING "Force custom VC repository for LLVM_APPEND_VC_REV")
341 option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall tool" OFF)
343 set(PACKAGE_NAME LLVM)
344 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
345 set(PACKAGE_BUGREPORT "https://github.com/llvm/llvm-project/issues/")
347 set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
348   "Default URL where bug reports are to be submitted.")
349 set(LLDB_BUG_REPORT_URL "${BUG_REPORT_URL}" CACHE STRING
350   "Default URL where lldb bug reports are to be submitted.")
352 # Configure CPack.
353 if(NOT DEFINED CPACK_PACKAGE_INSTALL_DIRECTORY)
354   set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM")
355 endif()
356 if(NOT DEFINED CPACK_PACKAGE_VENDOR)
357   set(CPACK_PACKAGE_VENDOR "LLVM")
358 endif()
359 set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
360 set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
361 set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH})
362 set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
363 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT")
364 if(WIN32 AND NOT UNIX)
365   set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32")
366   if(NOT DEFINED CPACK_PACKAGE_INSTALL_REGISTRY_KEY)
367     set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM")
368   endif()
369   set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp")
370   set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
371   set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
372   set(CPACK_NSIS_MODIFY_PATH "ON")
373   set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
374   if( CMAKE_CL_64 )
375     if(NOT DEFINED CPACK_NSIS_INSTALL_ROOT)
376       set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
377     endif()
378   endif()
379 endif()
380 include(CPack)
382 # Sanity check our source directory to make sure that we are not trying to
383 # generate an in-source build (unless on MSVC_IDE, where it is ok), and to make
384 # sure that we don't have any stray generated files lying around in the tree
385 # (which would end up getting picked up by header search, instead of the correct
386 # versions).
387 if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
388   message(FATAL_ERROR "In-source builds are not allowed.
389 Please create a directory and run cmake from there, passing the path
390 to this source directory as the last argument.
391 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
392 Please delete them.")
393 endif()
395 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
397 option(LLVM_ADDITIONAL_BUILD_TYPES "Additional build types that are allowed to be passed into CMAKE_BUILD_TYPE" "")
399 set(ALLOWED_BUILD_TYPES DEBUG RELEASE RELWITHDEBINFO MINSIZEREL ${LLVM_ADDITIONAL_BUILD_TYPES})
400 string (REPLACE ";" "|" ALLOWED_BUILD_TYPES_STRING "${ALLOWED_BUILD_TYPES}")
401 string (TOUPPER "${ALLOWED_BUILD_TYPES_STRING}" uppercase_ALLOWED_BUILD_TYPES)
403 if (CMAKE_BUILD_TYPE AND
404     NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(${uppercase_ALLOWED_BUILD_TYPES})$")
405   message(FATAL_ERROR "Unknown value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
406 endif()
408 # LLVM_INSTALL_PACKAGE_DIR needs to be declared prior to adding the tools
409 # subdirectory in order to have the value available for llvm-config.
410 include(GNUInstallPackageDir)
411 set(LLVM_INSTALL_PACKAGE_DIR "${CMAKE_INSTALL_PACKAGEDIR}/llvm" CACHE STRING
412   "Path for CMake subdirectory for LLVM (defaults to '${CMAKE_INSTALL_PACKAGEDIR}/llvm')")
414 set(LLVM_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
415     "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
416 mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
418 set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING
419     "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)")
420 mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
422 set(LLVM_EXAMPLES_INSTALL_DIR "examples" CACHE STRING
423     "Path for examples subdirectory (enabled by LLVM_BUILD_EXAMPLES=ON) (defaults to 'examples')")
424 mark_as_advanced(LLVM_EXAMPLES_INSTALL_DIR)
426 # They are used as destination of target generators.
427 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
428 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
429 if(WIN32 OR CYGWIN)
430   # DLL platform -- put DLLs into bin.
431   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
432 else()
433   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
434 endif()
436 # Each of them corresponds to llvm-config's.
437 set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir
438 set(LLVM_LIBRARY_DIR      ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir
439 set(LLVM_MAIN_SRC_DIR     ${CMAKE_CURRENT_SOURCE_DIR}  ) # --src-root
440 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir
441 set(LLVM_BINARY_DIR       ${CMAKE_CURRENT_BINARY_DIR}  ) # --prefix
444 # Note: LLVM_CMAKE_DIR does not include generated files
445 set(LLVM_CMAKE_DIR ${LLVM_MAIN_SRC_DIR}/cmake/modules)
446 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
447 set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
449 # List of all targets to be built by default:
450 set(LLVM_ALL_TARGETS
451   AArch64
452   AMDGPU
453   ARM
454   AVR
455   BPF
456   Hexagon
457   Lanai
458   LoongArch
459   Mips
460   MSP430
461   NVPTX
462   PowerPC
463   RISCV
464   Sparc
465   SystemZ
466   VE
467   WebAssembly
468   X86
469   XCore
470   )
472 set(LLVM_ALL_EXPERIMENTAL_TARGETS
473   ARC
474   CSKY
475   DirectX
476   M68k
477   SPIRV
478   Xtensa
481 # List of targets with JIT support:
482 set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
484 set(LLVM_TARGETS_TO_BUILD "all"
485     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
487 set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
488     CACHE STRING "Semicolon-separated list of experimental targets to build, or \"all\".")
490 option(BUILD_SHARED_LIBS
491   "Build all libraries as shared libraries instead of static" OFF)
493 option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON)
494 if(LLVM_ENABLE_BACKTRACES)
495   set(ENABLE_BACKTRACES 1)
496 endif()
498 option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON)
500 option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
501 if(LLVM_ENABLE_CRASH_OVERRIDES)
502   set(ENABLE_CRASH_OVERRIDES 1)
503 endif()
505 option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF)
507 set(WINDOWS_PREFER_FORWARD_SLASH_DEFAULT OFF)
508 if (MINGW)
509   # Cygwin doesn't identify itself as Windows, and thus gets path::Style::posix
510   # as native path style, regardless of what this is set to.
511   set(WINDOWS_PREFER_FORWARD_SLASH_DEFAULT ON)
512 endif()
513 option(LLVM_WINDOWS_PREFER_FORWARD_SLASH "Prefer path names with forward slashes on Windows." ${WINDOWS_PREFER_FORWARD_SLASH_DEFAULT})
515 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
516 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
517 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
519 set(LLVM_TARGET_ARCH "host"
520   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
522 option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON)
524 set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
526 option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
528 option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)
530 # On z/OS, threads cannot be used because TLS is not supported.
531 if (CMAKE_SYSTEM_NAME MATCHES "OS390")
532   option(LLVM_ENABLE_THREADS "Use threads if available." OFF)
533 else()
534   option(LLVM_ENABLE_THREADS "Use threads if available." ON)
535 endif()
537 set(LLVM_ENABLE_ZLIB "ON" CACHE STRING "Use zlib for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
539 set(LLVM_ENABLE_ZSTD "ON" CACHE STRING "Use zstd for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
541 set(LLVM_USE_STATIC_ZSTD FALSE CACHE BOOL "Use static version of zstd. Can be TRUE, FALSE")
543 set(LLVM_ENABLE_CURL "OFF" CACHE STRING "Use libcurl for the HTTP client if available. Can be ON, OFF, or FORCE_ON")
545 set(LLVM_ENABLE_HTTPLIB "OFF" CACHE STRING "Use cpp-httplib HTTP server library if available. Can be ON, OFF, or FORCE_ON")
547 set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")
549 option(LLVM_ENABLE_Z3_SOLVER
550   "Enable Support for the Z3 constraint solver in LLVM."
551   ${LLVM_ENABLE_Z3_SOLVER_DEFAULT}
554 if (LLVM_ENABLE_Z3_SOLVER)
555   find_package(Z3 4.7.1)
557   if (LLVM_Z3_INSTALL_DIR)
558     if (NOT Z3_FOUND)
559       message(FATAL_ERROR "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.")
560     endif()
561   endif()
563   if (NOT Z3_FOUND)
564     message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.")
565   endif()
567   set(LLVM_WITH_Z3 1)
568 endif()
570 set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}")
573 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
574   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
575 endif()
577 if(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD STREQUAL "all")
578   set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${LLVM_ALL_EXPERIMENTAL_TARGETS})
579 endif()
581 set(LLVM_TARGETS_TO_BUILD
582    ${LLVM_TARGETS_TO_BUILD}
583    ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
584 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
586 if (NOT CMAKE_SYSTEM_NAME MATCHES "OS390")
587   option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
588 endif()
589 option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
590 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
591   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON)
592 else()
593   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
594 endif()
595 option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
596 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
597 option(LLVM_ENABLE_LLVM_LIBC "Set to on to link all LLVM executables against LLVM libc, assuming it is accessible by the host compiler." OFF)
598 option(LLVM_STATIC_LINK_CXX_STDLIB "Statically link the standard library." OFF)
599 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
600 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
601 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
603 option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF)
604 option(LLVM_UNREACHABLE_OPTIMIZE "Optimize llvm_unreachable() as undefined behavior (default), guaranteed trap when OFF" ON)
606 if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
607   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
608 else()
609   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
610 endif()
612 option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
614 # While adding scalable vector support to LLVM, we temporarily want to
615 # allow an implicit conversion of TypeSize to uint64_t, and to allow
616 # code to get the fixed number of elements from a possibly scalable vector.
617 # This CMake flag enables a more strict mode where it asserts that the type
618 # is not a scalable vector type.
620 # Enabling this flag makes it easier to find cases where the compiler makes
621 # assumptions on the size being 'fixed size', when building tests for
622 # SVE/SVE2 or other scalable vector architectures.
623 option(LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS
624        "Enable assertions that type is not scalable in implicit conversion from TypeSize to uint64_t and calls to getNumElements" OFF)
626 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
627   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
629 option(LLVM_FORCE_USE_OLD_TOOLCHAIN
630        "Set to ON to force using an old, unsupported host toolchain." OFF)
632 set(LLVM_LOCAL_RPATH "" CACHE FILEPATH
633   "If set, an absolute path added as rpath on binaries that do not already contain an executable-relative rpath.")
635 option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
636        "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
638 option(LLVM_USE_INTEL_JITEVENTS
639   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
640   OFF)
642 if( LLVM_USE_INTEL_JITEVENTS )
643   # Verify we are on a supported platform
644   if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
645     message(FATAL_ERROR
646       "Intel JIT API support is available on Linux and Windows only.")
647   endif()
648 endif( LLVM_USE_INTEL_JITEVENTS )
650 option(LLVM_USE_OPROFILE
651   "Use opagent JIT interface to inform OProfile about JIT code" OFF)
653 option(LLVM_EXTERNALIZE_DEBUGINFO
654   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
656 option(LLVM_EXPERIMENTAL_DEBUGINFO_ITERATORS
657   "Add extra Booleans to ilist_iterators to communicate facts for debug-info" OFF)
659 set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING
660   "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)")
662 # If enabled, verify we are on a platform that supports oprofile.
663 if( LLVM_USE_OPROFILE )
664   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
665     message(FATAL_ERROR "OProfile support is available on Linux only.")
666   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
667 endif( LLVM_USE_OPROFILE )
669 option(LLVM_USE_PERF
670   "Use perf JIT interface to inform perf about JIT code" OFF)
672 # If enabled, verify we are on a platform that supports perf.
673 if( LLVM_USE_PERF )
674   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
675     message(FATAL_ERROR "perf support is available on Linux only.")
676   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
677 endif( LLVM_USE_PERF )
679 set(LLVM_USE_SANITIZER "" CACHE STRING
680   "Define the sanitizer used to build binaries and tests.")
681 option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
682 set(LLVM_UBSAN_FLAGS
683     "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
684     CACHE STRING
685     "Compile flags set to enable UBSan. Only used if LLVM_USE_SANITIZER contains 'Undefined'.")
686 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
687   "Path to fuzzing library for linking with fuzz targets")
689 option(LLVM_USE_SPLIT_DWARF
690   "Use -gsplit-dwarf when compiling llvm and --gdb-index when linking." OFF)
692 # Define an option controlling whether we should build for 32-bit on 64-bit
693 # platforms, where supported.
694 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT (WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX"))
695   # TODO: support other platforms and toolchains.
696   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
697 endif()
699 # Define the default arguments to use with 'lit', and an option for the user to
700 # override.
701 set(LIT_ARGS_DEFAULT "-sv")
702 if (MSVC_IDE OR XCODE)
703   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
704 endif()
705 if(LLVM_INDIVIDUAL_TEST_COVERAGE)
706    set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --per-test-coverage")
707 endif()
708 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
710 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
711 if( WIN32 AND NOT CYGWIN )
712   set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
713 endif()
714 set(LLVM_NATIVE_TOOL_DIR "" CACHE PATH "Path to a directory containing prebuilt matching native tools (such as llvm-tblgen)")
716 set(LLVM_INTEGRATED_CRT_ALLOC "" CACHE PATH "Replace the Windows CRT allocator with any of {rpmalloc|mimalloc|snmalloc}. Only works with CMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded.")
717 if(LLVM_INTEGRATED_CRT_ALLOC)
718   if(NOT WIN32)
719     message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC is only supported on Windows.")
720   endif()
721   if(LLVM_USE_SANITIZER)
722     message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC cannot be used along with LLVM_USE_SANITIZER!")
723   endif()
724   if(CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
725     message(FATAL_ERROR "The Debug target isn't supported along with LLVM_INTEGRATED_CRT_ALLOC!")
726   endif()
727 endif()
729 # Define options to control the inclusion and default build behavior for
730 # components which may not strictly be necessary (tools, examples, and tests).
732 # This is primarily to support building smaller or faster project files.
733 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
734 option(LLVM_BUILD_TOOLS
735   "Build the LLVM tools. If OFF, just generate build targets." ON)
737 option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
738 option(LLVM_BUILD_UTILS
739   "Build LLVM utility binaries. If OFF, just generate build targets." ON)
741 option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
742 option(LLVM_BUILD_RUNTIMES
743   "Build the LLVM runtimes. If OFF, just generate build targets." ON)
745 option(LLVM_BUILD_RUNTIME
746   "Build the LLVM runtime libraries." ON)
747 option(LLVM_BUILD_EXAMPLES
748   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
749 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
751 if(LLVM_BUILD_EXAMPLES)
752   add_compile_definitions(BUILD_EXAMPLES)
753 endif(LLVM_BUILD_EXAMPLES)
755 option(LLVM_BUILD_TESTS
756   "Build LLVM unit tests. If OFF, just generate build targets." OFF)
757 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
759 option(LLVM_INSTALL_GTEST
760   "Install the llvm gtest library.  This should be on if you want to do
761    stand-alone builds of the other projects and run their unit tests." OFF)
763 option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default
764 targets. If OFF, benchmarks still could be built using Benchmarks target." OFF)
765 option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON)
767 option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
768 option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
769 option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
770 option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
771 option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
772 option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
774 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/llvm/doxygen-html"
775     CACHE STRING "Doxygen-generated HTML documentation install directory")
776 set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/llvm/ocaml-html"
777     CACHE STRING "OCamldoc-generated HTML documentation install directory")
779 option (LLVM_BUILD_EXTERNAL_COMPILER_RT
780   "Build compiler-rt as an external project." OFF)
782 option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
783   "Show target and host info when tools are invoked with --version." ON)
785 # You can configure which libraries from LLVM you want to include in the
786 # shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
787 # list of LLVM components. All component names handled by llvm-config are valid.
788 if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
789   set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
790     "Semicolon-separated list of components to include in libLLVM, or \"all\".")
791 endif()
793 if(MSVC)
794   option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
795   # Set this variable to OFF here so it can't be set with a command-line
796   # argument.
797   set (LLVM_LINK_LLVM_DYLIB OFF)
798   if (BUILD_SHARED_LIBS)
799     message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.")
800   endif()
801 else()
802   option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
803   option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
804   set(LLVM_BUILD_LLVM_DYLIB_default OFF)
805   if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
806     set(LLVM_BUILD_LLVM_DYLIB_default ON)
807   endif()
808   option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
809 endif()
811 if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS)
812   message(FATAL_ERROR "Cannot enable BUILD_SHARED_LIBS with LLVM_LINK_LLVM_DYLIB.  We recommend disabling BUILD_SHARED_LIBS.")
813 endif()
815 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
816 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
817   set(LLVM_USE_HOST_TOOLS ON)
818 endif()
820 option(LLVM_OMIT_DAGISEL_COMMENTS "Do not add comments to DAG ISel" ON)
821 if (CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE MATCHES "^(RELWITHDEBINFO|DEBUG)$")
822   set(LLVM_OMIT_DAGISEL_COMMENTS OFF)
823 endif()
825 if (MSVC_IDE)
826   option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
827 endif()
829 if(NOT LLVM_INDIVIDUAL_TEST_COVERAGE)
830   if(LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR LLVM_ENABLE_IR_PGO)
831     if(NOT LLVM_PROFILE_MERGE_POOL_SIZE)
832       # A pool size of 1-2 is probably sufficient on an SSD. 3-4 should be fine
833       # for spinning disks. Anything higher may only help on slower mediums.
834       set(LLVM_PROFILE_MERGE_POOL_SIZE "4")
835     endif()
836     if(NOT LLVM_PROFILE_FILE_PATTERN)
837       if(NOT LLVM_PROFILE_DATA_DIR)
838         file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR)
839       endif()
840       file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
841     endif()
842     if(NOT LLVM_CSPROFILE_FILE_PATTERN)
843       if(NOT LLVM_CSPROFILE_DATA_DIR)
844         file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR)
845       endif()
846       file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN)
847     endif()
848   endif()
849 endif()
851 if (LLVM_BUILD_STATIC)
852   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
853   # Remove shared library suffixes from use in find_library
854   foreach (shared_lib_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_IMPORT_LIBRARY_SUFFIX})
855     list(FIND CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix} shared_lib_suffix_idx)
856     if(NOT ${shared_lib_suffix_idx} EQUAL -1)
857       list(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix_idx})
858     endif()
859   endforeach()
860 endif()
862 # Use libtool instead of ar if you are both on an Apple host, and targeting Apple.
863 if(CMAKE_HOST_APPLE AND APPLE)
864   include(UseLibtool)
865 endif()
867 # Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
868 set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
869 mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
871 if(CMAKE_SYSTEM_NAME MATCHES "BSD|Linux|OS390")
872   set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default ON)
873 else()
874   set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default OFF)
875 endif()
876 set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default} CACHE BOOL
877   "Enable per-target runtimes directory")
879 set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
880   "Profiling data file to use when compiling in order to improve runtime performance.")
882 if(LLVM_INCLUDE_TESTS)
883   # Lit test suite requires at least python 3.6
884   set(LLVM_MINIMUM_PYTHON_VERSION 3.6)
885 else()
886   # FIXME: it is unknown if this is the actual minimum bound
887   set(LLVM_MINIMUM_PYTHON_VERSION 3.0)
888 endif()
890 # Find python before including config-ix, since it needs to be able to search
891 # for python modules.
892 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
893     COMPONENTS Interpreter)
895 # All options referred to from HandleLLVMOptions have to be specified
896 # BEFORE this include, otherwise options will not be correctly set on
897 # first cmake run
898 include(config-ix)
900 # By default, we target the host, but this can be overridden at CMake
901 # invocation time. Except on 64-bit AIX, where the system toolchain
902 # expect 32-bit objects by default.
903 if("${LLVM_HOST_TRIPLE}" MATCHES "^powerpc64-ibm-aix")
904   string(REGEX REPLACE "^powerpc64" "powerpc" LLVM_DEFAULT_TARGET_TRIPLE_DEFAULT "${LLVM_HOST_TRIPLE}")
905 else()
906   # Only set default triple when native target is enabled.
907   if (LLVM_NATIVE_TARGET)
908     set(LLVM_DEFAULT_TARGET_TRIPLE_DEFAULT "${LLVM_HOST_TRIPLE}")
909   endif()
910 endif()
912 set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE_DEFAULT}" CACHE STRING
913     "Default target for which LLVM will generate code." )
914 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
916 set(LLVM_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
918 if(WIN32 OR CYGWIN)
919   if(BUILD_SHARED_LIBS OR LLVM_BUILD_LLVM_DYLIB)
920     set(LLVM_ENABLE_PLUGINS_default ON)
921   else()
922     set(LLVM_ENABLE_PLUGINS_default OFF)
923   endif()
924 else()
925   set(LLVM_ENABLE_PLUGINS_default ${LLVM_ENABLE_PIC})
926 endif()
927 option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default})
929 set(LLVM_ENABLE_NEW_PASS_MANAGER TRUE CACHE BOOL
930   "Enable the new pass manager by default.")
931 if(NOT LLVM_ENABLE_NEW_PASS_MANAGER)
932   message(FATAL_ERROR "Enabling the legacy pass manager on the cmake level is"
933                       " no longer supported.")
934 endif()
936 include(HandleLLVMOptions)
938 ######
940 # Configure all of the various header file fragments LLVM uses which depend on
941 # configuration variables.
942 set(LLVM_ENUM_TARGETS "")
943 set(LLVM_ENUM_ASM_PRINTERS "")
944 set(LLVM_ENUM_ASM_PARSERS "")
945 set(LLVM_ENUM_DISASSEMBLERS "")
946 set(LLVM_ENUM_TARGETMCAS "")
947 set(LLVM_ENUM_EXEGESIS "")
948 foreach(t ${LLVM_TARGETS_TO_BUILD})
949   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
951   # Make sure that any experimental targets were passed via
952   # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD.
953   # We allow experimental targets that are not in LLVM_ALL_EXPERIMENTAL_TARGETS,
954   # as long as they are passed via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.
955   if ( NOT "${t}" IN_LIST LLVM_ALL_TARGETS AND NOT "${t}" IN_LIST LLVM_EXPERIMENTAL_TARGETS_TO_BUILD )
956     if( "${t}" IN_LIST LLVM_ALL_EXPERIMENTAL_TARGETS )
957       message(FATAL_ERROR "The target `${t}' is experimental and must be passed "
958         "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.")
959     else()
960       message(FATAL_ERROR "The target `${t}' is not a core tier target. It may be "
961         "experimental, if so it must be passed via "
962         "LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.\n"
963         "Core tier targets: ${LLVM_ALL_TARGETS}\n"
964         "Known experimental targets: ${LLVM_ALL_EXPERIMENTAL_TARGETS}")
965     endif()
966   else()
967     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n")
968     string(TOUPPER ${t} T_UPPER)
969     set(LLVM_HAS_${T_UPPER}_TARGET 1)
970   endif()
972   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
973   if( asmp_file )
974     set(LLVM_ENUM_ASM_PRINTERS
975       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
976   endif()
977   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
978     set(LLVM_ENUM_ASM_PARSERS
979       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
980   endif()
981   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
982     set(LLVM_ENUM_DISASSEMBLERS
983       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
984   endif()
985   if( EXISTS ${td}/MCA/CMakeLists.txt )
986     set(LLVM_ENUM_TARGETMCAS
987       "${LLVM_ENUM_TARGETMCAS}LLVM_TARGETMCA(${t})\n")
988   endif()
989   if( EXISTS ${LLVM_MAIN_SRC_DIR}/tools/llvm-exegesis/lib/${t}/CMakeLists.txt )
990     set(LLVM_ENUM_EXEGESIS
991       "${LLVM_ENUM_EXEGESIS}LLVM_EXEGESIS(${t})\n")
992   endif()
993 endforeach(t)
995 # Provide an LLVM_ namespaced alias for use in #cmakedefine.
996 set(LLVM_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
998 # Produce the target definition files, which provide a way for clients to easily
999 # include various classes of targets.
1000 configure_file(
1001   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
1002   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
1003   )
1004 configure_file(
1005   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
1006   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
1007   )
1008 configure_file(
1009   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
1010   ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
1011   )
1012 configure_file(
1013   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
1014   ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
1015   )
1016 configure_file(
1017   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/TargetMCAs.def.in
1018   ${LLVM_INCLUDE_DIR}/llvm/Config/TargetMCAs.def
1019   )
1020 configure_file(
1021   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/TargetExegesis.def.in
1022   ${LLVM_INCLUDE_DIR}/llvm/Config/TargetExegesis.def
1023   )
1025 # They are not referenced. See set_output_directory().
1026 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
1027 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_LIBRARY_DIR} )
1028 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBRARY_DIR} )
1030 # For up-to-date instructions for installing the TFLite dependency, refer to
1031 # the bot setup script: https://github.com/google/ml-compiler-opt/blob/main/buildbot/buildbot_init.sh
1032 set(LLVM_HAVE_TFLITE "" CACHE BOOL "Use tflite")
1033 if (LLVM_HAVE_TFLITE)
1034   find_package(tensorflow-lite REQUIRED)
1035 endif()
1037 # For up-to-date instructions for installing the Tensorflow dependency, refer to
1038 # the bot setup script: https://github.com/google/ml-compiler-opt/blob/main/buildbot/buildbot_init.sh
1039 # Specifically, assuming python3 is installed:
1040 # python3 -m pip install --upgrade pip && python3 -m pip install --user tf_nightly==2.3.0.dev20200528
1041 # Then set TENSORFLOW_AOT_PATH to the package install - usually it's ~/.local/lib/python3.7/site-packages/tensorflow
1043 set(TENSORFLOW_AOT_PATH "" CACHE PATH "Path to TensorFlow pip install dir")
1045 if (NOT TENSORFLOW_AOT_PATH STREQUAL "")
1046   set(LLVM_HAVE_TF_AOT "ON" CACHE BOOL "Tensorflow AOT available")
1047   set(TENSORFLOW_AOT_COMPILER
1048     "${TENSORFLOW_AOT_PATH}/../../../../bin/saved_model_cli"
1049     CACHE PATH "Path to the Tensorflow AOT compiler")
1050   include_directories(${TENSORFLOW_AOT_PATH}/include)
1051   add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src
1052     ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime)
1053   install(TARGETS tf_xla_runtime EXPORT LLVMExports
1054     ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
1055   set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime)
1056   # Once we add more modules, we should handle this more automatically.
1057   if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL)
1058     set(LLVM_INLINER_MODEL_PATH "none")
1059   elseif(NOT DEFINED LLVM_INLINER_MODEL_PATH
1060       OR "${LLVM_INLINER_MODEL_PATH}" STREQUAL ""
1061       OR "${LLVM_INLINER_MODEL_PATH}" STREQUAL "autogenerate")
1062     set(LLVM_INLINER_MODEL_PATH "autogenerate")
1063     set(LLVM_INLINER_MODEL_AUTOGENERATED 1)
1064   endif()
1065   if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_REGALLOCEVICTMODEL)
1066     set(LLVM_RAEVICT_MODEL_PATH "none")
1067   elseif(NOT DEFINED LLVM_RAEVICT_MODEL_PATH
1068       OR "${LLVM_RAEVICT_MODEL_PATH}" STREQUAL ""
1069       OR "${LLVM_RAEVICT_MODEL_PATH}" STREQUAL "autogenerate")
1070     set(LLVM_RAEVICT_MODEL_PATH "autogenerate")
1071     set(LLVM_RAEVICT_MODEL_AUTOGENERATED 1)
1072   endif()
1074 endif()
1076 # Configure the three LLVM configuration header files.
1077 configure_file(
1078   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
1079   ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
1080 configure_file(
1081   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
1082   ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
1083 configure_file(
1084   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
1085   ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
1087 # Add target for generating source rpm package.
1088 set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
1089     CACHE FILEPATH ".spec file to use for srpm generation")
1090 set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
1091 set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
1093 get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository)
1094 string(LENGTH "${revision}" revision_length)
1095 set(LLVM_RPM_SPEC_REVISION "${revision}")
1097 configure_file(
1098   ${LLVM_SRPM_USER_BINARY_SPECFILE}
1099   ${LLVM_SRPM_BINARY_SPECFILE} @ONLY)
1101 add_custom_target(srpm
1102   COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES
1103   COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE})
1104 set_target_properties(srpm PROPERTIES FOLDER "Misc")
1106 if(APPLE AND DARWIN_LTO_LIBRARY)
1107   set(CMAKE_EXE_LINKER_FLAGS
1108     "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
1109   set(CMAKE_SHARED_LINKER_FLAGS
1110     "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
1111   set(CMAKE_MODULE_LINKER_FLAGS
1112     "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
1113 endif()
1115 # Build with _XOPEN_SOURCE on AIX, as stray macros in _ALL_SOURCE mode tend to
1116 # break things. In this case we need to enable the large-file API as well.
1117 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
1118           add_compile_definitions(_XOPEN_SOURCE=700)
1119           add_compile_definitions(_LARGE_FILE_API)
1121   # Modules should be built with -shared -Wl,-G, so we can use runtime linking
1122   # with plugins.
1123   string(APPEND CMAKE_MODULE_LINKER_FLAGS " -shared -Wl,-G")
1125   # Also set the correct flags for building shared libraries.
1126   string(APPEND CMAKE_SHARED_LINKER_FLAGS " -shared")
1127 endif()
1129 # Build with _XOPEN_SOURCE on z/OS.
1130 if (CMAKE_SYSTEM_NAME MATCHES "OS390")
1131   add_compile_definitions(_XOPEN_SOURCE=600)
1132   add_compile_definitions(_OPEN_SYS) # Needed for process information.
1133   add_compile_definitions(_OPEN_SYS_FILE_EXT) # Needed for EBCDIC I/O.
1134   add_compile_definitions(_EXT) # Needed for file data.
1135   add_compile_definitions(_UNIX03_THREADS) # Multithreading support.
1136 endif()
1138 # Build with _FILE_OFFSET_BITS=64 on Solaris to match g++ >= 9.
1139 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
1140           add_compile_definitions(_FILE_OFFSET_BITS=64)
1141 endif()
1143 set(CMAKE_INCLUDE_CURRENT_DIR ON)
1145 include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
1147 # when crosscompiling import the executable targets from a file
1148 if(LLVM_USE_HOST_TOOLS)
1149   include(CrossCompile)
1150   llvm_create_cross_target(LLVM NATIVE "" Release)
1151 endif(LLVM_USE_HOST_TOOLS)
1152 if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
1153 # Dummy use to avoid CMake Warning: Manually-specified variables were not used
1154 # (this is a variable that CrossCompile sets on recursive invocations)
1155 endif()
1157 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
1158    # special hack for Solaris to handle crazy system sys/regset.h
1159    include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
1160 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
1162 # Make sure we don't get -rdynamic in every binary. For those that need it,
1163 # use export_executable_symbols(target).
1164 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
1166 include(AddLLVM)
1167 include(TableGen)
1169 include(LLVMDistributionSupport)
1171 if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
1172   # People report that -O3 is unreliable on MinGW. The traditional
1173   # build also uses -O2 for that reason:
1174   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
1175 endif()
1177 if(LLVM_INCLUDE_TESTS)
1178   umbrella_lit_testsuite_begin(check-all)
1179 endif()
1181 # Put this before tblgen. Else we have a circular dependence.
1182 add_subdirectory(lib/Demangle)
1183 add_subdirectory(lib/Support)
1184 add_subdirectory(lib/TableGen)
1186 add_subdirectory(utils/TableGen)
1188 add_subdirectory(include)
1190 add_subdirectory(lib)
1192 if( LLVM_INCLUDE_UTILS )
1193   add_subdirectory(utils/FileCheck)
1194   add_subdirectory(utils/PerfectShuffle)
1195   add_subdirectory(utils/count)
1196   add_subdirectory(utils/not)
1197   add_subdirectory(utils/UnicodeData)
1198   add_subdirectory(utils/yaml-bench)
1199   add_subdirectory(utils/split-file)
1200   if( LLVM_INCLUDE_TESTS )
1201     add_subdirectory(${LLVM_THIRD_PARTY_DIR}/unittest ${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest)
1202   endif()
1203 else()
1204   if ( LLVM_INCLUDE_TESTS )
1205     message(FATAL_ERROR "Including tests when not building utils will not work.
1206     Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.")
1207   endif()
1208 endif()
1210 # Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
1211 if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
1212   add_subdirectory(utils/LLVMVisualizers)
1213 endif()
1215 foreach( binding ${LLVM_BINDINGS_LIST} )
1216   if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
1217     add_subdirectory(bindings/${binding})
1218   endif()
1219 endforeach()
1221 add_subdirectory(projects)
1223 if( LLVM_INCLUDE_TOOLS )
1224   add_subdirectory(tools)
1225 endif()
1227 if( LLVM_INCLUDE_RUNTIMES )
1228   add_subdirectory(runtimes)
1229 endif()
1231 if( LLVM_INCLUDE_EXAMPLES )
1232   add_subdirectory(examples)
1233 endif()
1235 if( LLVM_INCLUDE_TESTS )
1236   set(LLVM_GTEST_RUN_UNDER
1237     "" CACHE STRING
1238     "Define the wrapper program that LLVM unit tests should be run under.")
1239   if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang)
1240     include(LLVMExternalProjectUtils)
1241     llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
1242       USE_TOOLCHAIN
1243       EXCLUDE_FROM_ALL
1244       NO_INSTALL
1245       ALWAYS_CLEAN)
1246   endif()
1247   add_subdirectory(utils/lit)
1248   add_subdirectory(test)
1249   add_subdirectory(unittests)
1251   if (WIN32)
1252     # This utility is used to prevent crashing tests from calling Dr. Watson on
1253     # Windows.
1254     add_subdirectory(utils/KillTheDoctor)
1255   endif()
1257   umbrella_lit_testsuite_end(check-all)
1258   get_property(LLVM_ALL_LIT_DEPENDS GLOBAL PROPERTY LLVM_ALL_LIT_DEPENDS)
1259   get_property(LLVM_ALL_ADDITIONAL_TEST_DEPENDS
1260       GLOBAL PROPERTY LLVM_ALL_ADDITIONAL_TEST_DEPENDS)
1261   add_custom_target(test-depends
1262       DEPENDS ${LLVM_ALL_LIT_DEPENDS} ${LLVM_ALL_ADDITIONAL_TEST_DEPENDS})
1263   set_target_properties(test-depends PROPERTIES FOLDER "Tests")
1264   add_dependencies(check-all test-depends)
1265 endif()
1267 if (LLVM_INCLUDE_DOCS)
1268   add_subdirectory(docs)
1269 endif()
1271 add_subdirectory(cmake/modules)
1273 # Do this last so that all lit targets have already been created.
1274 if (LLVM_INCLUDE_UTILS)
1275   add_subdirectory(utils/llvm-lit)
1276 endif()
1278 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1279   install(DIRECTORY include/llvm include/llvm-c
1280     DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1281     COMPONENT llvm-headers
1282     FILES_MATCHING
1283     PATTERN "*.def"
1284     PATTERN "*.h"
1285     PATTERN "*.td"
1286     PATTERN "*.inc"
1287     PATTERN "LICENSE.TXT"
1288     )
1290   install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c
1291     DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1292     COMPONENT llvm-headers
1293     FILES_MATCHING
1294     PATTERN "*.def"
1295     PATTERN "*.h"
1296     PATTERN "*.gen"
1297     PATTERN "*.inc"
1298     # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
1299     PATTERN "CMakeFiles" EXCLUDE
1300     PATTERN "config.h" EXCLUDE
1301     )
1303   if (LLVM_INSTALL_MODULEMAPS)
1304     install(DIRECTORY include
1305             DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1306             COMPONENT llvm-headers
1307             FILES_MATCHING
1308             PATTERN "module.modulemap"
1309             )
1310     install(FILES include/module.install.modulemap
1311             DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1312             COMPONENT llvm-headers
1313             RENAME "module.extern.modulemap"
1314             )
1315   endif(LLVM_INSTALL_MODULEMAPS)
1317   # Installing the headers needs to depend on generating any public
1318   # tablegen'd headers.
1319   add_custom_target(llvm-headers DEPENDS intrinsics_gen omp_gen)
1320   set_target_properties(llvm-headers PROPERTIES FOLDER "Misc")
1322   if (NOT LLVM_ENABLE_IDE)
1323     add_llvm_install_targets(install-llvm-headers
1324                              DEPENDS llvm-headers
1325                              COMPONENT llvm-headers)
1326   endif()
1328   # Custom target to install all libraries.
1329   add_custom_target(llvm-libraries)
1330   set_target_properties(llvm-libraries PROPERTIES FOLDER "Misc")
1332   if (NOT LLVM_ENABLE_IDE)
1333     add_llvm_install_targets(install-llvm-libraries
1334                              DEPENDS llvm-libraries
1335                              COMPONENT llvm-libraries)
1336   endif()
1338   get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS)
1339   if(LLVM_LIBS)
1340     list(REMOVE_DUPLICATES LLVM_LIBS)
1341     foreach(lib ${LLVM_LIBS})
1342       add_dependencies(llvm-libraries ${lib})
1343       if (NOT LLVM_ENABLE_IDE)
1344         add_dependencies(install-llvm-libraries install-${lib})
1345         add_dependencies(install-llvm-libraries-stripped install-${lib}-stripped)
1346       endif()
1347     endforeach()
1348   endif()
1349 endif()
1351 # This must be at the end of the LLVM root CMakeLists file because it must run
1352 # after all targets are created.
1353 llvm_distribution_add_targets()
1354 process_llvm_pass_plugins(GEN_CONFIG)
1355 include(CoverageReport)
1357 # This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
1358 if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
1359   include(InstallRequiredSystemLibraries)
1360 endif()
1362 if (LLVM_INCLUDE_BENCHMARKS)
1363   # Override benchmark defaults so that when the library itself is updated these
1364   # modifications are not lost.
1365   set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE)
1366   set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE)
1367   set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE)
1368   set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE)
1369   set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE)
1370   set(BENCHMARK_ENABLE_WERROR ${LLVM_ENABLE_WERROR} CACHE BOOL
1371     "Handle -Werror for Google Benchmark based on LLVM_ENABLE_WERROR" FORCE)
1372   # Since LLVM requires C++11 it is safe to assume that std::regex is available.
1373   set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE)
1374   add_subdirectory(${LLVM_THIRD_PARTY_DIR}/benchmark
1375     ${CMAKE_CURRENT_BINARY_DIR}/third-party/benchmark)
1376   add_subdirectory(benchmarks)
1377 endif()
1379 if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
1380   add_subdirectory(utils/llvm-locstats)
1381 endif()