1cmake_minimum_required(VERSION 3.13.4) 2 3# If we are not building as a part of LLVM, build LLD as an 4# standalone project, using LLVM as an external library: 5if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) 6 project(lld) 7 set(LLD_BUILT_STANDALONE TRUE) 8endif() 9 10# Must go below project(..) 11include(GNUInstallDirs) 12 13if(LLD_BUILT_STANDALONE) 14 set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to") 15 set(CMAKE_CXX_STANDARD_REQUIRED YES) 16 set(CMAKE_CXX_EXTENSIONS NO) 17 18 set(CMAKE_INCLUDE_CURRENT_DIR ON) 19 20 # Rely on llvm-config. 21 set(LLVM_CONFIG_OUTPUT) 22 if(NOT LLVM_CONFIG) 23 # back compat 24 set(LLVM_CONFIG "${LLVM_CONFIG_PATH}") 25 endif() 26 if(LLVM_CONFIG) 27 set (LLVM_CONFIG_FOUND 1) 28 message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}") 29 message(DEPRECATION "Using llvm-config to detect the LLVM installation is \ 30 deprecated. The installed cmake files should be used \ 31 instead. CMake should be able to detect your LLVM install \ 32 automatically, but you can also use LLVM_DIR to specify \ 33 the path containing LLVMConfig.cmake.") 34 set(CONFIG_COMMAND ${LLVM_CONFIG} 35 "--includedir" 36 "--prefix" 37 "--src-root" 38 "--cmakedir" 39 ) 40 execute_process( 41 COMMAND ${CONFIG_COMMAND} 42 RESULT_VARIABLE HAD_ERROR 43 OUTPUT_VARIABLE LLVM_CONFIG_OUTPUT 44 ) 45 if(NOT HAD_ERROR) 46 string(REGEX REPLACE 47 "[ \t]*[\r\n]+[ \t]*" ";" 48 LLVM_CONFIG_OUTPUT ${LLVM_CONFIG_OUTPUT}) 49 else() 50 string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}") 51 message(STATUS "${CONFIG_COMMAND_STR}") 52 message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}") 53 endif() 54 55 list(GET LLVM_CONFIG_OUTPUT 0 MAIN_INCLUDE_DIR) 56 list(GET LLVM_CONFIG_OUTPUT 1 LLVM_OBJ_ROOT) 57 list(GET LLVM_CONFIG_OUTPUT 2 MAIN_SRC_DIR) 58 list(GET LLVM_CONFIG_OUTPUT 3 LLVM_CONFIG_CMAKE_DIR) 59 60 # Normalize LLVM_CMAKE_DIR. --cmakedir might contain backslashes. 61 # CMake assumes slashes as PATH. 62 file(TO_CMAKE_PATH ${LLVM_CONFIG_CMAKE_DIR} LLVM_CMAKE_DIR) 63 endif() 64 65 find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}") 66 list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}") 67 68 # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets 69 # LLVM_CONFIG. 70 if (NOT LLVM_CONFIG_FOUND) 71 # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config 72 # path is removed. 73 set(MAIN_INCLUDE_DIR "${LLVM_INCLUDE_DIR}") 74 set(LLVM_OBJ_DIR "${LLVM_BINARY_DIR}") 75 # N.B. this is just a default value, the CACHE PATHs below can be overridden. 76 set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm") 77 endif() 78 79 set(LLVM_MAIN_INCLUDE_DIR "${MAIN_INCLUDE_DIR}" CACHE PATH "Path to llvm/include") 80 set(LLVM_BINARY_DIR "${LLVM_OBJ_ROOT}" CACHE PATH "Path to LLVM build tree") 81 set(LLVM_MAIN_SRC_DIR "${MAIN_SRC_DIR}" CACHE PATH "Path to LLVM source tree") 82 83 find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} 84 NO_DEFAULT_PATH) 85 86 # They are used as destination of target generators. 87 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) 88 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) 89 90 include(AddLLVM) 91 include(TableGen) 92 include(HandleLLVMOptions) 93 include(GetErrcMessages) 94 include(CheckAtomic) 95 96 set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") 97 98 include_directories("${LLVM_BINARY_DIR}/include" ${LLVM_INCLUDE_DIRS}) 99 link_directories(${LLVM_LIBRARY_DIRS}) 100 101 if(LLVM_INCLUDE_TESTS) 102 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED 103 COMPONENTS Interpreter) 104 105 # Check prebuilt llvm/utils. 106 if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX} 107 AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX}) 108 set(LLVM_UTILS_PROVIDED ON) 109 endif() 110 111 if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) 112 # Note: path not really used, except for checking if lit was found 113 set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) 114 if(NOT LLVM_UTILS_PROVIDED) 115 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck) 116 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not) 117 set(LLVM_UTILS_PROVIDED ON) 118 set(LLD_TEST_DEPS FileCheck not) 119 endif() 120 set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest) 121 if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h 122 AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX} 123 AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt) 124 add_subdirectory(${UNITTEST_DIR} utils/unittest) 125 endif() 126 else() 127 # Seek installed Lit. 128 find_program(LLVM_LIT 129 NAMES llvm-lit lit.py lit 130 PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit" 131 DOC "Path to lit.py") 132 endif() 133 134 if(LLVM_LIT) 135 # Define the default arguments to use with 'lit', and an option for the user 136 # to override. 137 set(LIT_ARGS_DEFAULT "-sv") 138 if (MSVC OR XCODE) 139 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") 140 endif() 141 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") 142 143 get_errc_messages(LLVM_LIT_ERRC_MESSAGES) 144 145 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools. 146 if(WIN32 AND NOT CYGWIN) 147 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools") 148 endif() 149 else() 150 set(LLVM_INCLUDE_TESTS OFF) 151 endif() 152 endif() 153 154 if(LLVM_HAVE_LIBXAR) 155 set(XAR_LIB xar) 156 endif() 157endif() # standalone 158 159set(LLD_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH 160 "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')") 161mark_as_advanced(LLD_TOOLS_INSTALL_DIR) 162 163set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 164set(LLD_INCLUDE_DIR ${LLD_SOURCE_DIR}/include ) 165set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) 166 167set(LLD_VENDOR ${PACKAGE_VENDOR} CACHE STRING 168 "Vendor-specific text for showing with version information.") 169 170if(LLD_VENDOR) 171 add_definitions(-DLLD_VENDOR="${LLD_VENDOR}") 172endif() 173 174# Compute the LLD version from the LLVM version. 175string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLD_VERSION 176 ${PACKAGE_VERSION}) 177message(STATUS "LLD version: ${LLD_VERSION}") 178 179string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" LLD_VERSION_MAJOR 180 ${LLD_VERSION}) 181string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" LLD_VERSION_MINOR 182 ${LLD_VERSION}) 183 184# Configure the Version.inc file. 185configure_file( 186 ${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Common/Version.inc.in 187 ${CMAKE_CURRENT_BINARY_DIR}/include/lld/Common/Version.inc) 188 189 190if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) 191 message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite " 192"the makefiles distributed with LLVM. Please create a directory and run cmake " 193"from there, passing the path to this source directory as the last argument. " 194"This process created the file `CMakeCache.txt' and the directory " 195"`CMakeFiles'. Please delete them.") 196endif() 197 198if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS) 199 set(LLVM_COMMON_CMAKE_UTILS ${LLD_SOURCE_DIR}/../cmake) 200endif() 201 202# Add path for custom modules. 203list(INSERT CMAKE_MODULE_PATH 0 204 "${LLD_SOURCE_DIR}/cmake/modules" 205 "${LLVM_COMMON_CMAKE_UTILS}/Modules" 206 ) 207 208include(AddLLD) 209 210option(LLD_USE_VTUNE 211 "Enable VTune user task tracking." 212 OFF) 213if (LLD_USE_VTUNE) 214 find_package(VTune) 215 if (VTUNE_FOUND) 216 include_directories(${VTune_INCLUDE_DIRS}) 217 list(APPEND LLVM_COMMON_LIBS ${VTune_LIBRARIES}) 218 add_definitions(-DLLD_HAS_VTUNE) 219 endif() 220endif() 221 222option(LLD_BUILD_TOOLS 223 "Build the lld tools. If OFF, just generate build targets." ON) 224 225option(LLD_DEFAULT_LD_LLD_IS_MINGW 226 "Use MinGW as the default backend for ld.lld. If OFF, ELF will be used." OFF) 227if (LLD_DEFAULT_LD_LLD_IS_MINGW) 228 add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1") 229endif() 230 231if (MSVC) 232 add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.' 233 add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header. 234endif() 235 236include_directories(BEFORE 237 ${CMAKE_CURRENT_BINARY_DIR}/include 238 ${CMAKE_CURRENT_SOURCE_DIR}/include 239 ) 240 241if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 242 install(DIRECTORY include/ 243 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" 244 FILES_MATCHING 245 PATTERN "*.h" 246 ) 247endif() 248 249add_subdirectory(Common) 250add_subdirectory(tools/lld) 251 252if (LLVM_INCLUDE_TESTS) 253 add_subdirectory(test) 254endif() 255 256add_subdirectory(docs) 257add_subdirectory(COFF) 258add_subdirectory(ELF) 259add_subdirectory(MachO) 260add_subdirectory(MinGW) 261add_subdirectory(wasm) 262 263add_subdirectory(cmake/modules) 264