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