[RISCV] Rename Mips instruction records to start with MIPS_. NFC (#125170)
[llvm-project.git] / llvm / CMakeLists.txt
blobc9ff3696e22d698681d00b718e1fd40c250a5626
1 # See docs/CMake.html for instructions about how to build LLVM with CMake.
3 cmake_minimum_required(VERSION 3.20.0)
5 include(CMakeDependentOption)
7 set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
8 include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
9   NO_POLICY_SCOPE)
11 # Builds with custom install names and installation rpath setups may not work
12 # in the build tree. Allow these cases to use CMake's default build tree
13 # behavior by setting `LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE` to do this.
14 option(LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE "If set, use CMake's default build tree install name directory logic (Darwin only)" OFF)
15 mark_as_advanced(LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE)
16 if(NOT LLVM_NO_INSTALL_NAME_DIR_FOR_BUILD_TREE)
17   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
18 endif()
20 include(${LLVM_COMMON_CMAKE_UTILS}/Modules/LLVMVersion.cmake)
22 set_directory_properties(PROPERTIES LLVM_VERSION_MAJOR "${LLVM_VERSION_MAJOR}")
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 and libclang-cpp.so"
31   set(LLVM_SHLIB_SYMBOL_VERSION "LLVM_${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}")
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 if (${CMAKE_SYSTEM_NAME} MATCHES "AIX")
121   # Disallow 'openmp' as a LLVM PROJECT on AIX as the supported way is to use
122   # LLVM_ENABLE_RUNTIMES.
123   list(REMOVE_ITEM LLVM_ALL_PROJECTS openmp)
124 endif()
126 # The flang project is not yet part of "all" projects (see C++ requirements)
127 set(LLVM_EXTRA_PROJECTS "flang")
128 # List of all known projects in the mono repo
129 set(LLVM_KNOWN_PROJECTS "${LLVM_ALL_PROJECTS};${LLVM_EXTRA_PROJECTS}")
130 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
131     "Semicolon-separated list of projects to build (${LLVM_KNOWN_PROJECTS}), or \"all\".")
132 # Make sure expansion happens first to not handle "all" in rest of the checks.
133 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
134   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
135 endif()
136 foreach(proj ${LLVM_ENABLE_PROJECTS})
137   if (NOT proj STREQUAL "llvm" AND NOT "${proj}" IN_LIST LLVM_KNOWN_PROJECTS)
138      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?")
139   endif()
140 endforeach()
142 if ("flang" IN_LIST LLVM_ENABLE_PROJECTS)
143   if (NOT "mlir" IN_LIST LLVM_ENABLE_PROJECTS)
144     message(STATUS "Enabling MLIR as a dependency to flang")
145     list(APPEND LLVM_ENABLE_PROJECTS "mlir")
146   endif()
148   if (NOT "clang" IN_LIST LLVM_ENABLE_PROJECTS)
149     message(FATAL_ERROR "Clang is not enabled, but is required for the Flang driver")
150   endif()
151 endif()
153 if ("libc" IN_LIST LLVM_ENABLE_PROJECTS)
154   message(WARNING "Using LLVM_ENABLE_PROJECTS=libc is deprecated now, and will "
155     "become a fatal error in the LLVM 21 release.  Please use "
156     "-DLLVM_ENABLE_RUNTIMES=libc or see the instructions at "
157     "https://libc.llvm.org/ for building the runtimes.")
158 endif()
160 if ("compiler-rt" IN_LIST LLVM_ENABLE_PROJECTS)
161   message(WARNING "Using LLVM_ENABLE_PROJECTS=compiler-rt is deprecated now, and will "
162     "become a fatal error in the LLVM 21 release.  Please use "
163     "-DLLVM_ENABLE_RUNTIMES=compiler-rt or see the instructions at "
164     "https://compiler-rt.llvm.org/ for building the runtimes.")
165 endif()
167 # Select the runtimes to build
169 # As we migrate runtimes to using the bootstrapping build, the set of default runtimes
170 # should grow as we remove those runtimes from LLVM_ENABLE_PROJECTS above.
171 set(LLVM_DEFAULT_RUNTIMES "libcxx;libcxxabi;libunwind")
172 set(LLVM_SUPPORTED_RUNTIMES "libc;libunwind;libcxxabi;pstl;libcxx;compiler-rt;openmp;llvm-libgcc;offload")
173 set(LLVM_ENABLE_RUNTIMES "" CACHE STRING
174   "Semicolon-separated list of runtimes to build, or \"all\" (${LLVM_DEFAULT_RUNTIMES}). Supported runtimes are ${LLVM_SUPPORTED_RUNTIMES}.")
175 if(LLVM_ENABLE_RUNTIMES STREQUAL "all")
176   set(LLVM_ENABLE_RUNTIMES ${LLVM_DEFAULT_RUNTIMES})
177 endif()
178 foreach(proj IN LISTS LLVM_ENABLE_RUNTIMES)
179   if (NOT "${proj}" IN_LIST LLVM_SUPPORTED_RUNTIMES)
180     message(FATAL_ERROR "Runtime \"${proj}\" is not a supported runtime. Supported runtimes are: ${LLVM_SUPPORTED_RUNTIMES}")
181   endif()
182 endforeach()
184 # Set a shorthand option to enable the GPU build of the 'libc' project.
185 option(LIBC_GPU_BUILD "Enable the 'libc' project targeting the GPU" OFF)
186 if(LIBC_GPU_BUILD)
187   if(LLVM_RUNTIME_TARGETS)
188     list(APPEND LLVM_RUNTIME_TARGETS "nvptx64-nvidia-cuda" "amdgcn-amd-amdhsa")
189   else()
190     set(LLVM_RUNTIME_TARGETS "default;nvptx64-nvidia-cuda;amdgcn-amd-amdhsa")
191   endif()
192   list(APPEND RUNTIMES_nvptx64-nvidia-cuda_LLVM_ENABLE_RUNTIMES "libc")
193   list(APPEND RUNTIMES_amdgcn-amd-amdhsa_LLVM_ENABLE_RUNTIMES "libc")
194 endif()
196 foreach(_name ${LLVM_RUNTIME_TARGETS})
197   if("libc" IN_LIST RUNTIMES_${_name}_LLVM_ENABLE_RUNTIMES)
198     if("${_name}" STREQUAL "amdgcn-amd-amdhsa" OR "${_name}" STREQUAL "nvptx64-nvidia-cuda")
199       set(LLVM_LIBC_GPU_BUILD ON)
200     endif()
201   endif()
202 endforeach()
203 if("${LIBC_TARGET_TRIPLE}" STREQUAL "amdgcn-amd-amdhsa" OR
204    "${LIBC_TARGET_TRIPLE}" STREQUAL "nvptx64-nvidia-cuda")
205   set(LLVM_LIBC_GPU_BUILD ON)
206 endif()
207 if (NOT "libc" IN_LIST LLVM_ENABLE_PROJECTS AND LLVM_LIBC_GPU_BUILD)
208   message(STATUS "Enabling libc project to build libc testing tools")
209   list(APPEND LLVM_ENABLE_PROJECTS "libc")
210 endif()
212 # LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
213 # `LLVM_ENABLE_PROJECTS` CMake cache variable.  This exists for
214 # several reasons:
216 # * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
217 # source of truth for which projects to build. This means we will ignore user
218 # supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
219 # them.
221 # * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
222 # non-empty list but now the user wishes to disable building all other projects
223 # by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
224 # need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
225 # building all the projects that were previously enabled.
226 set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
227 mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
229 if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
230   set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
231   foreach(proj ${LLVM_KNOWN_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
232     string(TOUPPER "${proj}" upper_proj)
233     string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
234     if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
235       message(STATUS "${proj} project is enabled")
236       set(SHOULD_ENABLE_PROJECT TRUE)
237       set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
238       if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
239         message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
240       endif()
241       if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" )
242         set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE)
243       else()
244         set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "")
245       endif()
246     elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
247       message(STATUS "${proj} project is enabled")
248       set(SHOULD_ENABLE_PROJECT TRUE)
249     else()
250       message(STATUS "${proj} project is disabled")
251       set(SHOULD_ENABLE_PROJECT FALSE)
252     endif()
253     # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
254     # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
255     # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
256     # we should deprecate allowing users to set these variables by turning them
257     # into normal CMake variables rather than cache variables.
258     set(LLVM_TOOL_${upper_proj}_BUILD
259       ${SHOULD_ENABLE_PROJECT}
260       CACHE
261       BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
262     )
263   endforeach()
264 endif()
265 unset(SHOULD_ENABLE_PROJECT)
267 # Build llvm with ccache if the package is present
268 set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
269 if(LLVM_CCACHE_BUILD)
270   find_program(CCACHE_PROGRAM ccache)
271   if(CCACHE_PROGRAM)
272     set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache")
273     set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data")
274     set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes"
275         CACHE STRING "Parameters to pass through to ccache")
277     if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
278       set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}")
279       if (LLVM_CCACHE_MAXSIZE)
280         set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}")
281       endif()
282       if (LLVM_CCACHE_DIR)
283         set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}")
284       endif()
285       set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
286     else()
287       if(LLVM_CCACHE_MAXSIZE OR LLVM_CCACHE_DIR OR
288          NOT LLVM_CCACHE_PARAMS MATCHES "CCACHE_CPP2=yes CCACHE_HASHDIR=yes")
289         message(FATAL_ERROR "Ccache configuration through CMake is not supported on Windows. Please use environment variables.")
290       endif()
291       # RULE_LAUNCH_COMPILE should work with Ninja but currently has issues
292       # with cmd.exe and some MSVC tools other than cl.exe
293       set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
294       set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM})
295     endif()
296   else()
297     message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF")
298   endif()
299 endif()
301 set(LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS "" CACHE STRING
302   "Optional arguments for the native tool used in CMake --build invocations for external projects.")
303 mark_as_advanced(LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS)
305 option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF)
307 # Some features of the LLVM build may be disallowed when dependency debugging is
308 # enabled. In particular you cannot use ccache because we want to force compile
309 # operations to always happen.
310 if(LLVM_DEPENDENCY_DEBUGGING)
311   if(NOT CMAKE_HOST_APPLE)
312     message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.")
313   endif()
314   if(LLVM_CCACHE_BUILD)
315     message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.")
316   endif()
317 endif()
319 option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF)
320 option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF)
321 if(LLVM_ENABLE_GISEL_COV)
322   set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage")
323 endif()
325 # Add path for custom modules
326 list(INSERT CMAKE_MODULE_PATH 0
327   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
328   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
329   "${LLVM_COMMON_CMAKE_UTILS}/Modules"
330   )
332 # Generate a CompilationDatabase (compile_commands.json file) for our build,
333 # for use by clang_complete, YouCompleteMe, etc.
334 set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
336 option(LLVM_INSTALL_BINUTILS_SYMLINKS
337   "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
339 option(LLVM_INSTALL_CCTOOLS_SYMLINKS
340   "Install symlinks from the cctools tool names to the corresponding LLVM tools." OFF)
342 # By default we use symlinks on Unix platforms and copy binaries on Windows
343 # If you have the correct setup on Windows you can use this option to enable
344 # symlinks and save a lot of diskspace.
345 option(LLVM_USE_SYMLINKS "Use symlinks instead of copying binaries" ${CMAKE_HOST_UNIX})
347 option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
349 option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
351 # Unfortunatly Clang is too eager to search directories for module maps, which can cause the
352 # installed version of the maps to be found when building LLVM from source. Therefore we turn off
353 # the installation by default. See llvm.org/PR31905.
354 option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF)
356 option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
357 if ( LLVM_USE_FOLDERS )
358   set_property(GLOBAL PROPERTY USE_FOLDERS ON)
359 endif()
361 include(VersionFromVCS)
363 option(LLVM_APPEND_VC_REV
364   "Embed the version control system revision in LLVM" ON)
366 set(LLVM_FORCE_VC_REVISION
367   "" CACHE STRING "Force custom VC revision for LLVM_APPEND_VC_REV")
369 set(LLVM_FORCE_VC_REPOSITORY
370   "" CACHE STRING "Force custom VC repository for LLVM_APPEND_VC_REV")
372 option(LLVM_TOOL_LLVM_DRIVER_BUILD "Enables building the llvm multicall tool" OFF)
374 set(PACKAGE_NAME LLVM)
375 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
376 set(PACKAGE_BUGREPORT "https://github.com/llvm/llvm-project/issues/")
378 set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
379   "Default URL where bug reports are to be submitted.")
380 set(LLDB_BUG_REPORT_URL "${BUG_REPORT_URL}" CACHE STRING
381   "Default URL where lldb bug reports are to be submitted.")
383 # Configure CPack.
384 if(NOT DEFINED CPACK_PACKAGE_INSTALL_DIRECTORY)
385   set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM")
386 endif()
387 if(NOT DEFINED CPACK_PACKAGE_VENDOR)
388   set(CPACK_PACKAGE_VENDOR "LLVM")
389 endif()
390 set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
391 set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
392 set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH})
393 set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
394 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT")
395 if(WIN32 AND NOT UNIX)
396   set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32")
397   if(NOT DEFINED CPACK_PACKAGE_INSTALL_REGISTRY_KEY)
398     set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM")
399   endif()
400   set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp")
401   set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
402   set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
403   set(CPACK_NSIS_MODIFY_PATH "ON")
404   set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
405   if( CMAKE_CL_64 )
406     if(NOT DEFINED CPACK_NSIS_INSTALL_ROOT)
407       set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
408     endif()
409   endif()
410 endif()
411 include(CPack)
413 # Sanity check our source directory to make sure that we are not trying to
414 # generate an in-source build (unless on MSVC_IDE, where it is ok), and to make
415 # sure that we don't have any stray generated files lying around in the tree
416 # (which would end up getting picked up by header search, instead of the correct
417 # versions).
418 if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
419   message(FATAL_ERROR "In-source builds are not allowed.
420 Please create a directory and run cmake from there, passing the path
421 to this source directory as the last argument.
422 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
423 Please delete them.")
424 endif()
426 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
428 option(LLVM_ADDITIONAL_BUILD_TYPES "Additional build types that are allowed to be passed into CMAKE_BUILD_TYPE" "")
430 set(ALLOWED_BUILD_TYPES DEBUG RELEASE RELWITHDEBINFO MINSIZEREL ${LLVM_ADDITIONAL_BUILD_TYPES})
431 string (REPLACE ";" "|" ALLOWED_BUILD_TYPES_STRING "${ALLOWED_BUILD_TYPES}")
432 string (TOUPPER "${ALLOWED_BUILD_TYPES_STRING}" uppercase_ALLOWED_BUILD_TYPES)
434 if (CMAKE_BUILD_TYPE AND
435     NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(${uppercase_ALLOWED_BUILD_TYPES})$")
436   message(FATAL_ERROR "Unknown value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
437 endif()
439 # LLVM_INSTALL_PACKAGE_DIR needs to be declared prior to adding the tools
440 # subdirectory in order to have the value available for llvm-config.
441 include(GNUInstallPackageDir)
442 set(LLVM_INSTALL_PACKAGE_DIR "${CMAKE_INSTALL_PACKAGEDIR}/llvm" CACHE STRING
443   "Path for CMake subdirectory for LLVM (defaults to '${CMAKE_INSTALL_PACKAGEDIR}/llvm')")
445 set(LLVM_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE STRING
446     "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
447 mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
449 set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING
450     "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)")
451 mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
453 set(LLVM_EXAMPLES_INSTALL_DIR "examples" CACHE STRING
454     "Path for examples subdirectory (enabled by LLVM_BUILD_EXAMPLES=ON) (defaults to 'examples')")
455 mark_as_advanced(LLVM_EXAMPLES_INSTALL_DIR)
457 # They are used as destination of target generators.
458 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
459 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
460 if(WIN32 OR CYGWIN)
461   # DLL platform -- put DLLs into bin.
462   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
463 else()
464   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
465 endif()
467 # Each of them corresponds to llvm-config's.
468 set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir
469 set(LLVM_LIBRARY_DIR      ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir
470 set(LLVM_MAIN_SRC_DIR     ${CMAKE_CURRENT_SOURCE_DIR}  ) # --src-root
471 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir
472 set(LLVM_BINARY_DIR       ${CMAKE_CURRENT_BINARY_DIR}  ) # --prefix
475 # Note: LLVM_CMAKE_DIR does not include generated files
476 set(LLVM_CMAKE_DIR ${LLVM_MAIN_SRC_DIR}/cmake/modules)
477 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
478 set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
480 # List of all targets to be built by default:
481 set(LLVM_ALL_TARGETS
482   AArch64
483   AMDGPU
484   ARM
485   AVR
486   BPF
487   Hexagon
488   Lanai
489   LoongArch
490   Mips
491   MSP430
492   NVPTX
493   PowerPC
494   RISCV
495   Sparc
496   SPIRV
497   SystemZ
498   VE
499   WebAssembly
500   X86
501   XCore
502   )
504 set(LLVM_ALL_EXPERIMENTAL_TARGETS
505   ARC
506   CSKY
507   DirectX
508   M68k
509   Xtensa
512 # List of targets with JIT support:
513 set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
515 set(LLVM_TARGETS_TO_BUILD "all"
516     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
518 set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
519     CACHE STRING "Semicolon-separated list of experimental targets to build, or \"all\".")
521 option(BUILD_SHARED_LIBS
522   "Build all libraries as shared libraries instead of static" OFF)
524 option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON)
525 if(LLVM_ENABLE_BACKTRACES)
526   set(ENABLE_BACKTRACES 1)
527 endif()
529 option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON)
531 option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
532 if(LLVM_ENABLE_CRASH_OVERRIDES)
533   set(ENABLE_CRASH_OVERRIDES 1)
534 endif()
536 option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF)
538 set(LLVM_ENABLE_DEBUGLOC_COVERAGE_TRACKING "DISABLED" CACHE STRING
539   "Enhance Debugify's line number coverage tracking; enabling this is ABI-breaking. Can be DISABLED, or COVERAGE.")
540 set_property(CACHE LLVM_ENABLE_DEBUGLOC_COVERAGE_TRACKING PROPERTY STRINGS DISABLED COVERAGE)
542 set(WINDOWS_PREFER_FORWARD_SLASH_DEFAULT OFF)
543 if (MINGW)
544   # Cygwin doesn't identify itself as Windows, and thus gets path::Style::posix
545   # as native path style, regardless of what this is set to.
546   set(WINDOWS_PREFER_FORWARD_SLASH_DEFAULT ON)
547 endif()
548 option(LLVM_WINDOWS_PREFER_FORWARD_SLASH "Prefer path names with forward slashes on Windows." ${WINDOWS_PREFER_FORWARD_SLASH_DEFAULT})
550 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
551 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
552 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
554 set(LLVM_TARGET_ARCH "host"
555   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
557 set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
559 option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
561 option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)
563 # On z/OS, threads cannot be used because TLS is not supported.
564 if (CMAKE_SYSTEM_NAME MATCHES "OS390")
565   option(LLVM_ENABLE_THREADS "Use threads if available." OFF)
566 else()
567   option(LLVM_ENABLE_THREADS "Use threads if available." ON)
568 endif()
570 set(LLVM_ENABLE_ZLIB "ON" CACHE STRING "Use zlib for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
572 set(LLVM_ENABLE_ZSTD "ON" CACHE STRING "Use zstd for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
574 set(LLVM_USE_STATIC_ZSTD FALSE CACHE BOOL "Use static version of zstd. Can be TRUE, FALSE")
576 set(LLVM_ENABLE_CURL "OFF" CACHE STRING "Use libcurl for the HTTP client if available. Can be ON, OFF, or FORCE_ON")
578 set(LLVM_HAS_LOGF128 "OFF" CACHE STRING "Use logf128 to constant fold fp128 logarithm calls. Can be ON, OFF, or FORCE_ON")
580 set(LLVM_ENABLE_HTTPLIB "OFF" CACHE STRING "Use cpp-httplib HTTP server library if available. Can be ON, OFF, or FORCE_ON")
582 set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")
584 option(LLVM_ENABLE_Z3_SOLVER
585   "Enable Support for the Z3 constraint solver in LLVM."
586   ${LLVM_ENABLE_Z3_SOLVER_DEFAULT}
589 if (LLVM_ENABLE_Z3_SOLVER)
590   find_package(Z3 4.8.9)
592   if (LLVM_Z3_INSTALL_DIR)
593     if (NOT Z3_FOUND)
594       message(FATAL_ERROR "Z3 >= 4.8.9 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.")
595     endif()
596   endif()
598   if (NOT Z3_FOUND)
599     message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.")
600   endif()
602   set(LLVM_WITH_Z3 1)
603 endif()
605 set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}")
608 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
609   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
610 endif()
612 if(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD STREQUAL "all")
613   set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${LLVM_ALL_EXPERIMENTAL_TARGETS})
614 endif()
616 set(LLVM_TARGETS_TO_BUILD
617    ${LLVM_TARGETS_TO_BUILD}
618    ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
619 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
621 if (NOT CMAKE_SYSTEM_NAME MATCHES "OS390")
622   option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
623 endif()
624 option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
625 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
626   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON)
627 else()
628   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
629 endif()
630 option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
631 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
632 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)
633 option(LLVM_STATIC_LINK_CXX_STDLIB "Statically link the standard library." OFF)
634 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
635 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
636 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
638 option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF)
639 option(LLVM_UNREACHABLE_OPTIMIZE "Optimize llvm_unreachable() as undefined behavior (default), guaranteed trap when OFF" ON)
641 if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
642   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
643 else()
644   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
645 endif()
647 option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
649 # While adding scalable vector support to LLVM, we temporarily want to
650 # allow an implicit conversion of TypeSize to uint64_t, and to allow
651 # code to get the fixed number of elements from a possibly scalable vector.
652 # This CMake flag enables a more strict mode where it asserts that the type
653 # is not a scalable vector type.
655 # Enabling this flag makes it easier to find cases where the compiler makes
656 # assumptions on the size being 'fixed size', when building tests for
657 # SVE/SVE2 or other scalable vector architectures.
658 option(LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS
659        "Enable assertions that type is not scalable in implicit conversion from TypeSize to uint64_t and calls to getNumElements" OFF)
661 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
662   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
664 option(LLVM_FORCE_USE_OLD_TOOLCHAIN
665        "Set to ON to force using an old, unsupported host toolchain." OFF)
667 set(LLVM_LOCAL_RPATH "" CACHE FILEPATH
668   "If set, an absolute path added as rpath on binaries that do not already contain an executable-relative rpath.")
670 option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
671        "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
673 option(LLVM_USE_INTEL_JITEVENTS
674   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
675   OFF)
677 if( LLVM_USE_INTEL_JITEVENTS )
678   # Verify we are on a supported platform
679   if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
680     message(FATAL_ERROR
681       "Intel JIT API support is available on Linux and Windows only.")
682   endif()
683 endif( LLVM_USE_INTEL_JITEVENTS )
685 option(LLVM_USE_OPROFILE
686   "Use opagent JIT interface to inform OProfile about JIT code" OFF)
688 option(LLVM_EXTERNALIZE_DEBUGINFO
689   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
691 option(LLVM_ENABLE_EXPORTED_SYMBOLS_IN_EXECUTABLES
692   "Preserve exported symbols in executables" ON)
694 set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING
695   "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)")
697 # If enabled, verify we are on a platform that supports oprofile.
698 if( LLVM_USE_OPROFILE )
699   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
700     message(FATAL_ERROR "OProfile support is available on Linux only.")
701   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
702 endif( LLVM_USE_OPROFILE )
704 option(LLVM_USE_PERF
705   "Use perf JIT interface to inform perf about JIT code" OFF)
707 # If enabled, verify we are on a platform that supports perf.
708 if( LLVM_USE_PERF )
709   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
710     message(FATAL_ERROR "perf support is available on Linux only.")
711   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
712 endif( LLVM_USE_PERF )
714 set(LLVM_USE_SANITIZER "" CACHE STRING
715   "Define the sanitizer used to build binaries and tests.")
716 option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
717 set(LLVM_UBSAN_FLAGS
718     "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
719     CACHE STRING
720     "Compile flags set to enable UBSan. Only used if LLVM_USE_SANITIZER contains 'Undefined'.")
721 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
722   "Path to fuzzing library for linking with fuzz targets")
724 option(LLVM_USE_SPLIT_DWARF
725   "Use -gsplit-dwarf when compiling llvm and --gdb-index when linking." OFF)
727 # Define an option controlling whether we should build for 32-bit on 64-bit
728 # platforms, where supported.
729 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT (WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX"))
730   # TODO: support other platforms and toolchains.
731   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
732 endif()
734 # Define the default arguments to use with 'lit', and an option for the user to
735 # override.
736 set(LIT_ARGS_DEFAULT "-sv")
737 if (MSVC_IDE OR XCODE)
738   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
739 endif()
740 if(LLVM_INDIVIDUAL_TEST_COVERAGE)
741    set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --per-test-coverage")
742 endif()
743 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
745 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
746 if( WIN32 AND NOT CYGWIN )
747   set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
748 endif()
749 set(LLVM_NATIVE_TOOL_DIR "" CACHE PATH "Path to a directory containing prebuilt matching native tools (such as llvm-tblgen)")
751 set(LLVM_ENABLE_RPMALLOC "" CACHE BOOL "Replace the CRT allocator with rpmalloc.")
752 if(LLVM_ENABLE_RPMALLOC)
753   if(NOT (CMAKE_SYSTEM_NAME MATCHES "Windows|Linux"))
754     message(FATAL_ERROR "LLVM_ENABLE_RPMALLOC is only supported on Windows and Linux.")
755   endif()
756   if(LLVM_USE_SANITIZER)
757     message(FATAL_ERROR "LLVM_ENABLE_RPMALLOC cannot be used along with LLVM_USE_SANITIZER!")
758   endif()
759   if(WIN32)
760     if(CMAKE_CONFIGURATION_TYPES)
761       foreach(BUILD_MODE ${CMAKE_CONFIGURATION_TYPES})
762         string(TOUPPER "${BUILD_MODE}" uppercase_BUILD_MODE)
763         if(uppercase_BUILD_MODE STREQUAL "DEBUG")
764           message(WARNING "The Debug target isn't supported along with LLVM_ENABLE_RPMALLOC!")
765         endif()
766       endforeach()
767     else()
768       if(CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
769         message(FATAL_ERROR "The Debug target isn't supported along with LLVM_ENABLE_RPMALLOC!")
770       endif()
771     endif()
772   endif()
774   # Override the C runtime allocator with the in-tree rpmalloc
775   set(LLVM_INTEGRATED_CRT_ALLOC "${CMAKE_CURRENT_SOURCE_DIR}/lib/Support")
776   set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded")
777 endif()
779 set(LLVM_INTEGRATED_CRT_ALLOC "${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.")
780 if(LLVM_INTEGRATED_CRT_ALLOC)
781   if(NOT WIN32)
782     message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC is only supported on Windows.")
783   endif()
784   if(LLVM_USE_SANITIZER)
785     message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC cannot be used along with LLVM_USE_SANITIZER!")
786   endif()
787   if(CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
788     message(FATAL_ERROR "The Debug target isn't supported along with LLVM_INTEGRATED_CRT_ALLOC!")
789   endif()
790 endif()
792 # Define options to control the inclusion and default build behavior for
793 # components which may not strictly be necessary (tools, examples, and tests).
795 # This is primarily to support building smaller or faster project files.
796 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
797 option(LLVM_BUILD_TOOLS
798   "Build the LLVM tools. If OFF, just generate build targets." ON)
800 option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
801 option(LLVM_BUILD_UTILS
802   "Build LLVM utility binaries. If OFF, just generate build targets." ON)
804 option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
805 option(LLVM_BUILD_RUNTIMES
806   "Build the LLVM runtimes. If OFF, just generate build targets." ON)
808 option(LLVM_BUILD_RUNTIME
809   "Build the LLVM runtime libraries." ON)
810 option(LLVM_BUILD_EXAMPLES
811   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
812 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
814 option(LLVM_BUILD_TESTS
815   "Build LLVM unit tests. If OFF, just generate build targets." OFF)
816 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
818 option(LLVM_INSTALL_GTEST
819   "Install the llvm gtest library.  This should be on if you want to do
820    stand-alone builds of the other projects and run their unit tests." OFF)
822 option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default
823 targets. If OFF, benchmarks still could be built using Benchmarks target." OFF)
824 option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON)
826 option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
827 option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
828 option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
829 option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
830 option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
831 option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
833 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/llvm/doxygen-html"
834     CACHE STRING "Doxygen-generated HTML documentation install directory")
835 set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/llvm/ocaml-html"
836     CACHE STRING "OCamldoc-generated HTML documentation install directory")
838 option (LLVM_BUILD_EXTERNAL_COMPILER_RT
839   "Build compiler-rt as an external project." OFF)
841 option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
842   "Show target and host info when tools are invoked with --version." ON)
844 option(LLVM_VERSION_PRINTER_SHOW_BUILD_CONFIG
845   "Show the optional build config flags when tools are invoked with --version." ON)
847 # You can configure which libraries from LLVM you want to include in the
848 # shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
849 # list of LLVM components. All component names handled by llvm-config are valid.
850 if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
851   set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
852     "Semicolon-separated list of components to include in libLLVM, or \"all\".")
853 endif()
855 if(MSVC)
856   option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
857   if (BUILD_SHARED_LIBS)
858     message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.")
859   endif()
860 else()
861   option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
862 endif()
864 # Used to test building the llvm shared library with explicit symbol visibility on
865 # Windows and Linux. For ELF platforms default symbols visibility is set to hidden.
866 set(LLVM_BUILD_LLVM_DYLIB_VIS FALSE CACHE BOOL "")
867 mark_as_advanced(LLVM_BUILD_LLVM_DYLIB_VIS)
869 set(CAN_BUILD_LLVM_DYLIB OFF)
870 if(NOT MSVC OR LLVM_BUILD_LLVM_DYLIB_VIS)
871   set(CAN_BUILD_LLVM_DYLIB ON)
872 endif()
874 cmake_dependent_option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF
875                        "CAN_BUILD_LLVM_DYLIB" OFF)
877 set(LLVM_BUILD_LLVM_DYLIB_default OFF)
878 if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
879   set(LLVM_BUILD_LLVM_DYLIB_default ON)
880 endif()
881 cmake_dependent_option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default}
882                        "CAN_BUILD_LLVM_DYLIB" OFF)
884 cmake_dependent_option(LLVM_DYLIB_EXPORT_INLINES "Force inline members of classes to be DLL exported when
885                        building with clang-cl so the libllvm DLL is compatible with MSVC"
886                        OFF
887                        "MSVC;LLVM_BUILD_LLVM_DYLIB_VIS" OFF)
889 if(LLVM_BUILD_LLVM_DYLIB_VIS)
890   set(LLVM_BUILD_LLVM_DYLIB ON)
891 endif()
893 if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS)
894   message(FATAL_ERROR "Cannot enable BUILD_SHARED_LIBS with LLVM_LINK_LLVM_DYLIB.  We recommend disabling BUILD_SHARED_LIBS.")
895 endif()
897 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
898 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
899   set(LLVM_USE_HOST_TOOLS ON)
900 endif()
902 option(LLVM_OMIT_DAGISEL_COMMENTS "Do not add comments to DAG ISel" ON)
903 if (CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE MATCHES "^(RELWITHDEBINFO|DEBUG)$")
904   set(LLVM_OMIT_DAGISEL_COMMENTS OFF)
905 endif()
907 if (MSVC_IDE)
908   option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
909 endif()
911 if(NOT LLVM_INDIVIDUAL_TEST_COVERAGE)
912   if(LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR LLVM_ENABLE_IR_PGO)
913     if(NOT LLVM_PROFILE_MERGE_POOL_SIZE)
914       # A pool size of 1-2 is probably sufficient on an SSD. 3-4 should be fine
915       # for spinning disks. Anything higher may only help on slower mediums.
916       set(LLVM_PROFILE_MERGE_POOL_SIZE "4")
917     endif()
918     if(NOT LLVM_PROFILE_FILE_PATTERN)
919       if(NOT LLVM_PROFILE_DATA_DIR)
920         file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR)
921       endif()
922       file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
923     endif()
924     if(NOT LLVM_CSPROFILE_FILE_PATTERN)
925       if(NOT LLVM_CSPROFILE_DATA_DIR)
926         file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR)
927       endif()
928       file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN)
929     endif()
930   endif()
931 endif()
933 if (LLVM_BUILD_STATIC)
934   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
935   # Remove shared library suffixes from use in find_library
936   foreach (shared_lib_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_IMPORT_LIBRARY_SUFFIX})
937     list(FIND CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix} shared_lib_suffix_idx)
938     if(NOT ${shared_lib_suffix_idx} EQUAL -1)
939       list(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix_idx})
940     endif()
941   endforeach()
942 endif()
944 # Use libtool instead of ar if you are both on an Apple host, and targeting Apple.
945 if(CMAKE_HOST_APPLE AND APPLE)
946   include(UseLibtool)
947 endif()
949 # Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
950 set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
951 mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
953 if(CMAKE_SYSTEM_NAME MATCHES "BSD|Linux|OS390")
954   set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default ON)
955 else()
956   set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default OFF)
957 endif()
958 set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR ${LLVM_ENABLE_PER_TARGET_RUNTIME_DIR_default} CACHE BOOL
959   "Enable per-target runtimes directory")
961 set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
962   "Profiling data file to use when compiling in order to improve runtime performance.")
964 if(LLVM_INCLUDE_TESTS)
965   # All LLVM Python files should be compatible down to this minimum version.
966   set(LLVM_MINIMUM_PYTHON_VERSION 3.8)
967 else()
968   # FIXME: it is unknown if this is the actual minimum bound
969   set(LLVM_MINIMUM_PYTHON_VERSION 3.0)
970 endif()
972 # Find python before including config-ix, since it needs to be able to search
973 # for python modules.
974 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
975     COMPONENTS Interpreter)
977 # All options referred to from HandleLLVMOptions have to be specified
978 # BEFORE this include, otherwise options will not be correctly set on
979 # first cmake run
980 include(config-ix)
982 # By default, we target the host, but this can be overridden at CMake
983 # invocation time. Except on 64-bit AIX, where the system toolchain
984 # expect 32-bit objects by default.
985 if("${LLVM_HOST_TRIPLE}" MATCHES "^powerpc64-ibm-aix")
986   string(REGEX REPLACE "^powerpc64" "powerpc" LLVM_DEFAULT_TARGET_TRIPLE_DEFAULT "${LLVM_HOST_TRIPLE}")
987 else()
988   # Only set default triple when native target is enabled.
989   if (LLVM_NATIVE_TARGET)
990     set(LLVM_DEFAULT_TARGET_TRIPLE_DEFAULT "${LLVM_HOST_TRIPLE}")
991   endif()
992 endif()
994 set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE_DEFAULT}" CACHE STRING
995     "Default target for which LLVM will generate code." )
996 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
998 set(LLVM_TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
1000 if(WIN32 OR CYGWIN)
1001   if(BUILD_SHARED_LIBS OR LLVM_BUILD_LLVM_DYLIB)
1002     set(LLVM_ENABLE_PLUGINS_default ON)
1003   else()
1004     set(LLVM_ENABLE_PLUGINS_default OFF)
1005   endif()
1006 else()
1007   set(LLVM_ENABLE_PLUGINS_default ${LLVM_ENABLE_PIC})
1008 endif()
1009 option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default})
1011 set(LLVM_ENABLE_NEW_PASS_MANAGER TRUE CACHE BOOL
1012   "Enable the new pass manager by default.")
1013 if(NOT LLVM_ENABLE_NEW_PASS_MANAGER)
1014   message(FATAL_ERROR "Enabling the legacy pass manager on the cmake level is"
1015                       " no longer supported.")
1016 endif()
1018 include(HandleLLVMOptions)
1020 ######
1022 # Configure all of the various header file fragments LLVM uses which depend on
1023 # configuration variables.
1024 set(LLVM_ENUM_TARGETS "")
1025 set(LLVM_ENUM_ASM_PRINTERS "")
1026 set(LLVM_ENUM_ASM_PARSERS "")
1027 set(LLVM_ENUM_DISASSEMBLERS "")
1028 set(LLVM_ENUM_TARGETMCAS "")
1029 set(LLVM_ENUM_EXEGESIS "")
1030 foreach(t ${LLVM_TARGETS_TO_BUILD})
1031   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
1033   # Make sure that any experimental targets were passed via
1034   # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD.
1035   # We allow experimental targets that are not in LLVM_ALL_EXPERIMENTAL_TARGETS,
1036   # as long as they are passed via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.
1037   if ( NOT "${t}" IN_LIST LLVM_ALL_TARGETS AND NOT "${t}" IN_LIST LLVM_EXPERIMENTAL_TARGETS_TO_BUILD )
1038     if( "${t}" IN_LIST LLVM_ALL_EXPERIMENTAL_TARGETS )
1039       message(FATAL_ERROR "The target `${t}' is experimental and must be passed "
1040         "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.")
1041     else()
1042       message(FATAL_ERROR "The target `${t}' is not a core tier target. It may be "
1043         "experimental, if so it must be passed via "
1044         "LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.\n"
1045         "Core tier targets: ${LLVM_ALL_TARGETS}\n"
1046         "Known experimental targets: ${LLVM_ALL_EXPERIMENTAL_TARGETS}")
1047     endif()
1048   else()
1049     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n")
1050     string(TOUPPER ${t} T_UPPER)
1051     set(LLVM_HAS_${T_UPPER}_TARGET 1)
1052   endif()
1054   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
1055   if( asmp_file )
1056     set(LLVM_ENUM_ASM_PRINTERS
1057       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
1058   endif()
1059   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
1060     set(LLVM_ENUM_ASM_PARSERS
1061       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
1062   endif()
1063   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
1064     set(LLVM_ENUM_DISASSEMBLERS
1065       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
1066   endif()
1067   if( EXISTS ${td}/MCA/CMakeLists.txt )
1068     set(LLVM_ENUM_TARGETMCAS
1069       "${LLVM_ENUM_TARGETMCAS}LLVM_TARGETMCA(${t})\n")
1070   endif()
1071   if( EXISTS ${LLVM_MAIN_SRC_DIR}/tools/llvm-exegesis/lib/${t}/CMakeLists.txt )
1072     set(LLVM_ENUM_EXEGESIS
1073       "${LLVM_ENUM_EXEGESIS}LLVM_EXEGESIS(${t})\n")
1074   endif()
1075 endforeach(t)
1077 # Provide an LLVM_ namespaced alias for use in #cmakedefine.
1078 set(LLVM_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
1080 # Produce the target definition files, which provide a way for clients to easily
1081 # include various classes of targets.
1082 configure_file(
1083   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
1084   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
1085   )
1086 configure_file(
1087   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
1088   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
1089   )
1090 configure_file(
1091   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
1092   ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
1093   )
1094 configure_file(
1095   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
1096   ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
1097   )
1098 configure_file(
1099   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/TargetMCAs.def.in
1100   ${LLVM_INCLUDE_DIR}/llvm/Config/TargetMCAs.def
1101   )
1102 configure_file(
1103   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/TargetExegesis.def.in
1104   ${LLVM_INCLUDE_DIR}/llvm/Config/TargetExegesis.def
1105   )
1107 # They are not referenced. See set_output_directory().
1108 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_TOOLS_BINARY_DIR} )
1109 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_LIBRARY_DIR} )
1110 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_LIBRARY_DIR} )
1112 # For up-to-date instructions for installing the TFLite dependency, refer to
1113 # the bot setup script: https://github.com/google/ml-compiler-opt/blob/main/buildbot/buildbot_init.sh
1114 set(LLVM_HAVE_TFLITE "" CACHE BOOL "Use tflite")
1115 if (LLVM_HAVE_TFLITE)
1116   find_package(tensorflow-lite REQUIRED)
1117 endif()
1119 # For up-to-date instructions for installing the Tensorflow dependency, refer to
1120 # the bot setup script: https://github.com/google/ml-compiler-opt/blob/main/buildbot/buildbot_init.sh
1121 # Specifically, assuming python3 is installed:
1122 # python3 -m pip install --upgrade pip && python3 -m pip install --user tf_nightly==2.3.0.dev20200528
1123 # Then set TENSORFLOW_AOT_PATH to the package install - usually it's ~/.local/lib/python3.7/site-packages/tensorflow
1125 set(TENSORFLOW_AOT_PATH "" CACHE PATH "Path to TensorFlow pip install dir")
1127 if (NOT TENSORFLOW_AOT_PATH STREQUAL "")
1128   set(LLVM_HAVE_TF_AOT "ON" CACHE BOOL "Tensorflow AOT available")
1129   set(TENSORFLOW_AOT_COMPILER
1130     "${TENSORFLOW_AOT_PATH}/../../../../bin/saved_model_cli"
1131     CACHE PATH "Path to the Tensorflow AOT compiler")
1132   include_directories(${TENSORFLOW_AOT_PATH}/include)
1133   add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src
1134     ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime)
1135   install(TARGETS tf_xla_runtime EXPORT LLVMExports
1136     ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
1137   install(TARGETS tf_xla_runtime EXPORT LLVMDevelopmentExports
1138     ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT tf_xla_runtime)
1139   set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS tf_xla_runtime)
1140   # Once we add more modules, we should handle this more automatically.
1141   if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_INLINERSIZEMODEL)
1142     set(LLVM_INLINER_MODEL_PATH "none")
1143   elseif(NOT DEFINED LLVM_INLINER_MODEL_PATH
1144       OR "${LLVM_INLINER_MODEL_PATH}" STREQUAL ""
1145       OR "${LLVM_INLINER_MODEL_PATH}" STREQUAL "autogenerate")
1146     set(LLVM_INLINER_MODEL_PATH "autogenerate")
1147     set(LLVM_INLINER_MODEL_AUTOGENERATED 1)
1148   endif()
1149   if (DEFINED LLVM_OVERRIDE_MODEL_HEADER_REGALLOCEVICTMODEL)
1150     set(LLVM_RAEVICT_MODEL_PATH "none")
1151   elseif(NOT DEFINED LLVM_RAEVICT_MODEL_PATH
1152       OR "${LLVM_RAEVICT_MODEL_PATH}" STREQUAL ""
1153       OR "${LLVM_RAEVICT_MODEL_PATH}" STREQUAL "autogenerate")
1154     set(LLVM_RAEVICT_MODEL_PATH "autogenerate")
1155     set(LLVM_RAEVICT_MODEL_AUTOGENERATED 1)
1156   endif()
1158 endif()
1160 # Configure the three LLVM configuration header files.
1161 configure_file(
1162   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
1163   ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
1164 configure_file(
1165   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
1166   ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
1167 configure_file(
1168   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
1169   ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
1171 if(APPLE AND DARWIN_LTO_LIBRARY)
1172   set(CMAKE_EXE_LINKER_FLAGS
1173     "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
1174   set(CMAKE_SHARED_LINKER_FLAGS
1175     "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
1176   set(CMAKE_MODULE_LINKER_FLAGS
1177     "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
1178 endif()
1180 # Build with _XOPEN_SOURCE on AIX, as stray macros in _ALL_SOURCE mode tend to
1181 # break things. In this case we need to enable the large-file API as well.
1182 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
1183           add_compile_definitions(_XOPEN_SOURCE=700)
1184           add_compile_definitions(_LARGE_FILE_API)
1186   # Modules should be built with -shared -Wl,-G, so we can use runtime linking
1187   # with plugins.
1188   string(APPEND CMAKE_MODULE_LINKER_FLAGS " -shared -Wl,-G")
1190   # Also set the correct flags for building shared libraries.
1191   string(APPEND CMAKE_SHARED_LINKER_FLAGS " -shared")
1192 endif()
1194 # Build with _XOPEN_SOURCE on z/OS.
1195 if (CMAKE_SYSTEM_NAME MATCHES "OS390")
1196   add_compile_definitions(_XOPEN_SOURCE=600)
1197   add_compile_definitions(_OPEN_SYS) # Needed for process information.
1198   add_compile_definitions(_OPEN_SYS_FILE_EXT) # Needed for EBCDIC I/O.
1199   add_compile_definitions(_EXT) # Needed for file data.
1200   add_compile_definitions(_UNIX03_THREADS) # Multithreading support.
1201   # Need to build LLVM as ASCII application.
1202   # This can't be a global setting because other projects may
1203   # need to be built in EBCDIC mode.
1204   append("-fzos-le-char-mode=ascii" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
1205   append("-m64" CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
1206 endif()
1208 # Build with _FILE_OFFSET_BITS=64 on Solaris to match g++ >= 9.
1209 if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
1210           add_compile_definitions(_FILE_OFFSET_BITS=64)
1211 endif()
1213 set(CMAKE_INCLUDE_CURRENT_DIR ON)
1215 include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
1217 # when crosscompiling import the executable targets from a file
1218 if(LLVM_USE_HOST_TOOLS)
1219   include(CrossCompile)
1220   llvm_create_cross_target(LLVM NATIVE "" Release)
1221 endif(LLVM_USE_HOST_TOOLS)
1222 if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
1223 # Dummy use to avoid CMake Warning: Manually-specified variables were not used
1224 # (this is a variable that CrossCompile sets on recursive invocations)
1225 endif()
1227 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
1228    # special hack for Solaris to handle crazy system sys/regset.h
1229    include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
1230 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
1232 # Make sure we don't get -rdynamic in every binary. For those that need it,
1233 # use EXPORT_SYMBOLS argument.
1234 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
1236 include(AddLLVM)
1237 include(TableGen)
1239 include(LLVMDistributionSupport)
1241 if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
1242   # People report that -O3 is unreliable on MinGW. The traditional
1243   # build also uses -O2 for that reason:
1244   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
1245 endif()
1247 if(LLVM_INCLUDE_TESTS)
1248   umbrella_lit_testsuite_begin(check-all)
1249 endif()
1251 # Put this before tblgen. Else we have a circular dependence.
1252 add_subdirectory(lib/Demangle)
1253 add_subdirectory(lib/Support)
1254 add_subdirectory(lib/TableGen)
1256 add_subdirectory(utils/TableGen)
1258 add_subdirectory(include)
1260 add_subdirectory(lib)
1262 if( LLVM_INCLUDE_UTILS )
1263   add_subdirectory(utils/FileCheck)
1264   add_subdirectory(utils/PerfectShuffle)
1265   add_subdirectory(utils/count)
1266   add_subdirectory(utils/not)
1267   add_subdirectory(utils/UnicodeData)
1268   add_subdirectory(utils/yaml-bench)
1269   add_subdirectory(utils/split-file)
1270   add_subdirectory(utils/mlgo-utils)
1271   if( LLVM_INCLUDE_TESTS )
1272     set(LLVM_SUBPROJECT_TITLE "Third-Party/Google Test")
1273     add_subdirectory(${LLVM_THIRD_PARTY_DIR}/unittest ${CMAKE_CURRENT_BINARY_DIR}/third-party/unittest)
1274     set(LLVM_SUBPROJECT_TITLE)
1275   endif()
1276 else()
1277   if ( LLVM_INCLUDE_TESTS )
1278     message(FATAL_ERROR "Including tests when not building utils will not work.
1279     Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.")
1280   endif()
1281 endif()
1283 # Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
1284 if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
1285   add_subdirectory(utils/LLVMVisualizers)
1286 endif()
1288 foreach( binding ${LLVM_BINDINGS_LIST} )
1289   if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
1290     add_subdirectory(bindings/${binding})
1291   endif()
1292 endforeach()
1294 add_subdirectory(projects)
1296 if( LLVM_INCLUDE_TOOLS )
1297   add_subdirectory(tools)
1298 endif()
1300 if( LLVM_INCLUDE_RUNTIMES )
1301   add_subdirectory(runtimes)
1302 endif()
1304 if( LLVM_INCLUDE_EXAMPLES )
1305   add_subdirectory(examples)
1306 endif()
1308 if( LLVM_INCLUDE_TESTS )
1309   set(LLVM_GTEST_RUN_UNDER
1310     "" CACHE STRING
1311     "Define the wrapper program that LLVM unit tests should be run under.")
1312   if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang)
1313     include(LLVMExternalProjectUtils)
1314     llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
1315       USE_TOOLCHAIN
1316       EXCLUDE_FROM_ALL
1317       NO_INSTALL
1318       ALWAYS_CLEAN)
1319   endif()
1320   add_subdirectory(utils/lit)
1321   add_subdirectory(test)
1322   add_subdirectory(unittests)
1324   if (WIN32)
1325     # This utility is used to prevent crashing tests from calling Dr. Watson on
1326     # Windows.
1327     add_subdirectory(utils/KillTheDoctor)
1328   endif()
1330   umbrella_lit_testsuite_end(check-all)
1331   get_property(LLVM_ALL_LIT_DEPENDS GLOBAL PROPERTY LLVM_ALL_LIT_DEPENDS)
1332   get_property(LLVM_ALL_ADDITIONAL_TEST_DEPENDS
1333       GLOBAL PROPERTY LLVM_ALL_ADDITIONAL_TEST_DEPENDS)
1334   add_custom_target(test-depends)
1335   if(LLVM_ALL_LIT_DEPENDS OR LLVM_ALL_ADDITIONAL_TEST_DEPENDS)
1336     add_dependencies(test-depends ${LLVM_ALL_LIT_DEPENDS} ${LLVM_ALL_ADDITIONAL_TEST_DEPENDS})
1337   endif()
1338   set_target_properties(test-depends PROPERTIES FOLDER "LLVM/Tests")
1339   add_dependencies(check-all test-depends)
1340 endif()
1342 if (LLVM_INCLUDE_DOCS)
1343   add_subdirectory(docs)
1344 endif()
1346 add_subdirectory(cmake/modules)
1348 # Do this last so that all lit targets have already been created.
1349 if (LLVM_INCLUDE_UTILS)
1350   add_subdirectory(utils/llvm-lit)
1351 endif()
1353 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1354   install(DIRECTORY include/llvm include/llvm-c
1355     DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1356     COMPONENT llvm-headers
1357     FILES_MATCHING
1358     PATTERN "*.def"
1359     PATTERN "*.h"
1360     PATTERN "*.td"
1361     PATTERN "*.inc"
1362     PATTERN "LICENSE.TXT"
1363     )
1365   install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c
1366     DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1367     COMPONENT llvm-headers
1368     FILES_MATCHING
1369     PATTERN "*.def"
1370     PATTERN "*.h"
1371     PATTERN "*.gen"
1372     PATTERN "*.inc"
1373     # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
1374     PATTERN "CMakeFiles" EXCLUDE
1375     PATTERN "config.h" EXCLUDE
1376     )
1378   if (LLVM_INSTALL_MODULEMAPS)
1379     install(DIRECTORY include
1380             DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1381             COMPONENT llvm-headers
1382             FILES_MATCHING
1383             PATTERN "module.modulemap"
1384             )
1385     install(FILES include/module.install.modulemap
1386             DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
1387             COMPONENT llvm-headers
1388             RENAME "module.extern.modulemap"
1389             )
1390   endif(LLVM_INSTALL_MODULEMAPS)
1392   # Installing the headers needs to depend on generating any public
1393   # tablegen'd headers.
1394   add_custom_target(llvm-headers DEPENDS intrinsics_gen omp_gen)
1395   set_target_properties(llvm-headers PROPERTIES FOLDER "LLVM/Resources")
1397   if (NOT LLVM_ENABLE_IDE)
1398     add_llvm_install_targets(install-llvm-headers
1399                              DEPENDS llvm-headers
1400                              COMPONENT llvm-headers)
1401   endif()
1403   # Custom target to install all libraries.
1404   add_custom_target(llvm-libraries)
1405   set_target_properties(llvm-libraries PROPERTIES FOLDER "LLVM/Resources")
1407   if (NOT LLVM_ENABLE_IDE)
1408     add_llvm_install_targets(install-llvm-libraries
1409                              DEPENDS llvm-libraries
1410                              COMPONENT llvm-libraries)
1411   endif()
1413   get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS)
1414   if(LLVM_LIBS)
1415     list(REMOVE_DUPLICATES LLVM_LIBS)
1416     foreach(lib ${LLVM_LIBS})
1417       add_dependencies(llvm-libraries ${lib})
1418       if (NOT LLVM_ENABLE_IDE)
1419         add_dependencies(install-llvm-libraries install-${lib})
1420         add_dependencies(install-llvm-libraries-stripped install-${lib}-stripped)
1421       endif()
1422     endforeach()
1423   endif()
1424 endif()
1426 # This must be at the end of the LLVM root CMakeLists file because it must run
1427 # after all targets are created.
1428 llvm_distribution_add_targets()
1429 process_llvm_pass_plugins(GEN_CONFIG)
1430 include(CoverageReport)
1432 # This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
1433 if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
1434   include(InstallRequiredSystemLibraries)
1435 endif()
1437 if (LLVM_INCLUDE_BENCHMARKS)
1438   # Override benchmark defaults so that when the library itself is updated these
1439   # modifications are not lost.
1440   set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE)
1441   set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE)
1442   set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE)
1443   set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE)
1444   set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE)
1445   set(BENCHMARK_ENABLE_WERROR ${LLVM_ENABLE_WERROR} CACHE BOOL
1446     "Handle -Werror for Google Benchmark based on LLVM_ENABLE_WERROR" FORCE)
1447   # Since LLVM requires C++11 it is safe to assume that std::regex is available.
1448   set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE)
1449   add_subdirectory(${LLVM_THIRD_PARTY_DIR}/benchmark
1450     ${CMAKE_CURRENT_BINARY_DIR}/third-party/benchmark)
1451   set_target_properties(benchmark PROPERTIES FOLDER "Third-Party/Google Benchmark")
1452   set_target_properties(benchmark_main PROPERTIES FOLDER "Third-Party/Google Benchmark")
1453   add_subdirectory(benchmarks)
1454 endif()
1456 if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
1457   add_subdirectory(utils/llvm-locstats)
1458 endif()
1460 if (XCODE)
1461   # For additional targets that you would like to add schemes, specify e.g:
1462   #
1463   #   -DLLVM_XCODE_EXTRA_TARGET_SCHEMES="TargetParserTests;SupportTests"
1464   #
1465   # at CMake configure time.
1466   set(LLVM_XCODE_EXTRA_TARGET_SCHEMES "" CACHE STRING "Specifies an extra list of targets to turn into schemes")
1468   foreach(target ${LLVM_XCODE_EXTRA_TARGET_SCHEMES})
1469     set_target_properties(${target} PROPERTIES XCODE_GENERATE_SCHEME ON)
1470   endforeach()
1471 endif()