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