1include(LLVMProcessSources)
2include(LLVM-Config)
3include(DetermineGCCCompatible)
4
5function(llvm_update_compile_flags name)
6  get_property(sources TARGET ${name} PROPERTY SOURCES)
7  if("${sources}" MATCHES "\\.c(;|$)")
8    set(update_src_props ON)
9  endif()
10
11  # LLVM_REQUIRES_EH is an internal flag that individual targets can use to
12  # force EH
13  if(LLVM_REQUIRES_EH OR LLVM_ENABLE_EH)
14    if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
15      message(AUTHOR_WARNING "Exception handling requires RTTI. Enabling RTTI for ${name}")
16      set(LLVM_REQUIRES_RTTI ON)
17    endif()
18    if(MSVC)
19      list(APPEND LLVM_COMPILE_FLAGS "/EHsc")
20    endif()
21  else()
22    if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
23      list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
24    elseif(MSVC)
25      list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
26      list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
27    endif()
28  endif()
29
30  # LLVM_REQUIRES_RTTI is an internal flag that individual
31  # targets can use to force RTTI
32  set(LLVM_CONFIG_HAS_RTTI YES CACHE INTERNAL "")
33  if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
34    set(LLVM_CONFIG_HAS_RTTI NO CACHE INTERNAL "")
35    list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
36    if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
37      list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
38    elseif (MSVC)
39      list(APPEND LLVM_COMPILE_FLAGS "/GR-")
40    endif ()
41  elseif(MSVC)
42    list(APPEND LLVM_COMPILE_FLAGS "/GR")
43  endif()
44
45  # Assume that;
46  #   - LLVM_COMPILE_FLAGS is list.
47  #   - PROPERTY COMPILE_FLAGS is string.
48  string(REPLACE ";" " " target_compile_flags " ${LLVM_COMPILE_FLAGS}")
49
50  if(update_src_props)
51    foreach(fn ${sources})
52      get_filename_component(suf ${fn} EXT)
53      if("${suf}" STREQUAL ".cpp")
54        set_property(SOURCE ${fn} APPEND_STRING PROPERTY
55          COMPILE_FLAGS "${target_compile_flags}")
56      endif()
57    endforeach()
58  else()
59    # Update target props, since all sources are C++.
60    set_property(TARGET ${name} APPEND_STRING PROPERTY
61      COMPILE_FLAGS "${target_compile_flags}")
62  endif()
63
64  set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS})
65endfunction()
66
67function(add_llvm_symbol_exports target_name export_file)
68  if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
69    set(native_export_file "${target_name}.exports")
70    add_custom_command(OUTPUT ${native_export_file}
71      COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file}
72      DEPENDS ${export_file}
73      VERBATIM
74      COMMENT "Creating export file for ${target_name}")
75    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
76                 LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
77  elseif(${CMAKE_SYSTEM_NAME} MATCHES "AIX")
78    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
79                 LINK_FLAGS " -Wl,-bE:${export_file}")
80  elseif(LLVM_HAVE_LINK_VERSION_SCRIPT)
81    # Gold and BFD ld require a version script rather than a plain list.
82    set(native_export_file "${target_name}.exports")
83    # FIXME: Don't write the "local:" line on OpenBSD.
84    add_custom_command(OUTPUT ${native_export_file}
85      COMMAND echo "{" > ${native_export_file}
86      COMMAND grep -q "[[:alnum:]]" ${export_file} && echo "  global:" >> ${native_export_file} || :
87      COMMAND sed -e "s/$/;/" -e "s/^/    /" < ${export_file} >> ${native_export_file}
88      COMMAND echo "  local: *;" >> ${native_export_file}
89      COMMAND echo "};" >> ${native_export_file}
90      DEPENDS ${export_file}
91      VERBATIM
92      COMMENT "Creating export file for ${target_name}")
93    if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
94      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
95                   LINK_FLAGS "  -Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
96    else()
97      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
98                   LINK_FLAGS "  -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
99    endif()
100  else()
101    set(native_export_file "${target_name}.def")
102
103    add_custom_command(OUTPUT ${native_export_file}
104      COMMAND ${PYTHON_EXECUTABLE} -c "import sys;print(''.join(['EXPORTS\\n']+sys.stdin.readlines(),))"
105        < ${export_file} > ${native_export_file}
106      DEPENDS ${export_file}
107      VERBATIM
108      COMMENT "Creating export file for ${target_name}")
109    set(export_file_linker_flag "${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
110    if(MSVC)
111      set(export_file_linker_flag "/DEF:\"${export_file_linker_flag}\"")
112    endif()
113    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
114                 LINK_FLAGS " ${export_file_linker_flag}")
115  endif()
116
117  add_custom_target(${target_name}_exports DEPENDS ${native_export_file})
118  set_target_properties(${target_name}_exports PROPERTIES FOLDER "Misc")
119
120  get_property(srcs TARGET ${target_name} PROPERTY SOURCES)
121  foreach(src ${srcs})
122    get_filename_component(extension ${src} EXT)
123    if(extension STREQUAL ".cpp")
124      set(first_source_file ${src})
125      break()
126    endif()
127  endforeach()
128
129  # Force re-linking when the exports file changes. Actually, it
130  # forces recompilation of the source file. The LINK_DEPENDS target
131  # property only works for makefile-based generators.
132  # FIXME: This is not safe because this will create the same target
133  # ${native_export_file} in several different file:
134  # - One where we emitted ${target_name}_exports
135  # - One where we emitted the build command for the following object.
136  # set_property(SOURCE ${first_source_file} APPEND PROPERTY
137  #   OBJECT_DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${native_export_file})
138
139  set_property(DIRECTORY APPEND
140    PROPERTY ADDITIONAL_MAKE_CLEAN_FILES ${native_export_file})
141
142  add_dependencies(${target_name} ${target_name}_exports)
143
144  # Add dependency to *_exports later -- CMake issue 14747
145  list(APPEND LLVM_COMMON_DEPENDS ${target_name}_exports)
146  set(LLVM_COMMON_DEPENDS ${LLVM_COMMON_DEPENDS} PARENT_SCOPE)
147endfunction(add_llvm_symbol_exports)
148
149if(NOT WIN32 AND NOT APPLE)
150  execute_process(
151    COMMAND ${CMAKE_C_COMPILER} -Wl,--version
152    OUTPUT_VARIABLE stdout
153    ERROR_QUIET
154    )
155  if("${stdout}" MATCHES "GNU gold")
156    set(LLVM_LINKER_IS_GOLD ON)
157  endif()
158endif()
159
160function(add_link_opts target_name)
161  # Don't use linker optimizations in debug builds since it slows down the
162  # linker in a context where the optimizations are not important.
163  if (NOT uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG")
164
165    # Pass -O3 to the linker. This enabled different optimizations on different
166    # linkers.
167    if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin|SunOS|AIX" OR WIN32))
168      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
169                   LINK_FLAGS " -Wl,-O3")
170    endif()
171
172    if(LLVM_LINKER_IS_GOLD)
173      # With gold gc-sections is always safe.
174      set_property(TARGET ${target_name} APPEND_STRING PROPERTY
175                   LINK_FLAGS " -Wl,--gc-sections")
176      # Note that there is a bug with -Wl,--icf=safe so it is not safe
177      # to enable. See https://sourceware.org/bugzilla/show_bug.cgi?id=17704.
178    endif()
179
180    if(NOT LLVM_NO_DEAD_STRIP)
181      if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
182        # ld64's implementation of -dead_strip breaks tools that use plugins.
183        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
184                     LINK_FLAGS " -Wl,-dead_strip")
185      elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS")
186        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
187                     LINK_FLAGS " -Wl,-z -Wl,discard-unused=sections")
188      elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD)
189        # Object files are compiled with -ffunction-data-sections.
190        # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks
191        # tools that use plugins. Always pass --gc-sections once we require
192        # a newer linker.
193        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
194                     LINK_FLAGS " -Wl,--gc-sections")
195      endif()
196    endif()
197  endif()
198endfunction(add_link_opts)
199
200# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}.
201# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more,
202# or a certain builder, for eaxample, msbuild.exe, would be confused.
203function(set_output_directory target)
204  cmake_parse_arguments(ARG "" "BINARY_DIR;LIBRARY_DIR" "" ${ARGN})
205
206  # module_dir -- corresponding to LIBRARY_OUTPUT_DIRECTORY.
207  # It affects output of add_library(MODULE).
208  if(WIN32 OR CYGWIN)
209    # DLL platform
210    set(module_dir ${ARG_BINARY_DIR})
211  else()
212    set(module_dir ${ARG_LIBRARY_DIR})
213  endif()
214  if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".")
215    foreach(build_mode ${CMAKE_CONFIGURATION_TYPES})
216      string(TOUPPER "${build_mode}" CONFIG_SUFFIX)
217      if(ARG_BINARY_DIR)
218        string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${ARG_BINARY_DIR})
219        set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi})
220      endif()
221      if(ARG_LIBRARY_DIR)
222        string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${ARG_LIBRARY_DIR})
223        set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li})
224      endif()
225      if(module_dir)
226        string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${module_dir})
227        set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi})
228      endif()
229    endforeach()
230  else()
231    if(ARG_BINARY_DIR)
232      set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ARG_BINARY_DIR})
233    endif()
234    if(ARG_LIBRARY_DIR)
235      set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ARG_LIBRARY_DIR})
236    endif()
237    if(module_dir)
238      set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${module_dir})
239    endif()
240  endif()
241endfunction()
242
243# If on Windows and building with MSVC, add the resource script containing the
244# VERSIONINFO data to the project.  This embeds version resource information
245# into the output .exe or .dll.
246# TODO: Enable for MinGW Windows builds too.
247#
248function(add_windows_version_resource_file OUT_VAR)
249  set(sources ${ARGN})
250  if (MSVC)
251    set(resource_file ${LLVM_SOURCE_DIR}/resources/windows_version_resource.rc)
252    if(EXISTS ${resource_file})
253      set(sources ${sources} ${resource_file})
254      source_group("Resource Files" ${resource_file})
255      set(windows_resource_file ${resource_file} PARENT_SCOPE)
256    endif()
257  endif(MSVC)
258
259  set(${OUT_VAR} ${sources} PARENT_SCOPE)
260endfunction(add_windows_version_resource_file)
261
262# set_windows_version_resource_properties(name resource_file...
263#   VERSION_MAJOR int
264#     Optional major version number (defaults to LLVM_VERSION_MAJOR)
265#   VERSION_MINOR int
266#     Optional minor version number (defaults to LLVM_VERSION_MINOR)
267#   VERSION_PATCHLEVEL int
268#     Optional patchlevel version number (defaults to LLVM_VERSION_PATCH)
269#   VERSION_STRING
270#     Optional version string (defaults to PACKAGE_VERSION)
271#   PRODUCT_NAME
272#     Optional product name string (defaults to "LLVM")
273#   )
274function(set_windows_version_resource_properties name resource_file)
275  cmake_parse_arguments(ARG
276    ""
277    "VERSION_MAJOR;VERSION_MINOR;VERSION_PATCHLEVEL;VERSION_STRING;PRODUCT_NAME"
278    ""
279    ${ARGN})
280
281  if (NOT DEFINED ARG_VERSION_MAJOR)
282    set(ARG_VERSION_MAJOR ${LLVM_VERSION_MAJOR})
283  endif()
284
285  if (NOT DEFINED ARG_VERSION_MINOR)
286    set(ARG_VERSION_MINOR ${LLVM_VERSION_MINOR})
287  endif()
288
289  if (NOT DEFINED ARG_VERSION_PATCHLEVEL)
290    set(ARG_VERSION_PATCHLEVEL ${LLVM_VERSION_PATCH})
291  endif()
292
293  if (NOT DEFINED ARG_VERSION_STRING)
294    set(ARG_VERSION_STRING ${PACKAGE_VERSION})
295  endif()
296
297  if (NOT DEFINED ARG_PRODUCT_NAME)
298    set(ARG_PRODUCT_NAME "LLVM")
299  endif()
300
301  set_property(SOURCE ${resource_file}
302               PROPERTY COMPILE_FLAGS /nologo)
303  set_property(SOURCE ${resource_file}
304               PROPERTY COMPILE_DEFINITIONS
305               "RC_VERSION_FIELD_1=${ARG_VERSION_MAJOR}"
306               "RC_VERSION_FIELD_2=${ARG_VERSION_MINOR}"
307               "RC_VERSION_FIELD_3=${ARG_VERSION_PATCHLEVEL}"
308               "RC_VERSION_FIELD_4=0"
309               "RC_FILE_VERSION=\"${ARG_VERSION_STRING}\""
310               "RC_INTERNAL_NAME=\"${name}\""
311               "RC_PRODUCT_NAME=\"${ARG_PRODUCT_NAME}\""
312               "RC_PRODUCT_VERSION=\"${ARG_VERSION_STRING}\"")
313endfunction(set_windows_version_resource_properties)
314
315# llvm_add_library(name sources...
316#   SHARED;STATIC
317#     STATIC by default w/o BUILD_SHARED_LIBS.
318#     SHARED by default w/  BUILD_SHARED_LIBS.
319#   OBJECT
320#     Also create an OBJECT library target. Default if STATIC && SHARED.
321#   MODULE
322#     Target ${name} might not be created on unsupported platforms.
323#     Check with "if(TARGET ${name})".
324#   DISABLE_LLVM_LINK_LLVM_DYLIB
325#     Do not link this library to libLLVM, even if
326#     LLVM_LINK_LLVM_DYLIB is enabled.
327#   OUTPUT_NAME name
328#     Corresponds to OUTPUT_NAME in target properties.
329#   DEPENDS targets...
330#     Same semantics as add_dependencies().
331#   LINK_COMPONENTS components...
332#     Same as the variable LLVM_LINK_COMPONENTS.
333#   LINK_LIBS lib_targets...
334#     Same semantics as target_link_libraries().
335#   ADDITIONAL_HEADERS
336#     May specify header files for IDE generators.
337#   SONAME
338#     Should set SONAME link flags and create symlinks
339#   PLUGIN_TOOL
340#     The tool (i.e. cmake target) that this plugin will link against
341#   )
342function(llvm_add_library name)
343  cmake_parse_arguments(ARG
344    "MODULE;SHARED;STATIC;OBJECT;DISABLE_LLVM_LINK_LLVM_DYLIB;SONAME"
345    "OUTPUT_NAME;PLUGIN_TOOL"
346    "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
347    ${ARGN})
348  list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
349  if(ARG_ADDITIONAL_HEADERS)
350    # Pass through ADDITIONAL_HEADERS.
351    set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS})
352  endif()
353  if(ARG_OBJLIBS)
354    set(ALL_FILES ${ARG_OBJLIBS})
355  else()
356    llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS})
357  endif()
358
359  if(ARG_MODULE)
360    if(ARG_SHARED OR ARG_STATIC)
361      message(WARNING "MODULE with SHARED|STATIC doesn't make sense.")
362    endif()
363    # Plugins that link against a tool are allowed even when plugins in general are not
364    if(NOT LLVM_ENABLE_PLUGINS AND NOT (ARG_PLUGIN_TOOL AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS))
365      message(STATUS "${name} ignored -- Loadable modules not supported on this platform.")
366      return()
367    endif()
368  else()
369    if(ARG_PLUGIN_TOOL)
370      message(WARNING "PLUGIN_TOOL without MODULE doesn't make sense.")
371    endif()
372    if(BUILD_SHARED_LIBS AND NOT ARG_STATIC)
373      set(ARG_SHARED TRUE)
374    endif()
375    if(NOT ARG_SHARED)
376      set(ARG_STATIC TRUE)
377    endif()
378  endif()
379
380  # Generate objlib
381  if((ARG_SHARED AND ARG_STATIC) OR ARG_OBJECT)
382    # Generate an obj library for both targets.
383    set(obj_name "obj.${name}")
384    add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
385      ${ALL_FILES}
386      )
387    llvm_update_compile_flags(${obj_name})
388    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
389
390    # Do add_dependencies(obj) later due to CMake issue 14747.
391    list(APPEND objlibs ${obj_name})
392
393    set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
394  endif()
395
396  if(ARG_SHARED AND ARG_STATIC)
397    # static
398    set(name_static "${name}_static")
399    if(ARG_OUTPUT_NAME)
400      set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}")
401    endif()
402    # DEPENDS has been appended to LLVM_COMMON_LIBS.
403    llvm_add_library(${name_static} STATIC
404      ${output_name}
405      OBJLIBS ${ALL_FILES} # objlib
406      LINK_LIBS ${ARG_LINK_LIBS}
407      LINK_COMPONENTS ${ARG_LINK_COMPONENTS}
408      )
409    # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY.
410    set(ARG_STATIC)
411  endif()
412
413  if(ARG_MODULE)
414    add_library(${name} MODULE ${ALL_FILES})
415    llvm_setup_rpath(${name})
416  elseif(ARG_SHARED)
417    add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
418    add_library(${name} SHARED ${ALL_FILES})
419
420    llvm_setup_rpath(${name})
421
422  else()
423    add_library(${name} STATIC ${ALL_FILES})
424  endif()
425
426  setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
427
428  if(DEFINED windows_resource_file)
429    set_windows_version_resource_properties(${name} ${windows_resource_file})
430    set(windows_resource_file ${windows_resource_file} PARENT_SCOPE)
431  endif()
432
433  set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
434  # $<TARGET_OBJECTS> doesn't require compile flags.
435  if(NOT obj_name)
436    llvm_update_compile_flags(${name})
437  endif()
438  add_link_opts( ${name} )
439  if(ARG_OUTPUT_NAME)
440    set_target_properties(${name}
441      PROPERTIES
442      OUTPUT_NAME ${ARG_OUTPUT_NAME}
443      )
444  endif()
445
446  if(ARG_MODULE)
447    set_target_properties(${name} PROPERTIES
448      PREFIX ""
449      SUFFIX ${LLVM_PLUGIN_EXT}
450      )
451  endif()
452
453  if(ARG_SHARED)
454    if(WIN32)
455      set_target_properties(${name} PROPERTIES
456        PREFIX ""
457        )
458    endif()
459
460    # Set SOVERSION on shared libraries that lack explicit SONAME
461    # specifier, on *nix systems that are not Darwin.
462    if(UNIX AND NOT APPLE AND NOT ARG_SONAME)
463      set_target_properties(${name}
464        PROPERTIES
465		# Concatenate the version numbers since ldconfig expects exactly
466		# one component indicating the ABI version, while LLVM uses
467		# major+minor for that.
468        SOVERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_MINOR}
469        VERSION ${LLVM_VERSION_MAJOR}${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
470    endif()
471  endif()
472
473  if(ARG_MODULE OR ARG_SHARED)
474    # Do not add -Dname_EXPORTS to the command-line when building files in this
475    # target. Doing so is actively harmful for the modules build because it
476    # creates extra module variants, and not useful because we don't use these
477    # macros.
478    set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
479
480    if (LLVM_EXPORTED_SYMBOL_FILE)
481      add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
482    endif()
483  endif()
484
485  if(ARG_SHARED AND UNIX)
486    if(NOT APPLE AND ARG_SONAME)
487      get_target_property(output_name ${name} OUTPUT_NAME)
488      if(${output_name} STREQUAL "output_name-NOTFOUND")
489        set(output_name ${name})
490      endif()
491      set(library_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}${LLVM_VERSION_SUFFIX})
492      set(api_name ${output_name}-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
493      set_target_properties(${name} PROPERTIES OUTPUT_NAME ${library_name})
494      llvm_install_library_symlink(${api_name} ${library_name} SHARED
495        COMPONENT ${name}
496        ALWAYS_GENERATE)
497      llvm_install_library_symlink(${output_name} ${library_name} SHARED
498        COMPONENT ${name}
499        ALWAYS_GENERATE)
500    endif()
501  endif()
502
503  if(ARG_MODULE AND LLVM_EXPORT_SYMBOLS_FOR_PLUGINS AND ARG_PLUGIN_TOOL AND (WIN32 OR CYGWIN))
504    # On DLL platforms symbols are imported from the tool by linking against it.
505    set(llvm_libs ${ARG_PLUGIN_TOOL})
506  elseif (DEFINED LLVM_LINK_COMPONENTS OR DEFINED ARG_LINK_COMPONENTS)
507    if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
508      set(llvm_libs LLVM)
509    else()
510      llvm_map_components_to_libnames(llvm_libs
511       ${ARG_LINK_COMPONENTS}
512       ${LLVM_LINK_COMPONENTS}
513       )
514    endif()
515  else()
516    # Components have not been defined explicitly in CMake, so add the
517    # dependency information for this library as defined by LLVMBuild.
518    #
519    # It would be nice to verify that we have the dependencies for this library
520    # name, but using get_property(... SET) doesn't suffice to determine if a
521    # property has been set to an empty value.
522    get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
523  endif()
524
525  if(ARG_STATIC)
526    set(libtype INTERFACE)
527  else()
528    # We can use PRIVATE since SO knows its dependent libs.
529    set(libtype PRIVATE)
530  endif()
531
532  target_link_libraries(${name} ${libtype}
533      ${ARG_LINK_LIBS}
534      ${lib_deps}
535      ${llvm_libs}
536      )
537
538  if(LLVM_COMMON_DEPENDS)
539    add_dependencies(${name} ${LLVM_COMMON_DEPENDS})
540    # Add dependencies also to objlibs.
541    # CMake issue 14747 --  add_dependencies() might be ignored to objlib's user.
542    foreach(objlib ${objlibs})
543      add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS})
544    endforeach()
545  endif()
546
547  if(ARG_SHARED OR ARG_MODULE)
548    llvm_externalize_debuginfo(${name})
549  endif()
550endfunction()
551
552macro(add_llvm_library name)
553  cmake_parse_arguments(ARG
554    "SHARED;BUILDTREE_ONLY"
555    ""
556    ""
557    ${ARGN})
558  if( BUILD_SHARED_LIBS OR ARG_SHARED )
559    llvm_add_library(${name} SHARED ${ARG_UNPARSED_ARGUMENTS})
560  else()
561    llvm_add_library(${name} ${ARG_UNPARSED_ARGUMENTS})
562  endif()
563
564  # Libraries that are meant to only be exposed via the build tree only are
565  # never installed and are only exported as a target in the special build tree
566  # config file.
567  if (NOT ARG_BUILDTREE_ONLY)
568    set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
569  endif()
570
571  if( EXCLUDE_FROM_ALL )
572    set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
573  elseif(ARG_BUILDTREE_ONLY)
574    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS_BUILDTREE_ONLY ${name})
575  else()
576    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO" OR
577        (LLVM_LINK_LLVM_DYLIB AND ${name} STREQUAL "LLVM"))
578      set(install_dir lib${LLVM_LIBDIR_SUFFIX})
579      if(ARG_SHARED OR BUILD_SHARED_LIBS)
580        if(WIN32 OR CYGWIN OR MINGW)
581          set(install_type RUNTIME)
582          set(install_dir bin)
583        else()
584          set(install_type LIBRARY)
585        endif()
586      else()
587        set(install_type ARCHIVE)
588      endif()
589
590      if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
591          NOT LLVM_DISTRIBUTION_COMPONENTS)
592        set(export_to_llvmexports EXPORT LLVMExports)
593        set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
594      endif()
595
596      install(TARGETS ${name}
597              ${export_to_llvmexports}
598              ${install_type} DESTINATION ${install_dir}
599              COMPONENT ${name})
600
601      if (NOT CMAKE_CONFIGURATION_TYPES)
602        add_custom_target(install-${name}
603                          DEPENDS ${name}
604                          COMMAND "${CMAKE_COMMAND}"
605                                  -DCMAKE_INSTALL_COMPONENT=${name}
606                                  -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
607      endif()
608    endif()
609    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
610  endif()
611  set_target_properties(${name} PROPERTIES FOLDER "Libraries")
612endmacro(add_llvm_library name)
613
614macro(add_llvm_loadable_module name)
615  llvm_add_library(${name} MODULE ${ARGN})
616  if(NOT TARGET ${name})
617    # Add empty "phony" target
618    add_custom_target(${name})
619  else()
620    if( EXCLUDE_FROM_ALL )
621      set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
622    else()
623      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
624        if(WIN32 OR CYGWIN)
625          # DLL platform
626          set(dlldir "bin")
627        else()
628          set(dlldir "lib${LLVM_LIBDIR_SUFFIX}")
629        endif()
630
631        if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
632            NOT LLVM_DISTRIBUTION_COMPONENTS)
633          set(export_to_llvmexports EXPORT LLVMExports)
634          set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
635        endif()
636
637        install(TARGETS ${name}
638                ${export_to_llvmexports}
639                LIBRARY DESTINATION ${dlldir}
640                ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
641      endif()
642      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
643    endif()
644  endif()
645
646  set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
647endmacro(add_llvm_loadable_module name)
648
649
650macro(add_llvm_executable name)
651  cmake_parse_arguments(ARG "DISABLE_LLVM_LINK_LLVM_DYLIB;IGNORE_EXTERNALIZE_DEBUGINFO;NO_INSTALL_RPATH" "" "DEPENDS" ${ARGN})
652  llvm_process_sources( ALL_FILES ${ARG_UNPARSED_ARGUMENTS} )
653
654  list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
655
656  # Generate objlib
657  if(LLVM_ENABLE_OBJLIB)
658    # Generate an obj library for both targets.
659    set(obj_name "obj.${name}")
660    add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
661      ${ALL_FILES}
662      )
663    llvm_update_compile_flags(${obj_name})
664    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
665
666    set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
667  endif()
668
669  add_windows_version_resource_file(ALL_FILES ${ALL_FILES})
670
671  if(XCODE)
672    # Note: the dummy.cpp source file provides no definitions. However,
673    # it forces Xcode to properly link the static library.
674    list(APPEND ALL_FILES "${LLVM_MAIN_SRC_DIR}/cmake/dummy.cpp")
675  endif()
676
677  if( EXCLUDE_FROM_ALL )
678    add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
679  else()
680    add_executable(${name} ${ALL_FILES})
681  endif()
682
683  setup_dependency_debugging(${name} ${LLVM_COMMON_DEPENDS})
684
685  if(NOT ARG_NO_INSTALL_RPATH)
686    llvm_setup_rpath(${name})
687  endif()
688
689  if(DEFINED windows_resource_file)
690    set_windows_version_resource_properties(${name} ${windows_resource_file})
691  endif()
692
693  # $<TARGET_OBJECTS> doesn't require compile flags.
694  if(NOT LLVM_ENABLE_OBJLIB)
695    llvm_update_compile_flags(${name})
696  endif()
697  add_link_opts( ${name} )
698
699  # Do not add -Dname_EXPORTS to the command-line when building files in this
700  # target. Doing so is actively harmful for the modules build because it
701  # creates extra module variants, and not useful because we don't use these
702  # macros.
703  set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
704
705  if (LLVM_EXPORTED_SYMBOL_FILE)
706    add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
707  endif(LLVM_EXPORTED_SYMBOL_FILE)
708
709  if (LLVM_LINK_LLVM_DYLIB AND NOT ARG_DISABLE_LLVM_LINK_LLVM_DYLIB)
710    set(USE_SHARED USE_SHARED)
711  endif()
712
713  set(EXCLUDE_FROM_ALL OFF)
714  set_output_directory(${name} BINARY_DIR ${LLVM_RUNTIME_OUTPUT_INTDIR} LIBRARY_DIR ${LLVM_LIBRARY_OUTPUT_INTDIR})
715  llvm_config( ${name} ${USE_SHARED} ${LLVM_LINK_COMPONENTS} )
716  if( LLVM_COMMON_DEPENDS )
717    add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
718  endif( LLVM_COMMON_DEPENDS )
719
720  if(NOT ARG_IGNORE_EXTERNALIZE_DEBUGINFO)
721    llvm_externalize_debuginfo(${name})
722  endif()
723  if (PTHREAD_LIB)
724    # libpthreads overrides some standard library symbols, so main
725    # executable must be linked with it in order to provide consistent
726    # API for all shared libaries loaded by this executable.
727    target_link_libraries(${name} ${PTHREAD_LIB})
728  endif()
729endmacro(add_llvm_executable name)
730
731function(export_executable_symbols target)
732  if (LLVM_EXPORTED_SYMBOL_FILE)
733    # The symbol file should contain the symbols we want the executable to
734    # export
735    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
736  elseif (LLVM_EXPORT_SYMBOLS_FOR_PLUGINS)
737    # Extract the symbols to export from the static libraries that the
738    # executable links against.
739    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
740    set(exported_symbol_file ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${target}.symbols)
741    # We need to consider not just the direct link dependencies, but also the
742    # transitive link dependencies. Do this by starting with the set of direct
743    # dependencies, then the dependencies of those dependencies, and so on.
744    get_target_property(new_libs ${target} LINK_LIBRARIES)
745    set(link_libs ${new_libs})
746    while(NOT "${new_libs}" STREQUAL "")
747      foreach(lib ${new_libs})
748        if(TARGET ${lib})
749          get_target_property(lib_type ${lib} TYPE)
750          if("${lib_type}" STREQUAL "STATIC_LIBRARY")
751            list(APPEND static_libs ${lib})
752          else()
753            list(APPEND other_libs ${lib})
754          endif()
755          get_target_property(transitive_libs ${lib} INTERFACE_LINK_LIBRARIES)
756          foreach(transitive_lib ${transitive_libs})
757            list(FIND link_libs ${transitive_lib} idx)
758            if(TARGET ${transitive_lib} AND idx EQUAL -1)
759              list(APPEND newer_libs ${transitive_lib})
760              list(APPEND link_libs ${transitive_lib})
761            endif()
762          endforeach(transitive_lib)
763        endif()
764      endforeach(lib)
765      set(new_libs ${newer_libs})
766      set(newer_libs "")
767    endwhile()
768    if (MSVC)
769      set(mangling microsoft)
770    else()
771      set(mangling itanium)
772    endif()
773    add_custom_command(OUTPUT ${exported_symbol_file}
774                       COMMAND ${PYTHON_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py --mangling=${mangling} ${static_libs} -o ${exported_symbol_file}
775                       WORKING_DIRECTORY ${LLVM_LIBRARY_OUTPUT_INTDIR}
776                       DEPENDS ${LLVM_MAIN_SRC_DIR}/utils/extract_symbols.py ${static_libs}
777                       VERBATIM
778                       COMMENT "Generating export list for ${target}")
779    add_llvm_symbol_exports( ${target} ${exported_symbol_file} )
780    # If something links against this executable then we want a
781    # transitive link against only the libraries whose symbols
782    # we aren't exporting.
783    set_target_properties(${target} PROPERTIES INTERFACE_LINK_LIBRARIES "${other_libs}")
784    # The default import library suffix that cmake uses for cygwin/mingw is
785    # ".dll.a", but for clang.exe that causes a collision with libclang.dll,
786    # where the import libraries of both get named libclang.dll.a. Use a suffix
787    # of ".exe.a" to avoid this.
788    if(CYGWIN OR MINGW)
789      set_target_properties(${target} PROPERTIES IMPORT_SUFFIX ".exe.a")
790    endif()
791  elseif(NOT (WIN32 OR CYGWIN))
792    # On Windows auto-exporting everything doesn't work because of the limit on
793    # the size of the exported symbol table, but on other platforms we can do
794    # it without any trouble.
795    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
796    if (APPLE)
797      set_property(TARGET ${target} APPEND_STRING PROPERTY
798        LINK_FLAGS " -rdynamic")
799    endif()
800  endif()
801endfunction()
802
803if(NOT LLVM_TOOLCHAIN_TOOLS)
804  set (LLVM_TOOLCHAIN_TOOLS
805    llvm-ar
806    llvm-ranlib
807    llvm-lib
808    llvm-objdump
809    )
810endif()
811
812macro(add_llvm_tool name)
813  if( NOT LLVM_BUILD_TOOLS )
814    set(EXCLUDE_FROM_ALL ON)
815  endif()
816  add_llvm_executable(${name} ${ARGN})
817
818  if ( ${name} IN_LIST LLVM_TOOLCHAIN_TOOLS OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
819    if( LLVM_BUILD_TOOLS )
820      if(${name} IN_LIST LLVM_DISTRIBUTION_COMPONENTS OR
821          NOT LLVM_DISTRIBUTION_COMPONENTS)
822        set(export_to_llvmexports EXPORT LLVMExports)
823        set_property(GLOBAL PROPERTY LLVM_HAS_EXPORTS True)
824      endif()
825
826      install(TARGETS ${name}
827              ${export_to_llvmexports}
828              RUNTIME DESTINATION ${LLVM_TOOLS_INSTALL_DIR}
829              COMPONENT ${name})
830
831      if (NOT CMAKE_CONFIGURATION_TYPES)
832        add_custom_target(install-${name}
833                          DEPENDS ${name}
834                          COMMAND "${CMAKE_COMMAND}"
835                                  -DCMAKE_INSTALL_COMPONENT=${name}
836                                  -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
837      endif()
838    endif()
839  endif()
840  if( LLVM_BUILD_TOOLS )
841    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
842  endif()
843  set_target_properties(${name} PROPERTIES FOLDER "Tools")
844endmacro(add_llvm_tool name)
845
846
847macro(add_llvm_example name)
848  if( NOT LLVM_BUILD_EXAMPLES )
849    set(EXCLUDE_FROM_ALL ON)
850  endif()
851  add_llvm_executable(${name} ${ARGN})
852  if( LLVM_BUILD_EXAMPLES )
853    install(TARGETS ${name} RUNTIME DESTINATION examples)
854  endif()
855  set_target_properties(${name} PROPERTIES FOLDER "Examples")
856endmacro(add_llvm_example name)
857
858# This is a macro that is used to create targets for executables that are needed
859# for development, but that are not intended to be installed by default.
860macro(add_llvm_utility name)
861  if ( NOT LLVM_BUILD_UTILS )
862    set(EXCLUDE_FROM_ALL ON)
863  endif()
864
865  add_llvm_executable(${name} DISABLE_LLVM_LINK_LLVM_DYLIB ${ARGN})
866  set_target_properties(${name} PROPERTIES FOLDER "Utils")
867  if( LLVM_INSTALL_UTILS AND LLVM_BUILD_UTILS )
868    install (TARGETS ${name}
869      RUNTIME DESTINATION bin
870      COMPONENT ${name})
871    if (NOT CMAKE_CONFIGURATION_TYPES)
872      add_custom_target(install-${name}
873                        DEPENDS ${name}
874                        COMMAND "${CMAKE_COMMAND}"
875                                -DCMAKE_INSTALL_COMPONENT=${name}
876                                -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
877    endif()
878  endif()
879endmacro(add_llvm_utility name)
880
881
882macro(add_llvm_target target_name)
883  include_directories(BEFORE
884    ${CMAKE_CURRENT_BINARY_DIR}
885    ${CMAKE_CURRENT_SOURCE_DIR})
886  add_llvm_library(LLVM${target_name} ${ARGN})
887  set( CURRENT_LLVM_TARGET LLVM${target_name} )
888endmacro(add_llvm_target)
889
890function(canonicalize_tool_name name output)
891  string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" nameStrip ${name})
892  string(REPLACE "-" "_" nameUNDERSCORE ${nameStrip})
893  string(TOUPPER ${nameUNDERSCORE} nameUPPER)
894  set(${output} "${nameUPPER}" PARENT_SCOPE)
895endfunction(canonicalize_tool_name)
896
897# Custom add_subdirectory wrapper
898# Takes in a project name (i.e. LLVM), the subdirectory name, and an optional
899# path if it differs from the name.
900macro(add_llvm_subdirectory project type name)
901  set(add_llvm_external_dir "${ARGN}")
902  if("${add_llvm_external_dir}" STREQUAL "")
903    set(add_llvm_external_dir ${name})
904  endif()
905  canonicalize_tool_name(${name} nameUPPER)
906  if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}/CMakeLists.txt)
907    # Treat it as in-tree subproject.
908    option(${project}_${type}_${nameUPPER}_BUILD
909           "Whether to build ${name} as part of ${project}" On)
910    mark_as_advanced(${project}_${type}_${name}_BUILD)
911    if(${project}_${type}_${nameUPPER}_BUILD)
912      add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir} ${add_llvm_external_dir})
913      # Don't process it in add_llvm_implicit_projects().
914      set(${project}_${type}_${nameUPPER}_BUILD OFF)
915    endif()
916  else()
917    set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR
918      "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}"
919      CACHE PATH "Path to ${name} source directory")
920    set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT ON)
921    if(NOT LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR OR NOT EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
922      set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT OFF)
923    endif()
924    if("${LLVM_EXTERNAL_${nameUPPER}_BUILD}" STREQUAL "OFF")
925      set(${project}_${type}_${nameUPPER}_BUILD_DEFAULT OFF)
926    endif()
927    option(${project}_${type}_${nameUPPER}_BUILD
928      "Whether to build ${name} as part of LLVM"
929      ${${project}_${type}_${nameUPPER}_BUILD_DEFAULT})
930    if (${project}_${type}_${nameUPPER}_BUILD)
931      if(EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR})
932        add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
933      elseif(NOT "${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}" STREQUAL "")
934        message(WARNING "Nonexistent directory for ${name}: ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}")
935      endif()
936      # FIXME: It'd be redundant.
937      set(${project}_${type}_${nameUPPER}_BUILD Off)
938    endif()
939  endif()
940endmacro()
941
942# Add external project that may want to be built as part of llvm such as Clang,
943# lld, and Polly. This adds two options. One for the source directory of the
944# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to
945# enable or disable building it with everything else.
946# Additional parameter can be specified as the name of directory.
947macro(add_llvm_external_project name)
948  add_llvm_subdirectory(LLVM TOOL ${name} ${ARGN})
949endmacro()
950
951macro(add_llvm_tool_subdirectory name)
952  add_llvm_external_project(${name})
953endmacro(add_llvm_tool_subdirectory)
954
955function(get_project_name_from_src_var var output)
956  string(REGEX MATCH "LLVM_EXTERNAL_(.*)_SOURCE_DIR"
957         MACHED_TOOL "${var}")
958  if(MACHED_TOOL)
959    set(${output} ${CMAKE_MATCH_1} PARENT_SCOPE)
960  else()
961    set(${output} PARENT_SCOPE)
962  endif()
963endfunction()
964
965function(create_subdirectory_options project type)
966  file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
967  foreach(dir ${sub-dirs})
968    if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
969      canonicalize_tool_name(${dir} name)
970      option(${project}_${type}_${name}_BUILD
971           "Whether to build ${name} as part of ${project}" On)
972      mark_as_advanced(${project}_${type}_${name}_BUILD)
973    endif()
974  endforeach()
975endfunction(create_subdirectory_options)
976
977function(create_llvm_tool_options)
978  create_subdirectory_options(LLVM TOOL)
979endfunction(create_llvm_tool_options)
980
981function(llvm_add_implicit_projects project)
982  set(list_of_implicit_subdirs "")
983  file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
984  foreach(dir ${sub-dirs})
985    if(IS_DIRECTORY "${dir}" AND EXISTS "${dir}/CMakeLists.txt")
986      canonicalize_tool_name(${dir} name)
987      if (${project}_TOOL_${name}_BUILD)
988        get_filename_component(fn "${dir}" NAME)
989        list(APPEND list_of_implicit_subdirs "${fn}")
990      endif()
991    endif()
992  endforeach()
993
994  foreach(external_proj ${list_of_implicit_subdirs})
995    add_llvm_subdirectory(${project} TOOL "${external_proj}" ${ARGN})
996  endforeach()
997endfunction(llvm_add_implicit_projects)
998
999function(add_llvm_implicit_projects)
1000  llvm_add_implicit_projects(LLVM)
1001endfunction(add_llvm_implicit_projects)
1002
1003# Generic support for adding a unittest.
1004function(add_unittest test_suite test_name)
1005  if( NOT LLVM_BUILD_TESTS )
1006    set(EXCLUDE_FROM_ALL ON)
1007  endif()
1008
1009  include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include)
1010  if (NOT LLVM_ENABLE_THREADS)
1011    list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0)
1012  endif ()
1013
1014  if (SUPPORTS_NO_VARIADIC_MACROS_FLAG)
1015    list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros")
1016  endif ()
1017
1018  set(LLVM_REQUIRES_RTTI OFF)
1019
1020  list(APPEND LLVM_LINK_COMPONENTS Support) # gtest needs it for raw_ostream
1021  add_llvm_executable(${test_name} IGNORE_EXTERNALIZE_DEBUGINFO NO_INSTALL_RPATH ${ARGN})
1022  set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
1023  set_output_directory(${test_name} BINARY_DIR ${outdir} LIBRARY_DIR ${outdir})
1024  # libpthreads overrides some standard library symbols, so main
1025  # executable must be linked with it in order to provide consistent
1026  # API for all shared libaries loaded by this executable.
1027  target_link_libraries(${test_name} gtest_main gtest ${PTHREAD_LIB})
1028
1029  add_dependencies(${test_suite} ${test_name})
1030  get_target_property(test_suite_folder ${test_suite} FOLDER)
1031  if (NOT ${test_suite_folder} STREQUAL "NOTFOUND")
1032    set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
1033  endif ()
1034endfunction()
1035
1036function(llvm_add_go_executable binary pkgpath)
1037  cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN})
1038
1039  if(LLVM_BINDINGS MATCHES "go")
1040    # FIXME: This should depend only on the libraries Go needs.
1041    get_property(llvmlibs GLOBAL PROPERTY LLVM_LIBS)
1042    set(binpath ${CMAKE_BINARY_DIR}/bin/${binary}${CMAKE_EXECUTABLE_SUFFIX})
1043    set(cc "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
1044    set(cxx "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
1045    set(cppflags "")
1046    get_property(include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
1047    foreach(d ${include_dirs})
1048      set(cppflags "${cppflags} -I${d}")
1049    endforeach(d)
1050    set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
1051    add_custom_command(OUTPUT ${binpath}
1052      COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "go=${GO_EXECUTABLE}" "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}" "packages=${LLVM_GO_PACKAGES}"
1053              ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
1054      DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
1055              ${llvmlibs} ${ARG_DEPENDS}
1056      COMMENT "Building Go executable ${binary}"
1057      VERBATIM)
1058    if (ARG_ALL)
1059      add_custom_target(${binary} ALL DEPENDS ${binpath})
1060    else()
1061      add_custom_target(${binary} DEPENDS ${binpath})
1062    endif()
1063  endif()
1064endfunction()
1065
1066# This function provides an automatic way to 'configure'-like generate a file
1067# based on a set of common and custom variables, specifically targeting the
1068# variables needed for the 'lit.site.cfg' files. This function bundles the
1069# common variables that any Lit instance is likely to need, and custom
1070# variables can be passed in.
1071function(configure_lit_site_cfg input output)
1072  foreach(c ${LLVM_TARGETS_TO_BUILD})
1073    set(TARGETS_BUILT "${TARGETS_BUILT} ${c}")
1074  endforeach(c)
1075  set(TARGETS_TO_BUILD ${TARGETS_BUILT})
1076
1077  set(SHLIBEXT "${LTDL_SHLIB_EXT}")
1078
1079  # Configuration-time: See Unit/lit.site.cfg.in
1080  if (CMAKE_CFG_INTDIR STREQUAL ".")
1081    set(LLVM_BUILD_MODE ".")
1082  else ()
1083    set(LLVM_BUILD_MODE "%(build_mode)s")
1084  endif ()
1085
1086  # They below might not be the build tree but provided binary tree.
1087  set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR})
1088  set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR})
1089  string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_TOOLS_BINARY_DIR})
1090  string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR  ${LLVM_LIBRARY_DIR})
1091
1092  # SHLIBDIR points the build tree.
1093  string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}")
1094
1095  set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
1096  # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for
1097  # plugins. We may rename it.
1098  if(LLVM_ENABLE_PLUGINS)
1099    set(ENABLE_SHARED "1")
1100  else()
1101    set(ENABLE_SHARED "0")
1102  endif()
1103
1104  if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE)
1105    set(ENABLE_ASSERTIONS "1")
1106  else()
1107    set(ENABLE_ASSERTIONS "0")
1108  endif()
1109
1110  set(HOST_OS ${CMAKE_SYSTEM_NAME})
1111  set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR})
1112
1113  set(HOST_CC "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
1114  set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
1115  set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}")
1116
1117  set(LIT_SITE_CFG_IN_HEADER  "## Autogenerated from ${input}\n## Do not edit!")
1118
1119  configure_file(${input} ${output} @ONLY)
1120endfunction()
1121
1122# A raw function to create a lit target. This is used to implement the testuite
1123# management functions.
1124function(add_lit_target target comment)
1125  cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
1126  set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}")
1127  separate_arguments(LIT_ARGS)
1128  if (NOT CMAKE_CFG_INTDIR STREQUAL ".")
1129    list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR})
1130  endif ()
1131  if (EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
1132    # reset cache after erraneous r283029
1133    # TODO: remove this once all buildbots run
1134    if (LIT_COMMAND STREQUAL "${PYTHON_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py")
1135      unset(LIT_COMMAND CACHE)
1136    endif()
1137    set (LIT_COMMAND "${PYTHON_EXECUTABLE};${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py"
1138         CACHE STRING "Command used to spawn llvm-lit")
1139  else()
1140    find_program(LIT_COMMAND NAMES llvm-lit lit.py lit)
1141  endif ()
1142  list(APPEND LIT_COMMAND ${LIT_ARGS})
1143  foreach(param ${ARG_PARAMS})
1144    list(APPEND LIT_COMMAND --param ${param})
1145  endforeach()
1146  if (ARG_UNPARSED_ARGUMENTS)
1147    add_custom_target(${target}
1148      COMMAND ${LIT_COMMAND} ${ARG_UNPARSED_ARGUMENTS}
1149      COMMENT "${comment}"
1150      USES_TERMINAL
1151      )
1152  else()
1153    add_custom_target(${target}
1154      COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.")
1155    message(STATUS "${target} does nothing.")
1156  endif()
1157  if (ARG_DEPENDS)
1158    add_dependencies(${target} ${ARG_DEPENDS})
1159  endif()
1160
1161  # Tests should be excluded from "Build Solution".
1162  set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
1163endfunction()
1164
1165# A function to add a set of lit test suites to be driven through 'check-*' targets.
1166function(add_lit_testsuite target comment)
1167  cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
1168
1169  # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all.
1170  if(NOT EXCLUDE_FROM_ALL)
1171    # Register the testsuites, params and depends for the global check rule.
1172    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_UNPARSED_ARGUMENTS})
1173    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS})
1174    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS})
1175    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS})
1176  endif()
1177
1178  # Produce a specific suffixed check rule.
1179  add_lit_target(${target} ${comment}
1180    ${ARG_UNPARSED_ARGUMENTS}
1181    PARAMS ${ARG_PARAMS}
1182    DEPENDS ${ARG_DEPENDS}
1183    ARGS ${ARG_ARGS}
1184    )
1185endfunction()
1186
1187function(add_lit_testsuites project directory)
1188  if (NOT CMAKE_CONFIGURATION_TYPES)
1189    cmake_parse_arguments(ARG "" "" "PARAMS;DEPENDS;ARGS" ${ARGN})
1190
1191    # Search recursively for test directories by assuming anything not
1192    # in a directory called Inputs contains tests.
1193    file(GLOB_RECURSE to_process LIST_DIRECTORIES true ${directory}/*)
1194    foreach(lit_suite ${to_process})
1195      if(NOT IS_DIRECTORY ${lit_suite})
1196        continue()
1197      endif()
1198      string(FIND ${lit_suite} Inputs is_inputs)
1199      string(FIND ${lit_suite} Output is_output)
1200      if (NOT (is_inputs EQUAL -1 AND is_output EQUAL -1))
1201        continue()
1202      endif()
1203
1204      # Create a check- target for the directory.
1205      string(REPLACE ${directory} "" name_slash ${lit_suite})
1206      if (name_slash)
1207        string(REPLACE "/" "-" name_slash ${name_slash})
1208        string(REPLACE "\\" "-" name_dashes ${name_slash})
1209        string(TOLOWER "${project}${name_dashes}" name_var)
1210        add_lit_target("check-${name_var}" "Running lit suite ${lit_suite}"
1211          ${lit_suite}
1212          PARAMS ${ARG_PARAMS}
1213          DEPENDS ${ARG_DEPENDS}
1214          ARGS ${ARG_ARGS}
1215        )
1216      endif()
1217    endforeach()
1218  endif()
1219endfunction()
1220
1221function(llvm_install_library_symlink name dest type)
1222  cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
1223  foreach(path ${CMAKE_MODULE_PATH})
1224    if(EXISTS ${path}/LLVMInstallSymlink.cmake)
1225      set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake)
1226      break()
1227    endif()
1228  endforeach()
1229
1230  set(component ${ARG_COMPONENT})
1231  if(NOT component)
1232    set(component ${name})
1233  endif()
1234
1235  set(full_name ${CMAKE_${type}_LIBRARY_PREFIX}${name}${CMAKE_${type}_LIBRARY_SUFFIX})
1236  set(full_dest ${CMAKE_${type}_LIBRARY_PREFIX}${dest}${CMAKE_${type}_LIBRARY_SUFFIX})
1237
1238  set(output_dir lib${LLVM_LIBDIR_SUFFIX})
1239  if(WIN32 AND "${type}" STREQUAL "SHARED")
1240    set(output_dir bin)
1241  endif()
1242
1243  install(SCRIPT ${INSTALL_SYMLINK}
1244          CODE "install_symlink(${full_name} ${full_dest} ${output_dir})"
1245          COMPONENT ${component})
1246
1247  if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE)
1248    add_custom_target(install-${name}
1249                      DEPENDS ${name} ${dest} install-${dest}
1250                      COMMAND "${CMAKE_COMMAND}"
1251                              -DCMAKE_INSTALL_COMPONENT=${name}
1252                              -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
1253  endif()
1254endfunction()
1255
1256function(llvm_install_symlink name dest)
1257  cmake_parse_arguments(ARG "ALWAYS_GENERATE" "COMPONENT" "" ${ARGN})
1258  foreach(path ${CMAKE_MODULE_PATH})
1259    if(EXISTS ${path}/LLVMInstallSymlink.cmake)
1260      set(INSTALL_SYMLINK ${path}/LLVMInstallSymlink.cmake)
1261      break()
1262    endif()
1263  endforeach()
1264
1265  if(ARG_COMPONENT)
1266    set(component ${ARG_COMPONENT})
1267  else()
1268    if(ARG_ALWAYS_GENERATE)
1269      set(component ${dest})
1270    else()
1271      set(component ${name})
1272    endif()
1273  endif()
1274
1275  set(full_name ${name}${CMAKE_EXECUTABLE_SUFFIX})
1276  set(full_dest ${dest}${CMAKE_EXECUTABLE_SUFFIX})
1277
1278  install(SCRIPT ${INSTALL_SYMLINK}
1279          CODE "install_symlink(${full_name} ${full_dest} ${LLVM_TOOLS_INSTALL_DIR})"
1280          COMPONENT ${component})
1281
1282  if (NOT CMAKE_CONFIGURATION_TYPES AND NOT ARG_ALWAYS_GENERATE)
1283    add_custom_target(install-${name}
1284                      DEPENDS ${name} ${dest} install-${dest}
1285                      COMMAND "${CMAKE_COMMAND}"
1286                              -DCMAKE_INSTALL_COMPONENT=${name}
1287                              -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
1288  endif()
1289endfunction()
1290
1291function(add_llvm_tool_symlink link_name target)
1292  cmake_parse_arguments(ARG "ALWAYS_GENERATE" "OUTPUT_DIR" "" ${ARGN})
1293  # This got a bit gross... For multi-configuration generators the target
1294  # properties return the resolved value of the string, not the build system
1295  # expression. To reconstruct the platform-agnostic path we have to do some
1296  # magic. First we grab one of the types, and a type-specific path. Then from
1297  # the type-specific path we find the last occurrence of the type in the path,
1298  # and replace it with CMAKE_CFG_INTDIR. This allows the build step to be type
1299  # agnostic again.
1300  if(NOT ARG_OUTPUT_DIR)
1301    if(CMAKE_CONFIGURATION_TYPES)
1302      list(GET CMAKE_CONFIGURATION_TYPES 0 first_type)
1303      string(TOUPPER ${first_type} first_type_upper)
1304      set(first_type_suffix _${first_type_upper})
1305    endif()
1306    get_target_property(target_type ${target} TYPE)
1307    if(${target_type} STREQUAL "STATIC_LIBRARY")
1308      get_target_property(ARG_OUTPUT_DIR ${target} ARCHIVE_OUTPUT_DIRECTORY${first_type_suffix})
1309    elseif(UNIX AND ${target_type} STREQUAL "SHARED_LIBRARY")
1310      get_target_property(ARG_OUTPUT_DIR ${target} LIBRARY_OUTPUT_DIRECTORY${first_type_suffix})
1311    else()
1312      get_target_property(ARG_OUTPUT_DIR ${target} RUNTIME_OUTPUT_DIRECTORY${first_type_suffix})
1313    endif()
1314    if(CMAKE_CONFIGURATION_TYPES)
1315      string(FIND "${ARG_OUTPUT_DIR}" "/${first_type}/" type_start REVERSE)
1316      string(SUBSTRING "${ARG_OUTPUT_DIR}" 0 ${type_start} path_prefix)
1317      string(SUBSTRING "${ARG_OUTPUT_DIR}" ${type_start} -1 path_suffix)
1318      string(REPLACE "/${first_type}/" "/${CMAKE_CFG_INTDIR}/"
1319             path_suffix ${path_suffix})
1320      set(ARG_OUTPUT_DIR ${path_prefix}${path_suffix})
1321    endif()
1322  endif()
1323
1324  if(UNIX)
1325    set(LLVM_LINK_OR_COPY create_symlink)
1326    set(dest_binary "$<TARGET_FILE_NAME:${target}>")
1327  else()
1328    set(LLVM_LINK_OR_COPY copy)
1329    set(dest_binary "$<TARGET_FILE:${target}>")
1330  endif()
1331
1332  set(output_path "${ARG_OUTPUT_DIR}/${link_name}${CMAKE_EXECUTABLE_SUFFIX}")
1333
1334  set(target_name ${link_name})
1335  if(TARGET ${link_name})
1336    set(target_name ${link_name}-link)
1337  endif()
1338
1339
1340  if(ARG_ALWAYS_GENERATE)
1341    set_property(DIRECTORY APPEND PROPERTY
1342      ADDITIONAL_MAKE_CLEAN_FILES ${dest_binary})
1343    add_custom_command(TARGET ${target} POST_BUILD
1344      COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}")
1345  else()
1346    add_custom_command(OUTPUT ${output_path}
1347                     COMMAND ${CMAKE_COMMAND} -E ${LLVM_LINK_OR_COPY} "${dest_binary}" "${output_path}"
1348                     DEPENDS ${target})
1349    add_custom_target(${target_name} ALL DEPENDS ${target} ${output_path})
1350    set_target_properties(${target_name} PROPERTIES FOLDER Tools)
1351
1352    # Make sure both the link and target are toolchain tools
1353    if (${link_name} IN_LIST LLVM_TOOLCHAIN_TOOLS AND ${target} IN_LIST LLVM_TOOLCHAIN_TOOLS)
1354      set(TOOL_IS_TOOLCHAIN ON)
1355    endif()
1356
1357    if ((TOOL_IS_TOOLCHAIN OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY) AND LLVM_BUILD_TOOLS)
1358      llvm_install_symlink(${link_name} ${target})
1359    endif()
1360  endif()
1361endfunction()
1362
1363function(llvm_externalize_debuginfo name)
1364  if(NOT LLVM_EXTERNALIZE_DEBUGINFO)
1365    return()
1366  endif()
1367
1368  if(NOT LLVM_EXTERNALIZE_DEBUGINFO_SKIP_STRIP)
1369    set(strip_command COMMAND xcrun strip -Sxl $<TARGET_FILE:${name}>)
1370  endif()
1371
1372  if(APPLE)
1373    if(CMAKE_CXX_FLAGS MATCHES "-flto"
1374      OR CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE} MATCHES "-flto")
1375
1376      set(lto_object ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${name}-lto.o)
1377      set_property(TARGET ${name} APPEND_STRING PROPERTY
1378        LINK_FLAGS " -Wl,-object_path_lto,${lto_object}")
1379    endif()
1380    add_custom_command(TARGET ${name} POST_BUILD
1381      COMMAND xcrun dsymutil $<TARGET_FILE:${name}>
1382      ${strip_command}
1383      )
1384  else()
1385    message(FATAL_ERROR "LLVM_EXTERNALIZE_DEBUGINFO isn't implemented for non-darwin platforms!")
1386  endif()
1387endfunction()
1388
1389function(llvm_setup_rpath name)
1390  if(CMAKE_INSTALL_RPATH)
1391    return()
1392  endif()
1393
1394  if(LLVM_INSTALL_PREFIX AND NOT (LLVM_INSTALL_PREFIX STREQUAL CMAKE_INSTALL_PREFIX))
1395    set(extra_libdir ${LLVM_LIBRARY_DIR})
1396  elseif(LLVM_BUILD_LIBRARY_DIR)
1397    set(extra_libdir ${LLVM_LIBRARY_DIR})
1398  endif()
1399
1400  if (APPLE)
1401    set(_install_name_dir INSTALL_NAME_DIR "@rpath")
1402    set(_install_rpath "@loader_path/../lib" ${extra_libdir})
1403  elseif(UNIX)
1404    set(_install_rpath "\$ORIGIN/../lib${LLVM_LIBDIR_SUFFIX}" ${extra_libdir})
1405    if(${CMAKE_SYSTEM_NAME} MATCHES "(FreeBSD|DragonFly)")
1406      set_property(TARGET ${name} APPEND_STRING PROPERTY
1407                   LINK_FLAGS " -Wl,-z,origin ")
1408    elseif(${CMAKE_SYSTEM_NAME} STREQUAL "Linux" AND NOT LLVM_LINKER_IS_GOLD)
1409      # $ORIGIN is not interpreted at link time by ld.bfd
1410      set_property(TARGET ${name} APPEND_STRING PROPERTY
1411                   LINK_FLAGS " -Wl,-rpath-link,${LLVM_LIBRARY_OUTPUT_INTDIR} ")
1412    endif()
1413  else()
1414    return()
1415  endif()
1416
1417  set_target_properties(${name} PROPERTIES
1418                        BUILD_WITH_INSTALL_RPATH On
1419                        INSTALL_RPATH "${_install_rpath}"
1420                        ${_install_name_dir})
1421endfunction()
1422
1423function(setup_dependency_debugging name)
1424  if(NOT LLVM_DEPENDENCY_DEBUGGING)
1425    return()
1426  endif()
1427
1428  if("intrinsics_gen" IN_LIST ARGN)
1429    return()
1430  endif()
1431
1432  set(deny_attributes_gen "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Attributes.gen\"))")
1433  set(deny_intrinsics_gen "(deny file* (literal \"${LLVM_BINARY_DIR}/include/llvm/IR/Intrinsics.gen\"))")
1434
1435  set(sandbox_command "sandbox-exec -p '(version 1) (allow default) ${deny_attributes_gen} ${deny_intrinsics_gen}'")
1436  set_target_properties(${name} PROPERTIES RULE_LAUNCH_COMPILE ${sandbox_command})
1437endfunction()
1438