[InstCombine] Avoid use after free in DenseMap, when built with GCC
[llvm-core.git] / CMakeLists.txt
blob895f9ab7189d172ca7244c1263719fdfda88f344
1 # See docs/CMake.html for instructions about how to build LLVM with CMake.
3 cmake_minimum_required(VERSION 3.4.3)
5 if(POLICY CMP0068)
6   cmake_policy(SET CMP0068 NEW)
7   set(CMAKE_BUILD_WITH_INSTALL_NAME_DIR ON)
8 endif()
10 if(POLICY CMP0075)
11   cmake_policy(SET CMP0075 NEW)
12 endif()
14 if(POLICY CMP0077)
15   cmake_policy(SET CMP0077 NEW)
16 endif()
18 if(NOT DEFINED LLVM_VERSION_MAJOR)
19   set(LLVM_VERSION_MAJOR 9)
20 endif()
21 if(NOT DEFINED LLVM_VERSION_MINOR)
22   set(LLVM_VERSION_MINOR 0)
23 endif()
24 if(NOT DEFINED LLVM_VERSION_PATCH)
25   set(LLVM_VERSION_PATCH 0)
26 endif()
27 if(NOT DEFINED LLVM_VERSION_SUFFIX)
28   set(LLVM_VERSION_SUFFIX svn)
29 endif()
31 if (NOT PACKAGE_VERSION)
32   set(PACKAGE_VERSION
33     "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}")
34 endif()
36 if ((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.")
41 endif()
43 project(LLVM
44   VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}
45   LANGUAGES C CXX ASM)
47 if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
48   message(STATUS "No build type selected, default to Debug")
49   set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type (default Debug)" FORCE)
50 endif()
52 # This should only apply if you are both on an Apple host, and targeting Apple.
53 if(CMAKE_HOST_APPLE AND APPLE)
54   # if CMAKE_LIBTOOL is not set, try and find it with xcrun or find_program
55   if(NOT CMAKE_LIBTOOL)
56     if(NOT CMAKE_XCRUN)
57       find_program(CMAKE_XCRUN NAMES xcrun)
58     endif()
59     if(CMAKE_XCRUN)
60       execute_process(COMMAND ${CMAKE_XCRUN} -find libtool
61         OUTPUT_VARIABLE CMAKE_LIBTOOL
62         OUTPUT_STRIP_TRAILING_WHITESPACE)
63     endif()
65     if(NOT CMAKE_LIBTOOL OR NOT EXISTS CMAKE_LIBTOOL)
66       find_program(CMAKE_LIBTOOL NAMES libtool)
67     endif()
68   endif()
70   get_property(languages GLOBAL PROPERTY ENABLED_LANGUAGES)
71   if(CMAKE_LIBTOOL)
72     set(CMAKE_LIBTOOL ${CMAKE_LIBTOOL} CACHE PATH "libtool executable")
73     message(STATUS "Found libtool - ${CMAKE_LIBTOOL}")
75     execute_process(COMMAND ${CMAKE_LIBTOOL} -V
76       OUTPUT_VARIABLE LIBTOOL_V_OUTPUT
77       OUTPUT_STRIP_TRAILING_WHITESPACE)
78     if("${LIBTOOL_V_OUTPUT}" MATCHES ".*cctools-([0-9.]+).*")
79       string(REGEX REPLACE ".*cctools-([0-9.]+).*" "\\1" LIBTOOL_VERSION
80         ${LIBTOOL_V_OUTPUT})
81       if(NOT LIBTOOL_VERSION VERSION_LESS "862")
82         set(LIBTOOL_NO_WARNING_FLAG "-no_warning_for_no_symbols")
83       endif()
84     endif()
86     foreach(lang ${languages})
87       set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
88         "\"${CMAKE_LIBTOOL}\" -static ${LIBTOOL_NO_WARNING_FLAG} -o <TARGET> \
89         <LINK_FLAGS> <OBJECTS> ")
90     endforeach()
91   endif()
93   # If DYLD_LIBRARY_PATH is set we need to set it on archiver commands
94   if(DYLD_LIBRARY_PATH)
95     set(dyld_envar "DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}")
96     foreach(lang ${languages})
97       foreach(cmd ${CMAKE_${lang}_CREATE_STATIC_LIBRARY})
98         list(APPEND CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW
99              "${dyld_envar} ${cmd}")
100       endforeach()
101       set(CMAKE_${lang}_CREATE_STATIC_LIBRARY
102         ${CMAKE_${lang}_CREATE_STATIC_LIBRARY_NEW})
103     endforeach()
104   endif()
105 endif()
107 # Side-by-side subprojects layout: automatically set the
108 # LLVM_EXTERNAL_${project}_SOURCE_DIR using LLVM_ALL_PROJECTS
109 # This allows an easy way of setting up a build directory for llvm and another
110 # one for llvm+clang+... using the same sources.
111 set(LLVM_ALL_PROJECTS "clang;clang-tools-extra;compiler-rt;debuginfo-tests;libclc;libcxx;libcxxabi;libunwind;lld;lldb;llgo;openmp;parallel-libs;polly;pstl")
112 set(LLVM_ENABLE_PROJECTS "" CACHE STRING
113         "Semicolon-separated list of projects to build (${LLVM_ALL_PROJECTS}), or \"all\".")
114 if( LLVM_ENABLE_PROJECTS STREQUAL "all" )
115   set( LLVM_ENABLE_PROJECTS ${LLVM_ALL_PROJECTS})
116 endif()
118 # LLVM_ENABLE_PROJECTS_USED is `ON` if the user has ever used the
119 # `LLVM_ENABLE_PROJECTS` CMake cache variable.  This exists for
120 # several reasons:
122 # * As an indicator that the `LLVM_ENABLE_PROJECTS` list is now the single
123 # source of truth for which projects to build. This means we will ignore user
124 # supplied `LLVM_TOOL_<project>_BUILD` CMake cache variables and overwrite
125 # them.
127 # * The case where the user previously had `LLVM_ENABLE_PROJECTS` set to a
128 # non-empty list but now the user wishes to disable building all other projects
129 # by setting `LLVM_ENABLE_PROJECTS` to an empty string. In that case we still
130 # need to set the `LLVM_TOOL_${upper_proj}_BUILD` variables so that we disable
131 # building all the projects that were previously enabled.
132 set(LLVM_ENABLE_PROJECTS_USED OFF CACHE BOOL "")
133 mark_as_advanced(LLVM_ENABLE_PROJECTS_USED)
135 if (LLVM_ENABLE_PROJECTS_USED OR NOT LLVM_ENABLE_PROJECTS STREQUAL "")
136   set(LLVM_ENABLE_PROJECTS_USED ON CACHE BOOL "" FORCE)
137   foreach(proj ${LLVM_ALL_PROJECTS} ${LLVM_EXTERNAL_PROJECTS})
138     string(TOUPPER "${proj}" upper_proj)
139     string(REGEX REPLACE "-" "_" upper_proj ${upper_proj})
140     if ("${proj}" IN_LIST LLVM_ENABLE_PROJECTS)
141       message(STATUS "${proj} project is enabled")
142       set(SHOULD_ENABLE_PROJECT TRUE)
143       set(PROJ_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}")
144       if(NOT EXISTS "${PROJ_DIR}" OR NOT IS_DIRECTORY "${PROJ_DIR}")
145         message(FATAL_ERROR "LLVM_ENABLE_PROJECTS requests ${proj} but directory not found: ${PROJ_DIR}")
146       endif()
147       set(LLVM_EXTERNAL_${upper_proj}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../${proj}" CACHE STRING "")
148     elseif ("${proj}" IN_LIST LLVM_EXTERNAL_PROJECTS)
149       message(STATUS "${proj} project is enabled")
150       set(SHOULD_ENABLE_PROJECT TRUE)
151     else()
152       message(STATUS "${proj} project is disabled")
153       set(SHOULD_ENABLE_PROJECT FALSE)
154     endif()
155     # Force `LLVM_TOOL_${upper_proj}_BUILD` variables to have values that
156     # corresponds with `LLVM_ENABLE_PROJECTS`. This prevents the user setting
157     # `LLVM_TOOL_${upper_proj}_BUILD` variables externally. At some point
158     # we should deprecate allowing users to set these variables by turning them
159     # into normal CMake variables rather than cache variables.
160     set(LLVM_TOOL_${upper_proj}_BUILD
161       ${SHOULD_ENABLE_PROJECT}
162       CACHE
163       BOOL "Whether to build ${upper_proj} as part of LLVM" FORCE
164     )
165   endforeach()
166 endif()
167 unset(SHOULD_ENABLE_PROJECT)
169 # Build llvm with ccache if the package is present
170 set(LLVM_CCACHE_BUILD OFF CACHE BOOL "Set to ON for a ccache enabled build")
171 if(LLVM_CCACHE_BUILD)
172   find_program(CCACHE_PROGRAM ccache)
173   if(CCACHE_PROGRAM)
174       set(LLVM_CCACHE_MAXSIZE "" CACHE STRING "Size of ccache")
175       set(LLVM_CCACHE_DIR "" CACHE STRING "Directory to keep ccached data")
176       set(LLVM_CCACHE_PARAMS "CCACHE_CPP2=yes CCACHE_HASHDIR=yes"
177           CACHE STRING "Parameters to pass through to ccache")
179       set(CCACHE_PROGRAM "${LLVM_CCACHE_PARAMS} ${CCACHE_PROGRAM}")
180       if (LLVM_CCACHE_MAXSIZE)
181         set(CCACHE_PROGRAM "CCACHE_MAXSIZE=${LLVM_CCACHE_MAXSIZE} ${CCACHE_PROGRAM}")
182       endif()
183       if (LLVM_CCACHE_DIR)
184         set(CCACHE_PROGRAM "CCACHE_DIR=${LLVM_CCACHE_DIR} ${CCACHE_PROGRAM}")
185       endif()
186       set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE_PROGRAM})
187   else()
188     message(FATAL_ERROR "Unable to find the program ccache. Set LLVM_CCACHE_BUILD to OFF")
189   endif()
190 endif()
192 option(LLVM_DEPENDENCY_DEBUGGING "Dependency debugging mode to verify correctly expressed library dependencies (Darwin only)" OFF)
194 # Some features of the LLVM build may be disallowed when dependency debugging is
195 # enabled. In particular you cannot use ccache because we want to force compile
196 # operations to always happen.
197 if(LLVM_DEPENDENCY_DEBUGGING)
198   if(NOT CMAKE_HOST_APPLE)
199     message(FATAL_ERROR "Dependency debugging is only currently supported on Darwin hosts.")
200   endif()
201   if(LLVM_CCACHE_BUILD)
202     message(FATAL_ERROR "Cannot enable dependency debugging while using ccache.")
203   endif()
204 endif()
206 option(LLVM_ENABLE_DAGISEL_COV "Debug: Prints tablegen patterns that were used for selecting" OFF)
207 option(LLVM_ENABLE_GISEL_COV "Enable collection of GlobalISel rule coverage" OFF)
208 if(LLVM_ENABLE_GISEL_COV)
209   set(LLVM_GISEL_COV_PREFIX "${CMAKE_BINARY_DIR}/gisel-coverage-" CACHE STRING "Provide a filename prefix to collect the GlobalISel rule coverage")
210 endif()
212 # Add path for custom modules
213 set(CMAKE_MODULE_PATH
214   ${CMAKE_MODULE_PATH}
215   "${CMAKE_CURRENT_SOURCE_DIR}/cmake"
216   "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
217   )
219 # Generate a CompilationDatabase (compile_commands.json file) for our build,
220 # for use by clang_complete, YouCompleteMe, etc.
221 set(CMAKE_EXPORT_COMPILE_COMMANDS 1)
223 option(LLVM_INSTALL_BINUTILS_SYMLINKS
224   "Install symlinks from the binutils tool names to the corresponding LLVM tools." OFF)
226 option(LLVM_INSTALL_UTILS "Include utility binaries in the 'install' target." OFF)
228 option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files in the 'install' target." OFF)
230 # Unfortunatly Clang is too eager to search directories for module maps, which can cause the
231 # installed version of the maps to be found when building LLVM from source. Therefore we turn off
232 # the installation by default. See llvm.org/PR31905.
233 option(LLVM_INSTALL_MODULEMAPS "Install the modulemap files in the 'install' target." OFF)
235 option(LLVM_USE_FOLDERS "Enable solution folders in Visual Studio. Disable for Express versions." ON)
236 if ( LLVM_USE_FOLDERS )
237   set_property(GLOBAL PROPERTY USE_FOLDERS ON)
238 endif()
240 include(VersionFromVCS)
242 option(LLVM_APPEND_VC_REV
243   "Embed the version control system revision in LLVM" ON)
245 set(PACKAGE_NAME LLVM)
246 set(PACKAGE_STRING "${PACKAGE_NAME} ${PACKAGE_VERSION}")
247 set(PACKAGE_BUGREPORT "https://bugs.llvm.org/")
249 set(BUG_REPORT_URL "${PACKAGE_BUGREPORT}" CACHE STRING
250   "Default URL where bug reports are to be submitted.")
252 # Configure CPack.
253 set(CPACK_PACKAGE_INSTALL_DIRECTORY "LLVM")
254 set(CPACK_PACKAGE_VENDOR "LLVM")
255 set(CPACK_PACKAGE_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
256 set(CPACK_PACKAGE_VERSION_MINOR ${LLVM_VERSION_MINOR})
257 set(CPACK_PACKAGE_VERSION_PATCH ${LLVM_VERSION_PATCH})
258 set(CPACK_PACKAGE_VERSION ${PACKAGE_VERSION})
259 set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.TXT")
260 set(CPACK_NSIS_COMPRESSOR "/SOLID lzma \r\n SetCompressorDictSize 32")
261 if(WIN32 AND NOT UNIX)
262   set(CPACK_PACKAGE_INSTALL_REGISTRY_KEY "LLVM")
263   set(CPACK_PACKAGE_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_logo.bmp")
264   set(CPACK_NSIS_MUI_ICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
265   set(CPACK_NSIS_MUI_UNIICON "${CMAKE_CURRENT_SOURCE_DIR}\\\\cmake\\\\nsis_icon.ico")
266   set(CPACK_NSIS_MODIFY_PATH "ON")
267   set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL "ON")
268   if( CMAKE_CL_64 )
269     set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64")
270   endif()
271 endif()
272 include(CPack)
274 # Sanity check our source directory to make sure that we are not trying to
275 # generate an in-source build (unless on MSVC_IDE, where it is ok), and to make
276 # sure that we don't have any stray generated files lying around in the tree
277 # (which would end up getting picked up by header search, instead of the correct
278 # versions).
279 if( CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE )
280   message(FATAL_ERROR "In-source builds are not allowed.
281 Please create a directory and run cmake from there, passing the path
282 to this source directory as the last argument.
283 This process created the file `CMakeCache.txt' and the directory `CMakeFiles'.
284 Please delete them.")
285 endif()
287 string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
289 if (CMAKE_BUILD_TYPE AND
290     NOT uppercase_CMAKE_BUILD_TYPE MATCHES "^(DEBUG|RELEASE|RELWITHDEBINFO|MINSIZEREL)$")
291   message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
292 endif()
294 set(LLVM_LIBDIR_SUFFIX "" CACHE STRING "Define suffix of library directory name (32/64)" )
296 set(LLVM_TOOLS_INSTALL_DIR "bin" CACHE STRING "Path for binary subdirectory (defaults to 'bin')")
297 mark_as_advanced(LLVM_TOOLS_INSTALL_DIR)
299 set(LLVM_UTILS_INSTALL_DIR "${LLVM_TOOLS_INSTALL_DIR}" CACHE STRING
300     "Path to install LLVM utilities (enabled by LLVM_INSTALL_UTILS=ON) (defaults to LLVM_TOOLS_INSTALL_DIR)")
301 mark_as_advanced(LLVM_UTILS_INSTALL_DIR)
303 # They are used as destination of target generators.
304 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
305 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
306 if(WIN32 OR CYGWIN)
307   # DLL platform -- put DLLs into bin.
308   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
309 else()
310   set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
311 endif()
313 # Each of them corresponds to llvm-config's.
314 set(LLVM_TOOLS_BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) # --bindir
315 set(LLVM_LIBRARY_DIR      ${LLVM_LIBRARY_OUTPUT_INTDIR}) # --libdir
316 set(LLVM_MAIN_SRC_DIR     ${CMAKE_CURRENT_SOURCE_DIR}  ) # --src-root
317 set(LLVM_MAIN_INCLUDE_DIR ${LLVM_MAIN_SRC_DIR}/include ) # --includedir
318 set(LLVM_BINARY_DIR       ${CMAKE_CURRENT_BINARY_DIR}  ) # --prefix
320 # Note: LLVM_CMAKE_PATH does not include generated files
321 set(LLVM_CMAKE_PATH ${LLVM_MAIN_SRC_DIR}/cmake/modules)
322 set(LLVM_EXAMPLES_BINARY_DIR ${LLVM_BINARY_DIR}/examples)
323 set(LLVM_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/include)
325 # List of all targets to be built by default:
326 set(LLVM_ALL_TARGETS
327   AArch64
328   AMDGPU
329   ARM
330   BPF
331   Hexagon
332   Lanai
333   Mips
334   MSP430
335   NVPTX
336   PowerPC
337   Sparc
338   SystemZ
339   WebAssembly
340   X86
341   XCore
342   )
344 # List of targets with JIT support:
345 set(LLVM_TARGETS_WITH_JIT X86 PowerPC AArch64 ARM Mips SystemZ)
347 set(LLVM_TARGETS_TO_BUILD "all"
348     CACHE STRING "Semicolon-separated list of targets to build, or \"all\".")
350 set(LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ""
351   CACHE STRING "Semicolon-separated list of experimental targets to build.")
353 option(BUILD_SHARED_LIBS
354   "Build all libraries as shared libraries instead of static" OFF)
356 option(LLVM_ENABLE_BACKTRACES "Enable embedding backtraces on crash." ON)
357 if(LLVM_ENABLE_BACKTRACES)
358   set(ENABLE_BACKTRACES 1)
359 endif()
361 option(LLVM_ENABLE_UNWIND_TABLES "Emit unwind tables for the libraries" ON)
363 option(LLVM_ENABLE_CRASH_OVERRIDES "Enable crash overrides." ON)
364 if(LLVM_ENABLE_CRASH_OVERRIDES)
365   set(ENABLE_CRASH_OVERRIDES 1)
366 endif()
368 option(LLVM_ENABLE_CRASH_DUMPS "Turn on memory dumps on crashes. Currently only implemented on Windows." OFF)
370 option(LLVM_ENABLE_FFI "Use libffi to call external functions from the interpreter" OFF)
371 set(FFI_LIBRARY_DIR "" CACHE PATH "Additional directory, where CMake should search for libffi.so")
372 set(FFI_INCLUDE_DIR "" CACHE PATH "Additional directory, where CMake should search for ffi.h or ffi/ffi.h")
374 set(LLVM_TARGET_ARCH "host"
375   CACHE STRING "Set target to use for LLVM JIT or use \"host\" for automatic detection.")
377 option(LLVM_ENABLE_TERMINFO "Use terminfo database if available." ON)
379 set(LLVM_ENABLE_LIBXML2 "ON" CACHE STRING "Use libxml2 if available. Can be ON, OFF, or FORCE_ON")
381 option(LLVM_ENABLE_LIBEDIT "Use libedit if available." ON)
383 option(LLVM_ENABLE_LIBPFM "Use libpfm for performance counters if available." ON)
385 option(LLVM_ENABLE_THREADS "Use threads if available." ON)
387 option(LLVM_ENABLE_ZLIB "Use zlib for compression/decompression if available." ON)
389 set(LLVM_Z3_INSTALL_DIR "" CACHE STRING "Install directory of the Z3 solver.")
391 find_package(Z3 4.7.1)
393 if (LLVM_Z3_INSTALL_DIR)
394   if (NOT Z3_FOUND)
395     message(FATAL_ERROR "Z3 >= 4.7.1 has not been found in LLVM_Z3_INSTALL_DIR: ${LLVM_Z3_INSTALL_DIR}.")
396   endif()
397 endif()
399 set(LLVM_ENABLE_Z3_SOLVER_DEFAULT "${Z3_FOUND}")
401 option(LLVM_ENABLE_Z3_SOLVER
402   "Enable Support for the Z3 constraint solver in LLVM."
403   ${LLVM_ENABLE_Z3_SOLVER_DEFAULT}
406 if (LLVM_ENABLE_Z3_SOLVER)
407   if (NOT Z3_FOUND)
408     message(FATAL_ERROR "LLVM_ENABLE_Z3_SOLVER cannot be enabled when Z3 is not available.")
409   endif()
411   set(LLVM_WITH_Z3 1)
412 endif()
414 if( LLVM_TARGETS_TO_BUILD STREQUAL "all" )
415   set( LLVM_TARGETS_TO_BUILD ${LLVM_ALL_TARGETS} )
416 endif()
418 set(LLVM_TARGETS_TO_BUILD
419    ${LLVM_TARGETS_TO_BUILD}
420    ${LLVM_EXPERIMENTAL_TARGETS_TO_BUILD})
421 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
423 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
424 option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
425 option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
426 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
427   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON)
428   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." OFF)
429 else()
430   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
431   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
432 endif()
433 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
434 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
435 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
436 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
438 option(LLVM_ENABLE_DUMP "Enable dump functions even when assertions are disabled" OFF)
440 if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
441   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
442 else()
443   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
444 endif()
446 option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
448 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
449   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
451 option(LLVM_FORCE_USE_OLD_TOOLCHAIN
452        "Set to ON to force using an old, unsupported host toolchain." OFF)
454 option(LLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN
455        "Set to ON to only warn when using a toolchain which is about to be deprecated, instead of emitting an error." OFF)
457 option(LLVM_USE_INTEL_JITEVENTS
458   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
459   OFF)
461 if( LLVM_USE_INTEL_JITEVENTS )
462   # Verify we are on a supported platform
463   if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
464     message(FATAL_ERROR
465       "Intel JIT API support is available on Linux and Windows only.")
466   endif()
467 endif( LLVM_USE_INTEL_JITEVENTS )
469 option(LLVM_USE_OPROFILE
470   "Use opagent JIT interface to inform OProfile about JIT code" OFF)
472 option(LLVM_EXTERNALIZE_DEBUGINFO
473   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
475 set(LLVM_CODESIGNING_IDENTITY "" CACHE STRING
476   "Sign executables and dylibs with the given identity or skip if empty (Darwin Only)")
478 # If enabled, verify we are on a platform that supports oprofile.
479 if( LLVM_USE_OPROFILE )
480   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
481     message(FATAL_ERROR "OProfile support is available on Linux only.")
482   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
483 endif( LLVM_USE_OPROFILE )
485 option(LLVM_USE_PERF
486   "Use perf JIT interface to inform perf about JIT code" OFF)
488 # If enabled, verify we are on a platform that supports perf.
489 if( LLVM_USE_PERF )
490   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
491     message(FATAL_ERROR "perf support is available on Linux only.")
492   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
493 endif( LLVM_USE_PERF )
495 set(LLVM_USE_SANITIZER "" CACHE STRING
496   "Define the sanitizer used to build binaries and tests.")
497 option(LLVM_OPTIMIZE_SANITIZED_BUILDS "Pass -O1 on debug sanitizer builds" ON)
498 set(LLVM_LIB_FUZZING_ENGINE "" CACHE PATH
499   "Path to fuzzing library for linking with fuzz targets")
501 option(LLVM_USE_SPLIT_DWARF
502   "Use -gsplit-dwarf when compiling llvm." OFF)
504 option(LLVM_POLLY_LINK_INTO_TOOLS "Statically link Polly into tools (if available)" ON)
505 option(LLVM_POLLY_BUILD "Build LLVM with Polly" ON)
507 if (EXISTS ${LLVM_MAIN_SRC_DIR}/tools/polly/CMakeLists.txt)
508   set(POLLY_IN_TREE TRUE)
509 elseif(LLVM_EXTERNAL_POLLY_SOURCE_DIR)
510   set(POLLY_IN_TREE TRUE)
511 else()
512   set(POLLY_IN_TREE FALSE)
513 endif()
515 if (LLVM_POLLY_BUILD AND POLLY_IN_TREE)
516   set(WITH_POLLY ON)
517 else()
518   set(WITH_POLLY OFF)
519 endif()
521 if (LLVM_POLLY_LINK_INTO_TOOLS AND WITH_POLLY)
522   set(LINK_POLLY_INTO_TOOLS ON)
523 else()
524   set(LINK_POLLY_INTO_TOOLS OFF)
525 endif()
527 # Define an option controlling whether we should build for 32-bit on 64-bit
528 # platforms, where supported.
529 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
530   # TODO: support other platforms and toolchains.
531   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
532 endif()
534 # Define the default arguments to use with 'lit', and an option for the user to
535 # override.
536 set(LIT_ARGS_DEFAULT "-sv")
537 if (MSVC_IDE OR XCODE)
538   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
539 endif()
540 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
542 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
543 if( WIN32 AND NOT CYGWIN )
544   set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
545 endif()
547 # Define options to control the inclusion and default build behavior for
548 # components which may not strictly be necessary (tools, examples, and tests).
550 # This is primarily to support building smaller or faster project files.
551 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
552 option(LLVM_BUILD_TOOLS
553   "Build the LLVM tools. If OFF, just generate build targets." ON)
555 option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
556 option(LLVM_BUILD_UTILS
557   "Build LLVM utility binaries. If OFF, just generate build targets." ON)
559 option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
560 option(LLVM_BUILD_RUNTIMES
561   "Build the LLVM runtimes. If OFF, just generate build targets." ON)
563 option(LLVM_BUILD_RUNTIME
564   "Build the LLVM runtime libraries." ON)
565 option(LLVM_BUILD_EXAMPLES
566   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
567 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
569 option(LLVM_BUILD_TESTS
570   "Build LLVM unit tests. If OFF, just generate build targets." OFF)
571 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
572 option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
574 option(LLVM_BUILD_BENCHMARKS "Add LLVM benchmark targets to the list of default
575 targets. If OFF, benchmarks still could be built using Benchmarks target." OFF)
576 option(LLVM_INCLUDE_BENCHMARKS "Generate benchmark targets. If OFF, benchmarks can't be built." ON)
578 option (LLVM_BUILD_DOCS "Build the llvm documentation." OFF)
579 option (LLVM_INCLUDE_DOCS "Generate build targets for llvm documentation." ON)
580 option (LLVM_ENABLE_DOXYGEN "Use doxygen to generate llvm API documentation." OFF)
581 option (LLVM_ENABLE_SPHINX "Use Sphinx to generate llvm documentation." OFF)
582 option (LLVM_ENABLE_OCAMLDOC "Build OCaml bindings documentation." ON)
583 option (LLVM_ENABLE_BINDINGS "Build bindings." ON)
585 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
586     CACHE STRING "Doxygen-generated HTML documentation install directory")
587 set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
588     CACHE STRING "OCamldoc-generated HTML documentation install directory")
590 option (LLVM_BUILD_EXTERNAL_COMPILER_RT
591   "Build compiler-rt as an external project." OFF)
593 option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
594   "Show target and host info when tools are invoked with --version." ON)
596 # You can configure which libraries from LLVM you want to include in the
597 # shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
598 # list of LLVM components. All component names handled by llvm-config are valid.
599 if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
600   set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
601     "Semicolon-separated list of components to include in libLLVM, or \"all\".")
602 endif()
603 option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
604 if(MSVC)
605   option(LLVM_BUILD_LLVM_C_DYLIB "Build LLVM-C.dll (Windows only)" ON)
606 else()
607   option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin only)" OFF)
608 endif()
609 set(LLVM_BUILD_LLVM_DYLIB_default OFF)
610 if(LLVM_LINK_LLVM_DYLIB OR (LLVM_BUILD_LLVM_C_DYLIB AND NOT MSVC))
611   set(LLVM_BUILD_LLVM_DYLIB_default ON)
612 endif()
613 option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
615 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
616 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
617   set(LLVM_USE_HOST_TOOLS ON)
618 endif()
620 if (MSVC_IDE AND NOT (MSVC_VERSION LESS 1900))
621   option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
622 else()
623   set(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION FALSE CACHE INTERNAL "For Visual Studio 2013, manually copy natvis files to Documents\\Visual Studio 2013\\Visualizers" FORCE)
624 endif()
626 if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE OR
627     LLVM_ENABLE_IR_PGO)
628   if(NOT LLVM_PROFILE_MERGE_POOL_SIZE)
629     # A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine
630     # for spining disks. Anything higher may only help on slower mediums.
631     set(LLVM_PROFILE_MERGE_POOL_SIZE "4")
632   endif()
633   if(NOT LLVM_PROFILE_FILE_PATTERN)
634     if(NOT LLVM_PROFILE_DATA_DIR)
635       file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles" LLVM_PROFILE_DATA_DIR)
636     endif()
637                 file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
638   endif()
639   if(NOT LLVM_CSPROFILE_FILE_PATTERN)
640     if(NOT LLVM_CSPROFILE_DATA_DIR)
641       file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/csprofiles" LLVM_CSPROFILE_DATA_DIR)
642     endif()
643     file(TO_NATIVE_PATH "${LLVM_CSPROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_CSPROFILE_FILE_PATTERN)
644   endif()
645 endif()
647 if (LLVM_BUILD_STATIC)
648   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
649 endif()
651 # Override the default target with an environment variable named by LLVM_TARGET_TRIPLE_ENV.
652 set(LLVM_TARGET_TRIPLE_ENV CACHE STRING "The name of environment variable to override default target. Disabled by blank.")
653 mark_as_advanced(LLVM_TARGET_TRIPLE_ENV)
655 set(LLVM_ENABLE_PER_TARGET_RUNTIME_DIR OFF CACHE BOOL
656   "Enable per-target runtimes directory")
658 # All options referred to from HandleLLVMOptions have to be specified
659 # BEFORE this include, otherwise options will not be correctly set on
660 # first cmake run
661 include(config-ix)
663 string(REPLACE "Native" ${LLVM_NATIVE_ARCH}
664   LLVM_TARGETS_TO_BUILD "${LLVM_TARGETS_TO_BUILD}")
665 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
667 # By default, we target the host, but this can be overridden at CMake
668 # invocation time.
669 set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING
670   "Default target for which LLVM will generate code." )
671 set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
672 message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
673 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
675 include(HandleLLVMOptions)
677 # Verify that we can find a Python 2 interpreter.  Python 3 is unsupported.
678 # FIXME: We should support systems with only Python 3, but that requires work
679 # on LLDB.
680 set(Python_ADDITIONAL_VERSIONS 2.7)
681 include(FindPythonInterp)
682 if( NOT PYTHONINTERP_FOUND )
683   message(FATAL_ERROR
684 "Unable to find Python interpreter, required for builds and testing.
686 Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")
687 endif()
689 if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )
690   message(FATAL_ERROR "Python 2.7 or newer is required")
691 endif()
693 ######
694 # LLVMBuild Integration
696 # We use llvm-build to generate all the data required by the CMake based
697 # build system in one swoop:
699 #  - We generate a file (a CMake fragment) in the object root which contains
700 #    all the definitions that are required by CMake.
702 #  - We generate the library table used by llvm-config.
704 #  - We generate the dependencies for the CMake fragment, so that we will
705 #    automatically reconfigure ourselves.
707 set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
708 set(LLVMCONFIGLIBRARYDEPENDENCIESINC
709   "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
710 set(LLVMBUILDCMAKEFRAG
711   "${LLVM_BINARY_DIR}/LLVMBuild.cmake")
713 # Create the list of optional components that are enabled
714 if (LLVM_USE_INTEL_JITEVENTS)
715   set(LLVMOPTIONALCOMPONENTS IntelJITEvents)
716 endif (LLVM_USE_INTEL_JITEVENTS)
717 if (LLVM_USE_OPROFILE)
718   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
719 endif (LLVM_USE_OPROFILE)
720 if (LLVM_USE_PERF)
721   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} PerfJITEvents)
722 endif (LLVM_USE_PERF)
724 message(STATUS "Constructing LLVMBuild project information")
725 execute_process(
726   COMMAND ${PYTHON_EXECUTABLE} -B ${LLVMBUILDTOOL}
727             --native-target "${LLVM_NATIVE_ARCH}"
728             --enable-targets "${LLVM_TARGETS_TO_BUILD}"
729             --enable-optional-components "${LLVMOPTIONALCOMPONENTS}"
730             --write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC}
731             --write-cmake-fragment ${LLVMBUILDCMAKEFRAG}
732             OUTPUT_VARIABLE LLVMBUILDOUTPUT
733             ERROR_VARIABLE LLVMBUILDERRORS
734             OUTPUT_STRIP_TRAILING_WHITESPACE
735             ERROR_STRIP_TRAILING_WHITESPACE
736   RESULT_VARIABLE LLVMBUILDRESULT)
738 # On Win32, CMake doesn't properly handle piping the default output/error
739 # streams into the GUI console. So, we explicitly catch and report them.
740 if( NOT "${LLVMBUILDOUTPUT}" STREQUAL "")
741   message(STATUS "llvm-build output: ${LLVMBUILDOUTPUT}")
742 endif()
743 if( NOT "${LLVMBUILDRESULT}" STREQUAL "0" )
744   message(FATAL_ERROR
745     "Unexpected failure executing llvm-build: ${LLVMBUILDERRORS}")
746 endif()
748 # Include the generated CMake fragment. This will define properties from the
749 # LLVMBuild files in a format which is easy to consume from CMake, and will add
750 # the dependencies so that CMake will reconfigure properly when the LLVMBuild
751 # files change.
752 include(${LLVMBUILDCMAKEFRAG})
754 ######
756 # Configure all of the various header file fragments LLVM uses which depend on
757 # configuration variables.
758 set(LLVM_ENUM_TARGETS "")
759 set(LLVM_ENUM_ASM_PRINTERS "")
760 set(LLVM_ENUM_ASM_PARSERS "")
761 set(LLVM_ENUM_DISASSEMBLERS "")
762 foreach(t ${LLVM_TARGETS_TO_BUILD})
763   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
765   list(FIND LLVM_ALL_TARGETS ${t} idx)
766   list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy)
767   # At this point, LLVMBUILDTOOL already checked all the targets passed in
768   # LLVM_TARGETS_TO_BUILD and LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, so
769   # this test just makes sure that any experimental targets were passed via
770   # LLVM_EXPERIMENTAL_TARGETS_TO_BUILD, not LLVM_TARGETS_TO_BUILD.
771   if( idx LESS 0 AND idy LESS 0 )
772     message(FATAL_ERROR "The target `${t}' is experimental and must be passed "
773       "via LLVM_EXPERIMENTAL_TARGETS_TO_BUILD.")
774   else()
775     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n")
776   endif()
778   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
779   if( asmp_file )
780     set(LLVM_ENUM_ASM_PRINTERS
781       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
782   endif()
783   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
784     set(LLVM_ENUM_ASM_PARSERS
785       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
786   endif()
787   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
788     set(LLVM_ENUM_DISASSEMBLERS
789       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
790   endif()
791 endforeach(t)
793 # Produce the target definition files, which provide a way for clients to easily
794 # include various classes of targets.
795 configure_file(
796   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
797   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
798   )
799 configure_file(
800   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
801   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
802   )
803 configure_file(
804   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
805   ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
806   )
807 configure_file(
808   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
809   ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
810   )
812 # Configure the three LLVM configuration header files.
813 configure_file(
814   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
815   ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
816 configure_file(
817   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
818   ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
819 configure_file(
820   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
821   ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
823 # Add target for generating source rpm package.
824 set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
825     CACHE FILEPATH ".spec file to use for srpm generation")
826 set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
827 set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
829 get_source_info(${CMAKE_CURRENT_SOURCE_DIR} revision repository)
830 string(LENGTH "${revision}" revision_length)
831 if(revision MATCHES "^[0-9]+$" AND revision_length LESS 40)
832   set(LLVM_RPM_SPEC_REVISION "r${revision}")
833 else()
834   set(LLVM_RPM_SPEC_REVISION "${revision}")
835 endif()
837 configure_file(
838   ${LLVM_SRPM_USER_BINARY_SPECFILE}
839   ${LLVM_SRPM_BINARY_SPECFILE} @ONLY)
841 add_custom_target(srpm
842   COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES
843   COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE})
844 set_target_properties(srpm PROPERTIES FOLDER "Misc")
847 # They are not referenced. See set_output_directory().
848 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
849 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
850 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
852 if(APPLE AND DARWIN_LTO_LIBRARY)
853   set(CMAKE_EXE_LINKER_FLAGS
854     "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
855   set(CMAKE_SHARED_LINKER_FLAGS
856     "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
857   set(CMAKE_MODULE_LINKER_FLAGS
858     "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
859 endif()
861 # Work around a broken bfd ld behavior. When linking a binary with a
862 # foo.so library, it will try to find any library that foo.so uses and
863 # check its symbols. This is wasteful (the check was done when foo.so
864 # was created) and can fail since it is not the dynamic linker and
865 # doesn't know how to handle search paths correctly.
866 if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS|AIX")
867   set(CMAKE_EXE_LINKER_FLAGS
868       "${CMAKE_EXE_LINKER_FLAGS} -Wl,-allow-shlib-undefined")
869 endif()
871 set(CMAKE_INCLUDE_CURRENT_DIR ON)
873 include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
875 # when crosscompiling import the executable targets from a file
876 if(LLVM_USE_HOST_TOOLS)
877   include(CrossCompile)
878 endif(LLVM_USE_HOST_TOOLS)
879 if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
880 # Dummy use to avoid CMake Warning: Manually-specified variables were not used
881 # (this is a variable that CrossCompile sets on recursive invocations)
882 endif()
884 if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
885   # On FreeBSD, /usr/local/* is not used by default. In order to build LLVM
886   # with libxml2, iconv.h, etc., we must add /usr/local paths.
887   include_directories(SYSTEM "/usr/local/include")
888   link_directories("/usr/local/lib")
889 endif(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
891 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
892    # special hack for Solaris to handle crazy system sys/regset.h
893    include_directories("${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/Solaris")
894 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
896 # Make sure we don't get -rdynamic in every binary. For those that need it,
897 # use export_executable_symbols(target).
898 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
900 set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
901   "Profiling data file to use when compiling in order to improve runtime performance.")
903 if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE})
904   if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
905     add_definitions("-fprofile-instr-use=${LLVM_PROFDATA_FILE}")
906   else()
907     message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang")
908   endif()
909 endif()
911 include(AddLLVM)
912 include(TableGen)
914 if( MINGW AND NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
915   # People report that -O3 is unreliable on MinGW. The traditional
916   # build also uses -O2 for that reason:
917   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
918 endif()
920 # Put this before tblgen. Else we have a circular dependence.
921 add_subdirectory(lib/Demangle)
922 add_subdirectory(lib/Support)
923 add_subdirectory(lib/TableGen)
925 add_subdirectory(utils/TableGen)
927 add_subdirectory(include/llvm)
929 add_subdirectory(lib)
931 if( LLVM_INCLUDE_UTILS )
932   add_subdirectory(utils/FileCheck)
933   add_subdirectory(utils/PerfectShuffle)
934   add_subdirectory(utils/count)
935   add_subdirectory(utils/not)
936   add_subdirectory(utils/yaml-bench)
937 else()
938   if ( LLVM_INCLUDE_TESTS )
939     message(FATAL_ERROR "Including tests when not building utils will not work.
940     Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLUDE_TESTS to Off.")
941   endif()
942 endif()
944 # Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
945 if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
946   add_subdirectory(utils/LLVMVisualizers)
947 endif()
949 foreach( binding ${LLVM_BINDINGS_LIST} )
950   if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
951     add_subdirectory(bindings/${binding})
952   endif()
953 endforeach()
955 add_subdirectory(projects)
957 if( LLVM_INCLUDE_TOOLS )
958   add_subdirectory(tools)
959 endif()
961 if( LLVM_INCLUDE_RUNTIMES )
962   add_subdirectory(runtimes)
963 endif()
965 if( LLVM_INCLUDE_EXAMPLES )
966   add_subdirectory(examples)
967 endif()
969 if( LLVM_INCLUDE_TESTS )
970   if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang)
971     include(LLVMExternalProjectUtils)
972     llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
973       USE_TOOLCHAIN
974       EXCLUDE_FROM_ALL
975       NO_INSTALL
976       ALWAYS_CLEAN)
977   endif()
978   add_subdirectory(utils/lit)
979   add_subdirectory(test)
980   add_subdirectory(unittests)
981   if( LLVM_INCLUDE_UTILS )
982     add_subdirectory(utils/unittest)
983   endif()
985   if (WIN32)
986     # This utility is used to prevent crashing tests from calling Dr. Watson on
987     # Windows.
988     add_subdirectory(utils/KillTheDoctor)
989   endif()
991   # Add a global check rule now that all subdirectories have been traversed
992   # and we know the total set of lit testsuites.
993   get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES)
994   get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS)
995   get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS)
996   get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS)
997   get_property(LLVM_ADDITIONAL_TEST_TARGETS
998                GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS)
999   get_property(LLVM_ADDITIONAL_TEST_DEPENDS
1000                GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS)
1001   add_lit_target(check-all
1002     "Running all regression tests"
1003     ${LLVM_LIT_TESTSUITES}
1004     PARAMS ${LLVM_LIT_PARAMS}
1005     DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS}
1006     ARGS ${LLVM_LIT_EXTRA_ARGS}
1007     )
1008   if(TARGET check-runtimes)
1009     add_dependencies(check-all check-runtimes)
1010   endif()
1011   add_custom_target(test-depends
1012                     DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS})
1013   set_target_properties(test-depends PROPERTIES FOLDER "Tests")
1014 endif()
1016 if (LLVM_INCLUDE_DOCS)
1017   add_subdirectory(docs)
1018 endif()
1020 add_subdirectory(cmake/modules)
1022 # Do this last so that all lit targets have already been created.
1023 if (LLVM_INCLUDE_UTILS)
1024   add_subdirectory(utils/llvm-lit)
1025 endif()
1027 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
1028   install(DIRECTORY include/llvm include/llvm-c
1029     DESTINATION include
1030     COMPONENT llvm-headers
1031     FILES_MATCHING
1032     PATTERN "*.def"
1033     PATTERN "*.h"
1034     PATTERN "*.td"
1035     PATTERN "*.inc"
1036     PATTERN "LICENSE.TXT"
1037     PATTERN ".svn" EXCLUDE
1038     )
1040   install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm ${LLVM_INCLUDE_DIR}/llvm-c
1041     DESTINATION include
1042     COMPONENT llvm-headers
1043     FILES_MATCHING
1044     PATTERN "*.def"
1045     PATTERN "*.h"
1046     PATTERN "*.gen"
1047     PATTERN "*.inc"
1048     # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
1049     PATTERN "CMakeFiles" EXCLUDE
1050     PATTERN "config.h" EXCLUDE
1051     PATTERN ".svn" EXCLUDE
1052     )
1054   if (LLVM_INSTALL_MODULEMAPS)
1055     install(DIRECTORY include/llvm include/llvm-c
1056             DESTINATION include
1057             COMPONENT llvm-headers
1058             FILES_MATCHING
1059             PATTERN "module.modulemap"
1060             )
1061     install(FILES include/llvm/module.install.modulemap
1062             DESTINATION include/llvm
1063             COMPONENT llvm-headers
1064             RENAME "module.extern.modulemap"
1065             )
1066   endif(LLVM_INSTALL_MODULEMAPS)
1068   # Installing the headers needs to depend on generating any public
1069   # tablegen'd headers.
1070   add_custom_target(llvm-headers DEPENDS intrinsics_gen)
1071   set_target_properties(llvm-headers PROPERTIES FOLDER "Misc")
1073   if (NOT LLVM_ENABLE_IDE)
1074     add_llvm_install_targets(install-llvm-headers
1075                              DEPENDS llvm-headers
1076                              COMPONENT llvm-headers)
1077   endif()
1079   # Custom target to install all libraries.
1080   add_custom_target(llvm-libraries)
1081   set_target_properties(llvm-libraries PROPERTIES FOLDER "Misc")
1083   if (NOT LLVM_ENABLE_IDE)
1084     add_llvm_install_targets(install-llvm-libraries
1085                              DEPENDS llvm-libraries
1086                              COMPONENT llvm-libraries)
1087   endif()
1089   get_property(LLVM_LIBS GLOBAL PROPERTY LLVM_LIBS)
1090   if(LLVM_LIBS)
1091     list(REMOVE_DUPLICATES LLVM_LIBS)
1092     foreach(lib ${LLVM_LIBS})
1093       add_dependencies(llvm-libraries ${lib})
1094       if (NOT LLVM_ENABLE_IDE)
1095         add_dependencies(install-llvm-libraries install-${lib})
1096       endif()
1097     endforeach()
1098   endif()
1099 endif()
1101 # This must be at the end of the LLVM root CMakeLists file because it must run
1102 # after all targets are created.
1103 if(LLVM_DISTRIBUTION_COMPONENTS)
1104   if(LLVM_ENABLE_IDE)
1105     message(FATAL_ERROR "LLVM_DISTRIBUTION_COMPONENTS cannot be specified with multi-configuration generators (i.e. Xcode or Visual Studio)")
1106   endif()
1108   add_custom_target(distribution)
1109   add_custom_target(install-distribution)
1110   add_custom_target(install-distribution-stripped)
1111   foreach(target ${LLVM_DISTRIBUTION_COMPONENTS} ${LLVM_RUNTIME_DISTRIBUTION_COMPONENTS})
1112     if(TARGET ${target})
1113       add_dependencies(distribution ${target})
1114     else()
1115       message(SEND_ERROR "Specified distribution component '${target}' doesn't have a target")
1116     endif()
1118     if(TARGET install-${target})
1119       add_dependencies(install-distribution install-${target})
1120     else()
1121       message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install target")
1122     endif()
1124     if(TARGET install-${target}-stripped)
1125       add_dependencies(install-distribution-stripped install-${target}-stripped)
1126     else()
1127       message(SEND_ERROR "Specified distribution component '${target}' doesn't have an install-stripped target."
1128                          " Its installation target creation should be changed to use add_llvm_install_targets,"
1129                          " or you should manually create the 'install-${target}-stripped' target.")
1130     endif()
1131   endforeach()
1132 endif()
1134 # This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
1135 if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows" AND CMAKE_INSTALL_UCRT_LIBRARIES)
1136   include(InstallRequiredSystemLibraries)
1137 endif()
1139 if (LLVM_INCLUDE_BENCHMARKS)
1140   # Override benchmark defaults so that when the library itself is updated these
1141   # modifications are not lost.
1142   set(BENCHMARK_ENABLE_TESTING OFF CACHE BOOL "Disable benchmark testing" FORCE)
1143   set(BENCHMARK_ENABLE_EXCEPTIONS OFF CACHE BOOL "Disable benchmark exceptions" FORCE)
1144   set(BENCHMARK_ENABLE_INSTALL OFF CACHE BOOL "Don't install benchmark" FORCE)
1145   set(BENCHMARK_DOWNLOAD_DEPENDENCIES OFF CACHE BOOL "Don't download dependencies" FORCE)
1146   set(BENCHMARK_ENABLE_GTEST_TESTS OFF CACHE BOOL "Disable Google Test in benchmark" FORCE)
1147   # Since LLVM requires C++11 it is safe to assume that std::regex is available.
1148   set(HAVE_STD_REGEX ON CACHE BOOL "OK" FORCE)
1150   add_subdirectory(utils/benchmark)
1151   add_subdirectory(benchmarks)
1152 endif()