1cmake_minimum_required(VERSION 3.13.4)
2
3# If we are not building as a part of LLVM, build Clang as an
4# standalone project, using LLVM as an external library:
5if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
6  project(Clang)
7  set(CLANG_BUILT_STANDALONE TRUE)
8endif()
9
10# Must go below project(..)
11include(GNUInstallDirs)
12
13if(CLANG_BUILT_STANDALONE)
14  set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to")
15  set(CMAKE_CXX_STANDARD_REQUIRED YES)
16  set(CMAKE_CXX_EXTENSIONS NO)
17
18  # Rely on llvm-config.
19  set(LLVM_CONFIG_OUTPUT)
20  if(LLVM_CONFIG)
21    set (LLVM_CONFIG_FOUND 1)
22    message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}")
23    message(DEPRECATION "Using llvm-config to detect the LLVM installation is \
24          deprecated.  The installed cmake files should be used \
25          instead.  CMake should be able to detect your LLVM install \
26          automatically, but you can also use LLVM_DIR to specify \
27          the path containing LLVMConfig.cmake.")
28    set(CONFIG_COMMAND ${LLVM_CONFIG}
29      "--includedir"
30      "--prefix"
31      "--src-root"
32      "--cmakedir"
33      "--bindir"
34      "--libdir"
35      "--assertion-mode"
36      )
37    execute_process(
38      COMMAND ${CONFIG_COMMAND}
39      RESULT_VARIABLE HAD_ERROR
40      OUTPUT_VARIABLE LLVM_CONFIG_OUTPUT
41    )
42    if(NOT HAD_ERROR)
43      string(REGEX REPLACE
44        "[ \t]*[\r\n]+[ \t]*" ";"
45        LLVM_CONFIG_OUTPUT ${LLVM_CONFIG_OUTPUT})
46    else()
47      string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}")
48      message(STATUS "${CONFIG_COMMAND_STR}")
49      message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
50    endif()
51
52    list(GET LLVM_CONFIG_OUTPUT 0 MAIN_INCLUDE_DIR)
53    list(GET LLVM_CONFIG_OUTPUT 1 LLVM_OBJ_ROOT)
54    list(GET LLVM_CONFIG_OUTPUT 2 MAIN_SRC_DIR)
55    list(GET LLVM_CONFIG_OUTPUT 3 LLVM_CONFIG_CMAKE_DIR)
56    list(GET LLVM_CONFIG_OUTPUT 4 TOOLS_BINARY_DIR)
57    list(GET LLVM_CONFIG_OUTPUT 5 LIBRARY_DIR)
58    list(GET LLVM_CONFIG_OUTPUT 6 ENABLE_ASSERTIONS)
59
60    # Normalize LLVM_CMAKE_DIR. --cmakedir might contain backslashes.
61    # CMake assumes slashes as PATH.
62    file(TO_CMAKE_PATH ${LLVM_CONFIG_CMAKE_DIR} LLVM_CMAKE_DIR)
63  endif()
64
65
66  if(NOT MSVC_IDE)
67    set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS}
68      CACHE BOOL "Enable assertions")
69    # Assertions should follow llvm-config's.
70    mark_as_advanced(LLVM_ENABLE_ASSERTIONS)
71  endif()
72
73  find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
74  list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
75
76  # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets
77  # LLVM_CONFIG.
78  if (NOT LLVM_CONFIG_FOUND)
79    # Pull values from LLVMConfig.cmake.  We can drop this once the llvm-config
80    # path is removed.
81    set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}")
82    set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}")
83    # N.B. this is just a default value, the CACHE PATHs below can be overriden.
84    set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
85    set(TOOLS_BINARY_DIR "${LLVM_TOOLS_BINARY_DIR}")
86    set(LIBRARY_DIR "${LLVM_LIBRARY_DIR}")
87  endif()
88
89  set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include")
90  set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree")
91  set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree")
92  set(LLVM_TOOLS_BINARY_DIR "${TOOLS_BINARY_DIR}" CACHE PATH "Path to llvm/bin")
93  set(LLVM_LIBRARY_DIR "${LIBRARY_DIR}" CACHE PATH "Path to llvm/lib")
94
95  find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
96    NO_DEFAULT_PATH)
97
98  # They are used as destination of target generators.
99  set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
100  set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
101  if(WIN32 OR CYGWIN)
102    # DLL platform -- put DLLs into bin.
103    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR})
104  else()
105    set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
106  endif()
107
108  option(LLVM_INSTALL_TOOLCHAIN_ONLY
109    "Only include toolchain files in the 'install' target." OFF)
110
111  option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN
112    "Set to ON to force using an old, unsupported host toolchain." OFF)
113  option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF)
114  option(LLVM_ENABLE_LIBXML2 "Use libxml2 if available." ON)
115
116  include(AddLLVM)
117  include(TableGen)
118  include(HandleLLVMOptions)
119  include(VersionFromVCS)
120  include(CheckAtomic)
121  include(GetErrcMessages)
122  include(LLVMDistributionSupport)
123
124  set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
125  set(BUG_REPORT_URL "${LLVM_PACKAGE_BUGREPORT}" CACHE STRING
126    "Default URL where bug reports are to be submitted.")
127
128  if (NOT DEFINED LLVM_INCLUDE_TESTS)
129    set(LLVM_INCLUDE_TESTS ON)
130  endif()
131
132  include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}")
133  link_directories("${LLVM_LIBRARY_DIR}")
134
135  set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )
136  set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
137  set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )
138
139  if(LLVM_INCLUDE_TESTS)
140    find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
141      COMPONENTS Interpreter)
142
143    # Check prebuilt llvm/utils.
144    if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
145        AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX}
146        AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
147      set(LLVM_UTILS_PROVIDED ON)
148    endif()
149
150    if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
151      # Note: path not really used, except for checking if lit was found
152      set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
153      if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit)
154        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit utils/llvm-lit)
155      endif()
156      if(NOT LLVM_UTILS_PROVIDED)
157        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
158        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count)
159        add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
160        set(LLVM_UTILS_PROVIDED ON)
161        set(CLANG_TEST_DEPS FileCheck count not)
162      endif()
163      set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
164      if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
165          AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
166          AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
167        add_subdirectory(${UNITTEST_DIR} utils/unittest)
168      endif()
169    else()
170      # Seek installed Lit.
171      find_program(LLVM_LIT
172                   NAMES llvm-lit lit.py lit
173                   PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"
174                   DOC "Path to lit.py")
175    endif()
176
177    if(LLVM_LIT)
178      # Define the default arguments to use with 'lit', and an option for the user
179      # to override.
180      set(LIT_ARGS_DEFAULT "-sv")
181      if (MSVC OR XCODE)
182        set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
183      endif()
184      set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
185
186      get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
187
188      # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
189      if( WIN32 AND NOT CYGWIN )
190        set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
191      endif()
192    else()
193      set(LLVM_INCLUDE_TESTS OFF)
194    endif()
195
196    umbrella_lit_testsuite_begin(check-all)
197  endif() # LLVM_INCLUDE_TESTS
198
199  set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}")
200else()
201  set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}")
202endif() # standalone
203
204if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
205  set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
206endif()
207
208# Make sure that our source directory is on the current cmake module path so that
209# we can include cmake files from this directory.
210list(INSERT CMAKE_MODULE_PATH 0
211  "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules"
212  "${LLVM_COMMON_CMAKE_UTILS}/Modules"
213  )
214
215if(LLVM_ENABLE_LIBXML2)
216  # Don't look for libxml if we're using MSan, since uninstrumented third party
217  # code may call MSan interceptors like strlen, leading to false positives.
218  if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")
219    set (LIBXML2_FOUND 0)
220    find_package(LibXml2 2.5.3 QUIET)
221    if (LIBXML2_FOUND)
222      set(CLANG_HAVE_LIBXML 1)
223    endif()
224  endif()
225endif()
226
227include(CheckIncludeFile)
228check_include_file(sys/resource.h CLANG_HAVE_RLIMITS)
229
230set(CLANG_RESOURCE_DIR "" CACHE STRING
231  "Relative directory from the Clang binary to its resource files.")
232
233set(C_INCLUDE_DIRS "" CACHE STRING
234  "Colon separated list of directories clang will search for headers.")
235
236set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )
237set(DEFAULT_SYSROOT "" CACHE STRING
238  "Default <path> to all compiler invocations for --sysroot=<path>." )
239
240set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")
241
242set(ENABLE_X86_RELAX_RELOCATIONS ON CACHE BOOL
243    "enable x86 relax relocations by default")
244
245set(PPC_LINUX_DEFAULT_IEEELONGDOUBLE OFF CACHE BOOL
246    "Enable IEEE binary128 as default long double format on PowerPC Linux.")
247
248set(CLANG_SPAWN_CC1 OFF CACHE BOOL
249    "Whether clang should use a new process for the CC1 invocation")
250
251option(CLANG_DEFAULT_PIE_ON_LINUX "Default to -fPIE and -pie on linux-gnu" ON)
252
253# Manually handle default so we can change the meaning of a cached default.
254set(CLANG_ENABLE_OPAQUE_POINTERS "DEFAULT" CACHE STRING
255    "Enable opaque pointers by default")
256if(CLANG_ENABLE_OPAQUE_POINTERS STREQUAL "DEFAULT")
257  set(CLANG_ENABLE_OPAQUE_POINTERS_INTERNAL ON)
258elseif(CLANG_ENABLE_OPAQUE_POINTERS)
259  set(CLANG_ENABLE_OPAQUE_POINTERS_INTERNAL ON)
260else()
261  set(CLANG_ENABLE_OPAQUE_POINTERS_INTERNAL OFF)
262endif()
263
264# TODO: verify the values against LangStandards.def?
265set(CLANG_DEFAULT_STD_C "" CACHE STRING
266  "Default standard to use for C/ObjC code (IDENT from LangStandards.def, empty for platform default)")
267set(CLANG_DEFAULT_STD_CXX "" CACHE STRING
268  "Default standard to use for C++/ObjC++ code (IDENT from LangStandards.def, empty for platform default)")
269
270set(CLANG_DEFAULT_LINKER "" CACHE STRING
271  "Default linker to use (linker name or absolute path, empty for platform default)")
272
273set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING
274  "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default")
275if (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR
276        CLANG_DEFAULT_CXX_STDLIB STREQUAL "libstdc++" OR
277        CLANG_DEFAULT_CXX_STDLIB STREQUAL "libc++"))
278  message(WARNING "Resetting default C++ stdlib to use platform default")
279  set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING
280    "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default" FORCE)
281endif()
282
283set(CLANG_DEFAULT_RTLIB "" CACHE STRING
284  "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)")
285if (NOT(CLANG_DEFAULT_RTLIB STREQUAL "" OR
286        CLANG_DEFAULT_RTLIB STREQUAL "libgcc" OR
287        CLANG_DEFAULT_RTLIB STREQUAL "compiler-rt"))
288  message(WARNING "Resetting default rtlib to use platform default")
289  set(CLANG_DEFAULT_RTLIB "" CACHE STRING
290    "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)" FORCE)
291endif()
292
293set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING
294  "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)")
295if (CLANG_DEFAULT_UNWINDLIB STREQUAL "")
296  if (CLANG_DEFAULT_RTLIB STREQUAL "libgcc")
297    set (CLANG_DEFAULT_UNWINDLIB "libgcc" CACHE STRING "" FORCE)
298  endif()
299endif()
300
301if (NOT(CLANG_DEFAULT_UNWINDLIB STREQUAL "" OR
302        CLANG_DEFAULT_UNWINDLIB STREQUAL "none" OR
303        CLANG_DEFAULT_UNWINDLIB STREQUAL "libgcc" OR
304        CLANG_DEFAULT_UNWINDLIB STREQUAL "libunwind"))
305  message(WARNING "Resetting default unwindlib to use platform default")
306  set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING
307    "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)" FORCE)
308endif()
309
310set(CLANG_DEFAULT_OBJCOPY "objcopy" CACHE STRING
311  "Default objcopy executable to use.")
312
313set(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING
314  "Default OpenMP runtime used by -fopenmp.")
315
316# OpenMP offloading requires at least sm_35 because we use shuffle instructions
317# to generate efficient code for reductions and the atomicMax instruction on
318# 64-bit integers in the implementation of conditional lastprivate.
319set(CUDA_ARCH_FLAGS "sm_35")
320
321# Try to find the highest Nvidia GPU architecture the system supports
322if (NOT DEFINED CLANG_OPENMP_NVPTX_DEFAULT_ARCH)
323  find_package(CUDA QUIET)
324  if (CUDA_FOUND)
325    cuda_select_nvcc_arch_flags(CUDA_ARCH_FLAGS)
326  endif()
327else()
328  set(CUDA_ARCH_FLAGS ${CLANG_OPENMP_NVPTX_DEFAULT_ARCH})
329endif()
330
331string(REGEX MATCH "sm_([0-9]+)" CUDA_ARCH_MATCH ${CUDA_ARCH_FLAGS})
332if (NOT DEFINED CUDA_ARCH_MATCH OR "${CMAKE_MATCH_1}" LESS 35)
333  set(CLANG_OPENMP_NVPTX_DEFAULT_ARCH "sm_35" CACHE STRING
334    "Default architecture for OpenMP offloading to Nvidia GPUs." FORCE)
335  message(WARNING "Resetting default architecture for OpenMP offloading to Nvidia GPUs to sm_35")
336else()
337  set(CLANG_OPENMP_NVPTX_DEFAULT_ARCH ${CUDA_ARCH_MATCH} CACHE STRING
338    "Default architecture for OpenMP offloading to Nvidia GPUs.")
339endif()
340
341set(CLANG_SYSTEMZ_DEFAULT_ARCH "z10" CACHE STRING "SystemZ Default Arch")
342
343set(CLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING
344  "Vendor-specific text for showing with version information.")
345
346set(CLANG_REPOSITORY_STRING "" CACHE STRING
347  "Vendor-specific text for showing the repository the source is taken from.")
348
349if(CLANG_REPOSITORY_STRING)
350  add_definitions(-DCLANG_REPOSITORY_STRING="${CLANG_REPOSITORY_STRING}")
351endif()
352
353set(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING
354  "Vendor-specific uti.")
355
356set(CLANG_PYTHON_BINDINGS_VERSIONS "" CACHE STRING
357    "Python versions to install libclang python bindings for")
358
359set(CLANG_LINK_CLANG_DYLIB ${LLVM_LINK_LLVM_DYLIB} CACHE BOOL
360    "Link tools against libclang-cpp.so")
361
362if (NOT LLVM_LINK_LLVM_DYLIB AND CLANG_LINK_CLANG_DYLIB)
363  message(FATAL_ERROR "Cannot set CLANG_LINK_CLANG_DYLIB=ON when "
364                      "LLVM_LINK_LLVM_DYLIB=OFF")
365endif()
366
367# The libdir suffix must exactly match whatever LLVM's configuration used.
368set(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}")
369
370set(CLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
371    "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
372mark_as_advanced(CLANG_TOOLS_INSTALL_DIR)
373
374set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
375set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
376
377if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
378  message(FATAL_ERROR "In-source builds are not allowed. "
379"Please create a directory and run cmake "
380"from there, passing the path to this source directory as the last argument. "
381"This process created the file `CMakeCache.txt' and the directory "
382"`CMakeFiles'. Please delete them.")
383endif()
384
385# If CLANG_VERSION_* is specified, use it, if not use LLVM_VERSION_*.
386if(NOT DEFINED CLANG_VERSION_MAJOR)
387  set(CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
388endif()
389if(NOT DEFINED CLANG_VERSION_MINOR)
390  set(CLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})
391endif()
392if(NOT DEFINED CLANG_VERSION_PATCHLEVEL)
393  set(CLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
394endif()
395# Unlike PACKAGE_VERSION, CLANG_VERSION does not include LLVM_VERSION_SUFFIX.
396set(CLANG_VERSION "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}.${CLANG_VERSION_PATCHLEVEL}")
397message(STATUS "Clang version: ${CLANG_VERSION}")
398
399# Configure the Version.inc file.
400configure_file(
401  ${CMAKE_CURRENT_SOURCE_DIR}/include/clang/Basic/Version.inc.in
402  ${CMAKE_CURRENT_BINARY_DIR}/include/clang/Basic/Version.inc)
403
404# Add appropriate flags for GCC
405if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
406  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual")
407  if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
408    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
409  endif ()
410
411  # Enable -pedantic for Clang even if it's not enabled for LLVM.
412  if (NOT LLVM_ENABLE_PEDANTIC)
413    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-long-long")
414  endif ()
415
416  check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG)
417  if( CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG )
418    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types" )
419  endif()
420endif ()
421
422# Determine HOST_LINK_VERSION on Darwin.
423set(HOST_LINK_VERSION)
424if (APPLE AND NOT CMAKE_LINKER MATCHES ".*lld.*")
425  set(LD_V_OUTPUT)
426  execute_process(
427    COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1"
428    RESULT_VARIABLE HAD_ERROR
429    OUTPUT_VARIABLE LD_V_OUTPUT
430  )
431  if (HAD_ERROR)
432    message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}")
433  endif()
434  if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*")
435    string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
436  elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*")
437    string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT})
438  endif()
439  message(STATUS "Host linker version: ${HOST_LINK_VERSION}")
440endif()
441
442include(CMakeParseArguments)
443include(AddClang)
444
445set(CMAKE_INCLUDE_CURRENT_DIR ON)
446
447include_directories(BEFORE
448  ${CMAKE_CURRENT_BINARY_DIR}/include
449  ${CMAKE_CURRENT_SOURCE_DIR}/include
450  )
451
452if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
453  install(DIRECTORY include/clang include/clang-c
454    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
455    COMPONENT clang-headers
456    FILES_MATCHING
457    PATTERN "*.def"
458    PATTERN "*.h"
459    PATTERN "config.h" EXCLUDE
460    )
461
462  install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang
463    DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
464    COMPONENT clang-headers
465    FILES_MATCHING
466    PATTERN "CMakeFiles" EXCLUDE
467    PATTERN "*.inc"
468    PATTERN "*.h"
469    )
470
471  # Installing the headers needs to depend on generating any public
472  # tablegen'd headers.
473  add_custom_target(clang-headers DEPENDS clang-tablegen-targets)
474  set_target_properties(clang-headers PROPERTIES FOLDER "Misc")
475  if(NOT LLVM_ENABLE_IDE)
476    add_llvm_install_targets(install-clang-headers
477                             DEPENDS clang-headers
478                             COMPONENT clang-headers)
479  endif()
480
481  add_custom_target(bash-autocomplete DEPENDS utils/bash-autocomplete.sh)
482  install(PROGRAMS utils/bash-autocomplete.sh
483          DESTINATION "${CMAKE_INSTALL_DATADIR}/clang"
484          COMPONENT bash-autocomplete)
485  if(NOT LLVM_ENABLE_IDE)
486    add_llvm_install_targets(install-bash-autocomplete
487                             DEPENDS bash-autocomplete
488                             COMPONENT bash-autocomplete)
489  endif()
490endif()
491
492add_definitions( -D_GNU_SOURCE )
493
494option(CLANG_BUILD_TOOLS
495  "Build the Clang tools. If OFF, just generate build targets." ON)
496
497if(LLVM_ENABLE_PLUGINS OR LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
498  set(HAVE_CLANG_PLUGIN_SUPPORT ON)
499else()
500  set(HAVE_CLANG_PLUGIN_SUPPORT OFF)
501endif()
502CMAKE_DEPENDENT_OPTION(CLANG_PLUGIN_SUPPORT
503  "Build clang with plugin support" ON
504  "HAVE_CLANG_PLUGIN_SUPPORT" OFF)
505
506option(CLANG_ENABLE_ARCMT "Build ARCMT." ON)
507option(CLANG_ENABLE_STATIC_ANALYZER
508  "Include static analyzer in clang binary." ON)
509
510option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF)
511
512if(NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT)
513  message(FATAL_ERROR "Cannot disable static analyzer while enabling ARCMT or Z3")
514endif()
515
516if(CLANG_ENABLE_ARCMT)
517  set(CLANG_ENABLE_OBJC_REWRITER ON)
518endif()
519
520# This option is a stop-gap, we should commit to removing this as
521# soon as possible. See discussion:
522# https://discourse.llvm.org/t/rationale-for-removing-versioned-libclang-middle-ground-to-keep-it-behind-option/
523option(CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION
524  "Force the SOVERSION of libclang to be equal to CLANG_MAJOR" ON)
525
526# Clang version information
527set(CLANG_EXECUTABLE_VERSION
528    "${CLANG_VERSION_MAJOR}" CACHE STRING
529    "Major version number that will be appended to the clang executable name")
530set(LIBCLANG_LIBRARY_VERSION
531    "${CLANG_VERSION_MAJOR}" CACHE STRING
532    "Major version number that will be appended to the libclang library")
533mark_as_advanced(CLANG_EXECUTABLE_VERSION LIBCLANG_LIBRARY_VERSION)
534
535option(CLANG_INCLUDE_TESTS
536       "Generate build targets for the Clang unit tests."
537       ${LLVM_INCLUDE_TESTS})
538
539add_subdirectory(utils/TableGen)
540
541add_subdirectory(include)
542
543# All targets below may depend on all tablegen'd files.
544get_property(CLANG_TABLEGEN_TARGETS GLOBAL PROPERTY CLANG_TABLEGEN_TARGETS)
545add_custom_target(clang-tablegen-targets
546  DEPENDS
547  omp_gen
548  ${CLANG_TABLEGEN_TARGETS})
549set_target_properties(clang-tablegen-targets PROPERTIES FOLDER "Misc")
550list(APPEND LLVM_COMMON_DEPENDS clang-tablegen-targets)
551
552# Force target to be built as soon as possible. Clang modules builds depend
553# header-wise on it as they ship all headers from the umbrella folders. Building
554# an entire module might include header, which depends on intrinsics_gen.
555if(LLVM_ENABLE_MODULES)
556  list(APPEND LLVM_COMMON_DEPENDS intrinsics_gen)
557endif()
558
559add_subdirectory(lib)
560add_subdirectory(tools)
561add_subdirectory(runtime)
562
563option(CLANG_BUILD_EXAMPLES "Build CLANG example programs by default." OFF)
564add_subdirectory(examples)
565
566if(APPLE)
567  # this line is needed as a cleanup to ensure that any CMakeCaches with the old
568  # default value get updated to the new default.
569  if(CLANG_ORDER_FILE STREQUAL "")
570    unset(CLANG_ORDER_FILE CACHE)
571    unset(CLANG_ORDER_FILE)
572  endif()
573
574
575  set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE FILEPATH
576    "Order file to use when compiling clang in order to improve startup time (Darwin Only - requires ld64).")
577
578  if(NOT EXISTS ${CLANG_ORDER_FILE})
579    string(FIND "${CLANG_ORDER_FILE}" "${CMAKE_CURRENT_BINARY_DIR}" PATH_START)
580    if(PATH_START EQUAL 0)
581      file(WRITE ${CLANG_ORDER_FILE} "\n")
582    else()
583      message(FATAL_ERROR "Specified order file '${CLANG_ORDER_FILE}' does not exist.")
584    endif()
585  endif()
586endif()
587
588
589if( CLANG_INCLUDE_TESTS )
590  if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include/gtest/gtest.h)
591    add_subdirectory(unittests)
592    list(APPEND CLANG_TEST_DEPS ClangUnitTests)
593    list(APPEND CLANG_TEST_PARAMS
594      clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg
595      )
596  endif()
597  add_subdirectory(test)
598  add_subdirectory(bindings/python/tests)
599
600  if(CLANG_BUILT_STANDALONE)
601    umbrella_lit_testsuite_end(check-all)
602  endif()
603  add_subdirectory(utils/perf-training)
604endif()
605
606option(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs."
607  ${LLVM_INCLUDE_DOCS})
608if( CLANG_INCLUDE_DOCS )
609  add_subdirectory(docs)
610endif()
611
612# Custom target to install all clang libraries.
613add_custom_target(clang-libraries)
614set_target_properties(clang-libraries PROPERTIES FOLDER "Misc")
615
616if(NOT LLVM_ENABLE_IDE)
617  add_llvm_install_targets(install-clang-libraries
618                           DEPENDS clang-libraries
619                           COMPONENT clang-libraries)
620endif()
621
622get_property(CLANG_LIBS GLOBAL PROPERTY CLANG_LIBS)
623if(CLANG_LIBS)
624  list(REMOVE_DUPLICATES CLANG_LIBS)
625  foreach(lib ${CLANG_LIBS})
626    add_dependencies(clang-libraries ${lib})
627    if(NOT LLVM_ENABLE_IDE)
628      add_dependencies(install-clang-libraries install-${lib})
629      add_dependencies(install-clang-libraries-stripped install-${lib}-stripped)
630    endif()
631  endforeach()
632endif()
633
634add_subdirectory(cmake/modules)
635
636if(CLANG_STAGE)
637  message(STATUS "Setting current clang stage to: ${CLANG_STAGE}")
638endif()
639
640if (CLANG_ENABLE_BOOTSTRAP)
641  include(ExternalProject)
642
643  add_custom_target(clang-bootstrap-deps DEPENDS clang)
644
645  if(NOT CLANG_STAGE)
646    set(CLANG_STAGE stage1)
647  endif()
648
649  string(REGEX MATCH "stage([0-9]*)" MATCHED_STAGE "${CLANG_STAGE}")
650  if(MATCHED_STAGE)
651    if(NOT LLVM_BUILD_INSTRUMENTED)
652      math(EXPR STAGE_NUM "${CMAKE_MATCH_1} + 1")
653      set(NEXT_CLANG_STAGE stage${STAGE_NUM})
654    else()
655      set(NEXT_CLANG_STAGE stage${CMAKE_MATCH_1})
656    endif()
657  else()
658    set(NEXT_CLANG_STAGE bootstrap)
659  endif()
660
661  if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
662    set(NEXT_CLANG_STAGE ${NEXT_CLANG_STAGE}-instrumented)
663  endif()
664  message(STATUS "Setting next clang stage to: ${NEXT_CLANG_STAGE}")
665
666
667  set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-stamps/)
668  set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-bins/)
669
670  if(BOOTSTRAP_LLVM_ENABLE_LLD)
671    # adding lld to clang-bootstrap-deps without having it enabled in
672    # LLVM_ENABLE_PROJECTS just generates a cryptic error message.
673    if (NOT "lld" IN_LIST LLVM_ENABLE_PROJECTS)
674      message(FATAL_ERROR "LLD is enabled in the bootstrap build, but lld is not in LLVM_ENABLE_PROJECTS")
675    endif()
676    add_dependencies(clang-bootstrap-deps lld)
677  endif()
678
679  # If the next stage is LTO we need to depend on LTO and possibly lld or LLVMgold
680  if(BOOTSTRAP_LLVM_ENABLE_LTO OR LLVM_ENABLE_LTO AND NOT LLVM_BUILD_INSTRUMENTED)
681    if(APPLE)
682      add_dependencies(clang-bootstrap-deps LTO)
683      # on Darwin we need to set DARWIN_LTO_LIBRARY so that -flto will work
684      # using the just-built compiler, and we need to override DYLD_LIBRARY_PATH
685      # so that the host object file tools will use the just-built libLTO.
686      # However if System Integrity Protection is enabled the DYLD variables
687      # will be scrubbed from the environment of any base system commands. This
688      # includes /bin/sh, which ninja uses when executing build commands. To
689      # work around the envar being filtered away we pass it in as a CMake
690      # variable, and have LLVM's CMake append the envar to the archiver calls.
691      set(LTO_LIBRARY -DDARWIN_LTO_LIBRARY=${LLVM_SHLIB_OUTPUT_INTDIR}/libLTO.dylib
692        -DDYLD_LIBRARY_PATH=${LLVM_LIBRARY_OUTPUT_INTDIR})
693    elseif(NOT WIN32)
694      add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib)
695      if(NOT BOOTSTRAP_LLVM_ENABLE_LLD AND LLVM_BINUTILS_INCDIR)
696        add_dependencies(clang-bootstrap-deps LLVMgold)
697      endif()
698      set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)
699      set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)
700    endif()
701  endif()
702
703  if(CLANG_BOOTSTRAP_EXTRA_DEPS)
704    add_dependencies(clang-bootstrap-deps ${CLANG_BOOTSTRAP_EXTRA_DEPS})
705  endif()
706
707  add_custom_target(${NEXT_CLANG_STAGE}-clear
708    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared
709    )
710  add_custom_command(
711    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared
712    DEPENDS clang-bootstrap-deps
713    COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}
714    COMMAND ${CMAKE_COMMAND} -E make_directory ${BINARY_DIR}
715    COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}
716    COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR}
717    COMMENT "Clobberring ${NEXT_CLANG_STAGE} build and stamp directories"
718    )
719
720  if(CMAKE_VERBOSE_MAKEFILE)
721    set(verbose -DCMAKE_VERBOSE_MAKEFILE=On)
722  endif()
723
724  set(_BOOTSTRAP_DEFAULT_PASSTHROUGH
725    PACKAGE_VERSION
726    PACKAGE_VENDOR
727    LLVM_VERSION_MAJOR
728    LLVM_VERSION_MINOR
729    LLVM_VERSION_PATCH
730    CLANG_VERSION_MAJOR
731    CLANG_VERSION_MINOR
732    CLANG_VERSION_PATCHLEVEL
733    CLANG_VENDOR
734    LLVM_VERSION_SUFFIX
735    LLVM_BINUTILS_INCDIR
736    CLANG_REPOSITORY_STRING
737    CMAKE_C_COMPILER_LAUNCHER
738    CMAKE_CXX_COMPILER_LAUNCHER
739    CMAKE_MAKE_PROGRAM
740    CMAKE_OSX_ARCHITECTURES
741    CMAKE_BUILD_TYPE
742    LLVM_ENABLE_PROJECTS
743    LLVM_ENABLE_RUNTIMES)
744
745  # We don't need to depend on compiler-rt/libcxx if we're building instrumented
746  # because the next stage will use the same compiler used to build this stage.
747  if(NOT LLVM_BUILD_INSTRUMENTED)
748    if(TARGET compiler-rt)
749      add_dependencies(clang-bootstrap-deps compiler-rt)
750    endif()
751    if(TARGET cxx-headers)
752      add_dependencies(clang-bootstrap-deps cxx-headers)
753    endif()
754  endif()
755
756  set(C_COMPILER "clang")
757  set(CXX_COMPILER "clang++")
758  if(WIN32)
759    set(C_COMPILER "clang-cl.exe")
760    set(CXX_COMPILER "clang-cl.exe")
761  endif()
762
763  set(COMPILER_OPTIONS
764    -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CXX_COMPILER}
765    -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER}
766    -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER}
767    -DCMAKE_ASM_COMPILER_ID=Clang)
768
769  # cmake requires CMAKE_LINKER to be specified if the compiler is MSVC-like,
770  # otherwise it defaults the linker to be link.exe.
771  if(BOOTSTRAP_LLVM_ENABLE_LLD)
772    if((WIN32 AND NOT BOOTSTRAP_CMAKE_SYSTEM_NAME) OR BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Windows")
773      set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})
774    endif()
775  endif()
776
777  if(BOOTSTRAP_CMAKE_SYSTEM_NAME)
778    set(${CLANG_STAGE}_CONFIG -DLLVM_CONFIG_PATH=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-config)
779    set(${CLANG_STAGE}_TABLEGEN
780      -DLLVM_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-tblgen
781      -DCLANG_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-tblgen)
782    if(BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Linux")
783      if(BOOTSTRAP_LLVM_ENABLE_LLD)
784        set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld)
785      endif()
786      if(NOT BOOTSTRAP_LLVM_ENABLE_LTO)
787        add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib)
788        set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)
789        set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)
790      endif()
791      add_dependencies(clang-bootstrap-deps llvm-objcopy llvm-strip)
792      set(${CLANG_STAGE}_OBJCOPY -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy)
793      set(${CLANG_STAGE}_STRIP -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip)
794      set(${CLANG_STAGE}_READELF -DCMAKE_READELF=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-readelf)
795    endif()
796  endif()
797
798  if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)
799    add_dependencies(clang-bootstrap-deps llvm-profdata)
800    set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata)
801  endif()
802
803  if(LLVM_BUILD_INSTRUMENTED)
804    add_dependencies(clang-bootstrap-deps generate-profdata)
805    set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata)
806    # Use the current tools for LTO instead of the instrumented ones
807    list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH
808      CMAKE_CXX_COMPILER
809      CMAKE_C_COMPILER
810      CMAKE_ASM_COMPILER
811      CMAKE_AR
812      CMAKE_RANLIB
813      DARWIN_LTO_LIBRARY
814      DYLD_LIBRARY_PATH)
815
816    set(COMPILER_OPTIONS)
817    set(LTO_LIBRARY)
818    set(LTO_AR)
819    set(LTO_RANLIB)
820  endif()
821
822  # Find all variables that start with BOOTSTRAP_ and populate a variable with
823  # them.
824  get_cmake_property(variableNames VARIABLES)
825  foreach(variableName ${variableNames})
826    if(variableName MATCHES "^BOOTSTRAP_")
827      string(SUBSTRING ${variableName} 10 -1 varName)
828      string(REPLACE ";" "|" value "${${variableName}}")
829      list(APPEND PASSTHROUGH_VARIABLES
830        -D${varName}=${value})
831    endif()
832    if(${variableName} AND variableName MATCHES "LLVM_EXTERNAL_.*_SOURCE_DIR")
833      list(APPEND PASSTHROUGH_VARIABLES
834        -D${variableName}=${${variableName}})
835    endif()
836  endforeach()
837
838  # Populate the passthrough variables
839  foreach(variableName ${CLANG_BOOTSTRAP_PASSTHROUGH} ${_BOOTSTRAP_DEFAULT_PASSTHROUGH})
840    if(DEFINED ${variableName})
841      if("${${variableName}}" STREQUAL "")
842        set(value "")
843      else()
844        string(REPLACE ";" "|" value "${${variableName}}")
845      endif()
846      list(APPEND PASSTHROUGH_VARIABLES
847        -D${variableName}=${value})
848    endif()
849  endforeach()
850
851  ExternalProject_Add(${NEXT_CLANG_STAGE}
852    DEPENDS clang-bootstrap-deps
853    PREFIX ${NEXT_CLANG_STAGE}
854    SOURCE_DIR ${CMAKE_SOURCE_DIR}
855    STAMP_DIR ${STAMP_DIR}
856    BINARY_DIR ${BINARY_DIR}
857    EXCLUDE_FROM_ALL 1
858    CMAKE_ARGS
859                # We shouldn't need to set this here, but INSTALL_DIR doesn't
860                # seem to work, so instead I'm passing this through
861                -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
862                ${PASSTHROUGH_VARIABLES}
863                ${CLANG_BOOTSTRAP_CMAKE_ARGS}
864                 -DCLANG_STAGE=${NEXT_CLANG_STAGE}
865                ${COMPILER_OPTIONS}
866                ${${CLANG_STAGE}_CONFIG}
867                ${${CLANG_STAGE}_TABLEGEN}
868                ${LTO_LIBRARY} ${verbose} ${PGO_OPT}
869                ${${CLANG_STAGE}_LINKER}
870                ${${CLANG_STAGE}_AR}
871                ${${CLANG_STAGE}_RANLIB}
872                ${${CLANG_STAGE}_OBJCOPY}
873                ${${CLANG_STAGE}_STRIP}
874    INSTALL_COMMAND ""
875    STEP_TARGETS configure build
876    USES_TERMINAL_CONFIGURE 1
877    USES_TERMINAL_BUILD 1
878    USES_TERMINAL_INSTALL 1
879    LIST_SEPARATOR |
880    )
881
882  # exclude really-install from main target
883  set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On)
884  ExternalProject_Add_Step(${NEXT_CLANG_STAGE} really-install
885    COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install
886    COMMENT "Performing install step for '${NEXT_CLANG_STAGE}'"
887    DEPENDEES build
888    USES_TERMINAL 1
889  )
890  ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} really-install)
891  add_custom_target(${NEXT_CLANG_STAGE}-install DEPENDS ${NEXT_CLANG_STAGE}-really-install)
892
893  if(NOT CLANG_BOOTSTRAP_TARGETS)
894    set(CLANG_BOOTSTRAP_TARGETS check-llvm check-clang check-all)
895  endif()
896  foreach(target ${CLANG_BOOTSTRAP_TARGETS})
897    # Install targets have side effects, so we always want to execute them.
898    # "install" is reserved by CMake and can't be used as a step name for
899    # ExternalProject_Add_Step, so we can match against "^install-" instead of
900    # "^install" to get a tighter match. CMake's installation scripts already
901    # skip up-to-date files, so there's no behavior change if you install to the
902    # same destination multiple times.
903    if(target MATCHES "^install-")
904      set(step_always ON)
905    else()
906      set(step_always OFF)
907    endif()
908
909    ExternalProject_Add_Step(${NEXT_CLANG_STAGE} ${target}
910      COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target ${target}
911      COMMENT "Performing ${target} for '${NEXT_CLANG_STAGE}'"
912      DEPENDEES configure
913      ALWAYS ${step_always}
914      EXCLUDE_FROM_MAIN ON
915      USES_TERMINAL 1
916    )
917
918    if(target MATCHES "^stage[0-9]*")
919      add_custom_target(${target} DEPENDS ${NEXT_CLANG_STAGE}-${target})
920    endif()
921
922    ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} ${target})
923  endforeach()
924endif()
925
926if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)
927  add_subdirectory(utils/ClangVisualizers)
928endif()
929add_subdirectory(utils/hmaptool)
930
931if(CLANG_BUILT_STANDALONE)
932  llvm_distribution_add_targets()
933  process_llvm_pass_plugins()
934endif()
935
936configure_file(
937  ${CLANG_SOURCE_DIR}/include/clang/Config/config.h.cmake
938  ${CLANG_BINARY_DIR}/include/clang/Config/config.h)
939