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