1 | cmake_minimum_required(VERSION 3.4.3) |
2 | |
3 | if(POLICY CMP0075) |
4 | cmake_policy(SET CMP0075 NEW) |
5 | endif() |
6 | |
7 | # If we are not building as a part of LLVM, build Clang as an |
8 | # standalone project, using LLVM as an external library: |
9 | if( CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR ) |
10 | project(Clang) |
11 | |
12 | # Rely on llvm-config. |
13 | set(CONFIG_OUTPUT) |
14 | if(LLVM_CONFIG) |
15 | set (LLVM_CONFIG_FOUND 1) |
16 | message(STATUS "Found LLVM_CONFIG as ${LLVM_CONFIG}") |
17 | message(DEPRECATION "Using llvm-config to detect the LLVM installation is \ |
18 | deprecated. The installed cmake files should be used \ |
19 | instead. CMake should be able to detect your LLVM install \ |
20 | automatically, but you can also use LLVM_DIR to specify \ |
21 | the path containing LLVMConfig.cmake.") |
22 | set(CONFIG_COMMAND ${LLVM_CONFIG} |
23 | "--assertion-mode" |
24 | "--bindir" |
25 | "--libdir" |
26 | "--includedir" |
27 | "--prefix" |
28 | "--src-root" |
29 | "--cmakedir") |
30 | execute_process( |
31 | COMMAND ${CONFIG_COMMAND} |
32 | RESULT_VARIABLE HAD_ERROR |
33 | OUTPUT_VARIABLE CONFIG_OUTPUT |
34 | ) |
35 | if(NOT HAD_ERROR) |
36 | string(REGEX REPLACE |
37 | "[ \t]*[\r\n]+[ \t]*" ";" |
38 | CONFIG_OUTPUT ${CONFIG_OUTPUT}) |
39 | else() |
40 | string(REPLACE ";" " " CONFIG_COMMAND_STR "${CONFIG_COMMAND}") |
41 | message(STATUS "${CONFIG_COMMAND_STR}") |
42 | message(FATAL_ERROR "llvm-config failed with status ${HAD_ERROR}") |
43 | endif() |
44 | |
45 | list(GET CONFIG_OUTPUT 0 ENABLE_ASSERTIONS) |
46 | list(GET CONFIG_OUTPUT 1 TOOLS_BINARY_DIR) |
47 | list(GET CONFIG_OUTPUT 2 LIBRARY_DIR) |
48 | list(GET CONFIG_OUTPUT 3 INCLUDE_DIR) |
49 | list(GET CONFIG_OUTPUT 4 LLVM_OBJ_ROOT) |
50 | list(GET CONFIG_OUTPUT 5 MAIN_SRC_DIR) |
51 | list(GET CONFIG_OUTPUT 6 LLVM_CONFIG_CMAKE_PATH) |
52 | |
53 | # Normalize LLVM_CMAKE_PATH. --cmakedir might contain backslashes. |
54 | # CMake assumes slashes as PATH. |
55 | file(TO_CMAKE_PATH ${LLVM_CONFIG_CMAKE_PATH} LLVM_CMAKE_PATH) |
56 | endif() |
57 | |
58 | |
59 | if(NOT MSVC_IDE) |
60 | set(LLVM_ENABLE_ASSERTIONS ${ENABLE_ASSERTIONS} |
61 | CACHE BOOL "Enable assertions") |
62 | # Assertions should follow llvm-config's. |
63 | mark_as_advanced(LLVM_ENABLE_ASSERTIONS) |
64 | endif() |
65 | |
66 | find_package(LLVM REQUIRED HINTS "${LLVM_CMAKE_PATH}") |
67 | list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR}) |
68 | |
69 | # We can't check LLVM_CONFIG here, because find_package(LLVM ...) also sets |
70 | # LLVM_CONFIG. |
71 | if (NOT LLVM_CONFIG_FOUND) |
72 | # Pull values from LLVMConfig.cmake. We can drop this once the llvm-config |
73 | # path is removed. |
74 | set(TOOLS_BINARY_DIR ${LLVM_TOOLS_BINARY_DIR}) |
75 | set(LIBRARY_DIR ${LLVM_LIBRARY_DIR}) |
76 | set(INCLUDE_DIR ${LLVM_INCLUDE_DIR}) |
77 | set(LLVM_OBJ_DIR ${LLVM_BINARY_DIR}) |
78 | # The LLVM_CMAKE_PATH variable is set when doing non-standalone builds and |
79 | # used in this project, so we need to make sure we set this value. |
80 | # FIXME: LLVM_CMAKE_DIR comes from LLVMConfig.cmake. We should rename |
81 | # LLVM_CMAKE_PATH to LLVM_CMAKE_DIR throughout the project. |
82 | set(LLVM_CMAKE_PATH ${LLVM_CMAKE_DIR}) |
83 | endif() |
84 | |
85 | set(LLVM_TOOLS_BINARY_DIR ${TOOLS_BINARY_DIR} CACHE PATH "Path to llvm/bin") |
86 | set(LLVM_LIBRARY_DIR ${LIBRARY_DIR} CACHE PATH "Path to llvm/lib") |
87 | set(LLVM_MAIN_INCLUDE_DIR ${INCLUDE_DIR} CACHE PATH "Path to llvm/include") |
88 | set(LLVM_BINARY_DIR ${LLVM_OBJ_ROOT} CACHE PATH "Path to LLVM build tree") |
89 | set(LLVM_MAIN_SRC_DIR ${MAIN_SRC_DIR} CACHE PATH "Path to LLVM source tree") |
90 | |
91 | find_program(LLVM_TABLEGEN_EXE "llvm-tblgen" ${LLVM_TOOLS_BINARY_DIR} |
92 | NO_DEFAULT_PATH) |
93 | |
94 | # They are used as destination of target generators. |
95 | set(LLVM_RUNTIME_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/bin) |
96 | set(LLVM_LIBRARY_OUTPUT_INTDIR ${CMAKE_BINARY_DIR}/${CMAKE_CFG_INTDIR}/lib${LLVM_LIBDIR_SUFFIX}) |
97 | if(WIN32 OR CYGWIN) |
98 | # DLL platform -- put DLLs into bin. |
99 | set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) |
100 | else() |
101 | set(LLVM_SHLIB_OUTPUT_INTDIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) |
102 | endif() |
103 | |
104 | option(LLVM_ENABLE_WARNINGS "Enable compiler warnings." ON) |
105 | option(LLVM_INSTALL_TOOLCHAIN_ONLY |
106 | "Only include toolchain files in the 'install' target." OFF) |
107 | |
108 | option(LLVM_FORCE_USE_OLD_HOST_TOOLCHAIN |
109 | "Set to ON to force using an old, unsupported host toolchain." OFF) |
110 | option(CLANG_ENABLE_BOOTSTRAP "Generate the clang bootstrap target" OFF) |
111 | option(LLVM_ENABLE_LIBXML2 "Use libxml2 if available." ON) |
112 | |
113 | include(AddLLVM) |
114 | include(TableGen) |
115 | include(HandleLLVMOptions) |
116 | include(VersionFromVCS) |
117 | |
118 | set(PACKAGE_VERSION "${LLVM_PACKAGE_VERSION}") |
119 | |
120 | if (NOT DEFINED LLVM_INCLUDE_TESTS) |
121 | set(LLVM_INCLUDE_TESTS ON) |
122 | endif() |
123 | |
124 | include_directories("${LLVM_BINARY_DIR}/include" "${LLVM_MAIN_INCLUDE_DIR}") |
125 | link_directories("${LLVM_LIBRARY_DIR}") |
126 | |
127 | set( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin ) |
128 | set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) |
129 | set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib${LLVM_LIBDIR_SUFFIX} ) |
130 | |
131 | if(LLVM_INCLUDE_TESTS) |
132 | set(Python_ADDITIONAL_VERSIONS 2.7) |
133 | include(FindPythonInterp) |
134 | if(NOT PYTHONINTERP_FOUND) |
135 | message(FATAL_ERROR |
136 | "Unable to find Python interpreter, required for builds and testing. |
137 | |
138 | Please install Python or specify the PYTHON_EXECUTABLE CMake variable.") |
139 | endif() |
140 | |
141 | if( ${PYTHON_VERSION_STRING} VERSION_LESS 2.7 ) |
142 | message(FATAL_ERROR "Python 2.7 or newer is required") |
143 | endif() |
144 | |
145 | # Check prebuilt llvm/utils. |
146 | if(EXISTS ${LLVM_TOOLS_BINARY_DIR}/FileCheck${CMAKE_EXECUTABLE_SUFFIX} |
147 | AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/count${CMAKE_EXECUTABLE_SUFFIX} |
148 | AND EXISTS ${LLVM_TOOLS_BINARY_DIR}/not${CMAKE_EXECUTABLE_SUFFIX}) |
149 | set(LLVM_UTILS_PROVIDED ON) |
150 | endif() |
151 | |
152 | if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) |
153 | # Note: path not really used, except for checking if lit was found |
154 | set(LLVM_LIT ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py) |
155 | if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/llvm-lit) |
156 | add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/llvm-lit utils/llvm-lit) |
157 | endif() |
158 | if(NOT LLVM_UTILS_PROVIDED) |
159 | add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/FileCheck utils/FileCheck) |
160 | add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/count utils/count) |
161 | add_subdirectory(${LLVM_MAIN_SRC_DIR}/utils/not utils/not) |
162 | set(LLVM_UTILS_PROVIDED ON) |
163 | set(CLANG_TEST_DEPS FileCheck count not) |
164 | endif() |
165 | set(UNITTEST_DIR ${LLVM_MAIN_SRC_DIR}/utils/unittest) |
166 | if(EXISTS ${UNITTEST_DIR}/googletest/include/gtest/gtest.h |
167 | AND NOT EXISTS ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}gtest${CMAKE_STATIC_LIBRARY_SUFFIX} |
168 | AND EXISTS ${UNITTEST_DIR}/CMakeLists.txt) |
169 | add_subdirectory(${UNITTEST_DIR} utils/unittest) |
170 | endif() |
171 | else() |
172 | # Seek installed Lit. |
173 | find_program(LLVM_LIT |
174 | NAMES llvm-lit lit.py lit |
175 | PATHS "${LLVM_MAIN_SRC_DIR}/utils/lit" |
176 | DOC "Path to lit.py") |
177 | endif() |
178 | |
179 | if(LLVM_LIT) |
180 | # Define the default arguments to use with 'lit', and an option for the user |
181 | # to override. |
182 | set(LIT_ARGS_DEFAULT "-sv") |
183 | if (MSVC OR XCODE) |
184 | set(LIT_ARGS_DEFAULT "${LIT_ARGS_DEFAULT} --no-progress-bar") |
185 | endif() |
186 | set(LLVM_LIT_ARGS "${LIT_ARGS_DEFAULT}" CACHE STRING "Default options for lit") |
187 | |
188 | # On Win32 hosts, provide an option to specify the path to the GnuWin32 tools. |
189 | if( WIN32 AND NOT CYGWIN ) |
190 | set(LLVM_LIT_TOOLS_DIR "" CACHE PATH "Path to GnuWin32 tools") |
191 | endif() |
192 | else() |
193 | set(LLVM_INCLUDE_TESTS OFF) |
194 | endif() |
195 | endif() |
196 | |
197 | set( CLANG_BUILT_STANDALONE 1 ) |
198 | set(BACKEND_PACKAGE_STRING "LLVM ${LLVM_PACKAGE_VERSION}") |
199 | else() |
200 | set(BACKEND_PACKAGE_STRING "${PACKAGE_STRING}") |
201 | endif() |
202 | |
203 | # Make sure that our source directory is on the current cmake module path so that |
204 | # we can include cmake files from this directory. |
205 | list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules") |
206 | |
207 | if(LLVM_ENABLE_LIBXML2) |
208 | # Don't look for libxml if we're using MSan, since uninstrumented third party |
209 | # code may call MSan interceptors like strlen, leading to false positives. |
210 | if(NOT LLVM_USE_SANITIZER MATCHES "Memory.*") |
211 | set (LIBXML2_FOUND 0) |
212 | find_package(LibXml2 2.5.3 QUIET) |
213 | if (LIBXML2_FOUND) |
214 | set(CLANG_HAVE_LIBXML 1) |
215 | endif() |
216 | endif() |
217 | endif() |
218 | |
219 | include(CheckIncludeFile) |
220 | check_include_file(sys/resource.h CLANG_HAVE_RLIMITS) |
221 | |
222 | set(CLANG_RESOURCE_DIR "" CACHE STRING |
223 | "Relative directory from the Clang binary to its resource files.") |
224 | |
225 | set(C_INCLUDE_DIRS "" CACHE STRING |
226 | "Colon separated list of directories clang will search for headers.") |
227 | |
228 | set(GCC_INSTALL_PREFIX "" CACHE PATH "Directory where gcc is installed." ) |
229 | set(DEFAULT_SYSROOT "" CACHE PATH |
230 | "Default <path> to all compiler invocations for --sysroot=<path>." ) |
231 | |
232 | set(ENABLE_LINKER_BUILD_ID OFF CACHE BOOL "pass --build-id to ld") |
233 | |
234 | set(ENABLE_X86_RELAX_RELOCATIONS OFF CACHE BOOL |
235 | "enable x86 relax relocations by default") |
236 | |
237 | set(ENABLE_EXPERIMENTAL_NEW_PASS_MANAGER FALSE CACHE BOOL |
238 | "Enable the experimental new pass manager by default.") |
239 | |
240 | # TODO: verify the values against LangStandards.def? |
241 | set(CLANG_DEFAULT_STD_C "" CACHE STRING |
242 | "Default standard to use for C/ObjC code (IDENT from LangStandards.def, empty for platform default)") |
243 | set(CLANG_DEFAULT_STD_CXX "" CACHE STRING |
244 | "Default standard to use for C++/ObjC++ code (IDENT from LangStandards.def, empty for platform default)") |
245 | |
246 | set(CLANG_DEFAULT_LINKER "" CACHE STRING |
247 | "Default linker to use (linker name or absolute path, empty for platform default)") |
248 | |
249 | set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING |
250 | "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default") |
251 | if (NOT(CLANG_DEFAULT_CXX_STDLIB STREQUAL "" OR |
252 | CLANG_DEFAULT_CXX_STDLIB STREQUAL "libstdc++" OR |
253 | CLANG_DEFAULT_CXX_STDLIB STREQUAL "libc++")) |
254 | message(WARNING "Resetting default C++ stdlib to use platform default") |
255 | set(CLANG_DEFAULT_CXX_STDLIB "" CACHE STRING |
256 | "Default C++ stdlib to use (\"libstdc++\" or \"libc++\", empty for platform default" FORCE) |
257 | endif() |
258 | |
259 | set(CLANG_DEFAULT_RTLIB "" CACHE STRING |
260 | "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)") |
261 | if (NOT(CLANG_DEFAULT_RTLIB STREQUAL "" OR |
262 | CLANG_DEFAULT_RTLIB STREQUAL "libgcc" OR |
263 | CLANG_DEFAULT_RTLIB STREQUAL "compiler-rt")) |
264 | message(WARNING "Resetting default rtlib to use platform default") |
265 | set(CLANG_DEFAULT_RTLIB "" CACHE STRING |
266 | "Default runtime library to use (\"libgcc\" or \"compiler-rt\", empty for platform default)" FORCE) |
267 | endif() |
268 | |
269 | set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING |
270 | "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty to match runtime library.)") |
271 | if (CLANG_DEFAULT_UNWINDLIB STREQUAL "") |
272 | if (CLANG_DEFAULT_RTLIB STREQUAL "libgcc") |
273 | set (CLANG_DEFAULT_UNWINDLIB "libgcc" CACHE STRING "" FORCE) |
274 | elseif (CLANG_DEFAULT_RTLIBS STREQUAL "libunwind") |
275 | set (CLANG_DEFAULT_UNWINDLIB "none" CACHE STRING "" FORCE) |
276 | endif() |
277 | endif() |
278 | |
279 | if (NOT(CLANG_DEFAULT_UNWINDLIB STREQUAL "" OR |
280 | CLANG_DEFAULT_UNWINDLIB STREQUAL "none" OR |
281 | CLANG_DEFAULT_UNWINDLIB STREQUAL "libgcc" OR |
282 | CLANG_DEFAULT_UNWINDLIB STREQUAL "libunwind")) |
283 | message(WARNING "Resetting default unwindlib to use platform default") |
284 | set(CLANG_DEFAULT_UNWINDLIB "" CACHE STRING |
285 | "Default unwind library to use (\"none\" \"libgcc\" or \"libunwind\", empty for none)" FORCE) |
286 | endif() |
287 | |
288 | set(CLANG_DEFAULT_OBJCOPY "objcopy" CACHE STRING |
289 | "Default objcopy executable to use.") |
290 | |
291 | set(CLANG_DEFAULT_OPENMP_RUNTIME "libomp" CACHE STRING |
292 | "Default OpenMP runtime used by -fopenmp.") |
293 | |
294 | # OpenMP offloading requires at least sm_35 because we use shuffle instructions |
295 | # to generate efficient code for reductions and the atomicMax instruction on |
296 | # 64-bit integers in the implementation of conditional lastprivate. |
297 | set(CLANG_OPENMP_NVPTX_DEFAULT_ARCH "sm_35" CACHE STRING |
298 | "Default architecture for OpenMP offloading to Nvidia GPUs.") |
299 | string(REGEX MATCH "^sm_([0-9]+)$" MATCHED_ARCH "${CLANG_OPENMP_NVPTX_DEFAULT_ARCH}") |
300 | if (NOT DEFINED MATCHED_ARCH OR "${CMAKE_MATCH_1}" LESS 35) |
301 | message(WARNING "Resetting default architecture for OpenMP offloading to Nvidia GPUs to sm_35") |
302 | set(CLANG_OPENMP_NVPTX_DEFAULT_ARCH "sm_35" CACHE STRING |
303 | "Default architecture for OpenMP offloading to Nvidia GPUs." FORCE) |
304 | endif() |
305 | |
306 | set(CLANG_VENDOR ${PACKAGE_VENDOR} CACHE STRING |
307 | "Vendor-specific text for showing with version information.") |
308 | |
309 | if( CLANG_VENDOR ) |
310 | add_definitions( -DCLANG_VENDOR="${CLANG_VENDOR} " ) |
311 | endif() |
312 | |
313 | set(CLANG_REPOSITORY_STRING "" CACHE STRING |
314 | "Vendor-specific text for showing the repository the source is taken from.") |
315 | |
316 | if(CLANG_REPOSITORY_STRING) |
317 | add_definitions(-DCLANG_REPOSITORY_STRING="${CLANG_REPOSITORY_STRING}") |
318 | endif() |
319 | |
320 | set(CLANG_VENDOR_UTI "org.llvm.clang" CACHE STRING |
321 | "Vendor-specific uti.") |
322 | |
323 | set(CLANG_PYTHON_BINDINGS_VERSIONS "" CACHE STRING |
324 | "Python versions to install libclang python bindings for") |
325 | |
326 | # The libdir suffix must exactly match whatever LLVM's configuration used. |
327 | set(CLANG_LIBDIR_SUFFIX "${LLVM_LIBDIR_SUFFIX}") |
328 | |
329 | set(CLANG_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) |
330 | set(CLANG_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) |
331 | |
332 | if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE ) |
333 | message(FATAL_ERROR "In-source builds are not allowed. " |
334 | "Please create a directory and run cmake " |
335 | "from there, passing the path to this source directory as the last argument. " |
336 | "This process created the file `CMakeCache.txt' and the directory " |
337 | "`CMakeFiles'. Please delete them.") |
338 | endif() |
339 | |
340 | # If CLANG_VERSION_* is specified, use it, if not use LLVM_VERSION_*. |
341 | if(NOT DEFINED CLANG_VERSION_MAJOR) |
342 | set(CLANG_VERSION_MAJOR ${LLVM_VERSION_MAJOR}) |
343 | endif() |
344 | if(NOT DEFINED CLANG_VERSION_MINOR) |
345 | set(CLANG_VERSION_MINOR ${LLVM_VERSION_MINOR}) |
346 | endif() |
347 | if(NOT DEFINED CLANG_VERSION_PATCHLEVEL) |
348 | set(CLANG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH}) |
349 | endif() |
350 | # Unlike PACKAGE_VERSION, CLANG_VERSION does not include LLVM_VERSION_SUFFIX. |
351 | set(CLANG_VERSION "${CLANG_VERSION_MAJOR}.${CLANG_VERSION_MINOR}.${CLANG_VERSION_PATCHLEVEL}") |
352 | message(STATUS "Clang version: ${CLANG_VERSION}") |
353 | |
354 | # Configure the Version.inc file. |
355 | configure_file( |
356 | ${CMAKE_CURRENT_SOURCE_DIR}/include/clang/Basic/Version.inc.in |
357 | ${CMAKE_CURRENT_BINARY_DIR}/include/clang/Basic/Version.inc) |
358 | |
359 | # Add appropriate flags for GCC |
360 | if (LLVM_COMPILER_IS_GCC_COMPATIBLE) |
361 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-common -Woverloaded-virtual") |
362 | if (NOT "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") |
363 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-strict-aliasing") |
364 | endif () |
365 | |
366 | # Enable -pedantic for Clang even if it's not enabled for LLVM. |
367 | if (NOT LLVM_ENABLE_PEDANTIC) |
368 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pedantic -Wno-long-long") |
369 | endif () |
370 | |
371 | check_cxx_compiler_flag("-Werror -Wnested-anon-types" CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG) |
372 | if( CXX_SUPPORTS_NO_NESTED_ANON_TYPES_FLAG ) |
373 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nested-anon-types" ) |
374 | endif() |
375 | endif () |
376 | |
377 | # Determine HOST_LINK_VERSION on Darwin. |
378 | set(HOST_LINK_VERSION) |
379 | if (APPLE) |
380 | set(LD_V_OUTPUT) |
381 | execute_process( |
382 | COMMAND sh -c "${CMAKE_LINKER} -v 2>&1 | head -1" |
383 | RESULT_VARIABLE HAD_ERROR |
384 | OUTPUT_VARIABLE LD_V_OUTPUT |
385 | ) |
386 | if (NOT HAD_ERROR) |
387 | if ("${LD_V_OUTPUT}" MATCHES ".*ld64-([0-9.]+).*") |
388 | string(REGEX REPLACE ".*ld64-([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT}) |
389 | elseif ("${LD_V_OUTPUT}" MATCHES "[^0-9]*([0-9.]+).*") |
390 | string(REGEX REPLACE "[^0-9]*([0-9.]+).*" "\\1" HOST_LINK_VERSION ${LD_V_OUTPUT}) |
391 | endif() |
392 | else() |
393 | message(FATAL_ERROR "${CMAKE_LINKER} failed with status ${HAD_ERROR}") |
394 | endif() |
395 | endif() |
396 | |
397 | include(CMakeParseArguments) |
398 | include(AddClang) |
399 | |
400 | set(CMAKE_INCLUDE_CURRENT_DIR ON) |
401 | |
402 | include_directories(BEFORE |
403 | ${CMAKE_CURRENT_BINARY_DIR}/include |
404 | ${CMAKE_CURRENT_SOURCE_DIR}/include |
405 | ) |
406 | |
407 | if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
408 | install(DIRECTORY include/clang include/clang-c |
409 | DESTINATION include |
410 | COMPONENT clang-headers |
411 | FILES_MATCHING |
412 | PATTERN "*.def" |
413 | PATTERN "*.h" |
414 | PATTERN "config.h" EXCLUDE |
415 | PATTERN ".svn" EXCLUDE |
416 | ) |
417 | |
418 | install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/include/clang |
419 | DESTINATION include |
420 | COMPONENT clang-headers |
421 | FILES_MATCHING |
422 | PATTERN "CMakeFiles" EXCLUDE |
423 | PATTERN "*.inc" |
424 | PATTERN "*.h" |
425 | ) |
426 | |
427 | # Installing the headers needs to depend on generating any public |
428 | # tablegen'd headers. |
429 | add_custom_target(clang-headers DEPENDS clang-tablegen-targets) |
430 | set_target_properties(clang-headers PROPERTIES FOLDER "Misc") |
431 | if(NOT LLVM_ENABLE_IDE) |
432 | add_llvm_install_targets(install-clang-headers |
433 | DEPENDS clang-headers |
434 | COMPONENT clang-headers) |
435 | endif() |
436 | |
437 | install(PROGRAMS utils/bash-autocomplete.sh |
438 | DESTINATION share/clang |
439 | ) |
440 | endif() |
441 | |
442 | add_definitions( -D_GNU_SOURCE ) |
443 | |
444 | option(CLANG_BUILD_TOOLS |
445 | "Build the Clang tools. If OFF, just generate build targets." ON) |
446 | |
447 | option(CLANG_ENABLE_ARCMT "Build ARCMT." ON) |
448 | option(CLANG_ENABLE_STATIC_ANALYZER "Build static analyzer." ON) |
449 | |
450 | option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF) |
451 | |
452 | if(NOT CLANG_ENABLE_STATIC_ANALYZER AND CLANG_ENABLE_ARCMT) |
453 | message(FATAL_ERROR "Cannot disable static analyzer while enabling ARCMT or Z3") |
454 | endif() |
455 | |
456 | if(CLANG_ENABLE_ARCMT) |
457 | set(CLANG_ENABLE_OBJC_REWRITER ON) |
458 | endif() |
459 | |
460 | # Clang version information |
461 | set(CLANG_EXECUTABLE_VERSION |
462 | "${CLANG_VERSION_MAJOR}" CACHE STRING |
463 | "Major version number that will be appended to the clang executable name") |
464 | set(LIBCLANG_LIBRARY_VERSION |
465 | "${CLANG_VERSION_MAJOR}" CACHE STRING |
466 | "Major version number that will be appended to the libclang library") |
467 | mark_as_advanced(CLANG_EXECUTABLE_VERSION LIBCLANG_LIBRARY_VERSION) |
468 | |
469 | option(CLANG_INCLUDE_TESTS |
470 | "Generate build targets for the Clang unit tests." |
471 | ${LLVM_INCLUDE_TESTS}) |
472 | |
473 | add_subdirectory(utils/TableGen) |
474 | |
475 | add_subdirectory(include) |
476 | |
477 | # All targets below may depend on all tablegen'd files. |
478 | get_property(CLANG_TABLEGEN_TARGETS GLOBAL PROPERTY CLANG_TABLEGEN_TARGETS) |
479 | add_custom_target(clang-tablegen-targets DEPENDS ${CLANG_TABLEGEN_TARGETS}) |
480 | set_target_properties(clang-tablegen-targets PROPERTIES FOLDER "Misc") |
481 | list(APPEND LLVM_COMMON_DEPENDS clang-tablegen-targets) |
482 | |
483 | # Force target to be built as soon as possible. Clang modules builds depend |
484 | # header-wise on it as they ship all headers from the umbrella folders. Building |
485 | # an entire module might include header, which depends on intrinsics_gen. |
486 | if(LLVM_ENABLE_MODULES AND NOT CLANG_BUILT_STANDALONE) |
487 | list(APPEND LLVM_COMMON_DEPENDS intrinsics_gen) |
488 | endif() |
489 | |
490 | add_subdirectory(lib) |
491 | add_subdirectory(tools) |
492 | add_subdirectory(runtime) |
493 | |
494 | option(CLANG_BUILD_EXAMPLES "Build CLANG example programs by default." OFF) |
495 | add_subdirectory(examples) |
496 | |
497 | if(APPLE) |
498 | # this line is needed as a cleanup to ensure that any CMakeCaches with the old |
499 | # default value get updated to the new default. |
500 | if(CLANG_ORDER_FILE STREQUAL "") |
501 | unset(CLANG_ORDER_FILE CACHE) |
502 | unset(CLANG_ORDER_FILE) |
503 | endif() |
504 | |
505 | |
506 | set(CLANG_ORDER_FILE ${CMAKE_CURRENT_BINARY_DIR}/clang.order CACHE FILEPATH |
507 | "Order file to use when compiling clang in order to improve startup time (Darwin Only - requires ld64).") |
508 | |
509 | if(NOT EXISTS ${CLANG_ORDER_FILE}) |
510 | string(FIND "${CLANG_ORDER_FILE}" "${CMAKE_CURRENT_BINARY_DIR}" PATH_START) |
511 | if(PATH_START EQUAL 0) |
512 | file(WRITE ${CLANG_ORDER_FILE} "\n") |
513 | else() |
514 | message(FATAL_ERROR "Specified order file '${CLANG_ORDER_FILE}' does not exist.") |
515 | endif() |
516 | endif() |
517 | endif() |
518 | |
519 | |
520 | if( CLANG_INCLUDE_TESTS ) |
521 | if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include/gtest/gtest.h) |
522 | add_subdirectory(unittests) |
523 | list(APPEND CLANG_TEST_DEPS ClangUnitTests) |
524 | list(APPEND CLANG_TEST_PARAMS |
525 | clang_unit_site_config=${CMAKE_CURRENT_BINARY_DIR}/test/Unit/lit.site.cfg |
526 | ) |
527 | endif() |
528 | add_subdirectory(test) |
529 | add_subdirectory(bindings/python/tests) |
530 | |
531 | if(CLANG_BUILT_STANDALONE) |
532 | # Add a global check rule now that all subdirectories have been traversed |
533 | # and we know the total set of lit testsuites. |
534 | get_property(LLVM_LIT_TESTSUITES GLOBAL PROPERTY LLVM_LIT_TESTSUITES) |
535 | get_property(LLVM_LIT_PARAMS GLOBAL PROPERTY LLVM_LIT_PARAMS) |
536 | get_property(LLVM_LIT_DEPENDS GLOBAL PROPERTY LLVM_LIT_DEPENDS) |
537 | get_property(LLVM_LIT_EXTRA_ARGS GLOBAL PROPERTY LLVM_LIT_EXTRA_ARGS) |
538 | get_property(LLVM_ADDITIONAL_TEST_TARGETS |
539 | GLOBAL PROPERTY LLVM_ADDITIONAL_TEST_TARGETS) |
540 | add_lit_target(check-all |
541 | "Running all regression tests" |
542 | ${LLVM_LIT_TESTSUITES} |
543 | PARAMS ${LLVM_LIT_PARAMS} |
544 | DEPENDS ${LLVM_LIT_DEPENDS} ${LLVM_ADDITIONAL_TEST_TARGETS} |
545 | ARGS ${LLVM_LIT_EXTRA_ARGS} |
546 | ) |
547 | endif() |
548 | add_subdirectory(utils/perf-training) |
549 | endif() |
550 | |
551 | option(CLANG_INCLUDE_DOCS "Generate build targets for the Clang docs." |
552 | ${LLVM_INCLUDE_DOCS}) |
553 | if( CLANG_INCLUDE_DOCS ) |
554 | add_subdirectory(docs) |
555 | endif() |
556 | |
557 | # Custom target to install all clang libraries. |
558 | add_custom_target(clang-libraries) |
559 | set_target_properties(clang-libraries PROPERTIES FOLDER "Misc") |
560 | |
561 | if(NOT LLVM_ENABLE_IDE) |
562 | add_llvm_install_targets(install-clang-libraries |
563 | DEPENDS clang-libraries |
564 | COMPONENT clang-libraries) |
565 | endif() |
566 | |
567 | get_property(CLANG_LIBS GLOBAL PROPERTY CLANG_LIBS) |
568 | if(CLANG_LIBS) |
569 | list(REMOVE_DUPLICATES CLANG_LIBS) |
570 | foreach(lib ${CLANG_LIBS}) |
571 | add_dependencies(clang-libraries ${lib}) |
572 | if(NOT LLVM_ENABLE_IDE) |
573 | add_dependencies(install-clang-libraries install-${lib}) |
574 | endif() |
575 | endforeach() |
576 | endif() |
577 | |
578 | add_subdirectory(cmake/modules) |
579 | |
580 | if(CLANG_STAGE) |
581 | message(STATUS "Setting current clang stage to: ${CLANG_STAGE}") |
582 | endif() |
583 | |
584 | if (CLANG_ENABLE_BOOTSTRAP) |
585 | include(ExternalProject) |
586 | |
587 | add_custom_target(clang-bootstrap-deps DEPENDS clang) |
588 | |
589 | if(NOT CLANG_STAGE) |
590 | set(CLANG_STAGE stage1) |
591 | endif() |
592 | |
593 | string(REGEX MATCH "stage([0-9]*)" MATCHED_STAGE "${CLANG_STAGE}") |
594 | if(MATCHED_STAGE) |
595 | if(NOT LLVM_BUILD_INSTRUMENTED) |
596 | math(EXPR STAGE_NUM "${CMAKE_MATCH_1} + 1") |
597 | set(NEXT_CLANG_STAGE stage${STAGE_NUM}) |
598 | else() |
599 | set(NEXT_CLANG_STAGE stage${CMAKE_MATCH_1}) |
600 | endif() |
601 | else() |
602 | set(NEXT_CLANG_STAGE bootstrap) |
603 | endif() |
604 | |
605 | if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) |
606 | set(NEXT_CLANG_STAGE ${NEXT_CLANG_STAGE}-instrumented) |
607 | endif() |
608 | message(STATUS "Setting next clang stage to: ${NEXT_CLANG_STAGE}") |
609 | |
610 | |
611 | set(STAMP_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-stamps/) |
612 | set(BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-bins/) |
613 | |
614 | if(BOOTSTRAP_LLVM_ENABLE_LLD) |
615 | add_dependencies(clang-bootstrap-deps lld) |
616 | endif() |
617 | |
618 | # If the next stage is LTO we need to depend on LTO and possibly lld or LLVMgold |
619 | if(BOOTSTRAP_LLVM_ENABLE_LTO OR LLVM_ENABLE_LTO AND NOT LLVM_BUILD_INSTRUMENTED) |
620 | if(APPLE) |
621 | add_dependencies(clang-bootstrap-deps LTO) |
622 | # on Darwin we need to set DARWIN_LTO_LIBRARY so that -flto will work |
623 | # using the just-built compiler, and we need to override DYLD_LIBRARY_PATH |
624 | # so that the host object file tools will use the just-built libLTO. |
625 | # However if System Integrity Protection is enabled the DYLD variables |
626 | # will be scrubbed from the environment of any base system commands. This |
627 | # includes /bin/sh, which ninja uses when executing build commands. To |
628 | # work around the envar being filtered away we pass it in as a CMake |
629 | # variable, and have LLVM's CMake append the envar to the archiver calls. |
630 | set(LTO_LIBRARY -DDARWIN_LTO_LIBRARY=${LLVM_SHLIB_OUTPUT_INTDIR}/libLTO.dylib |
631 | -DDYLD_LIBRARY_PATH=${LLVM_LIBRARY_OUTPUT_INTDIR}) |
632 | elseif(NOT WIN32) |
633 | add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib) |
634 | if(NOT BOOTSTRAP_LLVM_ENABLE_LLD AND LLVM_BINUTILS_INCDIR) |
635 | add_dependencies(clang-bootstrap-deps LLVMgold) |
636 | endif() |
637 | set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar) |
638 | set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib) |
639 | endif() |
640 | endif() |
641 | |
642 | if(CLANG_BOOTSTRAP_EXTRA_DEPS) |
643 | add_dependencies(clang-bootstrap-deps ${CLANG_BOOTSTRAP_EXTRA_DEPS}) |
644 | endif() |
645 | |
646 | add_custom_target(${NEXT_CLANG_STAGE}-clear |
647 | DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared |
648 | ) |
649 | add_custom_command( |
650 | OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${NEXT_CLANG_STAGE}-cleared |
651 | DEPENDS clang-bootstrap-deps |
652 | COMMAND ${CMAKE_COMMAND} -E remove_directory ${BINARY_DIR} |
653 | COMMAND ${CMAKE_COMMAND} -E make_directory ${BINARY_DIR} |
654 | COMMAND ${CMAKE_COMMAND} -E remove_directory ${STAMP_DIR} |
655 | COMMAND ${CMAKE_COMMAND} -E make_directory ${STAMP_DIR} |
656 | COMMENT "Clobberring ${NEXT_CLANG_STAGE} build and stamp directories" |
657 | ) |
658 | |
659 | if(CMAKE_VERBOSE_MAKEFILE) |
660 | set(verbose -DCMAKE_VERBOSE_MAKEFILE=On) |
661 | endif() |
662 | |
663 | set(_BOOTSTRAP_DEFAULT_PASSTHROUGH |
664 | PACKAGE_VERSION |
665 | PACKAGE_VENDOR |
666 | LLVM_VERSION_MAJOR |
667 | LLVM_VERSION_MINOR |
668 | LLVM_VERSION_PATCH |
669 | CLANG_VERSION_MAJOR |
670 | CLANG_VERSION_MINOR |
671 | CLANG_VERSION_PATCHLEVEL |
672 | LLVM_VERSION_SUFFIX |
673 | LLVM_BINUTILS_INCDIR |
674 | CLANG_REPOSITORY_STRING |
675 | CMAKE_C_COMPILER_LAUNCHER |
676 | CMAKE_CXX_COMPILER_LAUNCHER |
677 | CMAKE_MAKE_PROGRAM |
678 | CMAKE_OSX_ARCHITECTURES |
679 | LLVM_ENABLE_PROJECTS |
680 | LLVM_ENABLE_RUNTIMES) |
681 | |
682 | # We don't need to depend on compiler-rt/libcxx if we're building instrumented |
683 | # because the next stage will use the same compiler used to build this stage. |
684 | if(NOT LLVM_BUILD_INSTRUMENTED) |
685 | if(TARGET compiler-rt) |
686 | add_dependencies(clang-bootstrap-deps compiler-rt) |
687 | endif() |
688 | if(TARGET cxx-headers) |
689 | add_dependencies(clang-bootstrap-deps cxx-headers) |
690 | endif() |
691 | endif() |
692 | |
693 | set(C_COMPILER "clang") |
694 | set(CXX_COMPILER "clang++") |
695 | if(WIN32) |
696 | set(C_COMPILER "clang-cl.exe") |
697 | set(CXX_COMPILER "clang-cl.exe") |
698 | endif() |
699 | |
700 | set(COMPILER_OPTIONS |
701 | -DCMAKE_CXX_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${CXX_COMPILER} |
702 | -DCMAKE_C_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER} |
703 | -DCMAKE_ASM_COMPILER=${LLVM_RUNTIME_OUTPUT_INTDIR}/${C_COMPILER} |
704 | -DCMAKE_ASM_COMPILER_ID=Clang) |
705 | |
706 | if(BOOTSTRAP_CMAKE_SYSTEM_NAME) |
707 | set(${CLANG_STAGE}_CONFIG -DLLVM_CONFIG_PATH=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-config) |
708 | set(${CLANG_STAGE}_TABLEGEN |
709 | -DLLVM_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-tblgen |
710 | -DCLANG_TABLEGEN=${LLVM_RUNTIME_OUTPUT_INTDIR}/clang-tblgen) |
711 | if(BOOTSTRAP_CMAKE_SYSTEM_NAME STREQUAL "Linux") |
712 | if(BOOTSTRAP_LLVM_ENABLE_LLD) |
713 | set(${CLANG_STAGE}_LINKER -DCMAKE_LINKER=${LLVM_RUNTIME_OUTPUT_INTDIR}/ld.lld) |
714 | endif() |
715 | if(NOT BOOTSTRAP_LLVM_ENABLE_LTO) |
716 | add_dependencies(clang-bootstrap-deps llvm-ar llvm-ranlib) |
717 | set(${CLANG_STAGE}_AR -DCMAKE_AR=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ar) |
718 | set(${CLANG_STAGE}_RANLIB -DCMAKE_RANLIB=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-ranlib) |
719 | endif() |
720 | add_dependencies(clang-bootstrap-deps llvm-objcopy llvm-strip) |
721 | set(${CLANG_STAGE}_OBJCOPY -DCMAKE_OBJCOPY=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-objcopy) |
722 | set(${CLANG_STAGE}_STRIP -DCMAKE_STRIP=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-strip) |
723 | endif() |
724 | endif() |
725 | |
726 | if(BOOTSTRAP_LLVM_BUILD_INSTRUMENTED) |
727 | add_dependencies(clang-bootstrap-deps llvm-profdata) |
728 | set(PGO_OPT -DLLVM_PROFDATA=${LLVM_RUNTIME_OUTPUT_INTDIR}/llvm-profdata) |
729 | endif() |
730 | |
731 | if(LLVM_BUILD_INSTRUMENTED) |
732 | add_dependencies(clang-bootstrap-deps generate-profdata) |
733 | set(PGO_OPT -DLLVM_PROFDATA_FILE=${CMAKE_CURRENT_BINARY_DIR}/utils/perf-training/clang.profdata) |
734 | # Use the current tools for LTO instead of the instrumented ones |
735 | list(APPEND _BOOTSTRAP_DEFAULT_PASSTHROUGH |
736 | CMAKE_CXX_COMPILER |
737 | CMAKE_C_COMPILER |
738 | CMAKE_ASM_COMPILER |
739 | CMAKE_AR |
740 | CMAKE_RANLIB |
741 | DARWIN_LTO_LIBRARY |
742 | DYLD_LIBRARY_PATH) |
743 | |
744 | set(COMPILER_OPTIONS) |
745 | set(LTO_LIBRARY) |
746 | set(LTO_AR) |
747 | set(LTO_RANLIB) |
748 | endif() |
749 | |
750 | # Find all variables that start with BOOTSTRAP_ and populate a variable with |
751 | # them. |
752 | get_cmake_property(variableNames VARIABLES) |
753 | foreach(variableName ${variableNames}) |
754 | if(variableName MATCHES "^BOOTSTRAP_") |
755 | string(SUBSTRING ${variableName} 10 -1 varName) |
756 | string(REPLACE ";" "|" value "${${variableName}}") |
757 | list(APPEND PASSTHROUGH_VARIABLES |
758 | -D${varName}=${value}) |
759 | endif() |
760 | if(${variableName} AND variableName MATCHES "LLVM_EXTERNAL_.*_SOURCE_DIR") |
761 | list(APPEND PASSTHROUGH_VARIABLES |
762 | -D${variableName}=${${variableName}}) |
763 | endif() |
764 | endforeach() |
765 | |
766 | # Populate the passthrough variables |
767 | foreach(variableName ${CLANG_BOOTSTRAP_PASSTHROUGH} ${_BOOTSTRAP_DEFAULT_PASSTHROUGH}) |
768 | if(DEFINED ${variableName}) |
769 | if("${${variableName}}" STREQUAL "") |
770 | set(value "") |
771 | else() |
772 | string(REPLACE ";" "|" value "${${variableName}}") |
773 | endif() |
774 | list(APPEND PASSTHROUGH_VARIABLES |
775 | -D${variableName}=${value}) |
776 | endif() |
777 | endforeach() |
778 | |
779 | ExternalProject_Add(${NEXT_CLANG_STAGE} |
780 | DEPENDS clang-bootstrap-deps |
781 | PREFIX ${NEXT_CLANG_STAGE} |
782 | SOURCE_DIR ${CMAKE_SOURCE_DIR} |
783 | STAMP_DIR ${STAMP_DIR} |
784 | BINARY_DIR ${BINARY_DIR} |
785 | EXCLUDE_FROM_ALL 1 |
786 | CMAKE_ARGS |
787 | # We shouldn't need to set this here, but INSTALL_DIR doesn't |
788 | # seem to work, so instead I'm passing this through |
789 | -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX} |
790 | ${CLANG_BOOTSTRAP_CMAKE_ARGS} |
791 | ${PASSTHROUGH_VARIABLES} |
792 | -DCLANG_STAGE=${NEXT_CLANG_STAGE} |
793 | ${COMPILER_OPTIONS} |
794 | ${${CLANG_STAGE}_CONFIG} |
795 | ${${CLANG_STAGE}_TABLEGEN} |
796 | ${LTO_LIBRARY} ${verbose} ${PGO_OPT} |
797 | ${${CLANG_STAGE}_LINKER} |
798 | ${${CLANG_STAGE}_AR} |
799 | ${${CLANG_STAGE}_RANLIB} |
800 | ${${CLANG_STAGE}_OBJCOPY} |
801 | ${${CLANG_STAGE}_STRIP} |
802 | INSTALL_COMMAND "" |
803 | STEP_TARGETS configure build |
804 | USES_TERMINAL_CONFIGURE 1 |
805 | USES_TERMINAL_BUILD 1 |
806 | USES_TERMINAL_INSTALL 1 |
807 | LIST_SEPARATOR | |
808 | ) |
809 | |
810 | # exclude really-install from main target |
811 | set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_really-install_EXCLUDE_FROM_MAIN On) |
812 | ExternalProject_Add_Step(${NEXT_CLANG_STAGE} really-install |
813 | COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target install |
814 | COMMENT "Performing install step for '${NEXT_CLANG_STAGE}'" |
815 | DEPENDEES build |
816 | USES_TERMINAL 1 |
817 | ) |
818 | ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} really-install) |
819 | add_custom_target(${NEXT_CLANG_STAGE}-install DEPENDS ${NEXT_CLANG_STAGE}-really-install) |
820 | |
821 | if(NOT CLANG_BOOTSTRAP_TARGETS) |
822 | set(CLANG_BOOTSTRAP_TARGETS check-llvm check-clang check-all) |
823 | endif() |
824 | foreach(target ${CLANG_BOOTSTRAP_TARGETS}) |
825 | # exclude from main target |
826 | set_target_properties(${NEXT_CLANG_STAGE} PROPERTIES _EP_${target}_EXCLUDE_FROM_MAIN On) |
827 | |
828 | ExternalProject_Add_Step(${NEXT_CLANG_STAGE} ${target} |
829 | COMMAND ${CMAKE_COMMAND} --build <BINARY_DIR> --target ${target} |
830 | COMMENT "Performing ${target} for '${NEXT_CLANG_STAGE}'" |
831 | DEPENDEES configure |
832 | USES_TERMINAL 1 |
833 | ) |
834 | |
835 | if(target MATCHES "^stage[0-9]*") |
836 | add_custom_target(${target} DEPENDS ${NEXT_CLANG_STAGE}-${target}) |
837 | endif() |
838 | |
839 | ExternalProject_Add_StepTargets(${NEXT_CLANG_STAGE} ${target}) |
840 | endforeach() |
841 | endif() |
842 | |
843 | if (LLVM_ADD_NATIVE_VISUALIZERS_TO_SOLUTION) |
844 | add_subdirectory(utils/ClangVisualizers) |
845 | endif() |
846 | add_subdirectory(utils/hmaptool) |
847 | |
848 | configure_file( |
849 | ${CLANG_SOURCE_DIR}/include/clang/Config/config.h.cmake |
850 | ${CLANG_BINARY_DIR}/include/clang/Config/config.h) |
851 | |