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