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