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