OSDN Git Service

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