150
|
1 # Check if lld is built as a standalone project.
|
|
2 if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
|
|
3 project(lld)
|
207
|
4 cmake_minimum_required(VERSION 3.13.4)
|
150
|
5
|
|
6 set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
|
7 set(LLD_BUILT_STANDALONE TRUE)
|
|
8
|
|
9 find_program(LLVM_CONFIG_PATH "llvm-config" DOC "Path to llvm-config binary")
|
|
10 if(NOT LLVM_CONFIG_PATH)
|
|
11 message(FATAL_ERROR "llvm-config not found: specify LLVM_CONFIG_PATH")
|
|
12 endif()
|
|
13
|
|
14 execute_process(COMMAND "${LLVM_CONFIG_PATH}"
|
|
15 "--obj-root"
|
|
16 "--includedir"
|
|
17 "--cmakedir"
|
|
18 "--src-root"
|
|
19 RESULT_VARIABLE HAD_ERROR
|
|
20 OUTPUT_VARIABLE LLVM_CONFIG_OUTPUT
|
|
21 OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
22 if(HAD_ERROR)
|
|
23 message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}")
|
|
24 endif()
|
|
25
|
|
26 string(REGEX REPLACE "[ \t]*[\r\n]+[ \t]*" ";" LLVM_CONFIG_OUTPUT "${LLVM_CONFIG_OUTPUT}")
|
|
27
|
|
28 list(GET LLVM_CONFIG_OUTPUT 0 OBJ_ROOT)
|
|
29 list(GET LLVM_CONFIG_OUTPUT 1 MAIN_INCLUDE_DIR)
|
|
30 list(GET LLVM_CONFIG_OUTPUT 2 LLVM_CMAKE_PATH)
|
|
31 list(GET LLVM_CONFIG_OUTPUT 3 MAIN_SRC_DIR)
|
|
32
|
|
33 set(LLVM_OBJ_ROOT ${OBJ_ROOT} CACHE PATH "path to LLVM build tree")
|
|
34 set(LLVM_MAIN_INCLUDE_DIR ${MAIN_INCLUDE_DIR} CACHE PATH "path to llvm/include")
|
|
35 set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree")
|
|
36
|
|
37 file(TO_CMAKE_PATH ${LLVM_OBJ_ROOT} LLVM_BINARY_DIR)
|
207
|
38 file(TO_CMAKE_PATH ${LLVM_CMAKE_PATH} LLVM_CMAKE_PATH)
|
150
|
39
|
|
40 if(NOT EXISTS "${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
|
|
41 message(FATAL_ERROR "LLVMConfig.cmake not found")
|
|
42 endif()
|
|
43 include("${LLVM_CMAKE_PATH}/LLVMConfig.cmake")
|
|
44
|
|
45 list(APPEND CMAKE_MODULE_PATH "${LLVM_CMAKE_PATH}")
|
|
46
|
|
47 set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
|
|
48 include_directories("${LLVM_BINARY_DIR}/include" ${LLVM_INCLUDE_DIRS})
|
|
49 link_directories(${LLVM_LIBRARY_DIRS})
|
|
50
|
|
51 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
|
|
52 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
|
|
53 find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} NO_DEFAULT_PATH)
|
|
54
|
|
55 include(AddLLVM)
|
|
56 include(TableGen)
|
|
57 include(HandleLLVMOptions)
|
207
|
58 include(GetErrcMessages)
|
|
59 include(CheckAtomic)
|
150
|
60
|
|
61 if(LLVM_INCLUDE_TESTS)
|
207
|
62 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
|
|
63 COMPONENTS Interpreter)
|
150
|
64
|
|
65 # Check prebuilt llvm/utils.
|
|
66 if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
|
|
67 AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
|
|
68 set(LLVM_UTILS_PROVIDED ON)
|
|
69 endif()
|
|
70
|
|
71 if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
|
|
72 # Note: path not really used, except for checking if lit was found
|
|
73 set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
|
|
74 if(NOT LLVM_UTILS_PROVIDED)
|
|
75 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
|
|
76 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
|
|
77 set(LLVM_UTILS_PROVIDED ON)
|
|
78 set(LLD_TEST_DEPS FileCheck not)
|
|
79 endif()
|
|
80 set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
|
|
81 if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
|
|
82 AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
|
|
83 AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
|
|
84 add_subdirectory(${UNITTEST_DIR} utils/unittest)
|
|
85 endif()
|
|
86 else()
|
|
87 # Seek installed Lit.
|
|
88 find_program(LLVM_LIT
|
|
89 NAMES llvm-lit lit.py lit
|
|
90 PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"
|
|
91 DOC "Path to lit.py")
|
|
92 endif()
|
|
93
|
|
94 if(LLVM_LIT)
|
|
95 # Define the default arguments to use with 'lit', and an option for the user
|
|
96 # to override.
|
|
97 set(LIT_ARGS_DEFAULT "-sv")
|
|
98 if (MSVC OR XCODE)
|
|
99 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
|
|
100 endif()
|
|
101 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
|
|
102
|
207
|
103 get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
|
|
104
|
150
|
105 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
|
|
106 if(WIN32 AND NOT CYGWIN)
|
|
107 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
|
|
108 endif()
|
|
109 else()
|
|
110 set(LLVM_INCLUDE_TESTS OFF)
|
|
111 endif()
|
|
112 endif()
|
207
|
113
|
|
114 if(LLVM_HAVE_LIBXAR)
|
|
115 set(XAR_LIB xar)
|
|
116 endif()
|
150
|
117 endif()
|
|
118
|
|
119 set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
|
|
120 set(LLD_INCLUDE_DIR ${LLD_SOURCE_DIR}/include )
|
|
121 set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
|
|
122
|
173
|
123 set(LLD_VENDOR ${PACKAGE_VENDOR} CACHE STRING
|
|
124 "Vendor-specific text for showing with version information.")
|
|
125
|
|
126 if(LLD_VENDOR)
|
|
127 add_definitions(-DLLD_VENDOR="${LLD_VENDOR}")
|
|
128 endif()
|
|
129
|
150
|
130 # Compute the LLD version from the LLVM version.
|
|
131 string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLD_VERSION
|
|
132 ${PACKAGE_VERSION})
|
|
133 message(STATUS "LLD version: ${LLD_VERSION}")
|
|
134
|
|
135 string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" LLD_VERSION_MAJOR
|
|
136 ${LLD_VERSION})
|
|
137 string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" LLD_VERSION_MINOR
|
|
138 ${LLD_VERSION})
|
|
139
|
|
140 # Configure the Version.inc file.
|
|
141 configure_file(
|
|
142 ${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Common/Version.inc.in
|
|
143 ${CMAKE_CURRENT_BINARY_DIR}/include/lld/Common/Version.inc)
|
|
144
|
|
145
|
|
146 if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
|
147 message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite "
|
|
148 "the makefiles distributed with LLVM. Please create a directory and run cmake "
|
|
149 "from there, passing the path to this source directory as the last argument. "
|
|
150 "This process created the file `CMakeCache.txt' and the directory "
|
|
151 "`CMakeFiles'. Please delete them.")
|
|
152 endif()
|
|
153
|
|
154 list (APPEND CMAKE_MODULE_PATH "${LLD_SOURCE_DIR}/cmake/modules")
|
|
155
|
|
156 include(AddLLD)
|
|
157
|
|
158 option(LLD_USE_VTUNE
|
|
159 "Enable VTune user task tracking."
|
|
160 OFF)
|
|
161 if (LLD_USE_VTUNE)
|
|
162 find_package(VTune)
|
|
163 if (VTUNE_FOUND)
|
|
164 include_directories(${VTune_INCLUDE_DIRS})
|
|
165 list(APPEND LLVM_COMMON_LIBS ${VTune_LIBRARIES})
|
|
166 add_definitions(-DLLD_HAS_VTUNE)
|
|
167 endif()
|
|
168 endif()
|
|
169
|
|
170 option(LLD_BUILD_TOOLS
|
|
171 "Build the lld tools. If OFF, just generate build targets." ON)
|
|
172
|
207
|
173 option(LLD_DEFAULT_LD_LLD_IS_MINGW
|
|
174 "Use MinGW as the default backend for ld.lld. If OFF, ELF will be used." OFF)
|
|
175 if (LLD_DEFAULT_LD_LLD_IS_MINGW)
|
|
176 add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1")
|
|
177 endif()
|
|
178
|
150
|
179 if (MSVC)
|
|
180 add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.'
|
|
181 add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header.
|
|
182 endif()
|
|
183
|
|
184 include_directories(BEFORE
|
|
185 ${CMAKE_CURRENT_BINARY_DIR}/include
|
|
186 ${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
187 )
|
|
188
|
|
189 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
|
|
190 install(DIRECTORY include/
|
|
191 DESTINATION include
|
|
192 FILES_MATCHING
|
|
193 PATTERN "*.h"
|
|
194 )
|
|
195 endif()
|
|
196
|
|
197 add_subdirectory(Common)
|
|
198 add_subdirectory(lib)
|
|
199 add_subdirectory(tools/lld)
|
|
200
|
|
201 if (LLVM_INCLUDE_TESTS)
|
|
202 add_subdirectory(test)
|
|
203 add_subdirectory(unittests)
|
|
204 endif()
|
|
205
|
|
206 add_subdirectory(docs)
|
|
207 add_subdirectory(COFF)
|
|
208 add_subdirectory(ELF)
|
173
|
209 add_subdirectory(MachO)
|
150
|
210 add_subdirectory(MinGW)
|
|
211 add_subdirectory(wasm)
|
173
|
212
|
|
213 add_subdirectory(cmake/modules)
|