Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 1 | include(GNUInstallDirs) |
2 | include(LLVMDistributionSupport) |
||
3 | include(LLVMProcessSources) |
||
4 | include(LLVM-Config) |
||
5 | include(DetermineGCCCompatible) |
||
6 | |||
7 | function(llvm_update_compile_flags name) |
||
8 | get_property(sources TARGET ${name} PROPERTY SOURCES) |
||
9 | if("${sources}" MATCHES "\\.c(;|$)") |
||
10 | set(update_src_props ON) |
||
11 | endif() |
||
12 | |||
13 | list(APPEND LLVM_COMPILE_CFLAGS " ${LLVM_COMPILE_FLAGS}") |
||
14 | |||
15 | # LLVM_REQUIRES_EH is an internal flag that individual targets can use to |
||
16 | # force EH |
||
17 | if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH) |
||
18 | if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI)) |
||
19 | message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}") |
||
20 | set(LLVM_REQUIRES_RTTI ON) |
||
21 | endif() |
||
22 | if(MSVC) |
||
23 | list(APPEND LLVM_COMPILE_FLAGS "/EHsc") |
||
24 | endif() |
||
25 | else() |
||
26 | if(LLVM_COMPILER_IS_GCC_COMPATIBLE) |
||
27 | list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions") |
||
28 | if(NOT LLVM_ENABLE_UNWIND_TABLES) |
||
29 | list(APPEND LLVM_COMPILE_FLAGS "-fno-unwind-tables") |
||
30 | list(APPEND LLVM_COMPILE_FLAGS "-fno-asynchronous-unwind-tables") |
||
31 | endif() |
||
32 | elseif(MSVC) |
||
33 | list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0) |
||
34 | list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-") |
||
35 | elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") |
||
36 | list(APPEND LLVM_COMPILE_FLAGS "-qnoeh") |
||
37 | endif() |
||
38 | endif() |
||
39 | |||
40 | # LLVM_REQUIRES_RTTI is an internal flag that individual |
||
41 | # targets can use to force RTTI |
||
42 | set(LLVM_CONFIG_HAS_RTTI YES CACHE INTERNAL "") |
||
43 | if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI)) |
||
44 | set(LLVM_CONFIG_HAS_RTTI NO CACHE INTERNAL "") |
||
45 | list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0) |
||
46 | if (LLVM_COMPILER_IS_GCC_COMPATIBLE) |
||
47 | list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti") |
||
48 | elseif (MSVC) |
||
49 | list(APPEND LLVM_COMPILE_FLAGS "/GR-") |
||
50 | elseif (CMAKE_CXX_COMPILER_ID MATCHES "XL") |
||
51 | list(APPEND LLVM_COMPILE_FLAGS "-qnortti") |
||
52 | endif () |
||
53 | elseif(MSVC) |
||
54 | list(APPEND LLVM_COMPILE_FLAGS "/GR") |
||
55 | endif() |
||
56 | |||
57 | # Assume that; |
||
58 | # - LLVM_COMPILE_FLAGS is list. |
||
59 | # - PROPERTY COMPILE_FLAGS is string. |
||
60 | string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}") |
||
61 | string(REPLACE ";" " " target_compile_cflags " ${LLVM_COMPILE_CFLAGS}") |
||
62 | |||
63 | if(update_src_props) |
||
64 | foreach(fn ${sources}) |
||
65 | get_filename_component(suf ${fn} EXT) |
||
66 | if("${suf}" STREQUAL ".cpp") |
||
67 | set_property(SOURCE ${fn} APPEND_STRING PROPERTY |
||
68 | COMPILE_FLAGS "${target_compile_flags}") |
||
69 | endif() |
||
70 | if("${suf}" STREQUAL ".c") |
||
71 | set_property(SOURCE ${fn} APPEND_STRING PROPERTY |
||
72 | COMPILE_FLAGS "${target_compile_cflags}") |
||
73 | endif() |
||
74 | endforeach() |
||
75 | else() |
||
76 | # Update target props, since all sources are C++. |
||
77 | set_property(TARGET ${name} APPEND_STRING PROPERTY |
||
78 | COMPILE_FLAGS "${target_compile_flags}") |
||
79 | endif() |
||
80 | |||
81 | set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS}) |
||
82 | endfunction() |
||
83 | |||
84 | function(add_llvm_symbol_exports target_name export_file) |
||
85 | if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") |
||
86 | set(native_export_file "${target_name}.exports") |
||
87 | add_custom_command(OUTPUT ${native_export_file} |
||
88 | COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file} |
||
89 | DEPENDS ${export_file} |
||
90 | VERBATIM |
||
91 | COMMENT "Creating export file for ${target_name}") |
||
92 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
93 | LINK_FLAGS " -Wl,-exported_symbols_list,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") |
||
94 | elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX") |
||
95 | # FIXME: `-Wl,-bE:` bypasses whatever handling there is in the build |
||
96 | # compiler driver to defer to the specified export list. |
||
97 | set(native_export_file "${export_file}") |
||
98 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
99 | LINK_FLAGS " -Wl,-bE:${export_file}") |
||
100 | elseif(LLVM_HAVE_LINK_VERSION_SCRIPT) |
||
101 | # Gold and BFD ld require a version script rather than a plain list. |
||
102 | set(native_export_file "${target_name}.exports") |
||
103 | # FIXME: Don't write the "local:" line on OpenBSD. |
||
104 | # in the export file, also add a linker script to version LLVM symbols (form: LLVM_N.M) |
||
105 | add_custom_command(OUTPUT ${native_export_file} |
||
106 | COMMAND "${Python3_EXECUTABLE}" "-c" |
||
107 | "import sys; \ |
||
108 | lines = [' ' + l.rstrip() for l in sys.stdin] + [' local: *;']; \ |
||
109 | print('LLVM_${LLVM_VERSION_MAJOR} {'); \ |
||
110 | print(' global:') if len(lines) > 1 else None; \ |
||
111 | print(';\\n'.join(lines) + '\\n};')" |
||
112 | < ${export_file} > ${native_export_file} |
||
113 | DEPENDS ${export_file} |
||
114 | VERBATIM |
||
115 | COMMENT "Creating export file for ${target_name}") |
||
116 | if (${LLVM_LINKER_IS_SOLARISLD}) |
||
117 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
118 | LINK_FLAGS " -Wl,-M,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") |
||
119 | else() |
||
120 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
121 | LINK_FLAGS " -Wl,--version-script,\"${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}\"") |
||
122 | endif() |
||
123 | elseif(WIN32) |
||
124 | set(native_export_file "${target_name}.def") |
||
125 | |||
126 | add_custom_command(OUTPUT ${native_export_file} |
||
127 | COMMAND "${Python3_EXECUTABLE}" -c "import sys;print(''.join(['EXPORTS\\n']+sys.stdin.readlines(),))" |
||
128 | < ${export_file} > ${native_export_file} |
||
129 | DEPENDS ${export_file} |
||
130 | VERBATIM |
||
131 | COMMENT "Creating export file for ${target_name}") |
||
132 | set(export_file_linker_flag "${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}") |
||
133 | if(MSVC) |
||
134 | # cl.exe or clang-cl, i.e. MSVC style command line interface |
||
135 | set(export_file_linker_flag "/DEF:\"${export_file_linker_flag}\"") |
||
136 | elseif(CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") |
||
137 | # clang in msvc mode, calling a link.exe/lld-link style linker |
||
138 | set(export_file_linker_flag "-Wl,/DEF:\"${export_file_linker_flag}\"") |
||
139 | elseif(MINGW) |
||
140 | # ${export_file_linker_flag}, which is the plain file name, works as is |
||
141 | # when passed to the compiler driver, which then passes it on to the |
||
142 | # linker as an input file. |
||
143 | set(export_file_linker_flag "\"${export_file_linker_flag}\"") |
||
144 | else() |
||
145 | message(FATAL_ERROR "Unsupported Windows toolchain") |
||
146 | endif() |
||
147 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
148 | LINK_FLAGS " ${export_file_linker_flag}") |
||
149 | endif() |
||
150 | |||
151 | add_custom_target(${target_name}_exports DEPENDS ${native_export_file}) |
||
152 | set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc") |
||
153 | |||
154 | get_property(srcs TARGET ${target_name} PROPERTY SOURCES) |
||
155 | foreach(src ${srcs}) |
||
156 | get_filename_component(extension ${src} EXT) |
||
157 | if(extension STREQUAL ".cpp") |
||
158 | set(first_source_file ${src}) |
||
159 | break() |
||
160 | endif() |
||
161 | endforeach() |
||
162 | |||
163 | # Force re-linking when the exports file changes. Actually, it |
||
164 | # forces recompilation of the source file. The LINK_DEPENDS target |
||
165 | # property only works for makefile-based generators. |
||
166 | # FIXME: This is not safe because this will create the same target |
||
167 | # ${native_export_file} in several different file: |
||
168 | # - One where we emitted ${target_name}_exports |
||
169 | # - One where we emitted the build command for the following object. |
||
170 | # set_property(SOURCE ${first_source_file} APPEND PROPERTY |
||
171 | # OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}) |
||
172 | |||
173 | set_property(DIRECTORY APPEND |
||
174 | PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file}) |
||
175 | |||
176 | add_dependencies(${target_name} ${target_name}_exports) |
||
177 | |||
178 | # Add dependency to *_exports later -- CMake issue 14747 |
||
179 | list(APPEND LLVM_COMMON_DEPENDS ${target_name}_exports) |
||
180 | set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE) |
||
181 | endfunction(add_llvm_symbol_exports) |
||
182 | |||
183 | if (NOT DEFINED LLVM_LINKER_DETECTED AND NOT WIN32) |
||
184 | # Detect what linker we have here. |
||
185 | if(APPLE) |
||
186 | # Linkers with ld64-compatible flags. |
||
187 | set(version_flag "-Wl,-v") |
||
188 | else() |
||
189 | # Linkers with BFD ld-compatible flags. |
||
190 | set(version_flag "-Wl,--version") |
||
191 | endif() |
||
192 | |||
193 | if (CMAKE_HOST_WIN32) |
||
194 | set(DEVNULL "NUL") |
||
195 | else() |
||
196 | set(DEVNULL "/dev/null") |
||
197 | endif() |
||
198 | |||
199 | if(LLVM_USE_LINKER) |
||
200 | set(command ${CMAKE_C_COMPILER} -fuse-ld=${LLVM_USE_LINKER} ${version_flag} -o ${DEVNULL}) |
||
201 | else() |
||
202 | separate_arguments(flags UNIX_COMMAND "${CMAKE_EXE_LINKER_FLAGS}") |
||
203 | set(command ${CMAKE_C_COMPILER} ${flags} ${version_flag} -o ${DEVNULL}) |
||
204 | endif() |
||
205 | execute_process( |
||
206 | COMMAND ${command} |
||
207 | OUTPUT_VARIABLE stdout |
||
208 | ERROR_VARIABLE stderr |
||
209 | ) |
||
210 | |||
211 | if(APPLE) |
||
212 | if("${stderr}" MATCHES "PROJECT:ld64") |
||
213 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
214 | set(LLVM_LINKER_IS_LD64 YES CACHE INTERNAL "") |
||
215 | message(STATUS "Linker detection: ld64") |
||
216 | elseif("${stderr}" MATCHES "^LLD" OR |
||
217 | "${stdout}" MATCHES "^LLD") |
||
218 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
219 | set(LLVM_LINKER_IS_LLD YES CACHE INTERNAL "") |
||
220 | message(STATUS "Linker detection: lld") |
||
221 | else() |
||
222 | set(LLVM_LINKER_DETECTED NO CACHE INTERNAL "") |
||
223 | message(STATUS "Linker detection: unknown") |
||
224 | endif() |
||
225 | else() |
||
226 | if("${stdout}" MATCHES "^mold") |
||
227 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
228 | set(LLVM_LINKER_IS_MOLD YES CACHE INTERNAL "") |
||
229 | message(STATUS "Linker detection: mold") |
||
230 | elseif("${stdout}" MATCHES "GNU gold") |
||
231 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
232 | set(LLVM_LINKER_IS_GOLD YES CACHE INTERNAL "") |
||
233 | message(STATUS "Linker detection: GNU Gold") |
||
234 | elseif("${stdout}" MATCHES "^LLD") |
||
235 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
236 | set(LLVM_LINKER_IS_LLD YES CACHE INTERNAL "") |
||
237 | message(STATUS "Linker detection: LLD") |
||
238 | elseif("${stdout}" MATCHES "GNU ld") |
||
239 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
240 | set(LLVM_LINKER_IS_GNULD YES CACHE INTERNAL "") |
||
241 | message(STATUS "Linker detection: GNU ld") |
||
242 | elseif("${stderr}" MATCHES "Solaris Link Editors" OR |
||
243 | "${stdout}" MATCHES "Solaris Link Editors") |
||
244 | set(LLVM_LINKER_DETECTED YES CACHE INTERNAL "") |
||
245 | set(LLVM_LINKER_IS_SOLARISLD YES CACHE INTERNAL "") |
||
246 | message(STATUS "Linker detection: Solaris ld") |
||
247 | else() |
||
248 | set(LLVM_LINKER_DETECTED NO CACHE INTERNAL "") |
||
249 | message(STATUS "Linker detection: unknown") |
||
250 | endif() |
||
251 | endif() |
||
252 | endif() |
||
253 | |||
254 | function(add_link_opts target_name) |
||
255 | get_llvm_distribution(${target_name} in_distribution in_distribution_var) |
||
256 | if(NOT in_distribution) |
||
257 | # Don't LTO optimize targets that aren't part of any distribution. |
||
258 | if (LLVM_ENABLE_LTO) |
||
259 | # We may consider avoiding LTO altogether by using -fembed-bitcode |
||
260 | # and teaching the linker to select machine code from .o files, see |
||
261 | # https://lists.llvm.org/pipermail/llvm-dev/2021-April/149843.html |
||
262 | if((UNIX OR MINGW) AND LINKER_IS_LLD) |
||
263 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
264 | LINK_FLAGS " -Wl,--lto-O0") |
||
265 | elseif(LINKER_IS_LLD_LINK) |
||
266 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
267 | LINK_FLAGS " /opt:lldlto=0") |
||
268 | elseif(APPLE AND NOT uppercase_LLVM_ENABLE_LTO STREQUAL "THIN") |
||
269 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
270 | LINK_FLAGS " -Wl,-mllvm,-O0") |
||
271 | endif() |
||
272 | endif() |
||
273 | endif() |
||
274 | |||
275 | # Don't use linker optimizations in debug builds since it slows down the |
||
276 | # linker in a context where the optimizations are not important. |
||
277 | if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG") |
||
278 | if(NOT LLVM_NO_DEAD_STRIP) |
||
279 | if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") |
||
280 | # ld64's implementation of -dead_strip breaks tools that use plugins. |
||
281 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
282 | LINK_FLAGS " -Wl,-dead_strip") |
||
283 | elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") |
||
284 | # Support for ld -z discard-unused=sections was only added in |
||
285 | # Solaris 11.4. |
||
286 | include(LLVMCheckLinkerFlag) |
||
287 | llvm_check_linker_flag(CXX "-Wl,-z,discard-unused=sections" LINKER_SUPPORTS_Z_DISCARD_UNUSED) |
||
288 | if (LINKER_SUPPORTS_Z_DISCARD_UNUSED) |
||
289 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
290 | LINK_FLAGS " -Wl,-z,discard-unused=sections") |
||
291 | endif() |
||
292 | elseif(NOT MSVC AND NOT CMAKE_SYSTEM_NAME MATCHES "AIX|OS390") |
||
293 | # TODO Revisit this later on z/OS. |
||
294 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
295 | LINK_FLAGS " -Wl,--gc-sections") |
||
296 | endif() |
||
297 | else() #LLVM_NO_DEAD_STRIP |
||
298 | if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") |
||
299 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
300 | LINK_FLAGS " -Wl,-bnogc") |
||
301 | endif() |
||
302 | endif() |
||
303 | endif() |
||
304 | |||
305 | if(ARG_SUPPORT_PLUGINS AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX") |
||
306 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
307 | LINK_FLAGS " -Wl,-brtl") |
||
308 | endif() |
||
309 | endfunction(add_link_opts) |
||
310 | |||
311 | # Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}. |
||
312 | # Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more, |
||
313 | # or a certain builder, for eaxample, msbuild.exe, would be confused. |
||
314 | function(set_output_directory target) |
||
315 | cmake_parse_arguments(ARG "" "BINARY_DIR;LIBRARY_DIR" "" ${ARGN}) |
||
316 | |||
317 | # module_dir -- corresponding to LIBRARY_OUTPUT_DIRECTORY. |
||
318 | # It affects output of add_library(MODULE). |
||
319 | if(WIN32 OR CYGWIN) |
||
320 | # DLL platform |
||
321 | set(module_dir ${ARG_BINARY_DIR}) |
||
322 | else() |
||
323 | set(module_dir ${ARG_LIBRARY_DIR}) |
||
324 | endif() |
||
325 | if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".") |
||
326 | foreach(build_mode ${CMAKE_CONFIGURATION_TYPES}) |
||
327 | string(TOUPPER "${build_mode}" CONFIG_SUFFIX) |
||
328 | if(ARG_BINARY_DIR) |
||
329 | string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${ARG_BINARY_DIR}) |
||
330 | set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi}) |
||
331 | endif() |
||
332 | if(ARG_LIBRARY_DIR) |
||
333 | string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${ARG_LIBRARY_DIR}) |
||
334 | set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li}) |
||
335 | endif() |
||
336 | if(module_dir) |
||
337 | string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${module_dir}) |
||
338 | set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi}) |
||
339 | endif() |
||
340 | endforeach() |
||
341 | else() |
||
342 | if(ARG_BINARY_DIR) |
||
343 | set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ARG_BINARY_DIR}) |
||
344 | endif() |
||
345 | if(ARG_LIBRARY_DIR) |
||
346 | set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ARG_LIBRARY_DIR}) |
||
347 | endif() |
||
348 | if(module_dir) |
||
349 | set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${module_dir}) |
||
350 | endif() |
||
351 | endif() |
||
352 | endfunction() |
||
353 | |||
354 | # If on Windows and building with MSVC, add the resource script containing the |
||
355 | # VERSIONINFO data to the project. This embeds version resource information |
||
356 | # into the output .exe or .dll. |
||
357 | # TODO: Enable for MinGW Windows builds too. |
||
358 | # |
||
359 | function(add_windows_version_resource_file OUT_VAR) |
||
360 | set(sources ${ARGN}) |
||
361 | if (MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") |
||
362 | set(resource_file ${LLVM_SOURCE_DIR}/resources/windows_version_resource.rc) |
||
363 | if(EXISTS ${resource_file}) |
||
364 | set(sources ${sources} ${resource_file}) |
||
365 | source_group("Resource Files" ${resource_file}) |
||
366 | set(windows_resource_file ${resource_file} PARENT_SCOPE) |
||
367 | endif() |
||
368 | endif(MSVC AND CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") |
||
369 | |||
370 | set(${OUT_VAR} ${sources} PARENT_SCOPE) |
||
371 | endfunction(add_windows_version_resource_file) |
||
372 | |||
373 | # set_windows_version_resource_properties(name resource_file... |
||
374 | # VERSION_MAJOR int |
||
375 | # Optional major version number (defaults to LLVM_VERSION_MAJOR) |
||
376 | # VERSION_MINOR int |
||
377 | # Optional minor version number (defaults to LLVM_VERSION_MINOR) |
||
378 | # VERSION_PATCHLEVEL int |
||
379 | # Optional patchlevel version number (defaults to LLVM_VERSION_PATCH) |
||
380 | # VERSION_STRING |
||
381 | # Optional version string (defaults to PACKAGE_VERSION) |
||
382 | # PRODUCT_NAME |
||
383 | # Optional product name string (defaults to "LLVM") |
||
384 | # ) |
||
385 | function(set_windows_version_resource_properties name resource_file) |
||
386 | cmake_parse_arguments(ARG |
||
387 | "" |
||
388 | "VERSION_MAJOR;VERSION_MINOR;VERSION_PATCHLEVEL;VERSION_STRING;PRODUCT_NAME" |
||
389 | "" |
||
390 | ${ARGN}) |
||
391 | |||
392 | if (NOT DEFINED ARG_VERSION_MAJOR) |
||
393 | if (${LLVM_VERSION_MAJOR}) |
||
394 | set(ARG_VERSION_MAJOR ${LLVM_VERSION_MAJOR}) |
||
395 | else() |
||
396 | set(ARG_VERSION_MAJOR 0) |
||
397 | endif() |
||
398 | endif() |
||
399 | |||
400 | if (NOT DEFINED ARG_VERSION_MINOR) |
||
401 | if (${LLVM_VERSION_MINOR}) |
||
402 | set(ARG_VERSION_MINOR ${LLVM_VERSION_MINOR}) |
||
403 | else() |
||
404 | set(ARG_VERSION_MINOR 0) |
||
405 | endif() |
||
406 | endif() |
||
407 | |||
408 | if (NOT DEFINED ARG_VERSION_PATCHLEVEL) |
||
409 | if (${LLVM_VERSION_PATCH}) |
||
410 | set(ARG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH}) |
||
411 | else() |
||
412 | set(ARG_VERSION_PATCHLEVEL 0) |
||
413 | endif() |
||
414 | endif() |
||
415 | |||
416 | if (NOT DEFINED ARG_VERSION_STRING) |
||
417 | if (${PACKAGE_VERSION}) |
||
418 | set(ARG_VERSION_STRING ${PACKAGE_VERSION}) |
||
419 | else() |
||
420 | set(ARG_VERSION_STRING 0) |
||
421 | endif() |
||
422 | endif() |
||
423 | |||
424 | if (NOT DEFINED ARG_PRODUCT_NAME) |
||
425 | set(ARG_PRODUCT_NAME "LLVM") |
||
426 | endif() |
||
427 | |||
428 | set_property(SOURCE ${resource_file} |
||
429 | PROPERTY COMPILE_FLAGS /nologo) |
||
430 | set_property(SOURCE ${resource_file} |
||
431 | PROPERTY COMPILE_DEFINITIONS |
||
432 | "RC_VERSION_FIELD_1=${ARG_VERSION_MAJOR}" |
||
433 | "RC_VERSION_FIELD_2=${ARG_VERSION_MINOR}" |
||
434 | "RC_VERSION_FIELD_3=${ARG_VERSION_PATCHLEVEL}" |
||
435 | "RC_VERSION_FIELD_4=0" |
||
436 | "RC_FILE_VERSION=\"${ARG_VERSION_STRING}\"" |
||
437 | "RC_INTERNAL_NAME=\"${name}\"" |
||
438 | "RC_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\"" |
||
439 | "RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"") |
||
440 | endfunction(set_windows_version_resource_properties) |
||
441 | |||
442 | # llvm_add_library(name sources... |
||
443 | # SHARED;STATIC |
||
444 | # STATIC by default w/o BUILD_SHARED_LIBS. |
||
445 | # SHARED by default w/ BUILD_SHARED_LIBS. |
||
446 | # OBJECT |
||
447 | # Also create an OBJECT library target. Default if STATIC && SHARED. |
||
448 | # MODULE |
||
449 | # Target ${name} might not be created on unsupported platforms. |
||
450 | # Check with "if(TARGET ${name})". |
||
451 | # DISABLE_LLVM_LINK_LLVM_DYLIB |
||
452 | # Do not link this library to libLLVM, even if |
||
453 | # LLVM_LINK_LLVM_DYLIB is enabled. |
||
454 | # OUTPUT_NAME name |
||
455 | # Corresponds to OUTPUT_NAME in target properties. |
||
456 | # DEPENDS targets... |
||
457 | # Same semantics as add_dependencies(). |
||
458 | # LINK_COMPONENTS components... |
||
459 | # Same as the variable LLVM_LINK_COMPONENTS. |
||
460 | # LINK_LIBS lib_targets... |
||
461 | # Same semantics as target_link_libraries(). |
||
462 | # ADDITIONAL_HEADERS |
||
463 | # May specify header files for IDE generators. |
||
464 | # SONAME |
||
465 | # Should set SONAME link flags and create symlinks |
||
466 | # NO_INSTALL_RPATH |
||
467 | # Suppress default RPATH settings in shared libraries. |
||
468 | # PLUGIN_TOOL |
||
469 | # The tool (i.e. cmake target) that this plugin will link against |
||
470 | # COMPONENT_LIB |
||
471 | # This is used to specify that this is a component library of |
||
472 | # LLVM which means that the source resides in llvm/lib/ and it is a |
||
473 | # candidate for inclusion into libLLVM.so. |
||
474 | # ) |
||
475 | function(llvm_add_library name) |
||
476 | cmake_parse_arguments(ARG |
||
477 | "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME;NO_INSTALL_RPATH;COMPONENT_LIB" |
||
478 | "OUTPUT_NAME;PLUGIN_TOOL;ENTITLEMENTS;BUNDLE_PATH" |
||
479 | "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS" |
||
480 | ${ARGN}) |
||
481 | list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS}) |
||
482 | if(ARG_ADDITIONAL_HEADERS) |
||
483 | # Pass through ADDITIONAL_HEADERS. |
||
484 | set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS}) |
||
485 | endif() |
||
486 | if(ARG_OBJLIBS) |
||
487 | set(ALL_FILES ${ARG_OBJLIBS}) |
||
488 | else() |
||
489 | llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS}) |
||
490 | endif() |
||
491 | |||
492 | if(ARG_MODULE) |
||
493 | if(ARG_SHARED OR ARG_STATIC) |
||
494 | message(WARNING "MODULE with SHARED|STATIC doesn't make sense.") |
||
495 | endif() |
||
496 | # Plugins that link against a tool are allowed even when plugins in general are not |
||
497 | if(NOT LLVM_ENABLE_PLUGINS AND NOT (ARG_PLUGIN_TOOL AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)) |
||
498 | message(STATUS "${name} ignored -- Loadable modules not supported on this platform.") |
||
499 | return() |
||
500 | endif() |
||
501 | else() |
||
502 | if(ARG_PLUGIN_TOOL) |
||
503 | message(WARNING "PLUGIN_TOOL without MODULE doesn't make sense.") |
||
504 | endif() |
||
505 | if(BUILD_SHARED_LIBS AND NOT ARG_STATIC) |
||
506 | set(ARG_SHARED TRUE) |
||
507 | endif() |
||
508 | if(NOT ARG_SHARED) |
||
509 | set(ARG_STATIC TRUE) |
||
510 | endif() |
||
511 | endif() |
||
512 | |||
513 | # Generate objlib |
||
514 | if((ARG_SHARED AND ARG_STATIC) OR ARG_OBJECT) |
||
515 | # Generate an obj library for both targets. |
||
516 | set(obj_name "obj.${name}") |
||
517 | add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL |
||
518 | ${ALL_FILES} |
||
519 | ) |
||
520 | llvm_update_compile_flags(${obj_name}) |
||
521 | if(CMAKE_GENERATOR STREQUAL "Xcode") |
||
522 | set(DUMMY_FILE ${CMAKE_CURRENT_BINARY_DIR}/Dummy.c) |
||
523 | file(WRITE ${DUMMY_FILE} "// This file intentionally empty\n") |
||
524 | set_property(SOURCE ${DUMMY_FILE} APPEND_STRING PROPERTY COMPILE_FLAGS "-Wno-empty-translation-unit") |
||
525 | endif() |
||
526 | set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>" ${DUMMY_FILE}) |
||
527 | |||
528 | # Do add_dependencies(obj) later due to CMake issue 14747. |
||
529 | list(APPEND objlibs ${obj_name}) |
||
530 | |||
531 | # Bring in the target include directories from our original target. |
||
532 | target_include_directories(${obj_name} PRIVATE $<TARGET_PROPERTY:${name},INCLUDE_DIRECTORIES>) |
||
533 | |||
534 | set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries") |
||
535 | if(ARG_DEPENDS) |
||
536 | add_dependencies(${obj_name} ${ARG_DEPENDS}) |
||
537 | endif() |
||
538 | # Treat link libraries like PUBLIC dependencies. LINK_LIBS might |
||
539 | # result in generating header files. Add a dependendency so that |
||
540 | # the generated header is created before this object library. |
||
541 | if(ARG_LINK_LIBS) |
||
542 | cmake_parse_arguments(LINK_LIBS_ARG |
||
543 | "" |
||
544 | "" |
||
545 | "PUBLIC;PRIVATE" |
||
546 | ${ARG_LINK_LIBS}) |
||
547 | foreach(link_lib ${LINK_LIBS_ARG_PUBLIC}) |
||
548 | if(LLVM_PTHREAD_LIB) |
||
549 | # Can't specify a dependence on -lpthread |
||
550 | if(NOT ${link_lib} STREQUAL ${LLVM_PTHREAD_LIB}) |
||
551 | add_dependencies(${obj_name} ${link_lib}) |
||
552 | endif() |
||
553 | else() |
||
554 | add_dependencies(${obj_name} ${link_lib}) |
||
555 | endif() |
||
556 | endforeach() |
||
557 | endif() |
||
558 | endif() |
||
559 | |||
560 | if(ARG_SHARED AND ARG_STATIC) |
||
561 | # static |
||
562 | set(name_static "${name}_static") |
||
563 | if(ARG_OUTPUT_NAME) |
||
564 | set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}") |
||
565 | endif() |
||
566 | # DEPENDS has been appended to LLVM_COMMON_LIBS. |
||
567 | llvm_add_library(${name_static} STATIC |
||
568 | ${output_name} |
||
569 | OBJLIBS ${ALL_FILES} # objlib |
||
570 | LINK_LIBS ${ARG_LINK_LIBS} |
||
571 | LINK_COMPONENTS ${ARG_LINK_COMPONENTS} |
||
572 | ) |
||
573 | |||
574 | # Bring in the target link info from our original target. |
||
575 | target_link_directories(${name_static} PRIVATE $<TARGET_PROPERTY:${name},LINK_DIRECTORIES>) |
||
576 | target_link_libraries(${name_static} PRIVATE $<TARGET_PROPERTY:${name},LINK_LIBRARIES>) |
||
577 | |||
578 | # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY. |
||
579 | set(ARG_STATIC) |
||
580 | endif() |
||
581 | |||
582 | if(ARG_MODULE) |
||
583 | add_library(${name} MODULE ${ALL_FILES}) |
||
584 | elseif(ARG_SHARED) |
||
585 | add_windows_version_resource_file(ALL_FILES ${ALL_FILES}) |
||
586 | add_library(${name} SHARED ${ALL_FILES}) |
||
587 | else() |
||
588 | add_library(${name} STATIC ${ALL_FILES}) |
||
589 | endif() |
||
590 | |||
591 | if(ARG_COMPONENT_LIB) |
||
592 | set_target_properties(${name} PROPERTIES LLVM_COMPONENT TRUE) |
||
593 | set_property(GLOBAL APPEND PROPERTY LLVM_COMPONENT_LIBS ${name}) |
||
594 | endif() |
||
595 | |||
596 | if(NOT ARG_NO_INSTALL_RPATH) |
||
597 | if(ARG_MODULE OR ARG_SHARED) |
||
598 | llvm_setup_rpath(${name}) |
||
599 | endif() |
||
600 | endif() |
||
601 | |||
602 | setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS}) |
||
603 | |||
604 | if(DEFINED windows_resource_file) |
||
605 | set_windows_version_resource_properties(${name} ${windows_resource_file}) |
||
606 | set(windows_resource_file ${windows_resource_file} PARENT_SCOPE) |
||
607 | endif() |
||
608 | |||
609 | set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) |
||
610 | # $<TARGET_OBJECTS> doesn't require compile flags. |
||
611 | if(NOT obj_name) |
||
612 | llvm_update_compile_flags(${name}) |
||
613 | endif() |
||
614 | add_link_opts( ${name} ) |
||
615 | if(ARG_OUTPUT_NAME) |
||
616 | set_target_properties(${name} |
||
617 | PROPERTIES |
||
618 | OUTPUT_NAME ${ARG_OUTPUT_NAME} |
||
619 | ) |
||
620 | endif() |
||
621 | |||
622 | if(ARG_MODULE) |
||
623 | set_target_properties(${name} PROPERTIES |
||
624 | PREFIX "" |
||
625 | SUFFIX ${LLVM_PLUGIN_EXT} |
||
626 | ) |
||
627 | endif() |
||
628 | |||
629 | if(ARG_SHARED) |
||
630 | if(MSVC) |
||
631 | set_target_properties(${name} PROPERTIES |
||
632 | PREFIX "" |
||
633 | ) |
||
634 | endif() |
||
635 | |||
636 | # Set SOVERSION on shared libraries that lack explicit SONAME |
||
637 | # specifier, on *nix systems that are not Darwin. |
||
638 | if(UNIX AND NOT APPLE AND NOT ARG_SONAME) |
||
639 | set_target_properties(${name} |
||
640 | PROPERTIES |
||
641 | # Since 4.0.0, the ABI version is indicated by the major version |
||
642 | SOVERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX} |
||
643 | VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}) |
||
644 | endif() |
||
645 | endif() |
||
646 | |||
647 | if(ARG_MODULE OR ARG_SHARED) |
||
648 | # Do not add -Dname_EXPORTS to the command-line when building files in this |
||
649 | # target. Doing so is actively harmful for the modules build because it |
||
650 | # creates extra module variants, and not useful because we don't use these |
||
651 | # macros. |
||
652 | set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" ) |
||
653 | |||
654 | if (LLVM_EXPORTED_SYMBOL_FILE) |
||
655 | add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) |
||
656 | endif() |
||
657 | endif() |
||
658 | |||
659 | if(ARG_SHARED) |
||
660 | if(NOT APPLE AND ARG_SONAME) |
||
661 | get_target_property(output_name ${name} OUTPUT_NAME) |
||
662 | if(${output_name} STREQUAL "output_name-NOTFOUND") |
||
663 | set(output_name ${name}) |
||
664 | endif() |
||
665 | set(library_name ${output_name}-${LLVM_VERSION_MAJOR}${LLVM_VERSION_SUFFIX}) |
||
666 | set(api_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX}) |
||
667 | set_target_properties(${name} PROPERTIES OUTPUT_NAME ${library_name}) |
||
668 | if(UNIX) |
||
669 | llvm_install_library_symlink(${api_name} ${library_name} SHARED |
||
670 | COMPONENT ${name}) |
||
671 | llvm_install_library_symlink(${output_name} ${library_name} SHARED |
||
672 | COMPONENT ${name}) |
||
673 | endif() |
||
674 | endif() |
||
675 | endif() |
||
676 | |||
677 | if(ARG_STATIC) |
||
678 | set(libtype PUBLIC) |
||
679 | else() |
||
680 | # We can use PRIVATE since SO knows its dependent libs. |
||
681 | set(libtype PRIVATE) |
||
682 | endif() |
||
683 | |||
684 | if(ARG_MODULE AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS AND ARG_PLUGIN_TOOL AND (WIN32 OR CYGWIN)) |
||
685 | # On DLL platforms symbols are imported from the tool by linking against it. |
||
686 | set(llvm_libs ${ARG_PLUGIN_TOOL}) |
||
687 | elseif (NOT ARG_COMPONENT_LIB) |
||
688 | if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB) |
||
689 | set(llvm_libs LLVM) |
||
690 | else() |
||
691 | llvm_map_components_to_libnames(llvm_libs |
||
692 | ${ARG_LINK_COMPONENTS} |
||
693 | ${LLVM_LINK_COMPONENTS} |
||
694 | ) |
||
695 | endif() |
||
696 | else() |
||
697 | # Components have not been defined explicitly in CMake, so add the |
||
698 | # dependency information for this library through their name, and let |
||
699 | # LLVMBuildResolveComponentsLink resolve the mapping. |
||
700 | # |
||
701 | # It would be nice to verify that we have the dependencies for this library |
||
702 | # name, but using get_property(... SET) doesn't suffice to determine if a |
||
703 | # property has been set to an empty value. |
||
704 | set_property(TARGET ${name} PROPERTY LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS} ${LLVM_LINK_COMPONENTS}) |
||
705 | |||
706 | # This property is an internal property only used to make sure the |
||
707 | # link step applied in LLVMBuildResolveComponentsLink uses the same |
||
708 | # property as the target_link_libraries call below. |
||
709 | set_property(TARGET ${name} PROPERTY LLVM_LIBTYPE ${libtype}) |
||
710 | endif() |
||
711 | |||
712 | target_link_libraries(${name} ${libtype} |
||
713 | ${ARG_LINK_LIBS} |
||
714 | ${lib_deps} |
||
715 | ${llvm_libs} |
||
716 | ) |
||
717 | |||
718 | if(LLVM_COMMON_DEPENDS) |
||
719 | add_dependencies(${name} ${LLVM_COMMON_DEPENDS}) |
||
720 | # Add dependencies also to objlibs. |
||
721 | # CMake issue 14747 -- add_dependencies() might be ignored to objlib's user. |
||
722 | foreach(objlib ${objlibs}) |
||
723 | add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS}) |
||
724 | endforeach() |
||
725 | endif() |
||
726 | |||
727 | if(ARG_SHARED OR ARG_MODULE) |
||
728 | llvm_externalize_debuginfo(${name}) |
||
729 | llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH}) |
||
730 | endif() |
||
731 | # clang and newer versions of ninja use high-resolutions timestamps, |
||
732 | # but older versions of libtool on Darwin don't, so the archive will |
||
733 | # often get an older timestamp than the last object that was added |
||
734 | # or updated. To fix this, we add a custom command to touch archive |
||
735 | # after it's been built so that ninja won't rebuild it unnecessarily |
||
736 | # the next time it's run. |
||
737 | if(ARG_STATIC AND LLVM_TOUCH_STATIC_LIBRARIES) |
||
738 | add_custom_command(TARGET ${name} |
||
739 | POST_BUILD |
||
740 | COMMAND touch ${LLVM_LIBRARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${name}${CMAKE_STATIC_LIBRARY_SUFFIX} |
||
741 | ) |
||
742 | endif() |
||
743 | endfunction() |
||
744 | |||
745 | function(add_llvm_install_targets target) |
||
746 | cmake_parse_arguments(ARG "" "COMPONENT;PREFIX;SYMLINK" "DEPENDS" ${ARGN}) |
||
747 | if(ARG_COMPONENT) |
||
748 | set(component_option -DCMAKE_INSTALL_COMPONENT="${ARG_COMPONENT}") |
||
749 | endif() |
||
750 | if(ARG_PREFIX) |
||
751 | set(prefix_option -DCMAKE_INSTALL_PREFIX="${ARG_PREFIX}") |
||
752 | endif() |
||
753 | |||
754 | set(file_dependencies) |
||
755 | set(target_dependencies) |
||
756 | foreach(dependency ${ARG_DEPENDS}) |
||
757 | if(TARGET ${dependency}) |
||
758 | list(APPEND target_dependencies ${dependency}) |
||
759 | else() |
||
760 | list(APPEND file_dependencies ${dependency}) |
||
761 | endif() |
||
762 | endforeach() |
||
763 | |||
764 | add_custom_target(${target} |
||
765 | DEPENDS ${file_dependencies} |
||
766 | COMMAND "${CMAKE_COMMAND}" |
||
767 | ${component_option} |
||
768 | ${prefix_option} |
||
769 | -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" |
||
770 | USES_TERMINAL) |
||
771 | set_target_properties(${target} PROPERTIES FOLDER "Component Install Targets") |
||
772 | add_custom_target(${target}-stripped |
||
773 | DEPENDS ${file_dependencies} |
||
774 | COMMAND "${CMAKE_COMMAND}" |
||
775 | ${component_option} |
||
776 | ${prefix_option} |
||
777 | -DCMAKE_INSTALL_DO_STRIP=1 |
||
778 | -P "${CMAKE_BINARY_DIR}/cmake_install.cmake" |
||
779 | USES_TERMINAL) |
||
780 | set_target_properties(${target}-stripped PROPERTIES FOLDER "Component Install Targets (Stripped)") |
||
781 | if(target_dependencies) |
||
782 | add_dependencies(${target} ${target_dependencies}) |
||
783 | add_dependencies(${target}-stripped ${target_dependencies}) |
||
784 | endif() |
||
785 | |||
786 | if(ARG_SYMLINK) |
||
787 | add_dependencies(${target} install-${ARG_SYMLINK}) |
||
788 | add_dependencies(${target}-stripped install-${ARG_SYMLINK}-stripped) |
||
789 | endif() |
||
790 | endfunction() |
||
791 | |||
792 | # Define special targets that behave like a component group. They don't have any |
||
793 | # source attached but other components can add themselves to them. If the |
||
794 | # component supports is a Target and it supports JIT compilation, HAS_JIT must |
||
795 | # be passed. One can use ADD_TO_COMPONENT option from add_llvm_component_library |
||
796 | # to link extra component into an existing group. |
||
797 | function(add_llvm_component_group name) |
||
798 | cmake_parse_arguments(ARG "HAS_JIT" "" "LINK_COMPONENTS" ${ARGN}) |
||
799 | add_custom_target(${name}) |
||
800 | if(ARG_HAS_JIT) |
||
801 | set_property(TARGET ${name} PROPERTY COMPONENT_HAS_JIT ON) |
||
802 | endif() |
||
803 | if(ARG_LINK_COMPONENTS) |
||
804 | set_property(TARGET ${name} PROPERTY LLVM_LINK_COMPONENTS ${ARG_LINK_COMPONENTS}) |
||
805 | endif() |
||
806 | endfunction() |
||
807 | |||
808 | # An LLVM component is a cmake target with the following cmake properties |
||
809 | # eventually set: |
||
810 | # - LLVM_COMPONENT_NAME: the name of the component, which can be the name of |
||
811 | # the associated library or the one specified through COMPONENT_NAME |
||
812 | # - LLVM_LINK_COMPONENTS: a list of component this component depends on |
||
813 | # - COMPONENT_HAS_JIT: (only for group component) whether this target group |
||
814 | # supports JIT compilation |
||
815 | # Additionnaly, the ADD_TO_COMPONENT <component> option make it possible to add this |
||
816 | # component to the LLVM_LINK_COMPONENTS of <component>. |
||
817 | function(add_llvm_component_library name) |
||
818 | cmake_parse_arguments(ARG |
||
819 | "" |
||
820 | "COMPONENT_NAME;ADD_TO_COMPONENT" |
||
821 | "" |
||
822 | ${ARGN}) |
||
823 | add_llvm_library(${name} COMPONENT_LIB ${ARG_UNPARSED_ARGUMENTS}) |
||
824 | string(REGEX REPLACE "^LLVM" "" component_name ${name}) |
||
825 | set_property(TARGET ${name} PROPERTY LLVM_COMPONENT_NAME ${component_name}) |
||
826 | |||
827 | if(ARG_COMPONENT_NAME) |
||
828 | set_property(GLOBAL PROPERTY LLVM_COMPONENT_NAME_${ARG_COMPONENT_NAME} ${component_name}) |
||
829 | endif() |
||
830 | |||
831 | if(ARG_ADD_TO_COMPONENT) |
||
832 | set_property(TARGET ${ARG_ADD_TO_COMPONENT} APPEND PROPERTY LLVM_LINK_COMPONENTS ${component_name}) |
||
833 | endif() |
||
834 | |||
835 | endfunction() |
||
836 | |||
837 | macro(add_llvm_library name) |
||
838 | cmake_parse_arguments(ARG |
||
839 | "SHARED;BUILDTREE_ONLY;MODULE;INSTALL_WITH_TOOLCHAIN" |
||
840 | "" |
||
841 | "" |
||
842 | ${ARGN}) |
||
843 | if(ARG_MODULE) |
||
844 | llvm_add_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS}) |
||
845 | elseif( BUILD_SHARED_LIBS OR ARG_SHARED ) |
||
846 | llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS}) |
||
847 | else() |
||
848 | llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS}) |
||
849 | endif() |
||
850 | |||
851 | # Libraries that are meant to only be exposed via the build tree only are |
||
852 | # never installed and are only exported as a target in the special build tree |
||
853 | # config file. |
||
854 | if (NOT ARG_BUILDTREE_ONLY AND NOT ARG_MODULE) |
||
855 | set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} ) |
||
856 | set(in_llvm_libs YES) |
||
857 | endif() |
||
858 | |||
859 | if (ARG_MODULE AND NOT TARGET ${name}) |
||
860 | # Add empty "phony" target |
||
861 | add_custom_target(${name}) |
||
862 | elseif( EXCLUDE_FROM_ALL ) |
||
863 | set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON) |
||
864 | elseif(ARG_BUILDTREE_ONLY) |
||
865 | set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name}) |
||
866 | else() |
||
867 | if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ARG_INSTALL_WITH_TOOLCHAIN) |
||
868 | if(in_llvm_libs) |
||
869 | set(umbrella UMBRELLA llvm-libraries) |
||
870 | else() |
||
871 | set(umbrella) |
||
872 | endif() |
||
873 | |||
874 | get_target_export_arg(${name} LLVM export_to_llvmexports ${umbrella}) |
||
875 | install(TARGETS ${name} |
||
876 | ${export_to_llvmexports} |
||
877 | LIBRARY DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} |
||
878 | ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX} COMPONENT ${name} |
||
879 | RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT ${name}) |
||
880 | |||
881 | if (NOT LLVM_ENABLE_IDE) |
||
882 | add_llvm_install_targets(install-${name} |
||
883 | DEPENDS ${name} |
||
884 | COMPONENT ${name}) |
||
885 | endif() |
||
886 | endif() |
||
887 | set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) |
||
888 | endif() |
||
889 | if (ARG_MODULE) |
||
890 | set_target_properties(${name} PROPERTIES FOLDER "Loadable modules") |
||
891 | else() |
||
892 | set_target_properties(${name} PROPERTIES FOLDER "Libraries") |
||
893 | endif() |
||
894 | endmacro(add_llvm_library name) |
||
895 | |||
896 | macro(generate_llvm_objects name) |
||
897 | cmake_parse_arguments(ARG "GENERATE_DRIVER" "" "DEPENDS" ${ARGN}) |
||
898 | |||
899 | llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ) |
||
900 | |||
901 | list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS}) |
||
902 | |||
903 | # Generate objlib |
||
904 | if(LLVM_ENABLE_OBJLIB OR (ARG_GENERATE_DRIVER AND LLVM_TOOL_LLVM_DRIVER_BUILD)) |
||
905 | # Generate an obj library for both targets. |
||
906 | set(obj_name "obj.${name}") |
||
907 | add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL |
||
908 | ${ALL_FILES} |
||
909 | ) |
||
910 | llvm_update_compile_flags(${obj_name}) |
||
911 | set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>") |
||
912 | if(ARG_DEPENDS) |
||
913 | add_dependencies(${obj_name} ${ARG_DEPENDS}) |
||
914 | endif() |
||
915 | |||
916 | set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries") |
||
917 | endif() |
||
918 | |||
919 | if (ARG_GENERATE_DRIVER) |
||
920 | string(REPLACE "-" "_" TOOL_NAME ${name}) |
||
921 | foreach(path ${CMAKE_MODULE_PATH}) |
||
922 | if(EXISTS ${path}/llvm-driver-template.cpp.in) |
||
923 | configure_file( |
||
924 | ${path}/llvm-driver-template.cpp.in |
||
925 | ${CMAKE_CURRENT_BINARY_DIR}/${name}-driver.cpp) |
||
926 | break() |
||
927 | endif() |
||
928 | endforeach() |
||
929 | |||
930 | list(APPEND ALL_FILES ${CMAKE_CURRENT_BINARY_DIR}/${name}-driver.cpp) |
||
931 | |||
932 | if (LLVM_TOOL_LLVM_DRIVER_BUILD |
||
933 | AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS) |
||
934 | ) |
||
935 | set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_COMPONENTS ${LLVM_LINK_COMPONENTS}) |
||
936 | set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_DEPS ${ARG_DEPENDS} ${LLVM_COMMON_DEPENDS}) |
||
937 | set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_OBJLIBS "${obj_name}") |
||
938 | |||
939 | set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOLS ${name}) |
||
940 | set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${name} ${name}) |
||
941 | target_link_libraries(${obj_name} ${LLVM_PTHREAD_LIB}) |
||
942 | llvm_config(${obj_name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} ) |
||
943 | endif() |
||
944 | endif() |
||
945 | endmacro() |
||
946 | |||
947 | macro(add_llvm_executable name) |
||
948 | cmake_parse_arguments(ARG |
||
949 | "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH;SUPPORT_PLUGINS" |
||
950 | "ENTITLEMENTS;BUNDLE_PATH" |
||
951 | "" |
||
952 | ${ARGN}) |
||
953 | generate_llvm_objects(${name} ${ARG_UNPARSED_ARGUMENTS}) |
||
954 | add_windows_version_resource_file(ALL_FILES ${ALL_FILES}) |
||
955 | |||
956 | if(XCODE) |
||
957 | # Note: the dummy.cpp source file provides no definitions. However, |
||
958 | # it forces Xcode to properly link the static library. |
||
959 | list(APPEND ALL_FILES "${LLVM_MAIN_SRC_DIR}/cmake/dummy.cpp") |
||
960 | endif() |
||
961 | |||
962 | if( EXCLUDE_FROM_ALL ) |
||
963 | add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES}) |
||
964 | else() |
||
965 | add_executable(${name} ${ALL_FILES}) |
||
966 | endif() |
||
967 | |||
968 | setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS}) |
||
969 | |||
970 | if(NOT ARG_NO_INSTALL_RPATH) |
||
971 | llvm_setup_rpath(${name}) |
||
972 | elseif(NOT "${LLVM_LOCAL_RPATH}" STREQUAL "") |
||
973 | # Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set. |
||
974 | if("${CMAKE_BUILD_RPATH}" STREQUAL "") |
||
975 | set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON) |
||
976 | endif() |
||
977 | |||
978 | set_property(TARGET ${name} PROPERTY INSTALL_RPATH "${LLVM_LOCAL_RPATH}") |
||
979 | endif() |
||
980 | |||
981 | if(DEFINED windows_resource_file) |
||
982 | set_windows_version_resource_properties(${name} ${windows_resource_file}) |
||
983 | endif() |
||
984 | |||
985 | # $<TARGET_OBJECTS> doesn't require compile flags. |
||
986 | if(NOT LLVM_ENABLE_OBJLIB) |
||
987 | llvm_update_compile_flags(${name}) |
||
988 | endif() |
||
989 | |||
990 | if (ARG_SUPPORT_PLUGINS AND NOT ${CMAKE_SYSTEM_NAME} MATCHES "AIX") |
||
991 | set(LLVM_NO_DEAD_STRIP On) |
||
992 | endif() |
||
993 | |||
994 | add_link_opts( ${name} ) |
||
995 | |||
996 | # Do not add -Dname_EXPORTS to the command-line when building files in this |
||
997 | # target. Doing so is actively harmful for the modules build because it |
||
998 | # creates extra module variants, and not useful because we don't use these |
||
999 | # macros. |
||
1000 | set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" ) |
||
1001 | |||
1002 | if (LLVM_EXPORTED_SYMBOL_FILE) |
||
1003 | add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} ) |
||
1004 | endif(LLVM_EXPORTED_SYMBOL_FILE) |
||
1005 | |||
1006 | if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB) |
||
1007 | set(USE_SHARED USE_SHARED) |
||
1008 | endif() |
||
1009 | |||
1010 | set(EXCLUDE_FROM_ALL OFF) |
||
1011 | set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR}) |
||
1012 | llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} ) |
||
1013 | if( LLVM_COMMON_DEPENDS ) |
||
1014 | add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} ) |
||
1015 | foreach(objlib ${obj_name}) |
||
1016 | add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS}) |
||
1017 | endforeach() |
||
1018 | endif( LLVM_COMMON_DEPENDS ) |
||
1019 | |||
1020 | if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO) |
||
1021 | llvm_externalize_debuginfo(${name}) |
||
1022 | endif() |
||
1023 | if (LLVM_PTHREAD_LIB) |
||
1024 | # libpthreads overrides some standard library symbols, so main |
||
1025 | # executable must be linked with it in order to provide consistent |
||
1026 | # API for all shared libaries loaded by this executable. |
||
1027 | target_link_libraries(${name} PRIVATE ${LLVM_PTHREAD_LIB}) |
||
1028 | endif() |
||
1029 | |||
1030 | llvm_codesign(${name} ENTITLEMENTS ${ARG_ENTITLEMENTS} BUNDLE_PATH ${ARG_BUNDLE_PATH}) |
||
1031 | endmacro(add_llvm_executable name) |
||
1032 | |||
1033 | # add_llvm_pass_plugin(name [NO_MODULE] ...) |
||
1034 | # Add ${name} as an llvm plugin. |
||
1035 | # If option LLVM_${name_upper}_LINK_INTO_TOOLS is set to ON, the plugin is registered statically. |
||
1036 | # Otherwise a pluggable shared library is registered. |
||
1037 | # |
||
1038 | # If NO_MODULE is specified, when option LLVM_${name_upper}_LINK_INTO_TOOLS is set to OFF, |
||
1039 | # only an object library is built, and no module is built. This is specific to the Polly use case. |
||
1040 | # |
||
1041 | # The SUBPROJECT argument contains the LLVM project the plugin belongs |
||
1042 | # to. If set, the plugin will link statically by default it if the |
||
1043 | # project was enabled. |
||
1044 | function(add_llvm_pass_plugin name) |
||
1045 | cmake_parse_arguments(ARG |
||
1046 | "NO_MODULE" "SUBPROJECT" "" |
||
1047 | ${ARGN}) |
||
1048 | |||
1049 | string(TOUPPER ${name} name_upper) |
||
1050 | |||
1051 | # Enable the plugin by default if it was explicitly enabled by the user. |
||
1052 | # Note: If was set to "all", LLVM's CMakeLists.txt replaces it with a |
||
1053 | # list of all projects, counting as explicitly enabled. |
||
1054 | set(link_into_tools_default OFF) |
||
1055 | if (ARG_SUBPROJECT AND LLVM_TOOL_${name_upper}_BUILD) |
||
1056 | set(link_into_tools_default ON) |
||
1057 | endif() |
||
1058 | option(LLVM_${name_upper}_LINK_INTO_TOOLS "Statically link ${name} into tools (if available)" ${link_into_tools_default}) |
||
1059 | |||
1060 | # If we statically link the plugin, don't use llvm dylib because we're going |
||
1061 | # to be part of it. |
||
1062 | if(LLVM_${name_upper}_LINK_INTO_TOOLS) |
||
1063 | list(APPEND ARG_UNPARSED_ARGUMENTS DISABLE_LLVM_LINK_LLVM_DYLIB) |
||
1064 | endif() |
||
1065 | |||
1066 | if(LLVM_${name_upper}_LINK_INTO_TOOLS) |
||
1067 | list(REMOVE_ITEM ARG_UNPARSED_ARGUMENTS BUILDTREE_ONLY) |
||
1068 | # process_llvm_pass_plugins takes care of the actual linking, just create an |
||
1069 | # object library as of now |
||
1070 | add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS}) |
||
1071 | target_compile_definitions(${name} PRIVATE LLVM_${name_upper}_LINK_INTO_TOOLS) |
||
1072 | set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS LLVM_LINK_INTO_TOOLS) |
||
1073 | if (TARGET intrinsics_gen) |
||
1074 | add_dependencies(obj.${name} intrinsics_gen) |
||
1075 | endif() |
||
1076 | if (TARGET omp_gen) |
||
1077 | add_dependencies(obj.${name} omp_gen) |
||
1078 | endif() |
||
1079 | if (TARGET acc_gen) |
||
1080 | add_dependencies(obj.${name} acc_gen) |
||
1081 | endif() |
||
1082 | set_property(GLOBAL APPEND PROPERTY LLVM_STATIC_EXTENSIONS ${name}) |
||
1083 | elseif(NOT ARG_NO_MODULE) |
||
1084 | add_llvm_library(${name} MODULE ${ARG_UNPARSED_ARGUMENTS}) |
||
1085 | else() |
||
1086 | add_llvm_library(${name} OBJECT ${ARG_UNPARSED_ARGUMENTS}) |
||
1087 | endif() |
||
1088 | message(STATUS "Registering ${name} as a pass plugin (static build: ${LLVM_${name_upper}_LINK_INTO_TOOLS})") |
||
1089 | |||
1090 | endfunction(add_llvm_pass_plugin) |
||
1091 | |||
1092 | # process_llvm_pass_plugins([GEN_CONFIG]) |
||
1093 | # |
||
1094 | # Correctly set lib dependencies between plugins and tools, based on tools |
||
1095 | # registered with the ENABLE_PLUGINS option. |
||
1096 | # |
||
1097 | # if GEN_CONFIG option is set, also generate X Macro file for extension |
||
1098 | # handling. It provides a HANDLE_EXTENSION(extension_namespace, ExtensionProject) |
||
1099 | # call for each extension allowing client code to define |
||
1100 | # HANDLE_EXTENSION to have a specific code be run for each extension. |
||
1101 | # |
||
1102 | function(process_llvm_pass_plugins) |
||
1103 | cmake_parse_arguments(ARG |
||
1104 | "GEN_CONFIG" "" "" |
||
1105 | ${ARGN}) |
||
1106 | |||
1107 | if(ARG_GEN_CONFIG) |
||
1108 | get_property(LLVM_STATIC_EXTENSIONS GLOBAL PROPERTY LLVM_STATIC_EXTENSIONS) |
||
1109 | else() |
||
1110 | include(LLVMConfigExtensions) |
||
1111 | endif() |
||
1112 | |||
1113 | # Add static plugins to the Extension component |
||
1114 | foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) |
||
1115 | set_property(TARGET LLVMExtensions APPEND PROPERTY LINK_LIBRARIES ${llvm_extension}) |
||
1116 | set_property(TARGET LLVMExtensions APPEND PROPERTY INTERFACE_LINK_LIBRARIES ${llvm_extension}) |
||
1117 | endforeach() |
||
1118 | |||
1119 | # Eventually generate the extension headers, and store config to a cmake file |
||
1120 | # for usage in third-party configuration. |
||
1121 | if(ARG_GEN_CONFIG) |
||
1122 | |||
1123 | ## Part 1: Extension header to be included whenever we need extension |
||
1124 | # processing. |
||
1125 | if(NOT DEFINED LLVM_INSTALL_PACKAGE_DIR) |
||
1126 | message(FATAL_ERROR "LLVM_INSTALL_PACKAGE_DIR must be defined and writable. GEN_CONFIG should only be passe when building LLVM proper.") |
||
1127 | endif() |
||
1128 | # LLVM_INSTALL_PACKAGE_DIR might be absolute, so don't reuse below. |
||
1129 | string(REPLACE "${CMAKE_CFG_INTDIR}" "." llvm_cmake_builddir "${LLVM_LIBRARY_DIR}") |
||
1130 | set(llvm_cmake_builddir "${llvm_cmake_builddir}/cmake/llvm") |
||
1131 | file(WRITE |
||
1132 | "${llvm_cmake_builddir}/LLVMConfigExtensions.cmake" |
||
1133 | "set(LLVM_STATIC_EXTENSIONS ${LLVM_STATIC_EXTENSIONS})") |
||
1134 | install(FILES |
||
1135 | ${llvm_cmake_builddir}/LLVMConfigExtensions.cmake |
||
1136 | DESTINATION ${LLVM_INSTALL_PACKAGE_DIR} |
||
1137 | COMPONENT cmake-exports) |
||
1138 | |||
1139 | set(ExtensionDef "${LLVM_BINARY_DIR}/include/llvm/Support/Extension.def") |
||
1140 | file(WRITE "${ExtensionDef}.tmp" "//extension handlers\n") |
||
1141 | foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) |
||
1142 | file(APPEND "${ExtensionDef}.tmp" "HANDLE_EXTENSION(${llvm_extension})\n") |
||
1143 | endforeach() |
||
1144 | file(APPEND "${ExtensionDef}.tmp" "#undef HANDLE_EXTENSION\n") |
||
1145 | |||
1146 | # only replace if there's an actual change |
||
1147 | execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||
1148 | "${ExtensionDef}.tmp" |
||
1149 | "${ExtensionDef}") |
||
1150 | file(REMOVE "${ExtensionDef}.tmp") |
||
1151 | |||
1152 | ## Part 2: Extension header that captures each extension dependency, to be |
||
1153 | # used by llvm-config. |
||
1154 | set(ExtensionDeps "${LLVM_BINARY_DIR}/tools/llvm-config/ExtensionDependencies.inc") |
||
1155 | |||
1156 | # Max needed to correctly size the required library array. |
||
1157 | set(llvm_plugin_max_deps_length 0) |
||
1158 | foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) |
||
1159 | get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES) |
||
1160 | list(LENGTH llvm_plugin_deps llvm_plugin_deps_length) |
||
1161 | if(llvm_plugin_deps_length GREATER llvm_plugin_max_deps_length) |
||
1162 | set(llvm_plugin_max_deps_length ${llvm_plugin_deps_length}) |
||
1163 | endif() |
||
1164 | endforeach() |
||
1165 | |||
1166 | list(LENGTH LLVM_STATIC_EXTENSIONS llvm_static_extension_count) |
||
1167 | file(WRITE |
||
1168 | "${ExtensionDeps}.tmp" |
||
1169 | "#include <array>\n\ |
||
1170 | struct ExtensionDescriptor {\n\ |
||
1171 | const char* Name;\n\ |
||
1172 | const char* RequiredLibraries[1 + 1 + ${llvm_plugin_max_deps_length}];\n\ |
||
1173 | };\n\ |
||
1174 | std::array<ExtensionDescriptor, ${llvm_static_extension_count}> AvailableExtensions{\n") |
||
1175 | |||
1176 | foreach(llvm_extension ${LLVM_STATIC_EXTENSIONS}) |
||
1177 | get_property(llvm_plugin_deps TARGET ${llvm_extension} PROPERTY LINK_LIBRARIES) |
||
1178 | |||
1179 | file(APPEND "${ExtensionDeps}.tmp" "ExtensionDescriptor{\"${llvm_extension}\", {") |
||
1180 | foreach(llvm_plugin_dep ${llvm_plugin_deps}) |
||
1181 | # Turn library dependency back to component name, if possible. |
||
1182 | # That way llvm-config can avoid redundant dependencies. |
||
1183 | STRING(REGEX REPLACE "^-l" "" plugin_dep_name ${llvm_plugin_dep}) |
||
1184 | STRING(REGEX MATCH "^LLVM" is_llvm_library ${plugin_dep_name}) |
||
1185 | if(is_llvm_library) |
||
1186 | STRING(REGEX REPLACE "^LLVM" "" plugin_dep_name ${plugin_dep_name}) |
||
1187 | STRING(TOLOWER ${plugin_dep_name} plugin_dep_name) |
||
1188 | endif() |
||
1189 | file(APPEND "${ExtensionDeps}.tmp" "\"${plugin_dep_name}\", ") |
||
1190 | endforeach() |
||
1191 | |||
1192 | # Self + mandatory trailing null, because the number of RequiredLibraries differs between extensions. |
||
1193 | file(APPEND "${ExtensionDeps}.tmp" \"${llvm_extension}\", "nullptr}},\n") |
||
1194 | endforeach() |
||
1195 | file(APPEND "${ExtensionDeps}.tmp" "};\n") |
||
1196 | |||
1197 | # only replace if there's an actual change |
||
1198 | execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different |
||
1199 | "${ExtensionDeps}.tmp" |
||
1200 | "${ExtensionDeps}") |
||
1201 | file(REMOVE "${ExtensionDeps}.tmp") |
||
1202 | endif() |
||
1203 | endfunction() |
||
1204 | |||
1205 | function(export_executable_symbols target) |
||
1206 | if (LLVM_EXPORTED_SYMBOL_FILE) |
||
1207 | # The symbol file should contain the symbols we want the executable to |
||
1208 | # export |
||
1209 | set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1) |
||
1210 | elseif (LLVM_EXPORT_SYMBOLS_FOR_PLUGINS) |
||
1211 | # Extract the symbols to export from the static libraries that the |
||
1212 | # executable links against. |
||
1213 | set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1) |
||
1214 | set(exported_symbol_file ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${target}.symbols) |
||
1215 | # We need to consider not just the direct link dependencies, but also the |
||
1216 | # transitive link dependencies. Do this by starting with the set of direct |
||
1217 | # dependencies, then the dependencies of those dependencies, and so on. |
||
1218 | get_target_property(new_libs ${target} LINK_LIBRARIES) |
||
1219 | set(link_libs ${new_libs}) |
||
1220 | while(NOT "${new_libs}" STREQUAL "") |
||
1221 | foreach(lib ${new_libs}) |
||
1222 | if(TARGET ${lib}) |
||
1223 | get_target_property(lib_type ${lib} TYPE) |
||
1224 | if("${lib_type}" STREQUAL "STATIC_LIBRARY") |
||
1225 | list(APPEND static_libs ${lib}) |
||
1226 | else() |
||
1227 | list(APPEND other_libs ${lib}) |
||
1228 | endif() |
||
1229 | get_target_property(transitive_libs ${lib} INTERFACE_LINK_LIBRARIES) |
||
1230 | foreach(transitive_lib ${transitive_libs}) |
||
1231 | if(TARGET ${transitive_lib} AND NOT ${transitive_lib} IN_LIST link_libs) |
||
1232 | list(APPEND newer_libs ${transitive_lib}) |
||
1233 | list(APPEND link_libs ${transitive_lib}) |
||
1234 | endif() |
||
1235 | endforeach(transitive_lib) |
||
1236 | endif() |
||
1237 | endforeach(lib) |
||
1238 | set(new_libs ${newer_libs}) |
||
1239 | set(newer_libs "") |
||
1240 | endwhile() |
||
1241 | list(REMOVE_DUPLICATES static_libs) |
||
1242 | if (MSVC) |
||
1243 | set(mangling microsoft) |
||
1244 | else() |
||
1245 | set(mangling itanium) |
||
1246 | endif() |
||
1247 | add_custom_command(OUTPUT ${exported_symbol_file} |
||
1248 | COMMAND "${Python3_EXECUTABLE}" ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py ${LLVM_EXTRACT_SYMBOLS_FLAGS} --mangling=${mangling} ${static_libs} -o ${exported_symbol_file} |
||
1249 | WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR} |
||
1250 | DEPENDS ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py ${static_libs} |
||
1251 | VERBATIM |
||
1252 | COMMENT "Generating export list for ${target}") |
||
1253 | add_llvm_symbol_exports( ${target} ${exported_symbol_file} ) |
||
1254 | # If something links against this executable then we want a |
||
1255 | # transitive link against only the libraries whose symbols |
||
1256 | # we aren't exporting. |
||
1257 | set_target_properties(${target} PROPERTIES INTERFACE_LINK_LIBRARIES "${other_libs}") |
||
1258 | # The default import library suffix that cmake uses for cygwin/mingw is |
||
1259 | # ".dll.a", but for clang.exe that causes a collision with libclang.dll, |
||
1260 | # where the import libraries of both get named libclang.dll.a. Use a suffix |
||
1261 | # of ".exe.a" to avoid this. |
||
1262 | if(CYGWIN OR MINGW) |
||
1263 | set_target_properties(${target} PROPERTIES IMPORT_SUFFIX ".exe.a") |
||
1264 | endif() |
||
1265 | elseif(NOT (WIN32 OR CYGWIN)) |
||
1266 | # On Windows auto-exporting everything doesn't work because of the limit on |
||
1267 | # the size of the exported symbol table, but on other platforms we can do |
||
1268 | # it without any trouble. |
||
1269 | set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1) |
||
1270 | if (APPLE) |
||
1271 | set_property(TARGET ${target} APPEND_STRING PROPERTY |
||
1272 | LINK_FLAGS " -rdynamic") |
||
1273 | endif() |
||
1274 | endif() |
||
1275 | endfunction() |
||
1276 | |||
1277 | # Export symbols if LLVM plugins are enabled. |
||
1278 | function(export_executable_symbols_for_plugins target) |
||
1279 | if(LLVM_ENABLE_PLUGINS OR LLVM_EXPORT_SYMBOLS_FOR_PLUGINS) |
||
1280 | export_executable_symbols(${target}) |
||
1281 | endif() |
||
1282 | endfunction() |
||
1283 | |||
1284 | if(NOT LLVM_TOOLCHAIN_TOOLS) |
||
1285 | set (LLVM_TOOLCHAIN_TOOLS |
||
1286 | llvm-ar |
||
1287 | llvm-cov |
||
1288 | llvm-cxxfilt |
||
1289 | llvm-dwp |
||
1290 | llvm-ranlib |
||
1291 | llvm-lib |
||
1292 | llvm-ml |
||
1293 | llvm-nm |
||
1294 | llvm-objcopy |
||
1295 | llvm-objdump |
||
1296 | llvm-pdbutil |
||
1297 | llvm-rc |
||
1298 | llvm-readobj |
||
1299 | llvm-size |
||
1300 | llvm-strings |
||
1301 | llvm-strip |
||
1302 | llvm-profdata |
||
1303 | llvm-symbolizer |
||
1304 | # symlink version of some of above tools that are enabled by |
||
1305 | # LLVM_INSTALL_BINUTILS_SYMLINKS. |
||
1306 | addr2line |
||
1307 | ar |
||
1308 | c++filt |
||
1309 | ranlib |
||
1310 | nm |
||
1311 | objcopy |
||
1312 | objdump |
||
1313 | readelf |
||
1314 | size |
||
1315 | strings |
||
1316 | strip |
||
1317 | ) |
||
1318 | endif() |
||
1319 | |||
1320 | macro(llvm_add_tool project name) |
||
1321 | cmake_parse_arguments(ARG "DEPENDS;GENERATE_DRIVER" "" "" ${ARGN}) |
||
1322 | if( NOT LLVM_BUILD_TOOLS ) |
||
1323 | set(EXCLUDE_FROM_ALL ON) |
||
1324 | endif() |
||
1325 | if(ARG_GENERATE_DRIVER |
||
1326 | AND LLVM_TOOL_LLVM_DRIVER_BUILD |
||
1327 | AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS) |
||
1328 | ) |
||
1329 | generate_llvm_objects(${name} ${ARGN}) |
||
1330 | add_custom_target(${name} DEPENDS llvm-driver) |
||
1331 | else() |
||
1332 | add_llvm_executable(${name} ${ARGN}) |
||
1333 | |||
1334 | if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
||
1335 | if( LLVM_BUILD_TOOLS ) |
||
1336 | get_target_export_arg(${name} LLVM export_to_llvmexports) |
||
1337 | install(TARGETS ${name} |
||
1338 | ${export_to_llvmexports} |
||
1339 | RUNTIME DESTINATION ${${project}_TOOLS_INSTALL_DIR} |
||
1340 | COMPONENT ${name}) |
||
1341 | |||
1342 | if (NOT LLVM_ENABLE_IDE) |
||
1343 | add_llvm_install_targets(install-${name} |
||
1344 | DEPENDS ${name} |
||
1345 | COMPONENT ${name}) |
||
1346 | endif() |
||
1347 | endif() |
||
1348 | endif() |
||
1349 | if( LLVM_BUILD_TOOLS ) |
||
1350 | set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) |
||
1351 | endif() |
||
1352 | set_target_properties(${name} PROPERTIES FOLDER "Tools") |
||
1353 | endif() |
||
1354 | endmacro(llvm_add_tool project name) |
||
1355 | |||
1356 | macro(add_llvm_tool name) |
||
1357 | llvm_add_tool(LLVM ${ARGV}) |
||
1358 | endmacro() |
||
1359 | |||
1360 | |||
1361 | macro(add_llvm_example name) |
||
1362 | if( NOT LLVM_BUILD_EXAMPLES ) |
||
1363 | set(EXCLUDE_FROM_ALL ON) |
||
1364 | endif() |
||
1365 | add_llvm_executable(${name} ${ARGN}) |
||
1366 | if( LLVM_BUILD_EXAMPLES ) |
||
1367 | install(TARGETS ${name} RUNTIME DESTINATION "${LLVM_EXAMPLES_INSTALL_DIR}") |
||
1368 | endif() |
||
1369 | set_target_properties(${name} PROPERTIES FOLDER "Examples") |
||
1370 | endmacro(add_llvm_example name) |
||
1371 | |||
1372 | macro(add_llvm_example_library name) |
||
1373 | if( NOT LLVM_BUILD_EXAMPLES ) |
||
1374 | set(EXCLUDE_FROM_ALL ON) |
||
1375 | add_llvm_library(${name} BUILDTREE_ONLY ${ARGN}) |
||
1376 | else() |
||
1377 | add_llvm_library(${name} ${ARGN}) |
||
1378 | endif() |
||
1379 | |||
1380 | set_target_properties(${name} PROPERTIES FOLDER "Examples") |
||
1381 | endmacro(add_llvm_example_library name) |
||
1382 | |||
1383 | # This is a macro that is used to create targets for executables that are needed |
||
1384 | # for development, but that are not intended to be installed by default. |
||
1385 | macro(add_llvm_utility name) |
||
1386 | if ( NOT LLVM_BUILD_UTILS ) |
||
1387 | set(EXCLUDE_FROM_ALL ON) |
||
1388 | endif() |
||
1389 | |||
1390 | add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN}) |
||
1391 | set_target_properties(${name} PROPERTIES FOLDER "Utils") |
||
1392 | if ( ${name} IN_LIST LLVM_TOOLCHAIN_UTILITIES OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) |
||
1393 | if (LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS) |
||
1394 | get_target_export_arg(${name} LLVM export_to_llvmexports) |
||
1395 | install(TARGETS ${name} |
||
1396 | ${export_to_llvmexports} |
||
1397 | RUNTIME DESTINATION ${LLVM_UTILS_INSTALL_DIR} |
||
1398 | COMPONENT ${name}) |
||
1399 | |||
1400 | if (NOT LLVM_ENABLE_IDE) |
||
1401 | add_llvm_install_targets(install-${name} |
||
1402 | DEPENDS ${name} |
||
1403 | COMPONENT ${name}) |
||
1404 | endif() |
||
1405 | set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name}) |
||
1406 | elseif(LLVM_BUILD_UTILS) |
||
1407 | set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name}) |
||
1408 | endif() |
||
1409 | endif() |
||
1410 | endmacro(add_llvm_utility name) |
||
1411 | |||
1412 | macro(add_llvm_fuzzer name) |
||
1413 | cmake_parse_arguments(ARG "" "DUMMY_MAIN" "" ${ARGN}) |
||
1414 | if( LLVM_LIB_FUZZING_ENGINE ) |
||
1415 | set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN}) |
||
1416 | add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS}) |
||
1417 | target_link_libraries(${name} PRIVATE ${LLVM_LIB_FUZZING_ENGINE}) |
||
1418 | set_target_properties(${name} PROPERTIES FOLDER "Fuzzers") |
||
1419 | elseif( LLVM_USE_SANITIZE_COVERAGE ) |
||
1420 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=fuzzer") |
||
1421 | set(LLVM_OPTIONAL_SOURCES ${ARG_DUMMY_MAIN}) |
||
1422 | add_llvm_executable(${name} ${ARG_UNPARSED_ARGUMENTS}) |
||
1423 | set_target_properties(${name} PROPERTIES FOLDER "Fuzzers") |
||
1424 | elseif( ARG_DUMMY_MAIN ) |
||
1425 | add_llvm_executable(${name} ${ARG_DUMMY_MAIN} ${ARG_UNPARSED_ARGUMENTS}) |
||
1426 | set_target_properties(${name} PROPERTIES FOLDER "Fuzzers") |
||
1427 | endif() |
||
1428 | endmacro() |
||
1429 | |||
1430 | macro(add_llvm_target target_name) |
||
1431 | include_directories(BEFORE |
||
1432 | ${CMAKE_CURRENT_BINARY_DIR} |
||
1433 | ${CMAKE_CURRENT_SOURCE_DIR}) |
||
1434 | add_llvm_component_library(LLVM${target_name} ${ARGN}) |
||
1435 | set( CURRENT_LLVM_TARGET LLVM${target_name} ) |
||
1436 | endmacro(add_llvm_target) |
||
1437 | |||
1438 | function(canonicalize_tool_name name output) |
||
1439 | string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" nameStrip ${name}) |
||
1440 | string(REPLACE "-" "_" nameUNDERSCORE ${nameStrip}) |
||
1441 | string(TOUPPER ${nameUNDERSCORE} nameUPPER) |
||
1442 | set(${output} "${nameUPPER}" PARENT_SCOPE) |
||
1443 | endfunction(canonicalize_tool_name) |
||
1444 | |||
1445 | # Custom add_subdirectory wrapper |
||
1446 | # Takes in a project name (i.e. LLVM), the subdirectory name, and an optional |
||
1447 | # path if it differs from the name. |
||
1448 | function(add_llvm_subdirectory project type name) |
||
1449 | set(add_llvm_external_dir "${ARGN}") |
||
1450 | if("${add_llvm_external_dir}" STREQUAL "") |
||
1451 | set(add_llvm_external_dir ${name}) |
||
1452 | endif() |
||
1453 | canonicalize_tool_name(${name} nameUPPER) |
||
1454 | set(canonical_full_name ${project}_${type}_${nameUPPER}) |
||
1455 | get_property(already_processed GLOBAL PROPERTY ${canonical_full_name}_PROCESSED) |
||
1456 | if(already_processed) |
||
1457 | return() |
||
1458 | endif() |
||
1459 | set_property(GLOBAL PROPERTY ${canonical_full_name}_PROCESSED YES) |
||
1460 | |||
1461 | if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt) |
||
1462 | # Treat it as in-tree subproject. |
||
1463 | option(${canonical_full_name}_BUILD |
||
1464 | "Whether to build ${name} as part of ${project}" On) |
||
1465 | mark_as_advanced(${project}_${type}_${name}_BUILD) |
||
1466 | if(${canonical_full_name}_BUILD) |
||
1467 | add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir}) |
||
1468 | endif() |
||
1469 | else() |
||
1470 | set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR |
||
1471 | "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" |
||
1472 | CACHE PATH "Path to ${name} source directory") |
||
1473 | set(${canonical_full_name}_BUILD_DEFAULT ON) |
||
1474 | if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}) |
||
1475 | set(${canonical_full_name}_BUILD_DEFAULT OFF) |
||
1476 | endif() |
||
1477 | if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF") |
||
1478 | set(${canonical_full_name}_BUILD_DEFAULT OFF) |
||
1479 | endif() |
||
1480 | option(${canonical_full_name}_BUILD |
||
1481 | "Whether to build ${name} as part of LLVM" |
||
1482 | ${${canonical_full_name}_BUILD_DEFAULT}) |
||
1483 | if (${canonical_full_name}_BUILD) |
||
1484 | if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}) |
||
1485 | add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir}) |
||
1486 | elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "") |
||
1487 | message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}") |
||
1488 | endif() |
||
1489 | endif() |
||
1490 | endif() |
||
1491 | endfunction() |
||
1492 | |||
1493 | # Add external project that may want to be built as part of llvm such as Clang, |
||
1494 | # lld, and Polly. This adds two options. One for the source directory of the |
||
1495 | # project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to |
||
1496 | # enable or disable building it with everything else. |
||
1497 | # Additional parameter can be specified as the name of directory. |
||
1498 | macro(add_llvm_external_project name) |
||
1499 | add_llvm_subdirectory(LLVM TOOL ${name} ${ARGN}) |
||
1500 | endmacro() |
||
1501 | |||
1502 | macro(add_llvm_tool_subdirectory name) |
||
1503 | add_llvm_external_project(${name}) |
||
1504 | endmacro(add_llvm_tool_subdirectory) |
||
1505 | |||
1506 | function(get_project_name_from_src_var var output) |
||
1507 | string(REGEX MATCH "LLVM_EXTERNAL_(.*)_SOURCE_DIR" |
||
1508 | MACHED_TOOL "${var}") |
||
1509 | if(MACHED_TOOL) |
||
1510 | set(${output} ${CMAKE_MATCH_1} PARENT_SCOPE) |
||
1511 | else() |
||
1512 | set(${output} PARENT_SCOPE) |
||
1513 | endif() |
||
1514 | endfunction() |
||
1515 | |||
1516 | function(create_subdirectory_options project type) |
||
1517 | file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*") |
||
1518 | foreach(dir ${sub-dirs}) |
||
1519 | if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt") |
||
1520 | canonicalize_tool_name(${dir} name) |
||
1521 | option(${project}_${type}_${name}_BUILD |
||
1522 | "Whether to build ${name} as part of ${project}" On) |
||
1523 | mark_as_advanced(${project}_${type}_${name}_BUILD) |
||
1524 | endif() |
||
1525 | endforeach() |
||
1526 | endfunction(create_subdirectory_options) |
||
1527 | |||
1528 | function(create_llvm_tool_options) |
||
1529 | create_subdirectory_options(LLVM TOOL) |
||
1530 | endfunction(create_llvm_tool_options) |
||
1531 | |||
1532 | function(llvm_add_implicit_projects project) |
||
1533 | set(list_of_implicit_subdirs "") |
||
1534 | file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*") |
||
1535 | foreach(dir ${sub-dirs}) |
||
1536 | if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt") |
||
1537 | canonicalize_tool_name(${dir} name) |
||
1538 | # I don't like special casing things by order, but the llvm-driver ends up |
||
1539 | # linking the object libraries from all the tools that opt-in, so adding |
||
1540 | # it separately at the end is probably the simplest case. |
||
1541 | if("${name}" STREQUAL "LLVM_DRIVER") |
||
1542 | continue() |
||
1543 | endif() |
||
1544 | if (${project}_TOOL_${name}_BUILD) |
||
1545 | get_filename_component(fn "${dir}" NAME) |
||
1546 | list(APPEND list_of_implicit_subdirs "${fn}") |
||
1547 | endif() |
||
1548 | endif() |
||
1549 | endforeach() |
||
1550 | |||
1551 | foreach(external_proj ${list_of_implicit_subdirs}) |
||
1552 | add_llvm_subdirectory(${project} TOOL "${external_proj}" ${ARGN}) |
||
1553 | endforeach() |
||
1554 | endfunction(llvm_add_implicit_projects) |
||
1555 | |||
1556 | function(add_llvm_implicit_projects) |
||
1557 | llvm_add_implicit_projects(LLVM) |
||
1558 | endfunction(add_llvm_implicit_projects) |
||
1559 | |||
1560 | # Generic support for adding a unittest. |
||
1561 | function(add_unittest test_suite test_name) |
||
1562 | if( NOT LLVM_BUILD_TESTS ) |
||
1563 | set(EXCLUDE_FROM_ALL ON) |
||
1564 | endif() |
||
1565 | |||
1566 | if (SUPPORTS_VARIADIC_MACROS_FLAG) |
||
1567 | list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros") |
||
1568 | endif () |
||
1569 | # Some parts of gtest rely on this GNU extension, don't warn on it. |
||
1570 | if(SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG) |
||
1571 | list(APPEND LLVM_COMPILE_FLAGS "-Wno-gnu-zero-variadic-macro-arguments") |
||
1572 | endif() |
||
1573 | |||
1574 | if (NOT DEFINED LLVM_REQUIRES_RTTI) |
||
1575 | set(LLVM_REQUIRES_RTTI OFF) |
||
1576 | endif() |
||
1577 | |||
1578 | list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream |
||
1579 | add_llvm_executable(${test_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN}) |
||
1580 | |||
1581 | # The runtime benefits of LTO don't outweight the compile time costs for tests. |
||
1582 | if(LLVM_ENABLE_LTO) |
||
1583 | if((UNIX OR MINGW) AND LINKER_IS_LLD) |
||
1584 | set_property(TARGET ${test_name} APPEND_STRING PROPERTY |
||
1585 | LINK_FLAGS " -Wl,--lto-O0") |
||
1586 | elseif(LINKER_IS_LLD_LINK) |
||
1587 | set_property(TARGET ${test_name} APPEND_STRING PROPERTY |
||
1588 | LINK_FLAGS " /opt:lldlto=0") |
||
1589 | elseif(APPLE AND NOT uppercase_LLVM_ENABLE_LTO STREQUAL "THIN") |
||
1590 | set_property(TARGET ${target_name} APPEND_STRING PROPERTY |
||
1591 | LINK_FLAGS " -Wl,-mllvm,-O0") |
||
1592 | endif() |
||
1593 | endif() |
||
1594 | |||
1595 | set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) |
||
1596 | set_output_directory(${test_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir}) |
||
1597 | # libpthreads overrides some standard library symbols, so main |
||
1598 | # executable must be linked with it in order to provide consistent |
||
1599 | # API for all shared libaries loaded by this executable. |
||
1600 | target_link_libraries(${test_name} PRIVATE llvm_gtest_main llvm_gtest ${LLVM_PTHREAD_LIB}) |
||
1601 | |||
1602 | add_dependencies(${test_suite} ${test_name}) |
||
1603 | get_target_property(test_suite_folder ${test_suite} FOLDER) |
||
1604 | if (test_suite_folder) |
||
1605 | set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}") |
||
1606 | endif () |
||
1607 | endfunction() |
||
1608 | |||
1609 | # Use for test binaries that call llvm::getInputFileDirectory(). Use of this |
||
1610 | # is discouraged. |
||
1611 | function(add_unittest_with_input_files test_suite test_name) |
||
1612 | set(LLVM_UNITTEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) |
||
1613 | configure_file( |
||
1614 | ${LLVM_MAIN_SRC_DIR}/unittests/unittest.cfg.in |
||
1615 | ${CMAKE_CURRENT_BINARY_DIR}/llvm.srcdir.txt) |
||
1616 | |||
1617 | add_unittest(${test_suite} ${test_name} ${ARGN}) |
||
1618 | endfunction() |
||
1619 | |||
1620 | # Generic support for adding a benchmark. |
||
1621 | function(add_benchmark benchmark_name) |
||
1622 | if( NOT LLVM_BUILD_BENCHMARKS ) |
||
1623 | set(EXCLUDE_FROM_ALL ON) |
||
1624 | endif() |
||
1625 | |||
1626 | add_llvm_executable(${benchmark_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN}) |
||
1627 | set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) |
||
1628 | set_output_directory(${benchmark_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir}) |
||
1629 | set_property(TARGET ${benchmark_name} PROPERTY FOLDER "Utils") |
||
1630 | target_link_libraries(${benchmark_name} PRIVATE benchmark) |
||
1631 | endfunction() |
||
1632 | |||
1633 | # This function canonicalize the CMake variables passed by names |
||
1634 | # from CMake boolean to 0/1 suitable for passing into Python or C++, |
||
1635 | # in place. |
||
1636 | function(llvm_canonicalize_cmake_booleans) |
||
1637 | foreach(var ${ARGN}) |
||
1638 | if(${var}) |
||
1639 | set(${var} 1 PARENT_SCOPE) |
||
1640 | else() |
||
1641 | set(${var} 0 PARENT_SCOPE) |
||
1642 | endif() |
||
1643 | endforeach() |
||
1644 | endfunction(llvm_canonicalize_cmake_booleans) |
||
1645 | |||
1646 | macro(set_llvm_build_mode) |
||
1647 | # Configuration-time: See Unit/lit.site.cfg.in |
||
1648 | if (CMAKE_CFG_INTDIR STREQUAL ".") |
||
1649 | set(LLVM_BUILD_MODE ".") |
||
1650 | else () |
||
1651 | set(LLVM_BUILD_MODE "%(build_mode)s") |
||
1652 | endif () |
||
1653 | endmacro() |
||
1654 | |||
1655 | # Takes a list of path names in pathlist and a base directory, and returns |
||
1656 | # a list of paths relative to the base directory in out_pathlist. |
||
1657 | # Paths that are on a different drive than the basedir (on Windows) or that |
||
1658 | # contain symlinks are returned absolute. |
||
1659 | # Use with LLVM_LIT_PATH_FUNCTION below. |
||
1660 | function(make_paths_relative out_pathlist basedir pathlist) |
||
1661 | # Passing ARG_PATH_VALUES as-is to execute_process() makes cmake strip |
||
1662 | # empty list entries. So escape the ;s in the list and do the splitting |
||
1663 | # ourselves. cmake has no relpath function, so use Python for that. |
||
1664 | string(REPLACE ";" "\\;" pathlist_escaped "${pathlist}") |
||
1665 | execute_process(COMMAND "${Python3_EXECUTABLE}" "-c" "\n |
||
1666 | import os, sys\n |
||
1667 | base = sys.argv[1] |
||
1668 | def haslink(p):\n |
||
1669 | if not p or p == os.path.dirname(p): return False\n |
||
1670 | return os.path.islink(p) or haslink(os.path.dirname(p))\n |
||
1671 | def relpath(p):\n |
||
1672 | if not p: return ''\n |
||
1673 | if os.path.splitdrive(p)[0] != os.path.splitdrive(base)[0]: return p\n |
||
1674 | if haslink(p) or haslink(base): return p\n |
||
1675 | return os.path.relpath(p, base)\n |
||
1676 | if len(sys.argv) < 3: sys.exit(0)\n |
||
1677 | sys.stdout.write(';'.join(relpath(p) for p in sys.argv[2].split(';')))" |
||
1678 | ${basedir} |
||
1679 | ${pathlist_escaped} |
||
1680 | OUTPUT_VARIABLE pathlist_relative |
||
1681 | ERROR_VARIABLE error |
||
1682 | RESULT_VARIABLE result) |
||
1683 | if (NOT result EQUAL 0) |
||
1684 | message(FATAL_ERROR "make_paths_relative() failed due to error '${result}', with stderr\n${error}") |
||
1685 | endif() |
||
1686 | set(${out_pathlist} "${pathlist_relative}" PARENT_SCOPE) |
||
1687 | endfunction() |
||
1688 | |||
1689 | # Converts a file that's relative to the current python file to an absolute |
||
1690 | # path. Since this uses __file__, it has to be emitted into python files that |
||
1691 | # use it and can't be in a lit module. Use with make_paths_relative(). |
||
1692 | string(CONCAT LLVM_LIT_PATH_FUNCTION |
||
1693 | "# Allow generated file to be relocatable.\n" |
||
1694 | "from pathlib import Path\n" |
||
1695 | "def path(p):\n" |
||
1696 | " if not p: return ''\n" |
||
1697 | " return str((Path(__file__).parent / p).resolve())\n" |
||
1698 | ) |
||
1699 | |||
1700 | # This function provides an automatic way to 'configure'-like generate a file |
||
1701 | # based on a set of common and custom variables, specifically targeting the |
||
1702 | # variables needed for the 'lit.site.cfg' files. This function bundles the |
||
1703 | # common variables that any Lit instance is likely to need, and custom |
||
1704 | # variables can be passed in. |
||
1705 | # The keyword PATHS is followed by a list of cmake variable names that are |
||
1706 | # mentioned as `path("@varname@")` in the lit.cfg.py.in file. Variables in that |
||
1707 | # list are treated as paths that are relative to the directory the generated |
||
1708 | # lit.cfg.py file is in, and the `path()` function converts the relative |
||
1709 | # path back to absolute form. This makes it possible to move a build directory |
||
1710 | # containing lit.cfg.py files from one machine to another. |
||
1711 | function(configure_lit_site_cfg site_in site_out) |
||
1712 | cmake_parse_arguments(ARG "" "" "MAIN_CONFIG;PATHS" ${ARGN}) |
||
1713 | |||
1714 | if ("${ARG_MAIN_CONFIG}" STREQUAL "") |
||
1715 | get_filename_component(INPUT_DIR ${site_in} DIRECTORY) |
||
1716 | set(ARG_MAIN_CONFIG "${INPUT_DIR}/lit.cfg") |
||
1717 | endif() |
||
1718 | |||
1719 | foreach(c ${LLVM_TARGETS_TO_BUILD}) |
||
1720 | set(TARGETS_BUILT "${TARGETS_BUILT} ${c}") |
||
1721 | endforeach(c) |
||
1722 | set(TARGETS_TO_BUILD ${TARGETS_BUILT}) |
||
1723 | |||
1724 | set(SHLIBEXT "${LTDL_SHLIB_EXT}") |
||
1725 | |||
1726 | set_llvm_build_mode() |
||
1727 | |||
1728 | # For standalone builds of subprojects, these might not be the build tree but |
||
1729 | # a provided binary tree. |
||
1730 | set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR}) |
||
1731 | set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR}) |
||
1732 | string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" LLVM_TOOLS_DIR "${LLVM_TOOLS_BINARY_DIR}") |
||
1733 | string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" LLVM_LIBS_DIR "${LLVM_LIBRARY_DIR}") |
||
1734 | # Like LLVM_{TOOLS,LIBS}_DIR, but pointing at the build tree. |
||
1735 | string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" CURRENT_TOOLS_DIR "${LLVM_RUNTIME_OUTPUT_INTDIR}") |
||
1736 | string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" CURRENT_LIBS_DIR "${LLVM_LIBRARY_OUTPUT_INTDIR}") |
||
1737 | string(REPLACE "${CMAKE_CFG_INTDIR}" "${LLVM_BUILD_MODE}" SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}") |
||
1738 | |||
1739 | # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for |
||
1740 | # plugins. We may rename it. |
||
1741 | if(LLVM_ENABLE_PLUGINS) |
||
1742 | set(ENABLE_SHARED "1") |
||
1743 | else() |
||
1744 | set(ENABLE_SHARED "0") |
||
1745 | endif() |
||
1746 | |||
1747 | if(LLVM_ENABLE_ASSERTIONS) |
||
1748 | set(ENABLE_ASSERTIONS "1") |
||
1749 | else() |
||
1750 | set(ENABLE_ASSERTIONS "0") |
||
1751 | endif() |
||
1752 | |||
1753 | set(HOST_OS ${CMAKE_SYSTEM_NAME}) |
||
1754 | set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR}) |
||
1755 | |||
1756 | set(HOST_CC "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}") |
||
1757 | set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}") |
||
1758 | set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}") |
||
1759 | |||
1760 | string(CONCAT LIT_SITE_CFG_IN_HEADER |
||
1761 | "# Autogenerated from ${site_in}\n# Do not edit!\n\n" |
||
1762 | "${LLVM_LIT_PATH_FUNCTION}" |
||
1763 | ) |
||
1764 | |||
1765 | # Override config_target_triple (and the env) |
||
1766 | if(LLVM_TARGET_TRIPLE_ENV) |
||
1767 | # This is expanded into the heading. |
||
1768 | string(CONCAT LIT_SITE_CFG_IN_HEADER "${LIT_SITE_CFG_IN_HEADER}" |
||
1769 | "import os\n" |
||
1770 | "target_env = \"${LLVM_TARGET_TRIPLE_ENV}\"\n" |
||
1771 | "config.target_triple = config.environment[target_env] = os.environ.get(target_env, \"${LLVM_TARGET_TRIPLE}\")\n" |
||
1772 | ) |
||
1773 | |||
1774 | # This is expanded to; config.target_triple = ""+config.target_triple+"" |
||
1775 | set(LLVM_TARGET_TRIPLE "\"+config.target_triple+\"") |
||
1776 | endif() |
||
1777 | |||
1778 | if (ARG_PATHS) |
||
1779 | # Walk ARG_PATHS and collect the current value of the variables in there. |
||
1780 | # list(APPEND) ignores empty elements exactly if the list is empty, |
||
1781 | # so start the list with a dummy element and drop it, to make sure that |
||
1782 | # even empty values make it into the values list. |
||
1783 | set(ARG_PATH_VALUES "dummy") |
||
1784 | foreach(path ${ARG_PATHS}) |
||
1785 | list(APPEND ARG_PATH_VALUES "${${path}}") |
||
1786 | endforeach() |
||
1787 | list(REMOVE_AT ARG_PATH_VALUES 0) |
||
1788 | |||
1789 | get_filename_component(OUTPUT_DIR ${site_out} DIRECTORY) |
||
1790 | make_paths_relative( |
||
1791 | ARG_PATH_VALUES_RELATIVE "${OUTPUT_DIR}" "${ARG_PATH_VALUES}") |
||
1792 | |||
1793 | list(LENGTH ARG_PATHS len_paths) |
||
1794 | list(LENGTH ARG_PATH_VALUES len_path_values) |
||
1795 | list(LENGTH ARG_PATH_VALUES_RELATIVE len_path_value_rels) |
||
1796 | if ((NOT ${len_paths} EQUAL ${len_path_values}) OR |
||
1797 | (NOT ${len_paths} EQUAL ${len_path_value_rels})) |
||
1798 | message(SEND_ERROR "PATHS lengths got confused") |
||
1799 | endif() |
||
1800 | |||
1801 | # Transform variables mentioned in ARG_PATHS to relative paths for |
||
1802 | # the configure_file() call. Variables are copied to subscopeds by cmake, |
||
1803 | # so this only modifies the local copy of the variables. |
||
1804 | math(EXPR arg_path_limit "${len_paths} - 1") |
||
1805 | foreach(i RANGE ${arg_path_limit}) |
||
1806 | list(GET ARG_PATHS ${i} val1) |
||
1807 | list(GET ARG_PATH_VALUES_RELATIVE ${i} val2) |
||
1808 | set(${val1} ${val2}) |
||
1809 | endforeach() |
||
1810 | endif() |
||
1811 | |||
1812 | configure_file(${site_in} ${site_out} @ONLY) |
||
1813 | |||
1814 | if (EXISTS "${ARG_MAIN_CONFIG}") |
||
1815 | # Remember main config / generated site config for llvm-lit.in. |
||
1816 | get_property(LLVM_LIT_CONFIG_FILES GLOBAL PROPERTY LLVM_LIT_CONFIG_FILES) |
||
1817 | list(APPEND LLVM_LIT_CONFIG_FILES "${ARG_MAIN_CONFIG}" "${site_out}") |
||
1818 | set_property(GLOBAL PROPERTY LLVM_LIT_CONFIG_FILES ${LLVM_LIT_CONFIG_FILES}) |
||
1819 | endif() |
||
1820 | endfunction() |
||
1821 | |||
1822 | function(dump_all_cmake_variables) |
||
1823 | get_cmake_property(_variableNames VARIABLES) |
||
1824 | foreach (_variableName ${_variableNames}) |
||
1825 | message(STATUS "${_variableName}=${${_variableName}}") |
||
1826 | endforeach() |
||
1827 | endfunction() |
||
1828 | |||
1829 | function(get_llvm_lit_path base_dir file_name) |
||
1830 | cmake_parse_arguments(ARG "ALLOW_EXTERNAL" "" "" ${ARGN}) |
||
1831 | |||
1832 | if (ARG_ALLOW_EXTERNAL) |
||
1833 | set (LLVM_EXTERNAL_LIT "" CACHE STRING "Command used to spawn lit") |
||
1834 | if ("${LLVM_EXTERNAL_LIT}" STREQUAL "") |
||
1835 | set(LLVM_EXTERNAL_LIT "${LLVM_DEFAULT_EXTERNAL_LIT}") |
||
1836 | endif() |
||
1837 | |||
1838 | if (NOT "${LLVM_EXTERNAL_LIT}" STREQUAL "") |
||
1839 | if (EXISTS ${LLVM_EXTERNAL_LIT}) |
||
1840 | get_filename_component(LIT_FILE_NAME ${LLVM_EXTERNAL_LIT} NAME) |
||
1841 | get_filename_component(LIT_BASE_DIR ${LLVM_EXTERNAL_LIT} DIRECTORY) |
||
1842 | set(${file_name} ${LIT_FILE_NAME} PARENT_SCOPE) |
||
1843 | set(${base_dir} ${LIT_BASE_DIR} PARENT_SCOPE) |
||
1844 | return() |
||
1845 | elseif (NOT DEFINED CACHE{LLVM_EXTERNAL_LIT_MISSING_WARNED_ONCE}) |
||
1846 | message(WARNING "LLVM_EXTERNAL_LIT set to ${LLVM_EXTERNAL_LIT}, but the path does not exist.") |
||
1847 | set(LLVM_EXTERNAL_LIT_MISSING_WARNED_ONCE YES CACHE INTERNAL "") |
||
1848 | endif() |
||
1849 | endif() |
||
1850 | endif() |
||
1851 | |||
1852 | set(lit_file_name "llvm-lit") |
||
1853 | if (CMAKE_HOST_WIN32 AND NOT CYGWIN) |
||
1854 | # llvm-lit needs suffix.py for multiprocess to find a main module. |
||
1855 | set(lit_file_name "${lit_file_name}.py") |
||
1856 | endif () |
||
1857 | set(${file_name} ${lit_file_name} PARENT_SCOPE) |
||
1858 | |||
1859 | get_property(LLVM_LIT_BASE_DIR GLOBAL PROPERTY LLVM_LIT_BASE_DIR) |
||
1860 | if (NOT "${LLVM_LIT_BASE_DIR}" STREQUAL "") |
||
1861 | set(${base_dir} ${LLVM_LIT_BASE_DIR} PARENT_SCOPE) |
||
1862 | endif() |
||
1863 | |||
1864 | # Allow individual projects to provide an override |
||
1865 | if (NOT "${LLVM_LIT_OUTPUT_DIR}" STREQUAL "") |
||
1866 | set(LLVM_LIT_BASE_DIR ${LLVM_LIT_OUTPUT_DIR}) |
||
1867 | elseif(NOT "${LLVM_RUNTIME_OUTPUT_INTDIR}" STREQUAL "") |
||
1868 | set(LLVM_LIT_BASE_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR}) |
||
1869 | else() |
||
1870 | set(LLVM_LIT_BASE_DIR "") |
||
1871 | endif() |
||
1872 | |||
1873 | # Cache this so we don't have to do it again and have subsequent calls |
||
1874 | # potentially disagree on the value. |
||
1875 | set_property(GLOBAL PROPERTY LLVM_LIT_BASE_DIR ${LLVM_LIT_BASE_DIR}) |
||
1876 | set(${base_dir} ${LLVM_LIT_BASE_DIR} PARENT_SCOPE) |
||
1877 | endfunction() |
||
1878 | |||
1879 | # A raw function to create a lit target. This is used to implement the testuite |
||
1880 | # management functions. |
||
1881 | function(add_lit_target target comment) |
||
1882 | cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN}) |
||
1883 | set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}") |
||
1884 | separate_arguments(LIT_ARGS) |
||
1885 | if (NOT CMAKE_CFG_INTDIR STREQUAL ".") |
||
1886 | list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR}) |
||
1887 | endif () |
||
1888 | |||
1889 | # Get the path to the lit to *run* tests with. This can be overriden by |
||
1890 | # the user by specifying -DLLVM_EXTERNAL_LIT=<path-to-lit.py> |
||
1891 | get_llvm_lit_path( |
||
1892 | lit_base_dir |
||
1893 | lit_file_name |
||
1894 | ALLOW_EXTERNAL |
||
1895 | ) |
||
1896 | |||
1897 | set(LIT_COMMAND "${Python3_EXECUTABLE};${lit_base_dir}/${lit_file_name}") |
||
1898 | list(APPEND LIT_COMMAND ${LIT_ARGS}) |
||
1899 | foreach(param ${ARG_PARAMS}) |
||
1900 | list(APPEND LIT_COMMAND --param ${param}) |
||
1901 | endforeach() |
||
1902 | if (ARG_UNPARSED_ARGUMENTS) |
||
1903 | add_custom_target(${target} |
||
1904 | COMMAND ${LIT_COMMAND} ${ARG_UNPARSED_ARGUMENTS} |
||
1905 | COMMENT "${comment}" |
||
1906 | USES_TERMINAL |
||
1907 | ) |
||
1908 | else() |
||
1909 | add_custom_target(${target} |
||
1910 | COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.") |
||
1911 | message(STATUS "${target} does nothing.") |
||
1912 | endif() |
||
1913 | |||
1914 | if (ARG_DEPENDS) |
||
1915 | add_dependencies(${target} ${ARG_DEPENDS}) |
||
1916 | endif() |
||
1917 | |||
1918 | # Tests should be excluded from "Build Solution". |
||
1919 | set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) |
||
1920 | endfunction() |
||
1921 | |||
1922 | # Convert a target name like check-clang to a variable name like CLANG. |
||
1923 | function(umbrella_lit_testsuite_var target outvar) |
||
1924 | if (NOT target MATCHES "^check-") |
||
1925 | message(FATAL_ERROR "umbrella lit suites must be check-*, not '${target}'") |
||
1926 | endif() |
||
1927 | string(SUBSTRING "${target}" 6 -1 var) |
||
1928 | string(REPLACE "-" "_" var ${var}) |
||
1929 | string(TOUPPER "${var}" var) |
||
1930 | set(${outvar} "${var}" PARENT_SCOPE) |
||
1931 | endfunction() |
||
1932 | |||
1933 | # Start recording all lit test suites for a combined 'check-foo' target. |
||
1934 | # The recording continues until umbrella_lit_testsuite_end() creates the target. |
||
1935 | function(umbrella_lit_testsuite_begin target) |
||
1936 | umbrella_lit_testsuite_var(${target} name) |
||
1937 | set_property(GLOBAL APPEND PROPERTY LLVM_LIT_UMBRELLAS ${name}) |
||
1938 | endfunction() |
||
1939 | |||
1940 | # Create a combined 'check-foo' target for a set of related test suites. |
||
1941 | # It runs all suites added since the matching umbrella_lit_testsuite_end() call. |
||
1942 | # Tests marked EXCLUDE_FROM_CHECK_ALL are not gathered. |
||
1943 | function(umbrella_lit_testsuite_end target) |
||
1944 | umbrella_lit_testsuite_var(${target} name) |
||
1945 | |||
1946 | get_property(testsuites GLOBAL PROPERTY LLVM_${name}_LIT_TESTSUITES) |
||
1947 | get_property(params GLOBAL PROPERTY LLVM_${name}_LIT_PARAMS) |
||
1948 | get_property(depends GLOBAL PROPERTY LLVM_${name}_LIT_DEPENDS) |
||
1949 | get_property(extra_args GLOBAL PROPERTY LLVM_${name}_LIT_EXTRA_ARGS) |
||
1950 | # Additional test targets are not gathered, but may be set externally. |
||
1951 | get_property(additional_test_targets |
||
1952 | GLOBAL PROPERTY LLVM_${name}_ADDITIONAL_TEST_TARGETS) |
||
1953 | |||
1954 | string(TOLOWER ${name} name) |
||
1955 | add_lit_target(${target} |
||
1956 | "Running ${name} regression tests" |
||
1957 | ${testsuites} |
||
1958 | PARAMS ${params} |
||
1959 | DEPENDS ${depends} ${additional_test_targets} |
||
1960 | ARGS ${extra_args} |
||
1961 | ) |
||
1962 | endfunction() |
||
1963 | |||
1964 | # A function to add a set of lit test suites to be driven through 'check-*' targets. |
||
1965 | function(add_lit_testsuite target comment) |
||
1966 | cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "" "PARAMS;DEPENDS;ARGS" ${ARGN}) |
||
1967 | |||
1968 | # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all. |
||
1969 | if(NOT ARG_EXCLUDE_FROM_CHECK_ALL) |
||
1970 | get_property(gather_names GLOBAL PROPERTY LLVM_LIT_UMBRELLAS) |
||
1971 | foreach(name ${gather_names}) |
||
1972 | # Register the testsuites, params and depends for the umbrella check rule. |
||
1973 | set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS}) |
||
1974 | set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_PARAMS ${ARG_PARAMS}) |
||
1975 | set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_DEPENDS ${ARG_DEPENDS}) |
||
1976 | set_property(GLOBAL APPEND PROPERTY LLVM_${name}_LIT_EXTRA_ARGS ${ARG_ARGS}) |
||
1977 | endforeach() |
||
1978 | endif() |
||
1979 | |||
1980 | # Produce a specific suffixed check rule. |
||
1981 | add_lit_target(${target} ${comment} |
||
1982 | ${ARG_UNPARSED_ARGUMENTS} |
||
1983 | PARAMS ${ARG_PARAMS} |
||
1984 | DEPENDS ${ARG_DEPENDS} |
||
1985 | ARGS ${ARG_ARGS} |
||
1986 | ) |
||
1987 | endfunction() |
||
1988 | |||
1989 | function(add_lit_testsuites project directory) |
||
1990 | if (NOT LLVM_ENABLE_IDE) |
||
1991 | cmake_parse_arguments(ARG "EXCLUDE_FROM_CHECK_ALL" "FOLDER" "PARAMS;DEPENDS;ARGS" ${ARGN}) |
||
1992 | |||
1993 | if (NOT ARG_FOLDER) |
||
1994 | set(ARG_FOLDER "Test Subdirectories") |
||
1995 | endif() |
||
1996 | |||
1997 | # Search recursively for test directories by assuming anything not |
||
1998 | # in a directory called Inputs contains tests. |
||
1999 | file(GLOB_RECURSE to_process LIST_DIRECTORIES true ${directory}/*) |
||
2000 | foreach(lit_suite ${to_process}) |
||
2001 | if(NOT IS_DIRECTORY ${lit_suite}) |
||
2002 | continue() |
||
2003 | endif() |
||
2004 | string(FIND ${lit_suite} Inputs is_inputs) |
||
2005 | string(FIND ${lit_suite} Output is_output) |
||
2006 | if (NOT (is_inputs EQUAL -1 AND is_output EQUAL -1)) |
||
2007 | continue() |
||
2008 | endif() |
||
2009 | |||
2010 | # Create a check- target for the directory. |
||
2011 | string(REPLACE ${directory} "" name_slash ${lit_suite}) |
||
2012 | if (name_slash) |
||
2013 | string(REPLACE "/" "-" name_slash ${name_slash}) |
||
2014 | string(REPLACE "\\" "-" name_dashes ${name_slash}) |
||
2015 | string(TOLOWER "${project}${name_dashes}" name_var) |
||
2016 | add_lit_target("check-${name_var}" "Running lit suite ${lit_suite}" |
||
2017 | ${lit_suite} |
||
2018 | ${EXCLUDE_FROM_CHECK_ALL} |
||
2019 | PARAMS ${ARG_PARAMS} |
||
2020 | DEPENDS ${ARG_DEPENDS} |
||
2021 | ARGS ${ARG_ARGS} |
||
2022 | ) |
||
2023 | set_target_properties(check-${name_var} PROPERTIES FOLDER ${ARG_FOLDER}) |
||
2024 | endif() |
||
2025 | endforeach() |
||
2026 | endif() |
||
2027 | endfunction() |
||
2028 | |||
2029 | function(llvm_install_library_symlink name dest type) |
||
2030 | cmake_parse_arguments(ARG "" "COMPONENT" "" ${ARGN}) |
||
2031 | foreach(path ${CMAKE_MODULE_PATH}) |
||
2032 | if(EXISTS ${path}/LLVMInstallSymlink.cmake) |
||
2033 | set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake) |
||
2034 | break() |
||
2035 | endif() |
||
2036 | endforeach() |
||
2037 | |||
2038 | set(component ${ARG_COMPONENT}) |
||
2039 | if(NOT component) |
||
2040 | set(component ${name}) |
||
2041 | endif() |
||
2042 | |||
2043 | set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX}) |
||
2044 | set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX}) |
||
2045 | |||
2046 | set(output_dir lib${LLVM_LIBDIR_SUFFIX}) |
||
2047 | if(WIN32 AND "${type}" STREQUAL "SHARED") |
||
2048 | set(output_dir "${CMAKE_INSTALL_BINDIR}") |
||
2049 | endif() |
||
2050 | |||
2051 | install(SCRIPT ${INSTALL_SYMLINK} |
||
2052 | CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\")" |
||
2053 | COMPONENT ${component}) |
||
2054 | |||
2055 | endfunction() |
||
2056 | |||
2057 | function(llvm_install_symlink project name dest) |
||
2058 | get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) |
||
2059 | if(LLVM_TOOL_LLVM_DRIVER_BUILD |
||
2060 | AND ${dest} IN_LIST LLVM_DRIVER_TOOLS |
||
2061 | AND (NOT LLVM_DISTRIBUTION_COMPONENTS OR ${dest} IN_LIST LLVM_DISTRIBUTION_COMPONENTS) |
||
2062 | ) |
||
2063 | return() |
||
2064 | endif() |
||
2065 | cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN}) |
||
2066 | foreach(path ${CMAKE_MODULE_PATH}) |
||
2067 | if(EXISTS ${path}/LLVMInstallSymlink.cmake) |
||
2068 | set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake) |
||
2069 | break() |
||
2070 | endif() |
||
2071 | endforeach() |
||
2072 | |||
2073 | if(ARG_COMPONENT) |
||
2074 | set(component ${ARG_COMPONENT}) |
||
2075 | else() |
||
2076 | if(ARG_ALWAYS_GENERATE) |
||
2077 | set(component ${dest}) |
||
2078 | else() |
||
2079 | set(component ${name}) |
||
2080 | endif() |
||
2081 | endif() |
||
2082 | |||
2083 | set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX}) |
||
2084 | set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX}) |
||
2085 | if (${dest} STREQUAL "llvm-driver") |
||
2086 | set(full_dest llvm${CMAKE_EXECUTABLE_SUFFIX}) |
||
2087 | endif() |
||
2088 | |||
2089 | set(output_dir "${${project}_TOOLS_INSTALL_DIR}") |
||
2090 | |||
2091 | install(SCRIPT ${INSTALL_SYMLINK} |
||
2092 | CODE "install_symlink(\"${full_name}\" \"${full_dest}\" \"${output_dir}\")" |
||
2093 | COMPONENT ${component}) |
||
2094 | |||
2095 | if (NOT LLVM_ENABLE_IDE AND NOT ARG_ALWAYS_GENERATE) |
||
2096 | add_llvm_install_targets(install-${name} |
||
2097 | DEPENDS ${name} ${dest} |
||
2098 | COMPONENT ${name} |
||
2099 | SYMLINK ${dest}) |
||
2100 | endif() |
||
2101 | endfunction() |
||
2102 | |||
2103 | function(llvm_add_tool_symlink project link_name target) |
||
2104 | cmake_parse_arguments(ARG "ALWAYS_GENERATE" "OUTPUT_DIR" "" ${ARGN}) |
||
2105 | |||
2106 | get_property(LLVM_DRIVER_TOOLS GLOBAL PROPERTY LLVM_DRIVER_TOOLS) |
||
2107 | |||
2108 | if (${target} IN_LIST LLVM_DRIVER_TOOLS) |
||
2109 | set_property(GLOBAL APPEND PROPERTY LLVM_DRIVER_TOOL_ALIASES_${target} ${link_name}) |
||
2110 | endif() |
||
2111 | set(dest_binary "$<TARGET_FILE:${target}>") |
||
2112 | |||
2113 | # This got a bit gross... For multi-configuration generators the target |
||
2114 | # properties return the resolved value of the string, not the build system |
||
2115 | # expression. To reconstruct the platform-agnostic path we have to do some |
||
2116 | # magic. First we grab one of the types, and a type-specific path. Then from |
||
2117 | # the type-specific path we find the last occurrence of the type in the path, |
||
2118 | # and replace it with CMAKE_CFG_INTDIR. This allows the build step to be type |
||
2119 | # agnostic again. |
||
2120 | if(NOT ARG_OUTPUT_DIR) |
||
2121 | # If you're not overriding the OUTPUT_DIR, we can make the link relative in |
||
2122 | # the same directory. |
||
2123 | if(LLVM_USE_SYMLINKS) |
||
2124 | set(dest_binary "$<TARGET_FILE_NAME:${target}>") |
||
2125 | endif() |
||
2126 | if(CMAKE_CONFIGURATION_TYPES) |
||
2127 | list(GET CMAKE_CONFIGURATION_TYPES 0 first_type) |
||
2128 | string(TOUPPER ${first_type} first_type_upper) |
||
2129 | set(first_type_suffix _${first_type_upper}) |
||
2130 | endif() |
||
2131 | get_target_property(target_type ${target} TYPE) |
||
2132 | if(${target_type} STREQUAL "STATIC_LIBRARY") |
||
2133 | get_target_property(ARG_OUTPUT_DIR ${target} ARCHIVE_OUTPUT_DIRECTORY${first_type_suffix}) |
||
2134 | elseif(UNIX AND ${target_type} STREQUAL "SHARED_LIBRARY") |
||
2135 | get_target_property(ARG_OUTPUT_DIR ${target} LIBRARY_OUTPUT_DIRECTORY${first_type_suffix}) |
||
2136 | else() |
||
2137 | get_target_property(ARG_OUTPUT_DIR ${target} RUNTIME_OUTPUT_DIRECTORY${first_type_suffix}) |
||
2138 | endif() |
||
2139 | if(CMAKE_CONFIGURATION_TYPES) |
||
2140 | string(FIND "${ARG_OUTPUT_DIR}" "/${first_type}/" type_start REVERSE) |
||
2141 | string(SUBSTRING "${ARG_OUTPUT_DIR}" 0 ${type_start} path_prefix) |
||
2142 | string(SUBSTRING "${ARG_OUTPUT_DIR}" ${type_start} -1 path_suffix) |
||
2143 | string(REPLACE "/${first_type}/" "/${CMAKE_CFG_INTDIR}/" |
||
2144 | path_suffix ${path_suffix}) |
||
2145 | set(ARG_OUTPUT_DIR ${path_prefix}${path_suffix}) |
||
2146 | endif() |
||
2147 | endif() |
||
2148 | |||
2149 | if(LLVM_USE_SYMLINKS) |
||
2150 | set(LLVM_LINK_OR_COPY create_symlink) |
||
2151 | else() |
||
2152 | set(LLVM_LINK_OR_COPY copy) |
||
2153 | endif() |
||
2154 | |||
2155 | set(output_path "${ARG_OUTPUT_DIR}/${link_name}${CMAKE_EXECUTABLE_SUFFIX}") |
||
2156 | |||
2157 | set(target_name ${link_name}) |
||
2158 | if(TARGET ${link_name}) |
||
2159 | set(target_name ${link_name}-link) |
||
2160 | endif() |
||
2161 | |||
2162 | |||
2163 | if(ARG_ALWAYS_GENERATE) |
||
2164 | set_property(DIRECTORY APPEND PROPERTY |
||
2165 | ADDITIONAL_MAKE_CLEAN_FILES ${dest_binary}) |
||
2166 | add_custom_command(TARGET ${target} POST_BUILD |
||
2167 | COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}") |
||
2168 | else() |
||
2169 | add_custom_command(OUTPUT ${output_path} |
||
2170 | COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}" |
||
2171 | DEPENDS ${target}) |
||
2172 | |||
2173 | # TODO: Make use of generator expressions below once CMake 3.19 or higher is the minimum supported version. |
||
2174 | set(should_build_all) |
||
2175 | get_target_property(target_excluded_from_all ${target} EXCLUDE_FROM_ALL) |
||
2176 | if (NOT target_excluded_from_all) |
||
2177 | set(should_build_all ALL) |
||
2178 | endif() |
||
2179 | add_custom_target(${target_name} ${should_build_all} DEPENDS ${target} ${output_path}) |
||
2180 | set_target_properties(${target_name} PROPERTIES FOLDER Tools) |
||
2181 | |||
2182 | # Make sure both the link and target are toolchain tools |
||
2183 | if (${link_name} IN_LIST LLVM_TOOLCHAIN_TOOLS AND ${target} IN_LIST LLVM_TOOLCHAIN_TOOLS) |
||
2184 | set(TOOL_IS_TOOLCHAIN ON) |
||
2185 | endif() |
||
2186 | |||
2187 | if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS) |
||
2188 | llvm_install_symlink("${project}" ${link_name} ${target}) |
||
2189 | endif() |
||
2190 | endif() |
||
2191 | endfunction() |
||
2192 | |||
2193 | function(add_llvm_tool_symlink link_name target) |
||
2194 | llvm_add_tool_symlink(LLVM ${ARGV}) |
||
2195 | endfunction() |
||
2196 | |||
2197 | function(llvm_externalize_debuginfo name) |
||
2198 | if(NOT LLVM_EXTERNALIZE_DEBUGINFO) |
||
2199 | return() |
||
2200 | endif() |
||
2201 | |||
2202 | if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP) |
||
2203 | if(APPLE) |
||
2204 | if(NOT CMAKE_STRIP) |
||
2205 | set(CMAKE_STRIP xcrun strip) |
||
2206 | endif() |
||
2207 | set(strip_command COMMAND ${CMAKE_STRIP} -S -x $<TARGET_FILE:${name}>) |
||
2208 | else() |
||
2209 | set(strip_command COMMAND ${CMAKE_STRIP} -g -x $<TARGET_FILE:${name}>) |
||
2210 | endif() |
||
2211 | endif() |
||
2212 | |||
2213 | if(APPLE) |
||
2214 | if(LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION) |
||
2215 | set(file_ext ${LLVM_EXTERNALIZE_DEBUGINFO_EXTENSION}) |
||
2216 | else() |
||
2217 | set(file_ext dSYM) |
||
2218 | endif() |
||
2219 | |||
2220 | set(output_name "$<TARGET_FILE_NAME:${name}>.${file_ext}") |
||
2221 | |||
2222 | if(LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR) |
||
2223 | set(output_path "-o=${LLVM_EXTERNALIZE_DEBUGINFO_OUTPUT_DIR}/${output_name}") |
||
2224 | else() |
||
2225 | set(output_path "-o=${output_name}") |
||
2226 | endif() |
||
2227 | |||
2228 | if(CMAKE_CXX_FLAGS MATCHES "-flto" |
||
2229 | OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto") |
||
2230 | |||
2231 | set(lto_object ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}-lto.o) |
||
2232 | set_property(TARGET ${name} APPEND_STRING PROPERTY |
||
2233 | LINK_FLAGS " -Wl,-object_path_lto,${lto_object}") |
||
2234 | endif() |
||
2235 | if(NOT CMAKE_DSYMUTIL) |
||
2236 | set(CMAKE_DSYMUTIL xcrun dsymutil) |
||
2237 | endif() |
||
2238 | add_custom_command(TARGET ${name} POST_BUILD |
||
2239 | COMMAND ${CMAKE_DSYMUTIL} ${output_path} $<TARGET_FILE:${name}> |
||
2240 | ${strip_command} |
||
2241 | ) |
||
2242 | else() |
||
2243 | add_custom_command(TARGET ${name} POST_BUILD |
||
2244 | COMMAND ${CMAKE_OBJCOPY} --only-keep-debug $<TARGET_FILE:${name}> $<TARGET_FILE:${name}>.debug |
||
2245 | ${strip_command} -R .gnu_debuglink |
||
2246 | COMMAND ${CMAKE_OBJCOPY} --add-gnu-debuglink=$<TARGET_FILE:${name}>.debug $<TARGET_FILE:${name}> |
||
2247 | ) |
||
2248 | endif() |
||
2249 | endfunction() |
||
2250 | |||
2251 | # Usage: llvm_codesign(name [FORCE] [ENTITLEMENTS file] [BUNDLE_PATH path]) |
||
2252 | function(llvm_codesign name) |
||
2253 | cmake_parse_arguments(ARG "FORCE" "ENTITLEMENTS;BUNDLE_PATH" "" ${ARGN}) |
||
2254 | |||
2255 | if(NOT LLVM_CODESIGNING_IDENTITY) |
||
2256 | return() |
||
2257 | endif() |
||
2258 | |||
2259 | if(CMAKE_GENERATOR STREQUAL "Xcode") |
||
2260 | set_target_properties(${name} PROPERTIES |
||
2261 | XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY ${LLVM_CODESIGNING_IDENTITY} |
||
2262 | ) |
||
2263 | if(DEFINED ARG_ENTITLEMENTS) |
||
2264 | set_target_properties(${name} PROPERTIES |
||
2265 | XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS ${ARG_ENTITLEMENTS} |
||
2266 | ) |
||
2267 | endif() |
||
2268 | elseif(APPLE AND CMAKE_HOST_SYSTEM_NAME MATCHES Darwin) |
||
2269 | if(NOT CMAKE_CODESIGN) |
||
2270 | set(CMAKE_CODESIGN xcrun codesign) |
||
2271 | endif() |
||
2272 | if(NOT CMAKE_CODESIGN_ALLOCATE) |
||
2273 | execute_process( |
||
2274 | COMMAND xcrun -f codesign_allocate |
||
2275 | OUTPUT_STRIP_TRAILING_WHITESPACE |
||
2276 | OUTPUT_VARIABLE CMAKE_CODESIGN_ALLOCATE |
||
2277 | ) |
||
2278 | endif() |
||
2279 | if(DEFINED ARG_ENTITLEMENTS) |
||
2280 | set(pass_entitlements --entitlements ${ARG_ENTITLEMENTS}) |
||
2281 | endif() |
||
2282 | |||
2283 | if (NOT ARG_BUNDLE_PATH) |
||
2284 | set(ARG_BUNDLE_PATH $<TARGET_FILE:${name}>) |
||
2285 | endif() |
||
2286 | |||
2287 | # ld64 now always codesigns the binaries it creates. Apply the force arg |
||
2288 | # unconditionally so that we can - for example - add entitlements to the |
||
2289 | # targets that need it. |
||
2290 | set(force_flag "-f") |
||
2291 | |||
2292 | add_custom_command( |
||
2293 | TARGET ${name} POST_BUILD |
||
2294 | COMMAND ${CMAKE_COMMAND} -E |
||
2295 | env CODESIGN_ALLOCATE=${CMAKE_CODESIGN_ALLOCATE} |
||
2296 | ${CMAKE_CODESIGN} -s ${LLVM_CODESIGNING_IDENTITY} |
||
2297 | ${pass_entitlements} ${force_flag} ${ARG_BUNDLE_PATH} |
||
2298 | ) |
||
2299 | endif() |
||
2300 | endfunction() |
||
2301 | |||
2302 | function(llvm_setup_rpath name) |
||
2303 | if(CMAKE_INSTALL_RPATH) |
||
2304 | return() |
||
2305 | endif() |
||
2306 | |||
2307 | if(LLVM_INSTALL_PREFIX AND NOT (LLVM_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX)) |
||
2308 | set(extra_libdir ${LLVM_LIBRARY_DIR}) |
||
2309 | elseif(LLVM_BUILD_LIBRARY_DIR) |
||
2310 | set(extra_libdir ${LLVM_LIBRARY_DIR}) |
||
2311 | endif() |
||
2312 | |||
2313 | if (APPLE) |
||
2314 | set(_install_name_dir INSTALL_NAME_DIR "@rpath") |
||
2315 | set(_install_rpath "@loader_path/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) |
||
2316 | elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX" AND BUILD_SHARED_LIBS) |
||
2317 | # $ORIGIN is not interpreted at link time by aix ld. |
||
2318 | # Since BUILD_SHARED_LIBS is only recommended for use by developers, |
||
2319 | # hardcode the rpath to build/install lib dir first in this mode. |
||
2320 | # FIXME: update this when there is better solution. |
||
2321 | set(_install_rpath "${LLVM_LIBRARY_OUTPUT_INTDIR}" "${CMAKE_INSTALL_PREFIX}/lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) |
||
2322 | elseif(UNIX) |
||
2323 | set(_build_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir}) |
||
2324 | set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}") |
||
2325 | if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)") |
||
2326 | set_property(TARGET ${name} APPEND_STRING PROPERTY |
||
2327 | LINK_FLAGS " -Wl,-z,origin ") |
||
2328 | endif() |
||
2329 | if(LLVM_LINKER_IS_GNULD) |
||
2330 | # $ORIGIN is not interpreted at link time by ld.bfd |
||
2331 | set_property(TARGET ${name} APPEND_STRING PROPERTY |
||
2332 | LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ") |
||
2333 | endif() |
||
2334 | else() |
||
2335 | return() |
||
2336 | endif() |
||
2337 | |||
2338 | # Enable BUILD_WITH_INSTALL_RPATH unless CMAKE_BUILD_RPATH is set and not |
||
2339 | # building for macOS or AIX, as those platforms seemingly require it. |
||
2340 | # On AIX, the tool chain doesn't support modifying rpaths/libpaths for XCOFF |
||
2341 | # on install at the moment, so BUILD_WITH_INSTALL_RPATH is required. |
||
2342 | if("${CMAKE_BUILD_RPATH}" STREQUAL "") |
||
2343 | if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin|AIX") |
||
2344 | set_property(TARGET ${name} PROPERTY BUILD_WITH_INSTALL_RPATH ON) |
||
2345 | else() |
||
2346 | set_property(TARGET ${name} APPEND PROPERTY BUILD_RPATH "${_build_rpath}") |
||
2347 | endif() |
||
2348 | endif() |
||
2349 | |||
2350 | set_target_properties(${name} PROPERTIES |
||
2351 | INSTALL_RPATH "${_install_rpath}" |
||
2352 | ${_install_name_dir}) |
||
2353 | endfunction() |
||
2354 | |||
2355 | function(setup_dependency_debugging name) |
||
2356 | if(NOT LLVM_DEPENDENCY_DEBUGGING) |
||
2357 | return() |
||
2358 | endif() |
||
2359 | |||
2360 | if("intrinsics_gen" IN_LIST ARGN) |
||
2361 | return() |
||
2362 | endif() |
||
2363 | |||
2364 | set(deny_attributes_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Attributes.inc\"))") |
||
2365 | set(deny_intrinsics_inc "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Intrinsics.inc\"))") |
||
2366 | |||
2367 | set(sandbox_command "sandbox-exec -p '(version 1) (allow default) ${deny_attributes_inc} ${deny_intrinsics_inc}'") |
||
2368 | set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command}) |
||
2369 | endfunction() |
||
2370 | |||
2371 | # If the sources at the given `path` are under version control, set `out_var` |
||
2372 | # to the the path of a file which will be modified when the VCS revision |
||
2373 | # changes, attempting to create that file if it does not exist; if no such |
||
2374 | # file exists and one cannot be created, instead set `out_var` to the |
||
2375 | # empty string. |
||
2376 | # |
||
2377 | # If the sources are not under version control, do not define `out_var`. |
||
2378 | function(find_first_existing_vc_file path out_var) |
||
2379 | if(NOT EXISTS "${path}") |
||
2380 | return() |
||
2381 | endif() |
||
2382 | find_package(Git) |
||
2383 | if(GIT_FOUND) |
||
2384 | execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --git-dir |
||
2385 | WORKING_DIRECTORY ${path} |
||
2386 | RESULT_VARIABLE git_result |
||
2387 | OUTPUT_VARIABLE git_output |
||
2388 | ERROR_QUIET) |
||
2389 | if(git_result EQUAL 0) |
||
2390 | string(STRIP "${git_output}" git_output) |
||
2391 | get_filename_component(git_dir ${git_output} ABSOLUTE BASE_DIR ${path}) |
||
2392 | # Some branchless cases (e.g. 'repo') may not yet have .git/logs/HEAD |
||
2393 | if (NOT EXISTS "${git_dir}/logs/HEAD") |
||
2394 | execute_process(COMMAND ${CMAKE_COMMAND} -E touch HEAD |
||
2395 | WORKING_DIRECTORY "${git_dir}/logs" |
||
2396 | RESULT_VARIABLE touch_head_result |
||
2397 | ERROR_QUIET) |
||
2398 | if (NOT touch_head_result EQUAL 0) |
||
2399 | set(${out_var} "" PARENT_SCOPE) |
||
2400 | return() |
||
2401 | endif() |
||
2402 | endif() |
||
2403 | set(${out_var} "${git_dir}/logs/HEAD" PARENT_SCOPE) |
||
2404 | endif() |
||
2405 | endif() |
||
2406 | endfunction() |
||
2407 | |||
2408 | function(setup_host_tool tool_name setting_name exe_var_name target_var_name) |
||
2409 | set(${setting_name}_DEFAULT "${tool_name}") |
||
2410 | |||
2411 | if(LLVM_NATIVE_TOOL_DIR) |
||
2412 | if(EXISTS "${LLVM_NATIVE_TOOL_DIR}/${tool_name}${LLVM_HOST_EXECUTABLE_SUFFIX}") |
||
2413 | set(${setting_name}_DEFAULT "${LLVM_NATIVE_TOOL_DIR}/${tool_name}${LLVM_HOST_EXECUTABLE_SUFFIX}") |
||
2414 | endif() |
||
2415 | endif() |
||
2416 | |||
2417 | set(${setting_name} "${${setting_name}_DEFAULT}" CACHE |
||
2418 | STRING "Host ${tool_name} executable. Saves building if cross-compiling.") |
||
2419 | |||
2420 | if(NOT ${setting_name} STREQUAL "${tool_name}") |
||
2421 | set(exe_name ${${setting_name}}) |
||
2422 | set(target_name ${${setting_name}}) |
||
2423 | elseif(LLVM_USE_HOST_TOOLS) |
||
2424 | build_native_tool(${tool_name} exe_name DEPENDS ${tool_name}) |
||
2425 | set(target_name ${exe_name}) |
||
2426 | else() |
||
2427 | set(exe_name $<TARGET_FILE:${tool_name}>) |
||
2428 | set(target_name ${tool_name}) |
||
2429 | endif() |
||
2430 | set(${exe_var_name} "${exe_name}" CACHE STRING "") |
||
2431 | set(${target_var_name} "${target_name}" CACHE STRING "") |
||
2432 | endfunction() |