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