• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# See docs/CMake.html for instructions about how to build LLVM with CMake.
2
3cmake_minimum_required(VERSION 3.13.4)
4
5if(POLICY CMP0068)
6  cmake_policy(SET CMP0068 NEW)
7  set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
8endif()
9
10if(POLICY CMP0075)
11  cmake_policy(SET CMP0075 NEW)
12endif()
13
14if(POLICY CMP0077)
15  cmake_policy(SET CMP0077 NEW)
16endif()
17
18if(NOT DEFINED LLVM_VERSION_MAJOR)
19  set(LLVM_VERSION_MAJOR 12)
20endif()
21if(NOT DEFINED LLVM_VERSION_MINOR)
22  set(LLVM_VERSION_MINOR 0)
23endif()
24if(NOT DEFINED LLVM_VERSION_PATCH)
25  set(LLVM_VERSION_PATCH 0)
26endif()
27if(NOT DEFINED LLVM_VERSION_SUFFIX)
28  set(LLVM_VERSION_SUFFIX git)
29endif()
30
31if (NOT PACKAGE_VERSION)
32  set(PACKAGE_VERSION
33    "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}")
34endif()
35
36if ((CMAKE_GENERATOR MATCHES "Visual Studio") AND (CMAKE_GENERATOR_TOOLSET STREQUAL ""))
37  message(WARNING "Visual Studio generators use the x86 host compiler by "
38                  "default, even for 64-bit targets. This can result in linker "
39                  "instability and out of memory errors. To use the 64-bit "
40                  "host compiler, pass -Thost=x64 on the CMake command line.")
41endif()
42
43if (CMAKE_GENERATOR STREQUAL "Xcode" AND NOT CMAKE_OSX_ARCHITECTURES)
44  # Some CMake features like object libraries get confused if you don't
45  # explicitly specify an architecture setting with the Xcode generator.
46  set(CMAKE_OSX_ARCHITECTURES "x86_64")
47endif()
48
49project(LLVM
50  VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
51  LANGUAGES C CXX ASM)
52
53set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to")
54set(CMAKE_CXX_STANDARD_REQUIRED YES)
55if (CYGWIN)
56  # Cygwin is a bit stricter and lack things like 'strdup', 'stricmp', etc in
57  # c++xx mode.
58  set(CMAKE_CXX_EXTENSIONS YES)
59else()
60  set(CMAKE_CXX_EXTENSIONS NO)
61endif()
62
63if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
64  message(STATUS "No build type selected, default to Debug")
65  set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE)
66endif()
67
68# Side-by-side subprojects layout: automatically set the
69# LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
70# This allows an easy way of setting up a build directory for llvm and another
71# one for llvm+clang+... using the same sources.
72set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;debuginfo-tests;libc;libclc;libcxx;libcxxabi;libunwind;lld;lldb;mlir;openmp;parallel-libs;polly;pstl")
73# The flang project is not yet part of "all" projects (see C++ requirements)
74set(LLVM_EXTRA_PROJECTS "flang")
75# List of all known projects in the mono repo
76set(LLVM_KNOWN_PROJECTS "${LLVM_ALL_PROJECTS};${LLVM_EXTRA_PROJECTS}")
77set(LLVM_ENABLE_PROJECTS "" CACHE STRING
78	"Semicolon-separated list of projects to build (${LLVM_KNOWN_PROJECTS}), or \"all\".")
79if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
80  set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
81endif()
82if ("flang" IN_LIST LLVM_ENABLE_PROJECTS AND NOT "mlir" IN_LIST LLVM_ENABLE_PROJECTS)
83  message(STATUS "Enabling MLIR as a dependency to flang")
84  list(APPEND LLVM_ENABLE_PROJECTS "mlir")
85endif()
86
87# LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
88# `LLVM_ENABLE_PROJECTS` CMake cache variable.  This exists for
89# several reasons:
90#
91# * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
92# source of truth for which projects to build. This means we will ignore user
93# supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
94# them.
95#
96# * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
97# non-empty list but now the user wishes to disable building all other projects
98# by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
99# need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
100# building all the projects that were previously enabled.
101set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
102mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
103
104if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
105  set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
106  foreach(proj ${LLVM_KNOWN_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
107    string(TOUPPER "${proj}" upper_proj)
108    string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
109    if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
110      message(STATUS "${proj} project is enabled")
111      set(SHOULD_ENABLE_PROJECT TRUE)
112      set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
113      if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
114        message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
115      endif()
116      if( LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR STREQUAL "" )
117        set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "" FORCE)
118      else()
119        set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE PATH "")
120      endif()
121    elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
122      message(STATUS "${proj} project is enabled")
123      set(SHOULD_ENABLE_PROJECT TRUE)
124    else()
125      message(STATUS "${proj} project is disabled")
126      set(SHOULD_ENABLE_PROJECT FALSE)
127    endif()
128    # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
129    # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
130    # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
131    # we should deprecate allowing users to set these variables by turning them
132    # into normal CMake variables rather than cache variables.
133    set(LLVM_TOOL_${upper_proj}_BUILD
134      ${SHOULD_ENABLE_PROJECT}
135      CACHE
136      BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
137    )
138  endforeach()
139endif()
140unset(SHOULD_ENABLE_PROJECT)
141
142# Build llvm with ccache if the package is present
143set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
144if(LLVM_CCACHE_BUILD)
145  find_program(CCACHE_PROGRAM ccache)
146  if(CCACHE_PROGRAM)
147      set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache")
148      set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data")
149      set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes"
150          CACHE STRING "Parameters to pass through to ccache")
151
152      set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}")
153      if (LLVM_CCACHE_MAXSIZE)
154        set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}")
155      endif()
156      if (LLVM_CCACHE_DIR)
157        set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}")
158      endif()
159      set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
160  else()
161    message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF")
162  endif()
163endif()
164
165option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF)
166
167# Some features of the LLVM build may be disallowed when dependency debugging is
168# enabled. In particular you cannot use ccache because we want to force compile
169# operations to always happen.
170if(LLVM_DEPENDENCY_DEBUGGING)
171  if(NOT CMAKE_HOST_APPLE)
172    message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.")
173  endif()
174  if(LLVM_CCACHE_BUILD)
175    message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.")
176  endif()
177endif()
178
179option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF)
180option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF)
181if(LLVM_ENABLE_GISEL_COV)
182  set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage")
183endif()
184
185# Add path for custom modules
186set(CMAKE_MODULE_PATH
187  ${CMAKE_MODULE_PATH}
188  "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
189  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
190  )
191
192# Generate a CompilationDatabase (compile_commands.json file) for our build,
193# for use by clang_complete, YouCompleteMe, etc.
194set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
195
196option(LLVM_INSTALL_BINUTILS_SYMLINKS
197  "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
198
199option(LLVM_INSTALL_CCTOOLS_SYMLINKS
200  "Install symlinks from the cctools tool names to the corresponding LLVM tools." OFF)
201
202option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
203
204option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
205
206# Unfortunatly Clang is too eager to search directories for module maps, which can cause the
207# installed version of the maps to be found when building LLVM from source. Therefore we turn off
208# the installation by default. See llvm.org/PR31905.
209option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF)
210
211option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
212if ( LLVM_USE_FOLDERS )
213  set_property(GLOBAL PROPERTY USE_FOLDERS ON)
214endif()
215
216include(VersionFromVCS)
217
218option(LLVM_APPEND_VC_REV
219  "Embed the version control system revision in LLVM" ON)
220
221set(PACKAGE_NAME LLVM)
222set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
223set(PACKAGE_BUGREPORT "https://bugs.llvm.org/")
224
225set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
226  "Default URL where bug reports are to be submitted.")
227
228# Configure CPack.
229set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM")
230set(CPACK_PACKAGE_VENDOR "LLVM")
231set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
232set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
233set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH})
234set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
235set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT")
236set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32")
237if(WIN32 AND NOT UNIX)
238  set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM")
239  set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp")
240  set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
241  set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
242  set(CPACK_NSIS_MODIFY_PATH "ON")
243  set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
244  if( CMAKE_CL_64 )
245    set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
246  endif()
247endif()
248include(CPack)
249
250# Sanity check our source directory to make sure that we are not trying to
251# generate an in-source build (unless on MSVC_IDE, where it is ok), and to make
252# sure that we don't have any stray generated files lying around in the tree
253# (which would end up getting picked up by header search, instead of the correct
254# versions).
255if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
256  message(FATAL_ERROR "In-source builds are not allowed.
257Please create a directory and run cmake from there, passing the path
258to this source directory as the last argument.
259This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
260Please delete them.")
261endif()
262
263string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
264
265if (CMAKE_BUILD_TYPE AND
266    NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL)$")
267  message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
268endif()
269
270set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
271
272set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')")
273mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
274
275set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING
276    "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)")
277mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
278
279# They are used as destination of target generators.
280set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
281set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
282if(WIN32 OR CYGWIN)
283  # DLL platform -- put DLLs into bin.
284  set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
285else()
286  set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
287endif()
288
289# Each of them corresponds to llvm-config's.
290set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir
291set(LLVM_LIBRARY_DIR      ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir
292set(LLVM_MAIN_SRC_DIR     ${CMAKE_CURRENT_SOURCE_DIR}  ) # --src-root
293set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir
294set(LLVM_BINARY_DIR       ${CMAKE_CURRENT_BINARY_DIR}  ) # --prefix
295
296# Note: LLVM_CMAKE_PATH does not include generated files
297set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules)
298set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
299set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
300
301# List of all targets to be built by default:
302set(LLVM_ALL_TARGETS
303  AArch64
304  AMDGPU
305  ARM
306  AVR
307  BPF
308  Hexagon
309  Lanai
310  Mips
311  MSP430
312  NVPTX
313  PowerPC
314  RISCV
315  Sparc
316  SystemZ
317  WebAssembly
318  X86
319  XCore
320  )
321
322# List of targets with JIT support:
323set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
324
325set(LLVM_TARGETS_TO_BUILD "all"
326    CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
327
328set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
329  CACHE STRING "Semicolon-separated list of experimental targets to build.")
330
331option(BUILD_SHARED_LIBS
332  "Build all libraries as shared libraries instead of static" OFF)
333
334option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON)
335if(LLVM_ENABLE_BACKTRACES)
336  set(ENABLE_BACKTRACES 1)
337endif()
338
339option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON)
340
341option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
342if(LLVM_ENABLE_CRASH_OVERRIDES)
343  set(ENABLE_CRASH_OVERRIDES 1)
344endif()
345
346option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF)
347
348option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
349set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
350set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
351
352set(LLVM_TARGET_ARCH "host"
353  CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
354
355option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON)
356
357set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
358
359option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
360
361option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)
362
363# On z/OS, threads cannot be used because TLS is not supported.
364if (CMAKE_SYSTEM_NAME MATCHES "OS390")
365  option(LLVM_ENABLE_THREADS "Use threads if available." OFF)
366else()
367  option(LLVM_ENABLE_THREADS "Use threads if available." ON)
368endif()
369
370set(LLVM_ENABLE_ZLIB "ON" CACHE STRING "Use zlib for compression/decompression if available. Can be ON, OFF, or FORCE_ON")
371
372set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")
373
374option(LLVM_ENABLE_Z3_SOLVER
375  "Enable Support for the Z3 constraint solver in LLVM."
376  ${LLVM_ENABLE_Z3_SOLVER_DEFAULT}
377)
378
379if (LLVM_ENABLE_Z3_SOLVER)
380  find_package(Z3 4.7.1)
381
382  if (LLVM_Z3_INSTALL_DIR)
383    if (NOT Z3_FOUND)
384      message(FATAL_ERROR "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.")
385    endif()
386  endif()
387
388  if (NOT Z3_FOUND)
389    message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.")
390  endif()
391
392  set(LLVM_WITH_Z3 1)
393endif()
394
395set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}")
396
397
398if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
399  set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
400endif()
401
402set(LLVM_TARGETS_TO_BUILD
403   ${LLVM_TARGETS_TO_BUILD}
404   ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
405list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
406
407option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
408option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
409if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
410  option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON)
411else()
412  option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
413endif()
414option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
415option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
416option(LLVM_STATIC_LINK_CXX_STDLIB "Statically link the standard library." OFF)
417option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
418option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
419option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
420
421option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF)
422
423if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
424  option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
425else()
426  option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
427endif()
428
429option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
430
431# While adding scalable vector support to LLVM, we temporarily want to
432# allow an implicit conversion of TypeSize to uint64_t, and to allow
433# code to get the fixed number of elements from a possibly scalable vector.
434# This CMake flag enables a more strict mode where it asserts that the type
435# is not a scalable vector type.
436#
437# Enabling this flag makes it easier to find cases where the compiler makes
438# assumptions on the size being 'fixed size', when building tests for
439# SVE/SVE2 or other scalable vector architectures.
440option(LLVM_ENABLE_STRICT_FIXED_SIZE_VECTORS
441       "Enable assertions that type is not scalable in implicit conversion from TypeSize to uint64_t and calls to getNumElements" OFF)
442
443set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
444  "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
445
446option(LLVM_FORCE_USE_OLD_TOOLCHAIN
447       "Set to ON to force using an old, unsupported host toolchain." OFF)
448
449set(LLVM_LOCAL_RPATH "" CACHE FILEPATH
450  "If set, an absolute path added as rpath on binaries that do not already contain an executable-relative rpath.")
451
452option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
453       "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
454
455option(LLVM_USE_INTEL_JITEVENTS
456  "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
457  OFF)
458
459if( LLVM_USE_INTEL_JITEVENTS )
460  # Verify we are on a supported platform
461  if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
462    message(FATAL_ERROR
463      "Intel JIT API support is available on Linux and Windows only.")
464  endif()
465endif( LLVM_USE_INTEL_JITEVENTS )
466
467option(LLVM_USE_OPROFILE
468  "Use opagent JIT interface to inform OProfile about JIT code" OFF)
469
470option(LLVM_EXTERNALIZE_DEBUGINFO
471  "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
472
473set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING
474  "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)")
475
476# If enabled, verify we are on a platform that supports oprofile.
477if( LLVM_USE_OPROFILE )
478  if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
479    message(FATAL_ERROR "OProfile support is available on Linux only.")
480  endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
481endif( LLVM_USE_OPROFILE )
482
483option(LLVM_USE_PERF
484  "Use perf JIT interface to inform perf about JIT code" OFF)
485
486# If enabled, verify we are on a platform that supports perf.
487if( LLVM_USE_PERF )
488  if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
489    message(FATAL_ERROR "perf support is available on Linux only.")
490  endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
491endif( LLVM_USE_PERF )
492
493set(LLVM_USE_SANITIZER "" CACHE STRING
494  "Define the sanitizer used to build binaries and tests.")
495option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
496set(LLVM_UBSAN_FLAGS
497    "-fsanitize=undefined -fno-sanitize=vptr,function -fno-sanitize-recover=all"
498    CACHE STRING
499    "Compile flags set to enable UBSan. Only used if LLVM_USE_SANITIZER contains 'Undefined'.")
500set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
501  "Path to fuzzing library for linking with fuzz targets")
502
503option(LLVM_USE_SPLIT_DWARF
504  "Use -gsplit-dwarf when compiling llvm." OFF)
505
506# Define an option controlling whether we should build for 32-bit on 64-bit
507# platforms, where supported.
508if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT (WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX"))
509  # TODO: support other platforms and toolchains.
510  option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
511endif()
512
513# Define the default arguments to use with 'lit', and an option for the user to
514# override.
515set(LIT_ARGS_DEFAULT "-sv")
516if (MSVC_IDE OR XCODE)
517  set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
518endif()
519set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
520
521# On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
522if( WIN32 AND NOT CYGWIN )
523  set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
524endif()
525
526set(LLVM_INTEGRATED_CRT_ALLOC "" CACHE PATH "Replace the Windows CRT allocator with any of {rpmalloc|mimalloc|snmalloc}. Only works with /MT enabled.")
527if(LLVM_INTEGRATED_CRT_ALLOC)
528  if(NOT WIN32)
529    message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC is only supported on Windows.")
530  endif()
531  if(LLVM_USE_SANITIZER)
532    message(FATAL_ERROR "LLVM_INTEGRATED_CRT_ALLOC cannot be used along with LLVM_USE_SANITIZER!")
533  endif()
534  if(CMAKE_BUILD_TYPE AND uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
535    message(FATAL_ERROR "The Debug target isn't supported along with LLVM_INTEGRATED_CRT_ALLOC!")
536  endif()
537endif()
538
539# Define options to control the inclusion and default build behavior for
540# components which may not strictly be necessary (tools, examples, and tests).
541#
542# This is primarily to support building smaller or faster project files.
543option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
544option(LLVM_BUILD_TOOLS
545  "Build the LLVM tools. If OFF, just generate build targets." ON)
546
547option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
548option(LLVM_BUILD_UTILS
549  "Build LLVM utility binaries. If OFF, just generate build targets." ON)
550
551option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
552option(LLVM_BUILD_RUNTIMES
553  "Build the LLVM runtimes. If OFF, just generate build targets." ON)
554
555option(LLVM_BUILD_RUNTIME
556  "Build the LLVM runtime libraries." ON)
557option(LLVM_BUILD_EXAMPLES
558  "Build the LLVM example programs. If OFF, just generate build targets." OFF)
559option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
560
561if(LLVM_BUILD_EXAMPLES)
562  add_definitions(-DBUILD_EXAMPLES)
563endif(LLVM_BUILD_EXAMPLES)
564
565option(LLVM_BUILD_TESTS
566  "Build LLVM unit tests. If OFF, just generate build targets." OFF)
567option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
568option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
569
570option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default
571targets. If OFF, benchmarks still could be built using Benchmarks target." OFF)
572option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON)
573
574option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
575option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
576option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
577option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
578option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
579option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
580
581set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
582    CACHE STRING "Doxygen-generated HTML documentation install directory")
583set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
584    CACHE STRING "OCamldoc-generated HTML documentation install directory")
585
586option (LLVM_BUILD_EXTERNAL_COMPILER_RT
587  "Build compiler-rt as an external project." OFF)
588
589option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
590  "Show target and host info when tools are invoked with --version." ON)
591
592# You can configure which libraries from LLVM you want to include in the
593# shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
594# list of LLVM components. All component names handled by llvm-config are valid.
595if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
596  set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
597    "Semicolon-separated list of components to include in libLLVM, or \"all\".")
598endif()
599
600if(MSVC)
601  option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
602  # Set this variable to OFF here so it can't be set with a command-line
603  # argument.
604  set (LLVM_LINK_LLVM_DYLIB OFF)
605  if (BUILD_SHARED_LIBS)
606    message(FATAL_ERROR "BUILD_SHARED_LIBS options is not supported on Windows.")
607  endif()
608else()
609  option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
610  option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
611  set(LLVM_BUILD_LLVM_DYLIB_default OFF)
612  if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
613    set(LLVM_BUILD_LLVM_DYLIB_default ON)
614  endif()
615  option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
616endif()
617
618if (LLVM_LINK_LLVM_DYLIB AND BUILD_SHARED_LIBS)
619  message(FATAL_ERROR "Cannot enable BUILD_SHARED_LIBS with LLVM_LINK_LLVM_DYLIB.  We recommend disabling BUILD_SHARED_LIBS.")
620endif()
621
622option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
623if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
624  set(LLVM_USE_HOST_TOOLS ON)
625endif()
626
627if (MSVC_IDE)
628  option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
629endif()
630
631if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR
632    LLVM_ENABLE_IR_PGO)
633  if(NOT LLVM_PROFILE_MERGE_POOL_SIZE)
634    # A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine
635    # for spining disks. Anything higher may only help on slower mediums.
636    set(LLVM_PROFILE_MERGE_POOL_SIZE "4")
637  endif()
638  if(NOT LLVM_PROFILE_FILE_PATTERN)
639    if(NOT LLVM_PROFILE_DATA_DIR)
640      file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR)
641    endif()
642    file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
643  endif()
644  if(NOT LLVM_CSPROFILE_FILE_PATTERN)
645    if(NOT LLVM_CSPROFILE_DATA_DIR)
646      file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR)
647    endif()
648    file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN)
649  endif()
650endif()
651
652if (LLVM_BUILD_STATIC)
653  set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
654  # Remove shared library suffixes from use in find_library
655  foreach (shared_lib_suffix ${CMAKE_SHARED_LIBRARY_SUFFIX} ${CMAKE_IMPORT_LIBRARY_SUFFIX})
656    list(FIND CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix} shared_lib_suffix_idx)
657    if(NOT ${shared_lib_suffix_idx} EQUAL -1)
658      list(REMOVE_AT CMAKE_FIND_LIBRARY_SUFFIXES ${shared_lib_suffix_idx})
659    endif()
660  endforeach()
661endif()
662
663# Use libtool instead of ar if you are both on an Apple host, and targeting Apple.
664if(CMAKE_HOST_APPLE AND APPLE)
665  include(UseLibtool)
666endif()
667
668# Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
669set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
670mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
671
672set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL
673  "Enable per-target runtimes directory")
674
675set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
676  "Profiling data file to use when compiling in order to improve runtime performance.")
677
678# All options referred to from HandleLLVMOptions have to be specified
679# BEFORE this include, otherwise options will not be correctly set on
680# first cmake run
681include(config-ix)
682
683string(REPLACE "Native" ${LLVM_NATIVE_ARCH}
684  LLVM_TARGETS_TO_BUILD "${LLVM_TARGETS_TO_BUILD}")
685list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
686
687# By default, we target the host, but this can be overridden at CMake
688# invocation time.
689set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING
690  "Default target for which LLVM will generate code." )
691set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
692message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
693message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
694
695if(WIN32 OR CYGWIN)
696  if(BUILD_SHARED_LIBS OR LLVM_BUILD_LLVM_DYLIB)
697    set(LLVM_ENABLE_PLUGINS_default ON)
698  else()
699    set(LLVM_ENABLE_PLUGINS_default OFF)
700  endif()
701else()
702  set(LLVM_ENABLE_PLUGINS_default ${LLVM_ENABLE_PIC})
703endif()
704option(LLVM_ENABLE_PLUGINS "Enable plugin support" ${LLVM_ENABLE_PLUGINS_default})
705
706set(ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER FALSE CACHE BOOL
707  "Enable the experimental new pass manager by default.")
708
709include(HandleLLVMOptions)
710
711find_package(Python3 COMPONENTS Interpreter)
712if(NOT Python3_Interpreter_FOUND)
713  message(WARNING "Python3 not found, using python2 as a fallback")
714  find_package(Python2 COMPONENTS Interpreter REQUIRED)
715  if(Python2_VERSION VERSION_LESS 2.7)
716    message(SEND_ERROR "Python 2.7 or newer is required")
717  endif()
718
719  # Treat python2 as python3
720  add_executable(Python3::Interpreter IMPORTED)
721  set_target_properties(Python3::Interpreter PROPERTIES
722    IMPORTED_LOCATION ${Python2_EXECUTABLE})
723  set(Python3_EXECUTABLE ${Python2_EXECUTABLE})
724endif()
725
726######
727
728# Configure all of the various header file fragments LLVM uses which depend on
729# configuration variables.
730set(LLVM_ENUM_TARGETS "")
731set(LLVM_ENUM_ASM_PRINTERS "")
732set(LLVM_ENUM_ASM_PARSERS "")
733set(LLVM_ENUM_DISASSEMBLERS "")
734foreach(t ${LLVM_TARGETS_TO_BUILD})
735  set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
736
737  list(FIND LLVM_ALL_TARGETS ${t} idx)
738  list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy)
739  # At this point, LLVMBUILDTOOL already checked all the targets passed in
740  # LLVM_TARGETS_TO_BUILD and LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, so
741  # this test just makes sure that any experimental targets were passed via
742  # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD.
743  if( idx LESS 0 AND idy LESS 0 )
744    message(FATAL_ERROR "The target `${t}' is experimental and must be passed "
745      "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.")
746  else()
747    set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n")
748  endif()
749
750  file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
751  if( asmp_file )
752    set(LLVM_ENUM_ASM_PRINTERS
753      "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
754  endif()
755  if( EXISTS ${td}/AsmParser/CMakeLists.txt )
756    set(LLVM_ENUM_ASM_PARSERS
757      "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
758  endif()
759  if( EXISTS ${td}/Disassembler/CMakeLists.txt )
760    set(LLVM_ENUM_DISASSEMBLERS
761      "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
762  endif()
763endforeach(t)
764
765# Produce the target definition files, which provide a way for clients to easily
766# include various classes of targets.
767configure_file(
768  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
769  ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
770  )
771configure_file(
772  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
773  ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
774  )
775configure_file(
776  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
777  ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
778  )
779configure_file(
780  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
781  ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
782  )
783
784# They are not referenced. See set_output_directory().
785set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
786set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
787set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
788
789# For up-to-date instructions for installing the Tensorflow dependency, refer to
790# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh
791# In this case, the latest C API library is available for download from
792# https://www.tensorflow.org/install/lang_c.
793# We will expose the conditional compilation variable,
794# LLVM_HAVE_TF_API, through llvm-config.h, so that a user of the LLVM library may
795# also leverage the dependency.
796set(TENSORFLOW_C_LIB_PATH "" CACHE PATH "Path to TensorFlow C library install")
797if (TENSORFLOW_C_LIB_PATH)
798  find_library(tensorflow_c_api tensorflow PATHS ${TENSORFLOW_C_LIB_PATH}/lib NO_DEFAULT_PATH REQUIRED)
799  set(LLVM_HAVE_TF_API "ON" CACHE BOOL "Full Tensorflow API available")
800  include_directories(${TENSORFLOW_C_LIB_PATH}/include)
801endif()
802
803# For up-to-date instructions for installing the Tensorflow dependency, refer to
804# the bot setup script: https://github.com/google/ml-compiler-opt/blob/master/buildbot/buildbot_init.sh
805# Specifically, assuming python3 is installed:
806# python3 -m pip install --upgrade pip && python3 -m pip install --user tf_nightly==2.3.0.dev20200528
807# Then set TENSORFLOW_AOT_PATH to the package install - usually it's ~/.local/lib/python3.7/site-packages/tensorflow
808#
809set(TENSORFLOW_AOT_PATH "" CACHE PATH "Path to TensorFlow pip install dir")
810
811if (NOT TENSORFLOW_AOT_PATH STREQUAL "")
812  set(LLVM_HAVE_TF_AOT "ON" CACHE BOOL "Tensorflow AOT available")
813  set(TENSORFLOW_AOT_COMPILER
814    "${TENSORFLOW_AOT_PATH}/../../../../bin/saved_model_cli"
815    CACHE PATH "Path to the Tensorflow AOT compiler")
816  include_directories(${TENSORFLOW_AOT_PATH}/include)
817  add_subdirectory(${TENSORFLOW_AOT_PATH}/xla_aot_runtime_src
818    ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}/tf_runtime)
819endif()
820
821# Keep the legacy CMake flag ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER for
822# compatibility.
823set(LLVM_ENABLE_NEW_PASS_MANAGER ${ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER})
824
825# Configure the three LLVM configuration header files.
826configure_file(
827  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
828  ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
829configure_file(
830  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
831  ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
832configure_file(
833  ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
834  ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
835
836# Add target for generating source rpm package.
837set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
838    CACHE FILEPATH ".spec file to use for srpm generation")
839set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
840set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
841
842get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository)
843string(LENGTH "${revision}" revision_length)
844set(LLVM_RPM_SPEC_REVISION "${revision}")
845
846configure_file(
847  ${LLVM_SRPM_USER_BINARY_SPECFILE}
848  ${LLVM_SRPM_BINARY_SPECFILE} @ONLY)
849
850add_custom_target(srpm
851  COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES
852  COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE})
853set_target_properties(srpm PROPERTIES FOLDER "Misc")
854
855if(APPLE AND DARWIN_LTO_LIBRARY)
856  set(CMAKE_EXE_LINKER_FLAGS
857    "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
858  set(CMAKE_SHARED_LINKER_FLAGS
859    "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
860  set(CMAKE_MODULE_LINKER_FLAGS
861    "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
862endif()
863
864# Build with _XOPEN_SOURCE on AIX, as stray macros in _ALL_SOURCE mode tend to
865# break things. In this case we need to enable the large-file API as well.
866if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX")
867          add_definitions("-D_XOPEN_SOURCE=700")
868          add_definitions("-D_LARGE_FILE_API")
869
870  # CMake versions less than 3.16 set default linker flags to include -brtl, as
871  # well as setting -G when building libraries, so clear them out. Note we only
872  # try to clear the form that CMake will set as part of its initial
873  # configuration, it is still possible the user may force it as part of a
874  # compound option.
875  if(CMAKE_VERSION VERSION_LESS 3.16)
876    string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_EXE_LINKER_FLAGS  "${CMAKE_EXE_LINKER_FLAGS}")
877    string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_SHARED_LINKER_FLAGS  "${CMAKE_SHARED_LINKER_FLAGS}")
878    string(REGEX REPLACE "(^|[ \t]+)-Wl,-brtl([ \t]+|$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
879    string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS
880      "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}")
881    string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS
882      "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}")
883    string(REGEX REPLACE "(^|[ \t]+)(-Wl,)?-G([ \t]+|$)" " " CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS
884      "${CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS}")
885    string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS
886      "${CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS}")
887    string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS
888      "${CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS}")
889    string(REGEX REPLACE "(^|[ \t]+)-Wl,-G," " -Wl," CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS
890      "${CMAKE_SHARED_LIBRARY_CREATE_ASM_FLAGS}")
891  endif()
892
893  # Modules should be built with -shared -Wl,-G, so we can use runtime linking
894  # with plugins.
895  string(APPEND CMAKE_MODULE_LINKER_FLAGS " -shared -Wl,-G")
896
897  # Also set the correct flags for building shared libraries.
898  string(APPEND CMAKE_SHARED_LINKER_FLAGS " -shared")
899endif()
900
901# Build with _XOPEN_SOURCE on z/OS.
902if (CMAKE_SYSTEM_NAME MATCHES "OS390")
903  add_definitions("-D_XOPEN_SOURCE=600")
904  add_definitions("-D_OPEN_SYS") # Needed for process information.
905  add_definitions("-D_OPEN_SYS_FILE_EXT") # Needed for EBCDIC I/O.
906endif()
907
908# Build with _FILE_OFFSET_BITS=64 on Solaris to match g++ >= 9.
909if (UNIX AND ${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
910          add_definitions("-D_FILE_OFFSET_BITS=64")
911endif()
912
913set(CMAKE_INCLUDE_CURRENT_DIR ON)
914
915include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
916
917# when crosscompiling import the executable targets from a file
918if(LLVM_USE_HOST_TOOLS)
919  include(CrossCompile)
920  llvm_create_cross_target(LLVM NATIVE "" Release)
921endif(LLVM_USE_HOST_TOOLS)
922if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
923# Dummy use to avoid CMake Warning: Manually-specified variables were not used
924# (this is a variable that CrossCompile sets on recursive invocations)
925endif()
926
927if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
928  # On FreeBSD, /usr/local/* is not used by default. In order to build LLVM
929  # with libxml2, iconv.h, etc., we must add /usr/local paths.
930  include_directories(SYSTEM "/usr/local/include")
931  link_directories("/usr/local/lib")
932endif(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
933
934if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
935   # special hack for Solaris to handle crazy system sys/regset.h
936   include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
937endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
938
939# Make sure we don't get -rdynamic in every binary. For those that need it,
940# use export_executable_symbols(target).
941set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
942
943include(AddLLVM)
944include(TableGen)
945
946if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
947  # People report that -O3 is unreliable on MinGW. The traditional
948  # build also uses -O2 for that reason:
949  llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
950endif()
951
952# Put this before tblgen. Else we have a circular dependence.
953add_subdirectory(lib/Demangle)
954add_subdirectory(lib/Support)
955add_subdirectory(lib/TableGen)
956
957add_subdirectory(utils/TableGen)
958
959add_subdirectory(include/llvm)
960
961add_subdirectory(lib)
962
963if( LLVM_INCLUDE_UTILS )
964  add_subdirectory(utils/FileCheck)
965  add_subdirectory(utils/PerfectShuffle)
966  add_subdirectory(utils/count)
967  add_subdirectory(utils/not)
968  add_subdirectory(utils/yaml-bench)
969else()
970  if ( LLVM_INCLUDE_TESTS )
971    message(FATAL_ERROR "Including tests when not building utils will not work.
972    Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.")
973  endif()
974endif()
975
976# Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
977if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
978  add_subdirectory(utils/LLVMVisualizers)
979endif()
980
981foreach( binding ${LLVM_BINDINGS_LIST} )
982  if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
983    add_subdirectory(bindings/${binding})
984  endif()
985endforeach()
986
987add_subdirectory(projects)
988
989if( LLVM_INCLUDE_TOOLS )
990  add_subdirectory(tools)
991endif()
992
993if( LLVM_INCLUDE_RUNTIMES )
994  add_subdirectory(runtimes)
995endif()
996
997if( LLVM_INCLUDE_EXAMPLES )
998  add_subdirectory(examples)
999endif()
1000
1001if( LLVM_INCLUDE_TESTS )
1002  if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang)
1003    include(LLVMExternalProjectUtils)
1004    llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
1005      USE_TOOLCHAIN
1006      EXCLUDE_FROM_ALL
1007      NO_INSTALL
1008      ALWAYS_CLEAN)
1009  endif()
1010  add_subdirectory(utils/lit)
1011  add_subdirectory(test)
1012  add_subdirectory(unittests)
1013  if( LLVM_INCLUDE_UTILS )
1014    add_subdirectory(utils/unittest)
1015  endif()
1016
1017  if (WIN32)
1018    # This utility is used to prevent crashing tests from calling Dr. Watson on
1019    # Windows.
1020    add_subdirectory(utils/KillTheDoctor)
1021  endif()
1022
1023  # Add a global check rule now that all subdirectories have been traversed
1024  # and we know the total set of lit testsuites.
1025  get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES)
1026  get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS)
1027  get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS)
1028  get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS)
1029  get_property(LLVM_ADDITIONAL_TEST_TARGETS
1030               GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS)
1031  get_property(LLVM_ADDITIONAL_TEST_DEPENDS
1032               GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS)
1033  add_lit_target(check-all
1034    "Running all regression tests"
1035    ${LLVM_LIT_TESTSUITES}
1036    PARAMS ${LLVM_LIT_PARAMS}
1037    DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS}
1038    ARGS ${LLVM_LIT_EXTRA_ARGS}
1039    )
1040  if(TARGET check-runtimes)
1041    add_dependencies(check-all check-runtimes)
1042  endif()
1043  add_custom_target(test-depends
1044                    DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS})
1045  set_target_properties(test-depends PROPERTIES FOLDER "Tests")
1046endif()
1047
1048if (LLVM_INCLUDE_DOCS)
1049  add_subdirectory(docs)
1050endif()
1051
1052add_subdirectory(cmake/modules)
1053
1054# Do this last so that all lit targets have already been created.
1055if (LLVM_INCLUDE_UTILS)
1056  add_subdirectory(utils/llvm-lit)
1057endif()
1058
1059if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1060  install(DIRECTORY include/llvm include/llvm-c
1061    DESTINATION include
1062    COMPONENT llvm-headers
1063    FILES_MATCHING
1064    PATTERN "*.def"
1065    PATTERN "*.h"
1066    PATTERN "*.td"
1067    PATTERN "*.inc"
1068    PATTERN "LICENSE.TXT"
1069    )
1070
1071  install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c
1072    DESTINATION include
1073    COMPONENT llvm-headers
1074    FILES_MATCHING
1075    PATTERN "*.def"
1076    PATTERN "*.h"
1077    PATTERN "*.gen"
1078    PATTERN "*.inc"
1079    # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
1080    PATTERN "CMakeFiles" EXCLUDE
1081    PATTERN "config.h" EXCLUDE
1082    )
1083
1084  if (LLVM_INSTALL_MODULEMAPS)
1085    install(DIRECTORY include/llvm include/llvm-c
1086            DESTINATION include
1087            COMPONENT llvm-headers
1088            FILES_MATCHING
1089            PATTERN "module.modulemap"
1090            )
1091    install(FILES include/llvm/module.install.modulemap
1092            DESTINATION include/llvm
1093            COMPONENT llvm-headers
1094            RENAME "module.extern.modulemap"
1095            )
1096  endif(LLVM_INSTALL_MODULEMAPS)
1097
1098  # Installing the headers needs to depend on generating any public
1099  # tablegen'd headers.
1100  add_custom_target(llvm-headers DEPENDS intrinsics_gen omp_gen)
1101  set_target_properties(llvm-headers PROPERTIES FOLDER "Misc")
1102
1103  if (NOT LLVM_ENABLE_IDE)
1104    add_llvm_install_targets(install-llvm-headers
1105                             DEPENDS llvm-headers
1106                             COMPONENT llvm-headers)
1107  endif()
1108
1109  # Custom target to install all libraries.
1110  add_custom_target(llvm-libraries)
1111  set_target_properties(llvm-libraries PROPERTIES FOLDER "Misc")
1112
1113  if (NOT LLVM_ENABLE_IDE)
1114    add_llvm_install_targets(install-llvm-libraries
1115                             DEPENDS llvm-libraries
1116                             COMPONENT llvm-libraries)
1117  endif()
1118
1119  get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS)
1120  if(LLVM_LIBS)
1121    list(REMOVE_DUPLICATES LLVM_LIBS)
1122    foreach(lib ${LLVM_LIBS})
1123      add_dependencies(llvm-libraries ${lib})
1124      if (NOT LLVM_ENABLE_IDE)
1125        add_dependencies(install-llvm-libraries install-${lib})
1126        add_dependencies(install-llvm-libraries-stripped install-${lib}-stripped)
1127      endif()
1128    endforeach()
1129  endif()
1130endif()
1131
1132# This must be at the end of the LLVM root CMakeLists file because it must run
1133# after all targets are created.
1134include(LLVMDistributionSupport)
1135llvm_distribution_add_targets()
1136process_llvm_pass_plugins(GEN_CONFIG)
1137
1138# This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
1139if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
1140  include(InstallRequiredSystemLibraries)
1141endif()
1142
1143if (LLVM_INCLUDE_BENCHMARKS)
1144  # Override benchmark defaults so that when the library itself is updated these
1145  # modifications are not lost.
1146  set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE)
1147  set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE)
1148  set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE)
1149  set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE)
1150  set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE)
1151  # Since LLVM requires C++11 it is safe to assume that std::regex is available.
1152  set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE)
1153
1154  add_subdirectory(utils/benchmark)
1155  add_subdirectory(benchmarks)
1156endif()
1157
1158if (LLVM_INCLUDE_UTILS AND LLVM_INCLUDE_TOOLS)
1159  add_subdirectory(utils/llvm-locstats)
1160endif()
1161