OSDN Git Service

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