OSDN Git Service

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