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