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