brintos

brintos / llvm-project-archived public Read only

0
0
Text · 33.2 KiB · e4cb1a3 Raw
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