OSDN Git Service

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