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