OSDN Git Service

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