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