OSDN Git Service

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