OSDN Git Service

Allow suppressing host and target info in VersionPrinter
[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 option(LLVM_ENABLE_PIC "Build Position-Independent Code" ON)
371 option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON)
372 option(LLVM_ENABLE_MODULES "Compile with C++ modules enabled." OFF)
373 if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
374   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." ON)
375   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." OFF)
376 else()
377   option(LLVM_ENABLE_MODULE_DEBUGGING "Compile with -gmodules." OFF)
378   option(LLVM_ENABLE_LOCAL_SUBMODULE_VISIBILITY "Compile with -fmodules-local-submodule-visibility." ON)
379 endif()
380 option(LLVM_ENABLE_CXX1Y "Compile with C++1y enabled." OFF)
381 option(LLVM_ENABLE_LIBCXX "Use libc++ if available." OFF)
382 option(LLVM_ENABLE_LLD "Use lld as C and C++ linker." OFF)
383 option(LLVM_ENABLE_PEDANTIC "Compile with pedantic enabled." ON)
384 option(LLVM_ENABLE_WERROR "Fail and stop if a warning is triggered." OFF)
385
386 if( NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
387   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" OFF)
388 else()
389   option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
390 endif()
391
392 option(LLVM_ENABLE_EXPENSIVE_CHECKS "Enable expensive checks" OFF)
393
394 set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
395   "Enable abi-breaking checks.  Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
396
397 option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
398        "Set to ON to force using an old, unsupported host toolchain." OFF)
399
400 option(LLVM_USE_INTEL_JITEVENTS
401   "Use Intel JIT API to inform Intel(R) VTune(TM) Amplifier XE 2011 about JIT code"
402   OFF)
403
404 if( LLVM_USE_INTEL_JITEVENTS )
405   # Verify we are on a supported platform
406   if( NOT CMAKE_SYSTEM_NAME MATCHES "Windows" AND NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
407     message(FATAL_ERROR
408       "Intel JIT API support is available on Linux and Windows only.")
409   endif()
410 endif( LLVM_USE_INTEL_JITEVENTS )
411
412 option(LLVM_USE_OPROFILE
413   "Use opagent JIT interface to inform OProfile about JIT code" OFF)
414
415 option(LLVM_EXTERNALIZE_DEBUGINFO
416   "Generate dSYM files and strip executables and libraries (Darwin Only)" OFF)
417
418 # If enabled, verify we are on a platform that supports oprofile.
419 if( LLVM_USE_OPROFILE )
420   if( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
421     message(FATAL_ERROR "OProfile support is available on Linux only.")
422   endif( NOT CMAKE_SYSTEM_NAME MATCHES "Linux" )
423 endif( LLVM_USE_OPROFILE )
424
425 set(LLVM_USE_SANITIZER "" CACHE STRING
426   "Define the sanitizer used to build binaries and tests.")
427
428 option(LLVM_USE_SPLIT_DWARF
429   "Use -gsplit-dwarf when compiling llvm." OFF)
430
431 option(LLVM_POLLY_LINK_INTO_TOOLS "Statically link Polly into tools (if available)" ON)
432 option(LLVM_POLLY_BUILD "Build LLVM with Polly" ON)
433
434 if (EXISTS ${LLVM_MAIN_SRC_DIR}/tools/polly/CMakeLists.txt)
435   set(POLLY_IN_TREE TRUE)
436 elseif(LLVM_EXTERNAL_POLLY_SOURCE_DIR)
437   set(POLLY_IN_TREE TRUE)
438 else()
439   set(POLLY_IN_TREE FALSE)
440 endif()
441
442 if (LLVM_POLLY_BUILD AND POLLY_IN_TREE)
443   set(WITH_POLLY ON)
444 else()
445   set(WITH_POLLY OFF)
446 endif()
447
448 if (LLVM_POLLY_LINK_INTO_TOOLS AND WITH_POLLY)
449   set(LINK_POLLY_INTO_TOOLS ON)
450 else()
451   set(LINK_POLLY_INTO_TOOLS OFF)
452 endif()
453
454 # Define an option controlling whether we should build for 32-bit on 64-bit
455 # platforms, where supported.
456 if( CMAKE_SIZEOF_VOID_P EQUAL 8 AND NOT WIN32 )
457   # TODO: support other platforms and toolchains.
458   option(LLVM_BUILD_32_BITS "Build 32 bits executables and libraries." OFF)
459 endif()
460
461 # Define the default arguments to use with 'lit', and an option for the user to
462 # override.
463 set(LIT_ARGS_DEFAULT "-sv")
464 if (MSVC_IDE OR XCODE)
465   set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
466 endif()
467 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
468
469 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
470 if( WIN32 AND NOT CYGWIN )
471   set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
472 endif()
473
474 # Define options to control the inclusion and default build behavior for
475 # components which may not strictly be necessary (tools, examples, and tests).
476 #
477 # This is primarily to support building smaller or faster project files.
478 option(LLVM_INCLUDE_TOOLS "Generate build targets for the LLVM tools." ON)
479 option(LLVM_BUILD_TOOLS
480   "Build the LLVM tools. If OFF, just generate build targets." ON)
481
482 option(LLVM_INCLUDE_UTILS "Generate build targets for the LLVM utils." ON)
483 option(LLVM_BUILD_UTILS
484   "Build LLVM utility binaries. If OFF, just generate build targets." ON)
485
486 option(LLVM_INCLUDE_RUNTIMES "Generate build targets for the LLVM runtimes." ON)
487 option(LLVM_BUILD_RUNTIMES
488   "Build the LLVM runtimes. If OFF, just generate build targets." ON)
489
490 option(LLVM_BUILD_RUNTIME
491   "Build the LLVM runtime libraries." ON)
492 option(LLVM_BUILD_EXAMPLES
493   "Build the LLVM example programs. If OFF, just generate build targets." OFF)
494 option(LLVM_INCLUDE_EXAMPLES "Generate build targets for the LLVM examples" ON)
495
496 option(LLVM_BUILD_TESTS
497   "Build LLVM unit tests. If OFF, just generate build targets." OFF)
498 option(LLVM_INCLUDE_TESTS "Generate build targets for the LLVM unit tests." ON)
499 option(LLVM_INCLUDE_GO_TESTS "Include the Go bindings tests in test build targets." ON)
500
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
507 set(LLVM_INSTALL_DOXYGEN_HTML_DIR "share/doc/llvm/doxygen-html"
508     CACHE STRING "Doxygen-generated HTML documentation install directory")
509 set(LLVM_INSTALL_OCAMLDOC_HTML_DIR "share/doc/llvm/ocaml-html"
510     CACHE STRING "OCamldoc-generated HTML documentation install directory")
511
512 option (LLVM_BUILD_EXTERNAL_COMPILER_RT
513   "Build compiler-rt as an external project." OFF)
514
515 option (LLVM_VERSION_PRINTER_SHOW_HOST_TARGET_INFO
516   "Show target and host info when tools are invoked with --version." ON)
517
518 # You can configure which libraries from LLVM you want to include in the
519 # shared library by setting LLVM_DYLIB_COMPONENTS to a semi-colon delimited
520 # list of LLVM components. All component names handled by llvm-config are valid.
521 if(NOT DEFINED LLVM_DYLIB_COMPONENTS)
522   set(LLVM_DYLIB_COMPONENTS "all" CACHE STRING
523     "Semicolon-separated list of components to include in libLLVM, or \"all\".")
524 endif()
525 option(LLVM_LINK_LLVM_DYLIB "Link tools against the libllvm dynamic library" OFF)
526 option(LLVM_BUILD_LLVM_C_DYLIB "Build libllvm-c re-export library (Darwin Only)" OFF)
527 set(LLVM_BUILD_LLVM_DYLIB_default OFF)
528 if(LLVM_LINK_LLVM_DYLIB OR LLVM_BUILD_LLVM_C_DYLIB)
529   set(LLVM_BUILD_LLVM_DYLIB_default ON)
530 endif()
531 option(LLVM_BUILD_LLVM_DYLIB "Build libllvm dynamic library" ${LLVM_BUILD_LLVM_DYLIB_default})
532
533 option(LLVM_OPTIMIZED_TABLEGEN "Force TableGen to be built with optimization" OFF)
534 if(CMAKE_CROSSCOMPILING OR (LLVM_OPTIMIZED_TABLEGEN AND (LLVM_ENABLE_ASSERTIONS OR CMAKE_CONFIGURATION_TYPES)))
535   set(LLVM_USE_HOST_TOOLS ON)
536 endif()
537
538 if (MSVC_IDE AND NOT (MSVC_VERSION LESS 1900))
539   option(LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION "Configure project to use Visual Studio native visualizers" TRUE)
540 else()
541   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)
542 endif()
543
544 if (LLVM_BUILD_INSTRUMENTED OR LLVM_BUILD_INSTRUMENTED_COVERAGE)
545   if(NOT LLVM_PROFILE_MERGE_POOL_SIZE)
546     # A pool size of 1-2 is probably sufficient on a SSD. 3-4 should be fine
547     # for spining disks. Anything higher may only help on slower mediums.
548     set(LLVM_PROFILE_MERGE_POOL_SIZE "4")
549   endif()
550   if(NOT LLVM_PROFILE_FILE_PATTERN)
551     if(NOT LLVM_PROFILE_DATA_DIR)
552       file(TO_NATIVE_PATH "${LLVM_BINARY_DIR}/profiles/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
553     else()
554       file(TO_NATIVE_PATH "${LLVM_PROFILE_DATA_DIR}/%${LLVM_PROFILE_MERGE_POOL_SIZE}m.profraw" LLVM_PROFILE_FILE_PATTERN)
555     endif()
556   endif()
557 endif()
558
559 if (LLVM_BUILD_STATIC)
560   set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")
561 endif()
562
563 # All options referred to from HandleLLVMOptions have to be specified
564 # BEFORE this include, otherwise options will not be correctly set on
565 # first cmake run
566 include(config-ix)
567
568 string(REPLACE "Native" ${LLVM_NATIVE_ARCH}
569   LLVM_TARGETS_TO_BUILD "${LLVM_TARGETS_TO_BUILD}")
570 list(REMOVE_DUPLICATES LLVM_TARGETS_TO_BUILD)
571
572 # By default, we target the host, but this can be overridden at CMake
573 # invocation time.
574 set(LLVM_DEFAULT_TARGET_TRIPLE "${LLVM_HOST_TRIPLE}" CACHE STRING
575   "Default target for which LLVM will generate code." )
576 set(TARGET_TRIPLE "${LLVM_DEFAULT_TARGET_TRIPLE}")
577 message(STATUS "LLVM host triple: ${LLVM_HOST_TRIPLE}")
578 message(STATUS "LLVM default target triple: ${LLVM_DEFAULT_TARGET_TRIPLE}")
579
580 include(HandleLLVMOptions)
581
582 # Verify that we can find a Python 2 interpreter.  Python 3 is unsupported.
583 # FIXME: We should support systems with only Python 3, but that requires work
584 # on LLDB.
585 set(Python_ADDITIONAL_VERSIONS 2.7)
586 include(FindPythonInterp)
587 if( NOT PYTHONINTERP_FOUND )
588   message(FATAL_ERROR
589 "Unable to find Python interpreter, required for builds and testing.
590
591 Please install Python or specify the PYTHON_EXECUTABLE CMake variable.")
592 endif()
593
594 if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 )
595   message(FATAL_ERROR "Python 2.7 or newer is required")
596 endif()
597
598 ######
599 # LLVMBuild Integration
600 #
601 # We use llvm-build to generate all the data required by the CMake based
602 # build system in one swoop:
603 #
604 #  - We generate a file (a CMake fragment) in the object root which contains
605 #    all the definitions that are required by CMake.
606 #
607 #  - We generate the library table used by llvm-config.
608 #
609 #  - We generate the dependencies for the CMake fragment, so that we will
610 #    automatically reconfigure outselves.
611
612 set(LLVMBUILDTOOL "${LLVM_MAIN_SRC_DIR}/utils/llvm-build/llvm-build")
613 set(LLVMCONFIGLIBRARYDEPENDENCIESINC
614   "${LLVM_BINARY_DIR}/tools/llvm-config/LibraryDependencies.inc")
615 set(LLVMBUILDCMAKEFRAG
616   "${LLVM_BINARY_DIR}/LLVMBuild.cmake")
617
618 # Create the list of optional components that are enabled
619 if (LLVM_USE_INTEL_JITEVENTS)
620   set(LLVMOPTIONALCOMPONENTS IntelJITEvents)
621 endif (LLVM_USE_INTEL_JITEVENTS)
622 if (LLVM_USE_OPROFILE)
623   set(LLVMOPTIONALCOMPONENTS ${LLVMOPTIONALCOMPONENTS} OProfileJIT)
624 endif (LLVM_USE_OPROFILE)
625
626 message(STATUS "Constructing LLVMBuild project information")
627 execute_process(
628   COMMAND ${PYTHON_EXECUTABLE} -B ${LLVMBUILDTOOL}
629             --native-target "${LLVM_NATIVE_ARCH}"
630             --enable-targets "${LLVM_TARGETS_TO_BUILD}"
631             --enable-optional-components "${LLVMOPTIONALCOMPONENTS}"
632             --write-library-table ${LLVMCONFIGLIBRARYDEPENDENCIESINC}
633             --write-cmake-fragment ${LLVMBUILDCMAKEFRAG}
634             OUTPUT_VARIABLE LLVMBUILDOUTPUT
635             ERROR_VARIABLE LLVMBUILDERRORS
636             OUTPUT_STRIP_TRAILING_WHITESPACE
637             ERROR_STRIP_TRAILING_WHITESPACE
638   RESULT_VARIABLE LLVMBUILDRESULT)
639
640 # On Win32, CMake doesn't properly handle piping the default output/error
641 # streams into the GUI console. So, we explicitly catch and report them.
642 if( NOT "${LLVMBUILDOUTPUT}" STREQUAL "")
643   message(STATUS "llvm-build output: ${LLVMBUILDOUTPUT}")
644 endif()
645 if( NOT "${LLVMBUILDRESULT}" STREQUAL "0" )
646   message(FATAL_ERROR
647     "Unexpected failure executing llvm-build: ${LLVMBUILDERRORS}")
648 endif()
649
650 # Include the generated CMake fragment. This will define properties from the
651 # LLVMBuild files in a format which is easy to consume from CMake, and will add
652 # the dependencies so that CMake will reconfigure properly when the LLVMBuild
653 # files change.
654 include(${LLVMBUILDCMAKEFRAG})
655
656 ######
657
658 # Configure all of the various header file fragments LLVM uses which depend on
659 # configuration variables.
660 set(LLVM_ENUM_TARGETS "")
661 set(LLVM_ENUM_ASM_PRINTERS "")
662 set(LLVM_ENUM_ASM_PARSERS "")
663 set(LLVM_ENUM_DISASSEMBLERS "")
664 foreach(t ${LLVM_TARGETS_TO_BUILD})
665   set( td ${LLVM_MAIN_SRC_DIR}/lib/Target/${t} )
666
667   list(FIND LLVM_ALL_TARGETS ${t} idx)
668   list(FIND LLVM_EXPERIMENTAL_TARGETS_TO_BUILD ${t} idy)
669   if( idx LESS 0 AND idy LESS 0 )
670     message(FATAL_ERROR "The target `${t}' does not exist.
671     It should be one of\n${LLVM_ALL_TARGETS}")
672   else()
673     set(LLVM_ENUM_TARGETS "${LLVM_ENUM_TARGETS}LLVM_TARGET(${t})\n")
674   endif()
675
676   file(GLOB asmp_file "${td}/*AsmPrinter.cpp")
677   if( asmp_file )
678     set(LLVM_ENUM_ASM_PRINTERS
679       "${LLVM_ENUM_ASM_PRINTERS}LLVM_ASM_PRINTER(${t})\n")
680   endif()
681   if( EXISTS ${td}/AsmParser/CMakeLists.txt )
682     set(LLVM_ENUM_ASM_PARSERS
683       "${LLVM_ENUM_ASM_PARSERS}LLVM_ASM_PARSER(${t})\n")
684   endif()
685   if( EXISTS ${td}/Disassembler/CMakeLists.txt )
686     set(LLVM_ENUM_DISASSEMBLERS
687       "${LLVM_ENUM_DISASSEMBLERS}LLVM_DISASSEMBLER(${t})\n")
688   endif()
689 endforeach(t)
690
691 # Produce the target definition files, which provide a way for clients to easily
692 # include various classes of targets.
693 configure_file(
694   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmPrinters.def.in
695   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmPrinters.def
696   )
697 configure_file(
698   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/AsmParsers.def.in
699   ${LLVM_INCLUDE_DIR}/llvm/Config/AsmParsers.def
700   )
701 configure_file(
702   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Disassemblers.def.in
703   ${LLVM_INCLUDE_DIR}/llvm/Config/Disassemblers.def
704   )
705 configure_file(
706   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/Targets.def.in
707   ${LLVM_INCLUDE_DIR}/llvm/Config/Targets.def
708   )
709
710 # Configure the three LLVM configuration header files.
711 configure_file(
712   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/config.h.cmake
713   ${LLVM_INCLUDE_DIR}/llvm/Config/config.h)
714 configure_file(
715   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/llvm-config.h.cmake
716   ${LLVM_INCLUDE_DIR}/llvm/Config/llvm-config.h)
717 configure_file(
718   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Config/abi-breaking.h.cmake
719   ${LLVM_INCLUDE_DIR}/llvm/Config/abi-breaking.h)
720 configure_file(
721   ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/DataTypes.h.cmake
722   ${LLVM_INCLUDE_DIR}/llvm/Support/DataTypes.h)
723
724 # Add target for generating source rpm package.
725 set(LLVM_SRPM_USER_BINARY_SPECFILE ${CMAKE_CURRENT_SOURCE_DIR}/llvm.spec.in
726     CACHE FILEPATH ".spec file to use for srpm generation")
727 set(LLVM_SRPM_BINARY_SPECFILE ${CMAKE_CURRENT_BINARY_DIR}/llvm.spec)
728 set(LLVM_SRPM_DIR "${CMAKE_CURRENT_BINARY_DIR}/srpm")
729
730 # SVN_REVISION and GIT_COMMIT get set by the call to add_version_info_from_vcs.
731 # DUMMY_VAR contains a version string which we don't care about.
732 add_version_info_from_vcs(DUMMY_VAR)
733 if ( SVN_REVISION )
734   set(LLVM_RPM_SPEC_REVISION "r${SVN_REVISION}")
735 elseif ( GIT_COMMIT )
736   set (LLVM_RPM_SPEC_REVISION "g${GIT_COMMIT}")
737 endif()
738
739 configure_file(
740   ${LLVM_SRPM_USER_BINARY_SPECFILE}
741   ${LLVM_SRPM_BINARY_SPECFILE} @ONLY)
742
743 add_custom_target(srpm
744   COMMAND cpack -G TGZ --config CPackSourceConfig.cmake -B ${LLVM_SRPM_DIR}/SOURCES
745   COMMAND rpmbuild -bs --define '_topdir ${LLVM_SRPM_DIR}' ${LLVM_SRPM_BINARY_SPECFILE})
746
747
748 # They are not referenced. See set_output_directory().
749 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/bin )
750 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
751 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LLVM_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
752
753 if(APPLE AND DARWIN_LTO_LIBRARY)
754   set(CMAKE_EXE_LINKER_FLAGS
755     "${CMAKE_EXE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
756   set(CMAKE_SHARED_LINKER_FLAGS
757     "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
758   set(CMAKE_MODULE_LINKER_FLAGS
759     "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-lto_library -Wl,${DARWIN_LTO_LIBRARY}")
760 endif()
761
762 # Work around a broken bfd ld behavior. When linking a binary with a
763 # foo.so library, it will try to find any library that foo.so uses and
764 # check its symbols. This is wasteful (the check was done when foo.so
765 # was created) and can fail since it is not the dynamic linker and
766 # doesn't know how to handle search paths correctly.
767 if (UNIX AND NOT APPLE AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS|AIX")
768   set(CMAKE_EXE_LINKER_FLAGS
769       "${CMAKE_EXE_LINKER_FLAGS} -Wl,-allow-shlib-undefined")
770 endif()
771
772 set(CMAKE_INCLUDE_CURRENT_DIR ON)
773
774 include_directories( ${LLVM_INCLUDE_DIR} ${LLVM_MAIN_INCLUDE_DIR})
775
776 # when crosscompiling import the executable targets from a file
777 if(LLVM_USE_HOST_TOOLS)
778   include(CrossCompile)
779 endif(LLVM_USE_HOST_TOOLS)
780 if(LLVM_TARGET_IS_CROSSCOMPILE_HOST)
781 # Dummy use to avoid CMake Wraning: Manually-specified variables were not used
782 # (this is a variable that CrossCompile sets on recursive invocations)
783 endif()
784
785 if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
786   # On FreeBSD, /usr/local/* is not used by default. In order to build LLVM
787   # with libxml2, iconv.h, etc., we must add /usr/local paths.
788   include_directories("/usr/local/include")
789   link_directories("/usr/local/lib")
790 endif(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
791
792 if( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
793    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -include llvm/Support/Solaris.h")
794 endif( ${CMAKE_SYSTEM_NAME} MATCHES SunOS )
795
796 # Make sure we don't get -rdynamic in every binary. For those that need it,
797 # use export_executable_symbols(target).
798 set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")
799
800 set(LLVM_PROFDATA_FILE "" CACHE FILEPATH
801   "Profiling data file to use when compiling in order to improve runtime performance.")
802
803 if(LLVM_PROFDATA_FILE AND EXISTS ${LLVM_PROFDATA_FILE})
804   if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang" )
805     add_definitions("-fprofile-instr-use=${LLVM_PROFDATA_FILE}")
806   else()
807     message(FATAL_ERROR "LLVM_PROFDATA_FILE can only be specified when compiling with clang")
808   endif()
809 endif()
810
811 include(AddLLVM)
812 include(TableGen)
813
814 if( MINGW )
815   # People report that -O3 is unreliable on MinGW. The traditional
816   # build also uses -O2 for that reason:
817   llvm_replace_compiler_option(CMAKE_CXX_FLAGS_RELEASE "-O3" "-O2")
818 endif()
819
820 # Put this before tblgen. Else we have a circular dependence.
821 add_subdirectory(lib/Demangle)
822 add_subdirectory(lib/Support)
823 add_subdirectory(lib/TableGen)
824
825 add_subdirectory(utils/TableGen)
826
827 # Force target to be built as soon as possible. Clang modules builds depend
828 # header-wise on it as they ship all headers from the umbrella folders. Building
829 # an entire module might include header, which depends on intrinsics_gen. This
830 # should be right after LLVMSupport and LLVMTableGen otherwise we introduce a
831 # circular dependence.
832 if (LLVM_ENABLE_MODULES)
833   list(APPEND LLVM_COMMON_DEPENDS intrinsics_gen)
834 endif(LLVM_ENABLE_MODULES)
835
836 add_subdirectory(include/llvm)
837
838 add_subdirectory(lib)
839
840 if( LLVM_INCLUDE_UTILS )
841   add_subdirectory(utils/FileCheck)
842   add_subdirectory(utils/PerfectShuffle)
843   add_subdirectory(utils/count)
844   add_subdirectory(utils/not)
845   add_subdirectory(utils/llvm-lit)
846   add_subdirectory(utils/yaml-bench)
847   add_subdirectory(utils/unittest)
848 else()
849   if ( LLVM_INCLUDE_TESTS )
850     message(FATAL_ERROR "Including tests when not building utils will not work.
851     Either set LLVM_INCLUDE_UTILS to On, or set LLVM_INCLDE_TESTS to Off.")
852   endif()
853 endif()
854
855 # Use LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION instead of LLVM_INCLUDE_UTILS because it is not really a util
856 if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
857   add_subdirectory(utils/LLVMVisualizers)
858 endif()
859
860 foreach( binding ${LLVM_BINDINGS_LIST} )
861   if( EXISTS "${LLVM_MAIN_SRC_DIR}/bindings/${binding}/CMakeLists.txt" )
862     add_subdirectory(bindings/${binding})
863   endif()
864 endforeach()
865
866 add_subdirectory(projects)
867
868 if( LLVM_INCLUDE_TOOLS )
869   add_subdirectory(tools)
870 endif()
871
872 if( LLVM_INCLUDE_RUNTIMES )
873   add_subdirectory(runtimes)
874 endif()
875
876 if( LLVM_INCLUDE_EXAMPLES )
877   add_subdirectory(examples)
878 endif()
879
880 if( LLVM_INCLUDE_TESTS )
881   if(EXISTS ${LLVM_MAIN_SRC_DIR}/projects/test-suite AND TARGET clang)
882     include(LLVMExternalProjectUtils)
883     llvm_ExternalProject_Add(test-suite ${LLVM_MAIN_SRC_DIR}/projects/test-suite
884       USE_TOOLCHAIN
885       EXCLUDE_FROM_ALL
886       NO_INSTALL
887       ALWAYS_CLEAN)
888   endif()
889   add_subdirectory(test)
890   add_subdirectory(unittests)
891   if (WIN32)
892     # This utility is used to prevent crashing tests from calling Dr. Watson on
893     # Windows.
894     add_subdirectory(utils/KillTheDoctor)
895   endif()
896
897   # Add a global check rule now that all subdirectories have been traversed
898   # and we know the total set of lit testsuites.
899   get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES)
900   get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS)
901   get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS)
902   get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS)
903   get_property(LLVM_ADDITIONAL_TEST_TARGETS
904                GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS)
905   get_property(LLVM_ADDITIONAL_TEST_DEPENDS
906                GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_DEPENDS)
907   add_lit_target(check-all
908     "Running all regression tests"
909     ${LLVM_LIT_TESTSUITES}
910     PARAMS ${LLVM_LIT_PARAMS}
911     DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS}
912     ARGS ${LLVM_LIT_EXTRA_ARGS}
913     )
914   if(TARGET check-runtimes)
915     add_dependencies(check-all check-runtimes)
916   endif()
917   add_custom_target(test-depends
918                     DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_DEPENDS})
919   set_target_properties(test-depends PROPERTIES FOLDER "Tests")
920 endif()
921
922 if (LLVM_INCLUDE_DOCS)
923   add_subdirectory(docs)
924 endif()
925
926 add_subdirectory(cmake/modules)
927
928 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
929   install(DIRECTORY include/llvm include/llvm-c
930     DESTINATION include
931     COMPONENT llvm-headers
932     FILES_MATCHING
933     PATTERN "*.def"
934     PATTERN "*.h"
935     PATTERN "*.td"
936     PATTERN "*.inc"
937     PATTERN "LICENSE.TXT"
938     PATTERN ".svn" EXCLUDE
939     )
940
941   install(DIRECTORY ${LLVM_INCLUDE_DIR}/llvm
942     DESTINATION include
943     COMPONENT llvm-headers
944     FILES_MATCHING
945     PATTERN "*.def"
946     PATTERN "*.h"
947     PATTERN "*.gen"
948     PATTERN "*.inc"
949     # Exclude include/llvm/CMakeFiles/intrinsics_gen.dir, matched by "*.def"
950     PATTERN "CMakeFiles" EXCLUDE
951     PATTERN "config.h" EXCLUDE
952     PATTERN ".svn" EXCLUDE
953     )
954
955   # Installing the headers needs to depend on generating any public
956   # tablegen'd headers.
957   add_custom_target(llvm-headers DEPENDS intrinsics_gen)
958
959   if (NOT CMAKE_CONFIGURATION_TYPES)
960     add_custom_target(install-llvm-headers
961                       DEPENDS llvm-headers
962                       COMMAND "${CMAKE_COMMAND}"
963                               -DCMAKE_INSTALL_COMPONENT=llvm-headers
964                               -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
965   endif()
966 endif()
967
968 # This must be at the end of the LLVM root CMakeLists file because it must run
969 # after all targets are created.
970 if(LLVM_DISTRIBUTION_COMPONENTS)
971   if(CMAKE_CONFIGURATION_TYPES)
972     message(FATAL_ERROR "LLVM_DISTRIBUTION_COMPONENTS cannot be specified with multi-configuration generators (i.e. Xcode or Visual Studio)")
973   endif()
974
975   add_custom_target(distribution)
976   add_custom_target(install-distribution)
977   foreach(target ${LLVM_DISTRIBUTION_COMPONENTS})
978     if(TARGET ${target})
979       add_dependencies(distribution ${target})
980     else()
981       message(FATAL_ERROR "Specified distribution component '${target}' doesn't have a target")
982     endif()
983
984     if(TARGET install-${target})
985       add_dependencies(install-distribution install-${target})
986     else()
987       message(FATAL_ERROR "Specified distribution component '${target}' doesn't have an install target")
988     endif()
989   endforeach()
990 endif()
991
992 # This allows us to deploy the Universal CRT DLLs by passing -DCMAKE_INSTALL_UCRT_LIBRARIES=ON to CMake
993 if (MSVC)
994   include(InstallRequiredSystemLibraries)
995 endif()