OSDN Git Service

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