1include(LLVMParseArguments)
2include(LLVMProcessSources)
3include(LLVM-Config)
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
12  # targets can use to force EH
13  if((LLVM_REQUIRES_EH OR LLVM_ENABLE_EH) AND NOT CLANG_CL)
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  else()
19    if(LLVM_COMPILER_IS_GCC_COMPATIBLE)
20      list(APPEND LLVM_COMPILE_FLAGS "-fno-exceptions")
21    elseif(MSVC)
22      list(APPEND LLVM_COMPILE_DEFINITIONS _HAS_EXCEPTIONS=0)
23      list(APPEND LLVM_COMPILE_FLAGS "/EHs-c-")
24    endif()
25    if (CLANG_CL)
26      # FIXME: Remove this once clang-cl supports SEH
27      list(APPEND LLVM_COMPILE_DEFINITIONS "GTEST_HAS_SEH=0")
28    endif()
29  endif()
30
31  # LLVM_REQUIRES_RTTI is an internal flag that individual
32  # targets can use to force RTTI
33  if(NOT (LLVM_REQUIRES_RTTI OR LLVM_ENABLE_RTTI))
34    list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_RTTI=0)
35    if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
36      list(APPEND LLVM_COMPILE_FLAGS "-fno-rtti")
37    elseif (MSVC)
38      list(APPEND LLVM_COMPILE_FLAGS "/GR-")
39    endif ()
40  endif()
41
42  # Assume that;
43  #   - LLVM_COMPILE_FLAGS is list.
44  #   - PROPERTY COMPILE_FLAGS is string.
45  string(REPLACE ";" " " target_compile_flags "${LLVM_COMPILE_FLAGS}")
46
47  if(update_src_props)
48    foreach(fn ${sources})
49      get_filename_component(suf ${fn} EXT)
50      if("${suf}" STREQUAL ".cpp")
51        set_property(SOURCE ${fn} APPEND_STRING PROPERTY
52          COMPILE_FLAGS "${target_compile_flags}")
53      endif()
54    endforeach()
55  else()
56    # Update target props, since all sources are C++.
57    set_property(TARGET ${name} APPEND_STRING PROPERTY
58      COMPILE_FLAGS "${target_compile_flags}")
59  endif()
60
61  set_property(TARGET ${name} APPEND PROPERTY COMPILE_DEFINITIONS ${LLVM_COMPILE_DEFINITIONS})
62endfunction()
63
64function(add_llvm_symbol_exports target_name export_file)
65  if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
66    set(native_export_file "${target_name}.exports")
67    add_custom_command(OUTPUT ${native_export_file}
68      COMMAND sed -e "s/^/_/" < ${export_file} > ${native_export_file}
69      DEPENDS ${export_file}
70      VERBATIM
71      COMMENT "Creating export file for ${target_name}")
72    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
73                 LINK_FLAGS " -Wl,-exported_symbols_list,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
74  elseif(LLVM_HAVE_LINK_VERSION_SCRIPT)
75    # Gold and BFD ld require a version script rather than a plain list.
76    set(native_export_file "${target_name}.exports")
77    # FIXME: Don't write the "local:" line on OpenBSD.
78    add_custom_command(OUTPUT ${native_export_file}
79      COMMAND echo "{" > ${native_export_file}
80      COMMAND grep -q "[[:alnum:]]" ${export_file} && echo "  global:" >> ${native_export_file} || :
81      COMMAND sed -e "s/$/;/" -e "s/^/    /" < ${export_file} >> ${native_export_file}
82      COMMAND echo "  local: *;" >> ${native_export_file}
83      COMMAND echo "};" >> ${native_export_file}
84      DEPENDS ${export_file}
85      VERBATIM
86      COMMENT "Creating export file for ${target_name}")
87    set_property(TARGET ${target_name} APPEND_STRING PROPERTY
88                 LINK_FLAGS "  -Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/${native_export_file}")
89  else()
90    set(native_export_file "${target_name}.def")
91
92    set(CAT "cat")
93    set(export_file_nativeslashes ${export_file})
94    if(WIN32 AND NOT CYGWIN)
95      set(CAT "type")
96      # Convert ${export_file} to native format (backslashes) for "type"
97      # Does not use file(TO_NATIVE_PATH) as it doesn't create a native
98      # path but a build-system specific format (see CMake bug
99      # http://public.kitware.com/Bug/print_bug_page.php?bug_id=5939 )
100      string(REPLACE / \\ export_file_nativeslashes ${export_file})
101    endif()
102
103    add_custom_command(OUTPUT ${native_export_file}
104      COMMAND ${CMAKE_COMMAND} -E echo "EXPORTS" > ${native_export_file}
105      COMMAND ${CAT} ${export_file_nativeslashes} >> ${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" 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(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD)
186        # Object files are compiled with -ffunction-data-sections.
187        # Versions of bfd ld < 2.23.1 have a bug in --gc-sections that breaks
188        # tools that use plugins. Always pass --gc-sections once we require
189        # a newer linker.
190        set_property(TARGET ${target_name} APPEND_STRING PROPERTY
191                     LINK_FLAGS " -Wl,--gc-sections")
192      endif()
193    endif()
194  endif()
195endfunction(add_link_opts)
196
197# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}.
198# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more,
199# or a certain builder, for eaxample, msbuild.exe, would be confused.
200function(set_output_directory target bindir libdir)
201  # Do nothing if *_OUTPUT_INTDIR is empty.
202  if("${bindir}" STREQUAL "")
203    return()
204  endif()
205
206  # moddir -- corresponding to LIBRARY_OUTPUT_DIRECTORY.
207  # It affects output of add_library(MODULE).
208  if(WIN32 OR CYGWIN)
209    # DLL platform
210    set(moddir ${bindir})
211  else()
212    set(moddir ${libdir})
213  endif()
214  if(NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".")
215    foreach(build_mode ${CMAKE_CONFIGURATION_TYPES})
216      string(TOUPPER "${build_mode}" CONFIG_SUFFIX)
217      string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${bindir})
218      string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${libdir})
219      string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${moddir})
220      set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi})
221      set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li})
222      set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi})
223    endforeach()
224  else()
225    set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${bindir})
226    set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${libdir})
227    set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${moddir})
228  endif()
229endfunction()
230
231# llvm_add_library(name sources...
232#   SHARED;STATIC
233#     STATIC by default w/o BUILD_SHARED_LIBS.
234#     SHARED by default w/  BUILD_SHARED_LIBS.
235#   MODULE
236#     Target ${name} might not be created on unsupported platforms.
237#     Check with "if(TARGET ${name})".
238#   OUTPUT_NAME name
239#     Corresponds to OUTPUT_NAME in target properties.
240#   DEPENDS targets...
241#     Same semantics as add_dependencies().
242#   LINK_COMPONENTS components...
243#     Same as the variable LLVM_LINK_COMPONENTS.
244#   LINK_LIBS lib_targets...
245#     Same semantics as target_link_libraries().
246#   ADDITIONAL_HEADERS
247#     May specify header files for IDE generators.
248#   )
249function(llvm_add_library name)
250  cmake_parse_arguments(ARG
251    "MODULE;SHARED;STATIC"
252    "OUTPUT_NAME"
253    "ADDITIONAL_HEADERS;DEPENDS;LINK_COMPONENTS;LINK_LIBS;OBJLIBS"
254    ${ARGN})
255  list(APPEND LLVM_COMMON_DEPENDS ${ARG_DEPENDS})
256  if(ARG_ADDITIONAL_HEADERS)
257    # Pass through ADDITIONAL_HEADERS.
258    set(ARG_ADDITIONAL_HEADERS ADDITIONAL_HEADERS ${ARG_ADDITIONAL_HEADERS})
259  endif()
260  if(ARG_OBJLIBS)
261    set(ALL_FILES ${ARG_OBJLIBS})
262  else()
263    llvm_process_sources(ALL_FILES ${ARG_UNPARSED_ARGUMENTS} ${ARG_ADDITIONAL_HEADERS})
264  endif()
265
266  if(ARG_MODULE)
267    if(ARG_SHARED OR ARG_STATIC)
268      message(WARNING "MODULE with SHARED|STATIC doesn't make sense.")
269    endif()
270    if(NOT LLVM_ENABLE_PLUGINS)
271      message(STATUS "${name} ignored -- Loadable modules not supported on this platform.")
272      return()
273    endif()
274  else()
275    if(BUILD_SHARED_LIBS AND NOT ARG_STATIC)
276      set(ARG_SHARED TRUE)
277    endif()
278    if(NOT ARG_SHARED)
279      set(ARG_STATIC TRUE)
280    endif()
281  endif()
282
283  # Generate objlib
284  if(ARG_SHARED AND ARG_STATIC)
285    # Generate an obj library for both targets.
286    set(obj_name "obj.${name}")
287    add_library(${obj_name} OBJECT EXCLUDE_FROM_ALL
288      ${ALL_FILES}
289      )
290    llvm_update_compile_flags(${obj_name})
291    set(ALL_FILES "$<TARGET_OBJECTS:${obj_name}>")
292
293    # Do add_dependencies(obj) later due to CMake issue 14747.
294    list(APPEND objlibs ${obj_name})
295
296    set_target_properties(${obj_name} PROPERTIES FOLDER "Object Libraries")
297  endif()
298
299  if(ARG_SHARED AND ARG_STATIC)
300    # static
301    set(name_static "${name}_static")
302    if(ARG_OUTPUT_NAME)
303      set(output_name OUTPUT_NAME "${ARG_OUTPUT_NAME}")
304    endif()
305    # DEPENDS has been appended to LLVM_COMMON_LIBS.
306    llvm_add_library(${name_static} STATIC
307      ${output_name}
308      OBJLIBS ${ALL_FILES} # objlib
309      LINK_LIBS ${ARG_LINK_LIBS}
310      LINK_COMPONENTS ${ARG_LINK_COMPONENTS}
311      )
312    # FIXME: Add name_static to anywhere in TARGET ${name}'s PROPERTY.
313    set(ARG_STATIC)
314  endif()
315
316  if(ARG_MODULE)
317    add_library(${name} MODULE ${ALL_FILES})
318  elseif(ARG_SHARED)
319    add_library(${name} SHARED ${ALL_FILES})
320  else()
321    add_library(${name} STATIC ${ALL_FILES})
322  endif()
323  set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
324  llvm_update_compile_flags(${name})
325  add_link_opts( ${name} )
326  if(ARG_OUTPUT_NAME)
327    set_target_properties(${name}
328      PROPERTIES
329      OUTPUT_NAME ${ARG_OUTPUT_NAME}
330      )
331  endif()
332
333  if(ARG_MODULE)
334    set_target_properties(${name} PROPERTIES
335      PREFIX ""
336      SUFFIX ${LLVM_PLUGIN_EXT}
337      )
338  endif()
339
340  if(ARG_SHARED)
341    if(WIN32)
342      set_target_properties(${name} PROPERTIES
343        PREFIX ""
344        )
345    endif()
346
347    set_target_properties(${name}
348      PROPERTIES
349      SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}
350      VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
351  endif()
352
353  if(ARG_MODULE OR ARG_SHARED)
354    # Do not add -Dname_EXPORTS to the command-line when building files in this
355    # target. Doing so is actively harmful for the modules build because it
356    # creates extra module variants, and not useful because we don't use these
357    # macros.
358    set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
359
360    if (LLVM_EXPORTED_SYMBOL_FILE)
361      add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
362    endif()
363  endif()
364
365  # Add the explicit dependency information for this library.
366  #
367  # It would be nice to verify that we have the dependencies for this library
368  # name, but using get_property(... SET) doesn't suffice to determine if a
369  # property has been set to an empty value.
370  get_property(lib_deps GLOBAL PROPERTY LLVMBUILD_LIB_DEPS_${name})
371
372  llvm_map_components_to_libnames(llvm_libs
373    ${ARG_LINK_COMPONENTS}
374    ${LLVM_LINK_COMPONENTS}
375    )
376
377  if(CMAKE_VERSION VERSION_LESS 2.8.12)
378    # Link libs w/o keywords, assuming PUBLIC.
379    target_link_libraries(${name}
380      ${ARG_LINK_LIBS}
381      ${lib_deps}
382      ${llvm_libs}
383      )
384  elseif(ARG_STATIC)
385    target_link_libraries(${name} INTERFACE
386      ${ARG_LINK_LIBS}
387      ${lib_deps}
388      ${llvm_libs}
389      )
390  else()
391    # We can use PRIVATE since SO knows its dependent libs.
392    target_link_libraries(${name} PRIVATE
393      ${ARG_LINK_LIBS}
394      ${lib_deps}
395      ${llvm_libs}
396      )
397  endif()
398
399  if(LLVM_COMMON_DEPENDS)
400    add_dependencies(${name} ${LLVM_COMMON_DEPENDS})
401    # Add dependencies also to objlibs.
402    # CMake issue 14747 --  add_dependencies() might be ignored to objlib's user.
403    foreach(objlib ${objlibs})
404      add_dependencies(${objlib} ${LLVM_COMMON_DEPENDS})
405    endforeach()
406  endif()
407endfunction()
408
409macro(add_llvm_library name)
410  cmake_parse_arguments(ARG
411    "SHARED"
412    ""
413    ""
414    ${ARGN})
415  if( BUILD_SHARED_LIBS )
416    llvm_add_library(${name} SHARED ${ARGN})
417  else()
418    llvm_add_library(${name} ${ARGN})
419  endif()
420  set_property( GLOBAL APPEND PROPERTY LLVM_LIBS ${name} )
421
422  if( EXCLUDE_FROM_ALL )
423    set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
424  else()
425    if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY OR ${name} STREQUAL "LTO")
426      if(ARG_SHARED OR BUILD_SHARED_LIBS)
427        if(WIN32 OR CYGWIN)
428          set(install_type RUNTIME)
429        else()
430          set(install_type LIBRARY)
431        endif()
432      else()
433        set(install_type ARCHIVE)
434      endif()
435
436      install(TARGETS ${name}
437            EXPORT LLVMExports
438            ${install_type} DESTINATION lib${LLVM_LIBDIR_SUFFIX}
439            COMPONENT ${name})
440
441      if (NOT CMAKE_CONFIGURATION_TYPES)
442        add_custom_target(install-${name}
443                          DEPENDS ${name}
444                          COMMAND "${CMAKE_COMMAND}"
445                                  -DCMAKE_INSTALL_COMPONENT=${name}
446                                  -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
447      endif()
448    endif()
449    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
450  endif()
451  set_target_properties(${name} PROPERTIES FOLDER "Libraries")
452endmacro(add_llvm_library name)
453
454macro(add_llvm_loadable_module name)
455  llvm_add_library(${name} MODULE ${ARGN})
456  if(NOT TARGET ${name})
457    # Add empty "phony" target
458    add_custom_target(${name})
459  else()
460    if( EXCLUDE_FROM_ALL )
461      set_target_properties( ${name} PROPERTIES EXCLUDE_FROM_ALL ON)
462    else()
463      if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
464        if(WIN32 OR CYGWIN)
465          # DLL platform
466          set(dlldir "bin")
467        else()
468          set(dlldir "lib${LLVM_LIBDIR_SUFFIX}")
469        endif()
470        install(TARGETS ${name}
471          EXPORT LLVMExports
472          LIBRARY DESTINATION ${dlldir}
473          ARCHIVE DESTINATION lib${LLVM_LIBDIR_SUFFIX})
474      endif()
475      set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
476    endif()
477  endif()
478
479  set_target_properties(${name} PROPERTIES FOLDER "Loadable modules")
480endmacro(add_llvm_loadable_module name)
481
482
483macro(add_llvm_executable name)
484  llvm_process_sources( ALL_FILES ${ARGN} )
485  if( EXCLUDE_FROM_ALL )
486    add_executable(${name} EXCLUDE_FROM_ALL ${ALL_FILES})
487  else()
488    add_executable(${name} ${ALL_FILES})
489  endif()
490  llvm_update_compile_flags(${name})
491  add_link_opts( ${name} )
492
493  # Do not add -Dname_EXPORTS to the command-line when building files in this
494  # target. Doing so is actively harmful for the modules build because it
495  # creates extra module variants, and not useful because we don't use these
496  # macros.
497  set_target_properties( ${name} PROPERTIES DEFINE_SYMBOL "" )
498
499  if (LLVM_EXPORTED_SYMBOL_FILE)
500    add_llvm_symbol_exports( ${name} ${LLVM_EXPORTED_SYMBOL_FILE} )
501  endif(LLVM_EXPORTED_SYMBOL_FILE)
502
503  set(EXCLUDE_FROM_ALL OFF)
504  set_output_directory(${name} ${LLVM_RUNTIME_OUTPUT_INTDIR} ${LLVM_LIBRARY_OUTPUT_INTDIR})
505  llvm_config( ${name} ${LLVM_LINK_COMPONENTS} )
506  if( LLVM_COMMON_DEPENDS )
507    add_dependencies( ${name} ${LLVM_COMMON_DEPENDS} )
508  endif( LLVM_COMMON_DEPENDS )
509endmacro(add_llvm_executable name)
510
511function(export_executable_symbols target)
512  if (NOT MSVC) # MSVC's linker doesn't support exporting all symbols.
513    set_target_properties(${target} PROPERTIES ENABLE_EXPORTS 1)
514  endif()
515endfunction()
516
517
518set (LLVM_TOOLCHAIN_TOOLS
519  llvm-ar
520  llvm-objdump
521  )
522
523macro(add_llvm_tool name)
524  if( NOT LLVM_BUILD_TOOLS )
525    set(EXCLUDE_FROM_ALL ON)
526  endif()
527  add_llvm_executable(${name} ${ARGN})
528
529  list(FIND LLVM_TOOLCHAIN_TOOLS ${name} LLVM_IS_${name}_TOOLCHAIN_TOOL)
530  if (LLVM_IS_${name}_TOOLCHAIN_TOOL GREATER -1 OR NOT LLVM_INSTALL_TOOLCHAIN_ONLY)
531    if( LLVM_BUILD_TOOLS )
532      install(TARGETS ${name}
533              EXPORT LLVMExports
534              RUNTIME DESTINATION bin
535              COMPONENT ${name})
536
537      if (NOT CMAKE_CONFIGURATION_TYPES)
538        add_custom_target(install-${name}
539                          DEPENDS ${name}
540                          COMMAND "${CMAKE_COMMAND}"
541                                  -DCMAKE_INSTALL_COMPONENT=${name}
542                                  -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
543      endif()
544    endif()
545  endif()
546  if( LLVM_BUILD_TOOLS )
547    set_property(GLOBAL APPEND PROPERTY LLVM_EXPORTS ${name})
548  endif()
549  set_target_properties(${name} PROPERTIES FOLDER "Tools")
550endmacro(add_llvm_tool name)
551
552
553macro(add_llvm_example name)
554  if( NOT LLVM_BUILD_EXAMPLES )
555    set(EXCLUDE_FROM_ALL ON)
556  endif()
557  add_llvm_executable(${name} ${ARGN})
558  if( LLVM_BUILD_EXAMPLES )
559    install(TARGETS ${name} RUNTIME DESTINATION examples)
560  endif()
561  set_target_properties(${name} PROPERTIES FOLDER "Examples")
562endmacro(add_llvm_example name)
563
564
565macro(add_llvm_utility name)
566  add_llvm_executable(${name} ${ARGN})
567  set_target_properties(${name} PROPERTIES FOLDER "Utils")
568  if( LLVM_INSTALL_UTILS )
569    install (TARGETS ${name}
570      RUNTIME DESTINATION bin
571      COMPONENT ${name})
572    if (NOT CMAKE_CONFIGURATION_TYPES)
573      add_custom_target(install-${name}
574                        DEPENDS ${name}
575                        COMMAND "${CMAKE_COMMAND}"
576                                -DCMAKE_INSTALL_COMPONENT=${name}
577                                -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
578    endif()
579  endif()
580endmacro(add_llvm_utility name)
581
582
583macro(add_llvm_target target_name)
584  include_directories(BEFORE
585    ${CMAKE_CURRENT_BINARY_DIR}
586    ${CMAKE_CURRENT_SOURCE_DIR})
587  add_llvm_library(LLVM${target_name} ${ARGN})
588  set( CURRENT_LLVM_TARGET LLVM${target_name} )
589endmacro(add_llvm_target)
590
591# Add external project that may want to be built as part of llvm such as Clang,
592# lld, and Polly. This adds two options. One for the source directory of the
593# project, which defaults to ${CMAKE_CURRENT_SOURCE_DIR}/${name}. Another to
594# enable or disable building it with everything else.
595# Additional parameter can be specified as the name of directory.
596macro(add_llvm_external_project name)
597  set(add_llvm_external_dir "${ARGN}")
598  if("${add_llvm_external_dir}" STREQUAL "")
599    set(add_llvm_external_dir ${name})
600  endif()
601  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}")
602  string(REPLACE "-" "_" nameUNDERSCORE ${name})
603  string(TOUPPER ${nameUNDERSCORE} nameUPPER)
604  set(LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/${add_llvm_external_dir}"
605      CACHE PATH "Path to ${name} source directory")
606  if (NOT ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} STREQUAL ""
607      AND EXISTS ${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR}/CMakeLists.txt)
608    option(LLVM_EXTERNAL_${nameUPPER}_BUILD
609           "Whether to build ${name} as part of LLVM" ON)
610    if (LLVM_EXTERNAL_${nameUPPER}_BUILD)
611      add_subdirectory(${LLVM_EXTERNAL_${nameUPPER}_SOURCE_DIR} ${add_llvm_external_dir})
612    endif()
613  endif()
614endmacro(add_llvm_external_project)
615
616macro(add_llvm_tool_subdirectory name)
617  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}")
618  add_subdirectory(${name})
619endmacro(add_llvm_tool_subdirectory)
620
621macro(ignore_llvm_tool_subdirectory name)
622  list(APPEND LLVM_IMPLICIT_PROJECT_IGNORE "${CMAKE_CURRENT_SOURCE_DIR}/${name}")
623endmacro(ignore_llvm_tool_subdirectory)
624
625function(add_llvm_implicit_external_projects)
626  set(list_of_implicit_subdirs "")
627  file(GLOB sub-dirs "${CMAKE_CURRENT_SOURCE_DIR}/*")
628  foreach(dir ${sub-dirs})
629    if(IS_DIRECTORY "${dir}")
630      list(FIND LLVM_IMPLICIT_PROJECT_IGNORE "${dir}" tool_subdir_ignore)
631      if( tool_subdir_ignore EQUAL -1
632          AND EXISTS "${dir}/CMakeLists.txt")
633        get_filename_component(fn "${dir}" NAME)
634        list(APPEND list_of_implicit_subdirs "${fn}")
635      endif()
636    endif()
637  endforeach()
638
639  foreach(external_proj ${list_of_implicit_subdirs})
640    add_llvm_external_project("${external_proj}")
641  endforeach()
642endfunction(add_llvm_implicit_external_projects)
643
644# Generic support for adding a unittest.
645function(add_unittest test_suite test_name)
646  if( NOT LLVM_BUILD_TESTS )
647    set(EXCLUDE_FROM_ALL ON)
648  endif()
649
650  include_directories(${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest/include)
651  if (NOT LLVM_ENABLE_THREADS)
652    list(APPEND LLVM_COMPILE_DEFINITIONS GTEST_HAS_PTHREAD=0)
653  endif ()
654
655  if (SUPPORTS_NO_VARIADIC_MACROS_FLAG)
656    list(APPEND LLVM_COMPILE_FLAGS "-Wno-variadic-macros")
657  endif ()
658
659  set(LLVM_REQUIRES_RTTI OFF)
660
661  add_llvm_executable(${test_name} ${ARGN})
662  set(outdir ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR})
663  set_output_directory(${test_name} ${outdir} ${outdir})
664  target_link_libraries(${test_name}
665    gtest
666    gtest_main
667    LLVMSupport # gtest needs it for raw_ostream.
668    )
669
670  add_dependencies(${test_suite} ${test_name})
671  get_target_property(test_suite_folder ${test_suite} FOLDER)
672  if (NOT ${test_suite_folder} STREQUAL "NOTFOUND")
673    set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
674  endif ()
675endfunction()
676
677function(llvm_add_go_executable binary pkgpath)
678  cmake_parse_arguments(ARG "ALL" "" "DEPENDS;GOFLAGS" ${ARGN})
679
680  if(LLVM_BINDINGS MATCHES "go")
681    # FIXME: This should depend only on the libraries Go needs.
682    get_property(llvmlibs GLOBAL PROPERTY LLVM_LIBS)
683    set(binpath ${CMAKE_BINARY_DIR}/bin/${binary}${CMAKE_EXECUTABLE_SUFFIX})
684    set(cc "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
685    set(cxx "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
686    set(cppflags "")
687    get_property(include_dirs DIRECTORY PROPERTY INCLUDE_DIRECTORIES)
688    foreach(d ${include_dirs})
689      set(cppflags "${cppflags} -I${d}")
690    endforeach(d)
691    set(ldflags "${CMAKE_EXE_LINKER_FLAGS}")
692    add_custom_command(OUTPUT ${binpath}
693      COMMAND ${CMAKE_BINARY_DIR}/bin/llvm-go "cc=${cc}" "cxx=${cxx}" "cppflags=${cppflags}" "ldflags=${ldflags}"
694              ${ARG_GOFLAGS} build -o ${binpath} ${pkgpath}
695      DEPENDS llvm-config ${CMAKE_BINARY_DIR}/bin/llvm-go${CMAKE_EXECUTABLE_SUFFIX}
696              ${llvmlibs} ${ARG_DEPENDS}
697      COMMENT "Building Go executable ${binary}"
698      VERBATIM)
699    if (ARG_ALL)
700      add_custom_target(${binary} ALL DEPENDS ${binpath})
701    else()
702      add_custom_target(${binary} DEPENDS ${binpath})
703    endif()
704  endif()
705endfunction()
706
707# This function provides an automatic way to 'configure'-like generate a file
708# based on a set of common and custom variables, specifically targeting the
709# variables needed for the 'lit.site.cfg' files. This function bundles the
710# common variables that any Lit instance is likely to need, and custom
711# variables can be passed in.
712function(configure_lit_site_cfg input output)
713  foreach(c ${LLVM_TARGETS_TO_BUILD})
714    set(TARGETS_BUILT "${TARGETS_BUILT} ${c}")
715  endforeach(c)
716  set(TARGETS_TO_BUILD ${TARGETS_BUILT})
717
718  set(SHLIBEXT "${LTDL_SHLIB_EXT}")
719
720  # Configuration-time: See Unit/lit.site.cfg.in
721  if (CMAKE_CFG_INTDIR STREQUAL ".")
722    set(LLVM_BUILD_MODE ".")
723  else ()
724    set(LLVM_BUILD_MODE "%(build_mode)s")
725  endif ()
726
727  # They below might not be the build tree but provided binary tree.
728  set(LLVM_SOURCE_DIR ${LLVM_MAIN_SRC_DIR})
729  set(LLVM_BINARY_DIR ${LLVM_BINARY_DIR})
730  string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_TOOLS_DIR ${LLVM_TOOLS_BINARY_DIR})
731  string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} LLVM_LIBS_DIR  ${LLVM_LIBRARY_DIR})
732
733  # SHLIBDIR points the build tree.
734  string(REPLACE ${CMAKE_CFG_INTDIR} ${LLVM_BUILD_MODE} SHLIBDIR "${LLVM_SHLIB_OUTPUT_INTDIR}")
735
736  set(PYTHON_EXECUTABLE ${PYTHON_EXECUTABLE})
737  # FIXME: "ENABLE_SHARED" doesn't make sense, since it is used just for
738  # plugins. We may rename it.
739  if(LLVM_ENABLE_PLUGINS)
740    set(ENABLE_SHARED "1")
741  else()
742    set(ENABLE_SHARED "0")
743  endif()
744
745  if(LLVM_ENABLE_ASSERTIONS AND NOT MSVC_IDE)
746    set(ENABLE_ASSERTIONS "1")
747  else()
748    set(ENABLE_ASSERTIONS "0")
749  endif()
750
751  set(HOST_OS ${CMAKE_SYSTEM_NAME})
752  set(HOST_ARCH ${CMAKE_SYSTEM_PROCESSOR})
753
754  set(HOST_CC "${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_ARG1}")
755  set(HOST_CXX "${CMAKE_CXX_COMPILER} ${CMAKE_CXX_COMPILER_ARG1}")
756  set(HOST_LDFLAGS "${CMAKE_EXE_LINKER_FLAGS}")
757
758  configure_file(${input} ${output} @ONLY)
759endfunction()
760
761# A raw function to create a lit target. This is used to implement the testuite
762# management functions.
763function(add_lit_target target comment)
764  parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN})
765  set(LIT_ARGS "${ARG_ARGS} ${LLVM_LIT_ARGS}")
766  separate_arguments(LIT_ARGS)
767  if (NOT CMAKE_CFG_INTDIR STREQUAL ".")
768    list(APPEND LIT_ARGS --param build_mode=${CMAKE_CFG_INTDIR})
769  endif ()
770  if (LLVM_MAIN_SRC_DIR)
771    set (LIT_COMMAND ${PYTHON_EXECUTABLE} ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
772  else()
773    find_program(LIT_COMMAND llvm-lit)
774  endif ()
775  list(APPEND LIT_COMMAND ${LIT_ARGS})
776  foreach(param ${ARG_PARAMS})
777    list(APPEND LIT_COMMAND --param ${param})
778  endforeach()
779  if (ARG_DEFAULT_ARGS)
780    add_custom_target(${target}
781      COMMAND ${LIT_COMMAND} ${ARG_DEFAULT_ARGS}
782      COMMENT "${comment}"
783      ${cmake_3_2_USES_TERMINAL}
784      )
785  else()
786    add_custom_target(${target}
787      COMMAND ${CMAKE_COMMAND} -E echo "${target} does nothing, no tools built.")
788    message(STATUS "${target} does nothing.")
789  endif()
790  if (ARG_DEPENDS)
791    add_dependencies(${target} ${ARG_DEPENDS})
792  endif()
793
794  # Tests should be excluded from "Build Solution".
795  set_target_properties(${target} PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON)
796endfunction()
797
798# A function to add a set of lit test suites to be driven through 'check-*' targets.
799function(add_lit_testsuite target comment)
800  parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN})
801
802  # EXCLUDE_FROM_ALL excludes the test ${target} out of check-all.
803  if(NOT EXCLUDE_FROM_ALL)
804    # Register the testsuites, params and depends for the global check rule.
805    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_TESTSUITES ${ARG_DEFAULT_ARGS})
806    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_PARAMS ${ARG_PARAMS})
807    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_DEPENDS ${ARG_DEPENDS})
808    set_property(GLOBAL APPEND PROPERTY LLVM_LIT_EXTRA_ARGS ${ARG_ARGS})
809  endif()
810
811  # Produce a specific suffixed check rule.
812  add_lit_target(${target} ${comment}
813    ${ARG_DEFAULT_ARGS}
814    PARAMS ${ARG_PARAMS}
815    DEPENDS ${ARG_DEPENDS}
816    ARGS ${ARG_ARGS}
817    )
818endfunction()
819
820function(add_lit_testsuites project directory)
821  if (NOT CMAKE_CONFIGURATION_TYPES)
822    parse_arguments(ARG "PARAMS;DEPENDS;ARGS" "" ${ARGN})
823    file(GLOB_RECURSE litCfg ${directory}/lit*.cfg)
824    set(lit_suites)
825    foreach(f ${litCfg})
826      get_filename_component(dir ${f} DIRECTORY)
827      set(lit_suites ${lit_suites} ${dir})
828    endforeach()
829    list(REMOVE_DUPLICATES lit_suites)
830    foreach(dir ${lit_suites})
831      string(REPLACE ${directory} "" name_slash ${dir})
832      if (name_slash)
833        string(REPLACE "/" "-" name_slash ${name_slash})
834        string(REPLACE "\\" "-" name_dashes ${name_slash})
835        string(TOLOWER "${project}${name_dashes}" name_var)
836        add_lit_target("check-${name_var}" "Running lit suite ${dir}"
837          ${dir}
838          PARAMS ${ARG_PARAMS}
839          DEPENDS ${ARG_DEPENDS}
840          ARGS ${ARG_ARGS}
841        )
842      endif()
843    endforeach()
844  endif()
845endfunction()
846