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