912 lines · plain
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.cmake8 NO_POLICY_SCOPE)9 10# If we are not building as a part of LLVM, build Clang as an11# 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 that18# we can include cmake files from this directory.19list(INSERT CMAKE_MODULE_PATH 020 "${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 overwritting44 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_ONLY64 "Only include toolchain files in the 'install' target." OFF)65 66 option(LLVM_FORCE_USE_OLD_TOOLCHAIN67 "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 separate_arguments(LLVM_DEFINITIONS_LIST NATIVE_COMMAND ${LLVM_DEFINITIONS})72 add_definitions(${LLVM_DEFINITIONS_LIST})73 list(APPEND CMAKE_REQUIRED_DEFINITIONS ${LLVM_DEFINITIONS_LIST})74 75 include(AddLLVM)76 include(TableGen)77 include(HandleLLVMOptions)78 include(VersionFromVCS)79 include(CheckAtomic)80 include(GetErrcMessages)81 include(LLVMDistributionSupport)82 83 if(CMAKE_CROSSCOMPILING)84 set(LLVM_USE_HOST_TOOLS ON)85 include(CrossCompile)86 llvm_create_cross_target(Clang NATIVE "" Release)87 endif()88 89 set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")90 set(BUG_REPORT_URL "${LLVM_PACKAGE_BUGREPORT}" CACHE STRING91 "Default URL where bug reports are to be submitted.")92 93 if (NOT DEFINED LLVM_INCLUDE_TESTS)94 set(LLVM_INCLUDE_TESTS ON)95 endif()96 97 include_directories(${LLVM_INCLUDE_DIRS})98 link_directories("${LLVM_LIBRARY_DIR}")99 100 set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin )101 set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )102 set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} )103 104 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED105 COMPONENTS Interpreter)106 107 if(LLVM_INCLUDE_TESTS)108 # Check prebuilt llvm/utils.109 if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}110 AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX}111 AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})112 set(LLVM_UTILS_PROVIDED ON)113 endif()114 115 # Seek installed Lit.116 find_program(LLVM_LIT117 NAMES llvm-lit lit.py lit118 PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"119 DOC "Path to lit.py")120 121 if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)122 # Note: path not really used, except for checking if lit was found123 if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit)124 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit utils/llvm-lit)125 endif()126 if(NOT LLVM_UTILS_PROVIDED)127 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)128 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count)129 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)130 set(LLVM_UTILS_PROVIDED ON)131 set(CLANG_TEST_DEPS FileCheck count not)132 endif()133 endif()134 135 if (NOT TARGET llvm_gtest)136 message(FATAL_ERROR "llvm-gtest not found. Please install llvm-gtest or disable tests with -DLLVM_INCLUDE_TESTS=OFF")137 endif()138 139 if(LLVM_LIT)140 # Define the default arguments to use with 'lit', and an option for the user141 # to override.142 set(LIT_ARGS_DEFAULT "-sv")143 if (MSVC OR XCODE)144 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")145 endif()146 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")147 148 get_errc_messages(LLVM_LIT_ERRC_MESSAGES)149 150 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.151 if( WIN32 AND NOT CYGWIN )152 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")153 endif()154 else()155 set(LLVM_INCLUDE_TESTS OFF)156 endif()157 158 umbrella_lit_testsuite_begin(check-all)159 160 # If LLVM was built with Z3, check if we still have the headers around.161 # They are used by a few tests.162 if (LLVM_WITH_Z3)163 find_package(Z3 4.8.9)164 endif()165 endif() # LLVM_INCLUDE_TESTS166endif() # standalone167 168# This allows disabling clang's XML dependency even if LLVM finds libxml2.169# By default, clang depends on libxml2 if LLVM does.170option(CLANG_ENABLE_LIBXML2 "Whether libclang may depend on libxml2"171 ${LLVM_ENABLE_LIBXML2})172 173if(CLANG_ENABLE_LIBXML2)174 # Don't look for libxml if we're using MSan, since uninstrumented third party175 # code may call MSan interceptors like strlen, leading to false positives.176 if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*")177 set (LIBXML2_FOUND 0)178 find_package(LibXml2 2.5.3 QUIET)179 if (LIBXML2_FOUND)180 set(CLANG_HAVE_LIBXML 1)181 endif()182 endif()183endif()184 185if(CLANG_ENABLE_CIR)186 if (CLANG_BUILT_STANDALONE)187 message(FATAL_ERROR188 "ClangIR is not yet supported in the standalone build.")189 endif()190 if (NOT "${LLVM_ENABLE_PROJECTS}" MATCHES "MLIR|mlir")191 message(FATAL_ERROR192 "Cannot build ClangIR without MLIR in LLVM_ENABLE_PROJECTS")193 endif()194endif()195 196include(CheckIncludeFile)197check_include_file(sys/resource.h CLANG_HAVE_RLIMITS)198 199# This check requires _GNU_SOURCE on linux200check_include_file(dlfcn.h CLANG_HAVE_DLFCN_H)201if( CLANG_HAVE_DLFCN_H )202 include(CMakePushCheckState)203 include(CheckLibraryExists)204 include(CheckSymbolExists)205 check_library_exists(dl dlopen "" HAVE_LIBDL)206 cmake_push_check_state()207 if( HAVE_LIBDL )208 list(APPEND CMAKE_REQUIRED_LIBRARIES dl)209 endif()210 list(APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)211 check_symbol_exists(dladdr dlfcn.h CLANG_HAVE_DLADDR)212 cmake_pop_check_state()213endif()214 215set(CLANG_RESOURCE_DIR "" CACHE STRING216 "Relative directory from the Clang binary to its resource files.")217 218set(C_INCLUDE_DIRS "" CACHE STRING219 "Colon separated list of directories clang will search for headers.")220 221set(USE_DEPRECATED_GCC_INSTALL_PREFIX OFF CACHE BOOL "Temporary workaround before GCC_INSTALL_PREFIX is completely removed")222set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." )223set(DEFAULT_SYSROOT "" CACHE STRING224 "Default <path> to all compiler invocations for --sysroot=<path>." )225if(GCC_INSTALL_PREFIX AND NOT USE_DEPRECATED_GCC_INSTALL_PREFIX)226 message(FATAL_ERROR "GCC_INSTALL_PREFIX is deprecated and will be removed. Use "227 "configuration files (https://clang.llvm.org/docs/UsersManual.html#configuration-files)"228 "to specify the default --gcc-install-dir= or --gcc-triple=. --gcc-toolchain= is discouraged. "229 "See https://github.com/llvm/llvm-project/pull/77537 for detail.")230endif()231 232set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld")233 234set(ENABLE_X86_RELAX_RELOCATIONS ON CACHE BOOL235 "enable x86 relax relocations by default")236 237set(PPC_LINUX_DEFAULT_IEEELONGDOUBLE OFF CACHE BOOL238 "Enable IEEE binary128 as default long double format on PowerPC Linux.")239 240set(CLANG_SPAWN_CC1 OFF CACHE BOOL241 "Whether clang should use a new process for the CC1 invocation")242 243option(CLANG_DEFAULT_PIE_ON_LINUX "Default to -fPIE and -pie on linux-gnu" ON)244 245set(CLANG_DEFAULT_LINKER "" CACHE STRING246 "Default linker to use (linker name or absolute path, empty for platform default)")247 248set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING249 "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default")250if (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR251 CLANG_DEFAULT_CXX_STDLIB STREQUAL "libstdc++" OR252 CLANG_DEFAULT_CXX_STDLIB STREQUAL "libc++"))253 message(WARNING "Resetting default C++ stdlib to use platform default")254 set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING255 "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default" FORCE)256endif()257 258set(CLANG_DEFAULT_RTLIB "" CACHE STRING259 "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)")260if (NOT(CLANG_DEFAULT_RTLIB STREQUAL "" OR261 CLANG_DEFAULT_RTLIB STREQUAL "libgcc" OR262 CLANG_DEFAULT_RTLIB STREQUAL "compiler-rt"))263 message(WARNING "Resetting default rtlib to use platform default")264 set(CLANG_DEFAULT_RTLIB "" CACHE STRING265 "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)" FORCE)266endif()267 268set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING269 "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)")270if (CLANG_DEFAULT_UNWINDLIB STREQUAL "")271 if (CLANG_DEFAULT_RTLIB STREQUAL "libgcc")272 set (CLANG_DEFAULT_UNWINDLIB "libgcc" CACHE STRING "" FORCE)273 endif()274endif()275 276if (NOT(CLANG_DEFAULT_UNWINDLIB STREQUAL "" OR277 CLANG_DEFAULT_UNWINDLIB STREQUAL "none" OR278 CLANG_DEFAULT_UNWINDLIB STREQUAL "libgcc" OR279 CLANG_DEFAULT_UNWINDLIB STREQUAL "libunwind"))280 message(WARNING "Resetting default unwindlib to use platform default")281 set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING282 "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)" FORCE)283endif()284 285set(CLANG_DEFAULT_OBJCOPY "objcopy" CACHE STRING286 "Default objcopy executable to use.")287 288set(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING289 "Default OpenMP runtime used by -fopenmp.")290 291set(CLANG_SYSTEMZ_DEFAULT_ARCH "z10" CACHE STRING "SystemZ Default Arch")292 293set(CLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING294 "Vendor-specific text for showing with version information.")295 296set(CLANG_REPOSITORY_STRING "" CACHE STRING297 "Vendor-specific text for showing the repository the source is taken from.")298 299if(CLANG_REPOSITORY_STRING)300 add_definitions(-DCLANG_REPOSITORY_STRING="${CLANG_REPOSITORY_STRING}")301endif()302 303set(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING304 "Vendor-specific uti.")305 306set(CLANG_PYTHON_BINDINGS_VERSIONS "" CACHE STRING307 "Python versions to install libclang python bindings for")308 309set(CLANG_LINK_CLANG_DYLIB ${LLVM_LINK_LLVM_DYLIB} CACHE BOOL310 "Link tools against libclang-cpp.so")311 312if (NOT LLVM_LINK_LLVM_DYLIB AND CLANG_LINK_CLANG_DYLIB)313 message(FATAL_ERROR "Cannot set CLANG_LINK_CLANG_DYLIB=ON when "314 "LLVM_LINK_LLVM_DYLIB=OFF")315endif()316 317# The libdir suffix must exactly match whatever LLVM's configuration used.318set(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}")319 320set(CLANG_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH321 "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")322mark_as_advanced(CLANG_TOOLS_INSTALL_DIR)323 324set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})325set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})326 327if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )328 message(FATAL_ERROR "In-source builds are not allowed. "329"Please create a directory and run cmake "330"from there, passing the path to this source directory as the last argument. "331"This process created the file `CMakeCache.txt' and the directory "332"`CMakeFiles'. Please delete them.")333endif()334 335# If CLANG_VERSION_* is specified, use it, if not use LLVM_VERSION_*.336if(NOT DEFINED CLANG_VERSION_MAJOR)337 set(CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})338endif()339if(NOT DEFINED CLANG_VERSION_MINOR)340 set(CLANG_VERSION_MINOR ${LLVM_VERSION_MINOR})341endif()342if(NOT DEFINED CLANG_VERSION_PATCHLEVEL)343 set(CLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})344endif()345if(NOT DEFINED CLANG_VERSION_SUFFIX)346 set(CLANG_VERSION_SUFFIX ${LLVM_VERSION_SUFFIX})347endif()348set(CLANG_VERSION "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}.${CLANG_VERSION_PATCHLEVEL}${CLANG_VERSION_SUFFIX}")349set(MAX_CLANG_ABI_COMPAT_VERSION "${LLVM_VERSION_MAJOR}")350message(STATUS "Clang version: ${CLANG_VERSION}")351 352# Configure the Version.inc file.353configure_file(354 ${CMAKE_CURRENT_SOURCE_DIR}/include/clang/Basic/Version.inc.in355 ${CMAKE_CURRENT_BINARY_DIR}/include/clang/Basic/Version.inc)356 357# Add appropriate flags for GCC358if (LLVM_COMPILER_IS_GCC_COMPATIBLE)359 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual")360 361 # Enable -pedantic for Clang even if it's not enabled for LLVM.362 if (NOT LLVM_ENABLE_PEDANTIC)363 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-long-long")364 endif ()365 366 if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")367 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types" )368 endif ()369endif ()370 371# Determine HOST_LINK_VERSION on Darwin.372set(HOST_LINK_VERSION)373if (APPLE AND NOT CMAKE_LINKER MATCHES ".*lld.*")374 get_darwin_linker_version(HOST_LINK_VERSION)375 message(STATUS "Host linker version: ${HOST_LINK_VERSION}")376endif()377 378include(AddClang)379 380set(CMAKE_INCLUDE_CURRENT_DIR ON)381 382include_directories(BEFORE383 ${CMAKE_CURRENT_BINARY_DIR}/include384 ${CMAKE_CURRENT_SOURCE_DIR}/include385 )386 387if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)388 install(DIRECTORY include/clang include/clang-c389 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"390 COMPONENT clang-headers391 FILES_MATCHING392 PATTERN "*.def"393 PATTERN "*.h"394 PATTERN "config.h" EXCLUDE395 )396 397 install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang398 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"399 COMPONENT clang-headers400 FILES_MATCHING401 PATTERN "CMakeFiles" EXCLUDE402 PATTERN "*.inc"403 PATTERN "*.h"404 )405 406 # Installing the headers needs to depend on generating any public407 # tablegen'd headers.408 add_custom_target(clang-headers DEPENDS clang-tablegen-targets)409 set_target_properties(clang-headers PROPERTIES FOLDER "Clang/Resources")410 if(NOT LLVM_ENABLE_IDE)411 add_llvm_install_targets(install-clang-headers412 DEPENDS clang-headers413 COMPONENT clang-headers)414 endif()415 416 add_custom_target(bash-autocomplete DEPENDS utils/bash-autocomplete.sh)417 set_target_properties(bash-autocomplete PROPERTIES FOLDER "Clang/Misc")418 install(FILES utils/bash-autocomplete.sh419 DESTINATION "${CMAKE_INSTALL_DATADIR}/clang"420 COMPONENT bash-autocomplete)421 if(NOT LLVM_ENABLE_IDE)422 add_llvm_install_targets(install-bash-autocomplete423 DEPENDS bash-autocomplete424 COMPONENT bash-autocomplete)425 endif()426endif()427 428option(CLANG_BUILD_TOOLS429 "Build the Clang tools. If OFF, just generate build targets." ON)430 431if(LLVM_ENABLE_PLUGINS OR LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)432 set(HAVE_CLANG_PLUGIN_SUPPORT ON)433else()434 set(HAVE_CLANG_PLUGIN_SUPPORT OFF)435endif()436CMAKE_DEPENDENT_OPTION(CLANG_PLUGIN_SUPPORT437 "Build clang with plugin support" ON438 "HAVE_CLANG_PLUGIN_SUPPORT" OFF)439 440# If libstdc++ is statically linked, clang-repl needs to statically link libstdc++441# itself, which is not possible in many platforms because of current limitations in442# JIT stack. (more platforms need to be supported by JITLink)443if(NOT LLVM_STATIC_LINK_CXX_STDLIB)444 set(HAVE_CLANG_REPL_SUPPORT ON)445endif()446 447option(CLANG_ENABLE_OBJC_REWRITER "Build the Objective-C rewriter tool" OFF)448 449option(CLANG_ENABLE_STATIC_ANALYZER450 "Include static analyzer in clang binary." ON)451 452option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF)453 454if (DEFINED CLANG_ENABLE_ARCMT)455 set(CLANG_ENABLE_OBJC_REWRITER ${CLANG_ENABLE_ARCMT})456 message(DEPRECATION "'CLANG_ENABLE_ARCMT' is deprecated as ARCMigrate has been removed from Clang. Please use 'CLANG_ENABLE_OBJC_REWRITER' instead to enable or disable the Objective-C rewriter.")457endif()458 459# This option is a stop-gap, we should commit to removing this as460# soon as possible. See discussion:461# https://discourse.llvm.org/t/rationale-for-removing-versioned-libclang-middle-ground-to-keep-it-behind-option/462option(CLANG_FORCE_MATCHING_LIBCLANG_SOVERSION463 "Force the SOVERSION of libclang to be equal to CLANG_MAJOR" ON)464 465# Clang version information466set(CLANG_EXECUTABLE_VERSION467 "${CLANG_VERSION_MAJOR}" CACHE STRING468 "Major version number that will be appended to the clang executable name")469set(LIBCLANG_LIBRARY_VERSION470 "${CLANG_VERSION_MAJOR}" CACHE STRING471 "Major version number that will be appended to the libclang library")472mark_as_advanced(CLANG_EXECUTABLE_VERSION LIBCLANG_LIBRARY_VERSION)473 474option(CLANG_INCLUDE_TESTS475 "Generate build targets for the Clang unit tests."476 ${LLVM_INCLUDE_TESTS})477 478option(CLANG_ENABLE_HLSL "Include HLSL build products" Off)479# While HLSL support is experimental this should stay hidden.480mark_as_advanced(CLANG_ENABLE_HLSL)481 482add_subdirectory(utils/TableGen)483 484# Export CLANG_TABLEGEN_EXE for use by flang docs.485set(CLANG_TABLEGEN_EXE "${CLANG_TABLEGEN_EXE}" CACHE INTERNAL "")486 487add_subdirectory(include)488 489# All targets below may depend on all tablegen'd files.490get_property(CLANG_TABLEGEN_TARGETS GLOBAL PROPERTY CLANG_TABLEGEN_TARGETS)491add_custom_target(clang-tablegen-targets492 DEPENDS493 omp_gen494 ClangDriverOptions495 ${CLANG_TABLEGEN_TARGETS})496set_target_properties(clang-tablegen-targets PROPERTIES FOLDER "Clang/Tablegenning/Targets")497list(APPEND LLVM_COMMON_DEPENDS clang-tablegen-targets)498 499# Force target to be built as soon as possible. Clang modules builds depend500# header-wise on it as they ship all headers from the umbrella folders. Building501# an entire module might include header, which depends on intrinsics_gen.502if(LLVM_ENABLE_MODULES)503 list(APPEND LLVM_COMMON_DEPENDS intrinsics_gen)504endif()505 506add_subdirectory(lib)507add_subdirectory(tools)508add_subdirectory(runtime)509 510option(CLANG_BUILD_EXAMPLES "Build CLANG example programs by default." OFF)511add_subdirectory(examples)512 513if(APPLE)514 # this line is needed as a cleanup to ensure that any CMakeCaches with the old515 # default value get updated to the new default.516 if(CLANG_ORDER_FILE STREQUAL "")517 unset(CLANG_ORDER_FILE CACHE)518 unset(CLANG_ORDER_FILE)519 endif()520 521 522 set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE FILEPATH523 "Order file to use when compiling clang in order to improve startup time (Darwin Only - requires ld64).")524 525 if(NOT EXISTS ${CLANG_ORDER_FILE})526 string(FIND "${CLANG_ORDER_FILE}" "${CMAKE_CURRENT_BINARY_DIR}" PATH_START)527 if(PATH_START EQUAL 0)528 file(WRITE ${CLANG_ORDER_FILE} "\n")529 else()530 message(FATAL_ERROR "Specified order file '${CLANG_ORDER_FILE}' does not exist.")531 endif()532 endif()533endif()534 535 536if( CLANG_INCLUDE_TESTS )537 find_package(Perl)538 539 add_subdirectory(unittests)540 list(APPEND CLANG_TEST_DEPS ClangUnitTests)541 list(APPEND CLANG_TEST_PARAMS542 clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg543 )544 add_subdirectory(test)545 add_subdirectory(bindings/python/tests)546 547 if(CLANG_BUILT_STANDALONE)548 umbrella_lit_testsuite_end(check-all)549 endif()550 add_subdirectory(utils/perf-training)551endif()552 553option(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs."554 ${LLVM_INCLUDE_DOCS})555if( CLANG_INCLUDE_DOCS )556 add_subdirectory(docs)557endif()558 559# Custom target to install all clang libraries.560add_custom_target(clang-libraries)561set_target_properties(clang-libraries PROPERTIES FOLDER "Clang/Install")562 563if(NOT LLVM_ENABLE_IDE)564 add_llvm_install_targets(install-clang-libraries565 DEPENDS clang-libraries566 COMPONENT clang-libraries)567endif()568 569get_property(CLANG_LIBS GLOBAL PROPERTY CLANG_LIBS)570if(CLANG_LIBS)571 list(REMOVE_DUPLICATES CLANG_LIBS)572 foreach(lib ${CLANG_LIBS})573 add_dependencies(clang-libraries ${lib})574 if(NOT LLVM_ENABLE_IDE)575 add_dependencies(install-clang-libraries install-${lib})576 add_dependencies(install-clang-libraries-stripped install-${lib}-stripped)577 endif()578 endforeach()579endif()580 581add_subdirectory(cmake/modules)582 583if(CLANG_STAGE)584 message(STATUS "Setting current clang stage to: ${CLANG_STAGE}")585endif()586 587if (CLANG_ENABLE_BOOTSTRAP)588 include(ExternalProject)589 590 add_custom_target(clang-bootstrap-deps DEPENDS clang)591 592 if(NOT CLANG_STAGE)593 set(CLANG_STAGE stage1)594 endif()595 596 string(REGEX MATCH "stage([0-9]*)" MATCHED_STAGE "${CLANG_STAGE}")597 if(MATCHED_STAGE)598 if(NOT LLVM_BUILD_INSTRUMENTED)599 math(EXPR STAGE_NUM "${CMAKE_MATCH_1} + 1")600 set(NEXT_CLANG_STAGE stage${STAGE_NUM})601 else()602 set(NEXT_CLANG_STAGE stage${CMAKE_MATCH_1})603 endif()604 else()605 set(NEXT_CLANG_STAGE bootstrap)606 endif()607 608 if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)609 set(NEXT_CLANG_STAGE ${NEXT_CLANG_STAGE}-instrumented)610 endif()611 message(STATUS "Setting next clang stage to: ${NEXT_CLANG_STAGE}")612 613 614 set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-stamps/)615 set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-bins/)616 617 if(BOOTSTRAP_LLVM_ENABLE_LLD)618 # adding lld to clang-bootstrap-deps without having it enabled in619 # LLVM_ENABLE_PROJECTS just generates a cryptic error message.620 if (NOT "lld" IN_LIST LLVM_ENABLE_PROJECTS)621 message(FATAL_ERROR "LLD is enabled in the bootstrap build, but lld is not in LLVM_ENABLE_PROJECTS")622 endif()623 add_dependencies(clang-bootstrap-deps lld)624 endif()625 626 if (WIN32)627 # Build llvm-rc and llvm-mt which are needed by the Windows build.628 add_dependencies(clang-bootstrap-deps llvm-rc)629 if(LLVM_ENABLE_LIBXML2)630 add_dependencies(clang-bootstrap-deps llvm-mt)631 endif()632 endif()633 634 # If the next stage is LTO we need to depend on LTO and possibly lld or LLVMgold635 if(BOOTSTRAP_LLVM_ENABLE_LTO OR LLVM_ENABLE_LTO AND NOT LLVM_BUILD_INSTRUMENTED)636 if(APPLE)637 add_dependencies(clang-bootstrap-deps LTO)638 # on Darwin we need to set DARWIN_LTO_LIBRARY so that -flto will work639 # using the just-built compiler, and we need to override DYLD_LIBRARY_PATH640 # so that the host object file tools will use the just-built libLTO.641 # However if System Integrity Protection is enabled the DYLD variables642 # will be scrubbed from the environment of any base system commands. This643 # includes /bin/sh, which ninja uses when executing build commands. To644 # work around the envar being filtered away we pass it in as a CMake645 # variable, and have LLVM's CMake append the envar to the archiver calls.646 set(LTO_LIBRARY -DDARWIN_LTO_LIBRARY=${LLVM_SHLIB_OUTPUT_INTDIR}/libLTO.dylib647 -DDYLD_LIBRARY_PATH=${LLVM_LIBRARY_OUTPUT_INTDIR})648 elseif(MSVC)649 add_dependencies(clang-bootstrap-deps llvm-lib)650 set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-lib)651 elseif(NOT WIN32)652 add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib)653 if(NOT BOOTSTRAP_LLVM_ENABLE_LLD AND LLVM_BINUTILS_INCDIR)654 add_dependencies(clang-bootstrap-deps LLVMgold)655 endif()656 set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)657 set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)658 endif()659 endif()660 661 if(CLANG_BOOTSTRAP_EXTRA_DEPS)662 add_dependencies(clang-bootstrap-deps ${CLANG_BOOTSTRAP_EXTRA_DEPS})663 endif()664 665 add_custom_target(${NEXT_CLANG_STAGE}-clear666 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared667 )668 add_custom_command(669 OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared670 DEPENDS clang-bootstrap-deps671 COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR}672 COMMAND ${CMAKE_COMMAND} -E make_directory ${BINARY_DIR}673 COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR}674 COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR}675 COMMENT "Clobberring ${NEXT_CLANG_STAGE} build and stamp directories"676 )677 678 if(CMAKE_VERBOSE_MAKEFILE)679 set(verbose -DCMAKE_VERBOSE_MAKEFILE=On)680 endif()681 682 set(_BOOTSTRAP_DEFAULT_PASSTHROUGH683 PACKAGE_VERSION684 PACKAGE_VENDOR685 LLVM_VERSION_MAJOR686 LLVM_VERSION_MINOR687 LLVM_VERSION_PATCH688 CLANG_VERSION_MAJOR689 CLANG_VERSION_MINOR690 CLANG_VERSION_PATCHLEVEL691 CLANG_VERSION_SUFFIX692 CLANG_VENDOR693 LLVM_VERSION_SUFFIX694 LLVM_BINUTILS_INCDIR695 CLANG_REPOSITORY_STRING696 CMAKE_MAKE_PROGRAM697 CMAKE_OSX_ARCHITECTURES698 CMAKE_BUILD_TYPE699 LLVM_ENABLE_PROJECTS700 LLVM_ENABLE_RUNTIMES)701 702 # We don't need to depend on compiler-rt/libcxx if we're building instrumented703 # because the next stage will use the same compiler used to build this stage.704 if(NOT LLVM_BUILD_INSTRUMENTED)705 if(TARGET compiler-rt)706 add_dependencies(clang-bootstrap-deps compiler-rt)707 endif()708 if(TARGET cxx-headers)709 add_dependencies(clang-bootstrap-deps cxx-headers)710 endif()711 endif()712 713 set(C_COMPILER "clang")714 set(CXX_COMPILER "clang++")715 if(WIN32)716 set(C_COMPILER "clang-cl.exe")717 set(CXX_COMPILER "clang-cl.exe")718 endif()719 720 set(COMPILER_OPTIONS721 -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CXX_COMPILER}722 -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER}723 -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER}724 -DCMAKE_ASM_COMPILER_ID=Clang)725 726 # cmake requires CMAKE_LINKER to be specified if the compiler is MSVC-like,727 # otherwise it defaults the linker to be link.exe.728 if(BOOTSTRAP_LLVM_ENABLE_LLD)729 if((WIN32 AND NOT BOOTSTRAP_CMAKE_SYSTEM_NAME) OR BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Windows")730 set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/lld-link${CMAKE_EXECUTABLE_SUFFIX})731 endif()732 endif()733 734 if(BOOTSTRAP_CMAKE_SYSTEM_NAME)735 set(${CLANG_STAGE}_TABLEGEN736 -DLLVM_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-tblgen737 -DCLANG_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-tblgen)738 if(BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Linux")739 if(BOOTSTRAP_LLVM_ENABLE_LLD)740 set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld)741 endif()742 if(NOT BOOTSTRAP_LLVM_ENABLE_LTO)743 add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib)744 set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar)745 set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib)746 endif()747 add_dependencies(clang-bootstrap-deps llvm-objcopy llvm-strip)748 set(${CLANG_STAGE}_OBJCOPY -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy)749 set(${CLANG_STAGE}_STRIP -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip)750 set(${CLANG_STAGE}_READELF -DCMAKE_READELF=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-readelf)751 endif()752 endif()753 754 if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)755 add_dependencies(clang-bootstrap-deps llvm-profdata)756 set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata)757 string(TOUPPER "${BOOTSTRAP_LLVM_BUILD_INSTRUMENTED}" BOOTSTRAP_LLVM_BUILD_INSTRUMENTED)758 if (BOOTSTRAP_LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO")759 add_dependencies(clang-bootstrap-deps llvm-profgen)760 list(APPEND PGO_OPT -DLLVM_PROFGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profgen)761 endif()762 endif()763 764 if(LLVM_BUILD_INSTRUMENTED)765 string(TOUPPER "${LLVM_BUILD_INSTRUMENTED}" LLVM_BUILD_INSTRUMENTED)766 if (LLVM_BUILD_INSTRUMENTED STREQUAL "CSSPGO")767 add_dependencies(clang-bootstrap-deps generate-sprofdata)768 set(PGO_OPT -DLLVM_SPROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.sprofdata)769 else()770 add_dependencies(clang-bootstrap-deps generate-profdata)771 set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata)772 endif()773 # Use the current tools for LTO instead of the instrumented ones774 list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH775 CMAKE_CXX_COMPILER776 CMAKE_C_COMPILER777 CMAKE_ASM_COMPILER778 CMAKE_AR779 CMAKE_RANLIB780 DARWIN_LTO_LIBRARY781 DYLD_LIBRARY_PATH)782 783 set(COMPILER_OPTIONS)784 set(LTO_LIBRARY)785 set(LTO_AR)786 set(LTO_RANLIB)787 endif()788 789 # Populate the passthrough variables790 foreach(variableName ${CLANG_BOOTSTRAP_PASSTHROUGH} ${_BOOTSTRAP_DEFAULT_PASSTHROUGH})791 if(DEFINED ${variableName})792 if("${${variableName}}" STREQUAL "")793 set(value "")794 else()795 string(REPLACE ";" "|" value "${${variableName}}")796 endif()797 list(APPEND PASSTHROUGH_VARIABLES798 -D${variableName}=${value})799 endif()800 endforeach()801 802 # Find all variables that start with BOOTSTRAP_ and populate a variable with803 # them.804 get_cmake_property(variableNames VARIABLES)805 foreach(variableName ${variableNames})806 if(variableName MATCHES "^BOOTSTRAP_")807 string(SUBSTRING ${variableName} 10 -1 varName)808 string(REPLACE ";" "|" value "${${variableName}}")809 list(APPEND PASSTHROUGH_VARIABLES810 -D${varName}=${value})811 endif()812 if(${variableName} AND variableName MATCHES "LLVM_EXTERNAL_.*_SOURCE_DIR")813 list(APPEND PASSTHROUGH_VARIABLES814 -D${variableName}=${${variableName}})815 endif()816 endforeach()817 818 # Build arguments for native tool used in CMake.819 set(build_configuration "$<CONFIG>")820 set(build_tool_args "${LLVM_EXTERNAL_PROJECT_BUILD_TOOL_ARGS}")821 if(NOT build_tool_args STREQUAL "")822 string(PREPEND build_tool_args "-- ")823 separate_arguments(build_tool_args UNIX_COMMAND "${build_tool_args}")824 endif()825 826 ExternalProject_Add(${NEXT_CLANG_STAGE}827 DEPENDS clang-bootstrap-deps828 PREFIX ${NEXT_CLANG_STAGE}829 SOURCE_DIR ${CMAKE_SOURCE_DIR}830 STAMP_DIR ${STAMP_DIR}831 BINARY_DIR ${BINARY_DIR}832 EXCLUDE_FROM_ALL 1833 CMAKE_ARGS834 # We shouldn't need to set this here, but INSTALL_DIR doesn't835 # seem to work, so instead I'm passing this through836 -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}837 ${PASSTHROUGH_VARIABLES}838 ${CLANG_BOOTSTRAP_CMAKE_ARGS}839 -DCLANG_STAGE=${NEXT_CLANG_STAGE}840 ${COMPILER_OPTIONS}841 ${${CLANG_STAGE}_TABLEGEN}842 ${LTO_LIBRARY} ${verbose} ${PGO_OPT}843 ${${CLANG_STAGE}_LINKER}844 ${${CLANG_STAGE}_AR}845 ${${CLANG_STAGE}_RANLIB}846 ${${CLANG_STAGE}_OBJCOPY}847 ${${CLANG_STAGE}_STRIP}848 BUILD_COMMAND ${CMAKE_COMMAND} --build ${BINARY_DIR}849 --config ${build_configuration}850 ${build_tool_args}851 INSTALL_COMMAND ""852 STEP_TARGETS configure build853 USES_TERMINAL_CONFIGURE 1854 USES_TERMINAL_BUILD 1855 USES_TERMINAL_INSTALL 1856 LIST_SEPARATOR |857 )858 859 # exclude really-install from main target860 set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On)861 ExternalProject_Add_Step(${NEXT_CLANG_STAGE} really-install862 COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install863 COMMENT "Performing install step for '${NEXT_CLANG_STAGE}'"864 DEPENDEES build865 USES_TERMINAL 1866 )867 ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} really-install)868 add_custom_target(${NEXT_CLANG_STAGE}-install DEPENDS ${NEXT_CLANG_STAGE}-really-install)869 870 if(NOT CLANG_BOOTSTRAP_TARGETS)871 set(CLANG_BOOTSTRAP_TARGETS check-llvm check-clang check-all)872 endif()873 foreach(target ${CLANG_BOOTSTRAP_TARGETS})874 875 ExternalProject_Add_Step(${NEXT_CLANG_STAGE} ${target}876 COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target ${target}877 COMMENT "Performing ${target} for '${NEXT_CLANG_STAGE}'"878 DEPENDEES configure879 # We need to set ALWAYS to ON here, otherwise these targets won't be880 # built on a second invocation of ninja. The targets have their own881 # logic to determine if they should build or not so setting ALWAYS ON882 # here does not mean the targets will always rebuild it just means that883 # they will check their dependenices and see if they need to be built.884 ALWAYS ON885 EXCLUDE_FROM_MAIN ON886 USES_TERMINAL 1887 )888 889 if(target MATCHES "^stage[0-9]*")890 add_custom_target(${target} DEPENDS ${NEXT_CLANG_STAGE}-${target})891 endif()892 893 ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} ${target})894 endforeach()895endif()896 897if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION)898 add_subdirectory(utils/ClangVisualizers)899endif()900add_subdirectory(utils/hmaptool)901 902if(CLANG_BUILT_STANDALONE)903 llvm_distribution_add_targets()904 process_llvm_pass_plugins()905endif()906 907set(CLANG_INSTALL_LIBDIR_BASENAME "lib${CLANG_LIBDIR_SUFFIX}")908 909configure_file(910 ${CLANG_SOURCE_DIR}/include/clang/Config/config.h.cmake911 ${CLANG_BINARY_DIR}/include/clang/Config/config.h)912