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