1 cmake_minimum_required(VERSION 3.13.4)
3 # If we are not building as a part of LLVM, build LLD as an
4 # standalone project, using LLVM as an external library:
5 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
7 set(LLD_BUILT_STANDALONE TRUE)
10 # Must go below project(..)
11 include(GNUInstallDirs)
13 if(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)
18 set(CMAKE_INCLUDE_CURRENT_DIR ON)
20 # Rely on llvm-config.
21 set(LLVM_CONFIG_OUTPUT)
24 set(LLVM_CONFIG "${LLVM_CONFIG_PATH}")
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}
41 COMMAND ${CONFIG_COMMAND}
42 RESULT_VARIABLE HAD_ERROR
43 OUTPUT_VARIABLE LLVM_CONFIG_OUTPUT
47 "[ \t]*[\r\n]+[ \t]*" ";"
48 LLVM_CONFIG_OUTPUT ${LLVM_CONFIG_OUTPUT})
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}")
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)
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)
65 find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
66 list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
68 # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets
70 if (NOT LLVM_CONFIG_FOUND)
71 # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config
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 overriden.
76 set(MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm")
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")
83 find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
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})
92 include(HandleLLVMOptions)
93 include(GetErrcMessages)
96 set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
98 include_directories("${LLVM_BINARY_DIR}/include" ${LLVM_INCLUDE_DIRS})
99 link_directories(${LLVM_LIBRARY_DIRS})
101 if(LLVM_INCLUDE_TESTS)
102 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
103 COMPONENTS Interpreter)
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)
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)
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)
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")
135 # Define the default arguments to use with 'lit', and an option for the user
137 set(LIT_ARGS_DEFAULT "-sv")
139 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
141 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
143 get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
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")
150 set(LLVM_INCLUDE_TESTS OFF)
159 set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
160 set(LLD_INCLUDE_DIR ${LLD_SOURCE_DIR}/include )
161 set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
163 set(LLD_VENDOR ${PACKAGE_VENDOR} CACHE STRING
164 "Vendor-specific text for showing with version information.")
167 add_definitions(-DLLD_VENDOR="${LLD_VENDOR}")
170 # Compute the LLD version from the LLVM version.
171 string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLD_VERSION
173 message(STATUS "LLD version: ${LLD_VERSION}")
175 string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" LLD_VERSION_MAJOR
177 string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" LLD_VERSION_MINOR
180 # Configure the Version.inc file.
182 ${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Common/Version.inc.in
183 ${CMAKE_CURRENT_BINARY_DIR}/include/lld/Common/Version.inc)
186 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
187 message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite "
188 "the makefiles distributed with LLVM. Please create a directory and run cmake "
189 "from there, passing the path to this source directory as the last argument. "
190 "This process created the file `CMakeCache.txt' and the directory "
191 "`CMakeFiles'. Please delete them.")
194 if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
195 set(LLVM_COMMON_CMAKE_UTILS ${LLD_SOURCE_DIR}/../cmake)
198 # Add path for custom modules.
199 list(INSERT CMAKE_MODULE_PATH 0
200 "${LLD_SOURCE_DIR}/cmake/modules"
201 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
207 "Enable VTune user task tracking."
212 include_directories(${VTune_INCLUDE_DIRS})
213 list(APPEND LLVM_COMMON_LIBS ${VTune_LIBRARIES})
214 add_definitions(-DLLD_HAS_VTUNE)
218 option(LLD_BUILD_TOOLS
219 "Build the lld tools. If OFF, just generate build targets." ON)
221 option(LLD_DEFAULT_LD_LLD_IS_MINGW
222 "Use MinGW as the default backend for ld.lld. If OFF, ELF will be used." OFF)
223 if (LLD_DEFAULT_LD_LLD_IS_MINGW)
224 add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1")
228 add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.'
229 add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header.
232 include_directories(BEFORE
233 ${CMAKE_CURRENT_BINARY_DIR}/include
234 ${CMAKE_CURRENT_SOURCE_DIR}/include
237 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
238 install(DIRECTORY include/
239 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
245 add_subdirectory(Common)
246 add_subdirectory(tools/lld)
248 if (LLVM_INCLUDE_TESTS)
249 add_subdirectory(test)
252 add_subdirectory(docs)
253 add_subdirectory(COFF)
254 add_subdirectory(ELF)
255 add_subdirectory(MachO)
256 add_subdirectory(MinGW)
257 add_subdirectory(wasm)
259 add_subdirectory(cmake/modules)