blob: 21a33c9425a0d3f66d1086a316e9da183dbb99c8 [file] [log] [blame]
John Ericsona1da5f32022-01-02 06:29:261cmake_minimum_required(VERSION 3.13.4)
2
Michał Górny9dd01a52022-10-24 04:31:373if(NOT DEFINED LLVM_COMMON_CMAKE_UTILS)
4 set(LLVM_COMMON_CMAKE_UTILS ${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
5endif()
6include(${LLVM_COMMON_CMAKE_UTILS}/Modules/CMakePolicy.cmake
7 NO_POLICY_SCOPE)
8
John Ericsona1da5f32022-01-02 06:29:269# If we are not building as a part of LLVM, build LLD as an
10# standalone project, using LLVM as an external library:
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4011if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)
12 project(lld)
John Ericsondf31ff12022-01-19 06:45:0713 set(LLD_BUILT_STANDALONE TRUE)
14endif()
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4015
John Ericsondf31ff12022-01-19 06:45:0716# Must go below project(..)
17include(GNUInstallDirs)
18
19if(LLD_BUILT_STANDALONE)
Tobias Hietab1356502022-08-05 19:45:5520 set(CMAKE_CXX_STANDARD 17 CACHE STRING "C++ standard to conform to")
Jez Ng606cb852022-02-22 23:14:4721 set(CMAKE_CXX_STANDARD_REQUIRED YES)
22 set(CMAKE_CXX_EXTENSIONS NO)
23
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4024 set(CMAKE_INCLUDE_CURRENT_DIR ON)
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4025
John Ericsona1da5f32022-01-02 06:29:2626 find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_DIR}")
John Ericsone0eeae92022-02-02 15:37:1327 list(APPEND CMAKE_MODULE_PATH "${LLVM_DIR}")
John Ericsona1da5f32022-01-02 06:29:2628
Tom Stellard91f3f0b2022-08-06 13:22:1929 # Turn into CACHE PATHs for overwritting
30 set(LLVM_INCLUDE_DIRS ${LLVM_INCLUDE_DIRS} CACHE PATH "Path to llvm/include and any other header dirs needed")
31 set(LLVM_BINARY_DIR "${LLVM_BINARY_DIR}" CACHE PATH "Path to LLVM build tree")
32 set(LLVM_MAIN_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../llvm" CACHE PATH "Path to LLVM source tree")
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4033
John Ericsona1da5f32022-01-02 06:29:2634 find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR}
35 NO_DEFAULT_PATH)
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4036
John Ericsona1da5f32022-01-02 06:29:2637 # They are used as destination of target generators.
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4038 set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin)
John Ericsone941b032022-08-19 02:44:4639 set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX})
Saleem Abdulrasoolf1af26d2016-12-12 05:47:4040
41 include(AddLLVM)
42 include(TableGen)
43 include(HandleLLVMOptions)
Markus Böckaf2796c2021-03-15 19:56:0844 include(GetErrcMessages)
Josh Stoneb26b32b2020-08-17 22:31:3245 include(CheckAtomic)
Michal Gornyda7ceb52017-01-31 14:10:2046
John Ericsona1da5f32022-01-02 06:29:2647 set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}")
48
John Ericsoncc56a502022-07-26 07:17:3049 include_directories(${LLVM_INCLUDE_DIRS})
John Ericsona1da5f32022-01-02 06:29:2650 link_directories(${LLVM_LIBRARY_DIRS})
51
Michal Gornyda7ceb52017-01-31 14:10:2052 if(LLVM_INCLUDE_TESTS)
Christopher Tetreault39970762021-03-15 16:33:3153 find_package(Python3 ${LLVM_MINIMUM_PYTHON_VERSION} REQUIRED
54 COMPONENTS Interpreter)
Michal Gornyda7ceb52017-01-31 14:10:2055
56 # Check prebuilt llvm/utils.
57 if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX}
58 AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX})
59 set(LLVM_UTILS_PROVIDED ON)
60 endif()
61
62 if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
63 # Note: path not really used, except for checking if lit was found
64 set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
65 if(NOT LLVM_UTILS_PROVIDED)
66 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck)
67 add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not)
68 set(LLVM_UTILS_PROVIDED ON)
69 set(LLD_TEST_DEPS FileCheck not)
70 endif()
71 set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest)
72 if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h
73 AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX}
74 AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt)
75 add_subdirectory(${UNITTEST_DIR} utils/unittest)
76 endif()
77 else()
78 # Seek installed Lit.
79 find_program(LLVM_LIT
80 NAMES llvm-lit lit.py lit
81 PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit"
82 DOC "Path to lit.py")
83 endif()
84
85 if(LLVM_LIT)
86 # Define the default arguments to use with 'lit', and an option for the user
87 # to override.
88 set(LIT_ARGS_DEFAULT "-sv")
89 if (MSVC OR XCODE)
90 set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar")
91 endif()
92 set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit")
93
Markus Böckaf2796c2021-03-15 19:56:0894 get_errc_messages(LLVM_LIT_ERRC_MESSAGES)
95
Michal Gornyda7ceb52017-01-31 14:10:2096 # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools.
97 if(WIN32 AND NOT CYGWIN)
98 set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools")
99 endif()
100 else()
101 set(LLVM_INCLUDE_TESTS OFF)
102 endif()
103 endif()
Mariusz Ceier9383e9c2021-05-19 15:07:39104
105 if(LLVM_HAVE_LIBXAR)
106 set(XAR_LIB xar)
107 endif()
John Ericsona1da5f32022-01-02 06:29:26108endif() # standalone
Saleem Abdulrasoolf1af26d2016-12-12 05:47:40109
John Ericson07b74982022-06-11 06:11:59110set(LLD_TOOLS_INSTALL_DIR "${CMAKE_INSTALL_BINDIR}" CACHE PATH
111 "Path for binary subdirectory (defaults to '${CMAKE_INSTALL_BINDIR}')")
112mark_as_advanced(LLD_TOOLS_INSTALL_DIR)
113
Michael J. Spencer773a8fb2011-12-18 08:27:59114set(LLD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})
Pete Cooper69b18f42016-01-07 00:14:09115set(LLD_INCLUDE_DIR ${LLD_SOURCE_DIR}/include )
Michael J. Spencer773a8fb2011-12-18 08:27:59116set(LLD_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
117
stevewan44f7b402020-05-11 22:33:55118set(LLD_VENDOR ${PACKAGE_VENDOR} CACHE STRING
119 "Vendor-specific text for showing with version information.")
120
121if(LLD_VENDOR)
122 add_definitions(-DLLD_VENDOR="${LLD_VENDOR}")
123endif()
124
Shankar Easwaranc3550f92014-10-08 03:47:51125# Compute the LLD version from the LLVM version.
126string(REGEX MATCH "[0-9]+\\.[0-9]+(\\.[0-9]+)?" LLD_VERSION
127 ${PACKAGE_VERSION})
128message(STATUS "LLD version: ${LLD_VERSION}")
129
130string(REGEX REPLACE "([0-9]+)\\.[0-9]+(\\.[0-9]+)?" "\\1" LLD_VERSION_MAJOR
131 ${LLD_VERSION})
132string(REGEX REPLACE "[0-9]+\\.([0-9]+)(\\.[0-9]+)?" "\\1" LLD_VERSION_MINOR
133 ${LLD_VERSION})
134
Nico Weber4f5c65a2020-01-16 15:12:06135# Configure the Version.inc file.
136configure_file(
137 ${CMAKE_CURRENT_SOURCE_DIR}/include/lld/Common/Version.inc.in
138 ${CMAKE_CURRENT_BINARY_DIR}/include/lld/Common/Version.inc)
139
140
Michael J. Spencer773a8fb2011-12-18 08:27:59141if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
142 message(FATAL_ERROR "In-source builds are not allowed. CMake would overwrite "
143"the makefiles distributed with LLVM. Please create a directory and run cmake "
144"from there, passing the path to this source directory as the last argument. "
145"This process created the file `CMakeCache.txt' and the directory "
146"`CMakeFiles'. Please delete them.")
147endif()
148
John Ericson89653702021-12-30 06:22:48149# Add path for custom modules.
150list(INSERT CMAKE_MODULE_PATH 0
151 "${LLD_SOURCE_DIR}/cmake/modules"
John Ericsonb3af9fb2022-01-01 17:51:16152 "${LLVM_COMMON_CMAKE_UTILS}/Modules"
John Ericson89653702021-12-30 06:22:48153 )
Michael J. Spencerd4eb47c2013-04-06 00:56:40154
Petr Hosekf367a2a2016-12-23 00:22:47155include(AddLLD)
156
Michael J. Spencerd4eb47c2013-04-06 00:56:40157option(LLD_USE_VTUNE
158 "Enable VTune user task tracking."
159 OFF)
160if (LLD_USE_VTUNE)
161 find_package(VTune)
162 if (VTUNE_FOUND)
163 include_directories(${VTune_INCLUDE_DIRS})
164 list(APPEND LLVM_COMMON_LIBS ${VTune_LIBRARIES})
165 add_definitions(-DLLD_HAS_VTUNE)
166 endif()
167endif()
168
Petr Hosekf367a2a2016-12-23 00:22:47169option(LLD_BUILD_TOOLS
170 "Build the lld tools. If OFF, just generate build targets." ON)
Nick Kledzik1a6615d2012-03-08 00:18:30171
Mateusz Mikuła61e0b2b2020-09-15 05:39:15172option(LLD_DEFAULT_LD_LLD_IS_MINGW
173 "Use MinGW as the default backend for ld.lld. If OFF, ELF will be used." OFF)
174if (LLD_DEFAULT_LD_LLD_IS_MINGW)
175 add_definitions("-DLLD_DEFAULT_LD_LLD_IS_MINGW=1")
176endif()
177
Zachary Turner392b7152014-12-02 17:57:54178if (MSVC)
179 add_definitions(-wd4530) # Suppress 'warning C4530: C++ exception handler used, but unwind semantics are not enabled.'
Michael J. Spencerb6396ea2015-02-25 01:30:13180 add_definitions(-wd4062) # Suppress 'warning C4062: enumerator X in switch of enum Y is not handled' from system header.
Zachary Turner392b7152014-12-02 17:57:54181endif()
182
Michael J. Spencer773a8fb2011-12-18 08:27:59183include_directories(BEFORE
184 ${CMAKE_CURRENT_BINARY_DIR}/include
185 ${CMAKE_CURRENT_SOURCE_DIR}/include
186 )
187
Hans Wennborg2391fdd2013-08-24 00:24:15188if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
189 install(DIRECTORY include/
John Ericson89653702021-12-30 06:22:48190 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
Hans Wennborg2391fdd2013-08-24 00:24:15191 FILES_MATCHING
192 PATTERN "*.h"
Hans Wennborg2391fdd2013-08-24 00:24:15193 )
194endif()
Michael J. Spencer773a8fb2011-12-18 08:27:59195
Rui Ueyama3f851702017-10-02 21:00:41196add_subdirectory(Common)
Rui Ueyama3178b802016-03-03 01:56:23197add_subdirectory(tools/lld)
Michael J. Spencer773a8fb2011-12-18 08:27:59198
Greg Fitzgeraldcedca2f2015-01-12 21:41:10199if (LLVM_INCLUDE_TESTS)
Chris Bieneman03c48b02015-10-01 18:17:47200 add_subdirectory(test)
Michael J. Spencer800de032012-12-19 00:51:07201endif()
Reid Klecknerf00daf12014-04-18 21:59:05202
203add_subdirectory(docs)
Rui Ueyama411c63602015-05-28 19:09:30204add_subdirectory(COFF)
Michael J. Spencer84487f12015-07-24 21:03:07205add_subdirectory(ELF)
Fangrui Song6acd3002020-04-02 18:54:05206add_subdirectory(MachO)
Martell Malone894dbbe2017-09-11 17:02:59207add_subdirectory(MinGW)
Sam Cleggc94d3932017-11-17 18:14:09208add_subdirectory(wasm)
Matt Arsenault2b2a9612020-05-02 22:32:40209
210add_subdirectory(cmake/modules)