1include(AddLLVM)
2include(LLVMParseArguments)
3include(CompilerRTUtils)
4
5# Tries to add "object library" target for a given architecture
6# with name "<name>.<arch>" if architecture can be targeted.
7# add_compiler_rt_object_library(<name> <arch>
8#                                SOURCES <source files>
9#                                CFLAGS <compile flags>)
10macro(add_compiler_rt_object_library name arch)
11  if(CAN_TARGET_${arch})
12    parse_arguments(LIB "SOURCES;CFLAGS" "" ${ARGN})
13    add_library(${name}.${arch} OBJECT ${LIB_SOURCES})
14    set_target_compile_flags(${name}.${arch}
15      ${TARGET_${arch}_CFLAGS} ${LIB_CFLAGS})
16  else()
17    message(FATAL_ERROR "Archtecture ${arch} can't be targeted")
18  endif()
19endmacro()
20
21# Same as above, but adds universal osx library with name "<name>.osx"
22# targeting multiple architectures.
23# add_compiler_rt_osx_object_library(<name> ARCH <architectures>
24#                                           SOURCES <source files>
25#                                           CFLAGS <compile flags>)
26macro(add_compiler_rt_osx_object_library name)
27  parse_arguments(LIB "ARCH;SOURCES;CFLAGS" "" ${ARGN})
28  set(libname "${name}.osx")
29  add_library(${libname} OBJECT ${LIB_SOURCES})
30  set_target_compile_flags(${libname} ${LIB_CFLAGS})
31  set_target_properties(${libname} PROPERTIES OSX_ARCHITECTURES "${LIB_ARCH}")
32endmacro()
33
34# Adds static runtime for a given architecture and puts it in the proper
35# directory in the build and install trees.
36# add_compiler_rt_static_runtime(<name> <arch>
37#                                SOURCES <source files>
38#                                CFLAGS <compile flags>
39#                                DEFS <compile definitions>)
40macro(add_compiler_rt_static_runtime name arch)
41  if(CAN_TARGET_${arch})
42    parse_arguments(LIB "SOURCES;CFLAGS;DEFS" "" ${ARGN})
43    add_library(${name} STATIC ${LIB_SOURCES})
44    # Setup compile flags and definitions.
45    set_target_compile_flags(${name}
46      ${TARGET_${arch}_CFLAGS} ${LIB_CFLAGS})
47    set_property(TARGET ${name} APPEND PROPERTY
48      COMPILE_DEFINITIONS ${LIB_DEFS})
49    # Setup correct output directory in the build tree.
50    set_target_properties(${name} PROPERTIES
51      ARCHIVE_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR})
52    # Add installation command.
53    install(TARGETS ${name}
54      ARCHIVE DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR})
55  else()
56    message(FATAL_ERROR "Archtecture ${arch} can't be targeted")
57  endif()
58endmacro()
59
60# Same as add_compiler_rt_static_runtime, but creates a universal library
61# for several architectures.
62# add_compiler_rt_osx_static_runtime(<name> ARCH <architectures>
63#                                    SOURCES <source files>
64#                                    CFLAGS <compile flags>
65#                                    DEFS <compile definitions>)
66macro(add_compiler_rt_osx_static_runtime name)
67  parse_arguments(LIB "ARCH;SOURCES;CFLAGS;DEFS" "" ${ARGN})
68  add_library(${name} STATIC ${LIB_SOURCES})
69  set_target_compile_flags(${name} ${LIB_CFLAGS})
70  set_property(TARGET ${name} APPEND PROPERTY
71    COMPILE_DEFINITIONS ${LIB_DEFS})
72  set_target_properties(${name} PROPERTIES
73    OSX_ARCHITECTURES "${LIB_ARCH}"
74    ARCHIVE_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR})
75  install(TARGETS ${name}
76    ARCHIVE DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR})
77endmacro()
78
79# Adds dynamic runtime library on osx, which supports multiple architectures.
80# add_compiler_rt_osx_dynamic_runtime(<name> ARCH <architectures>
81#                                     SOURCES <source files>
82#                                     CFLAGS <compile flags>
83#                                     DEFS <compile definitions>
84#                                     LINKFLAGS <link flags>)
85macro(add_compiler_rt_osx_dynamic_runtime name)
86  parse_arguments(LIB "ARCH;SOURCES;CFLAGS;DEFS;LINKFLAGS" "" ${ARGN})
87  add_library(${name} SHARED ${LIB_SOURCES})
88  set_target_compile_flags(${name} ${LIB_CFLAGS})
89  set_target_link_flags(${name} ${LIB_LINKFLAGS})
90  set_property(TARGET ${name} APPEND PROPERTY
91    COMPILE_DEFINITIONS ${LIB_DEFS})
92  set_target_properties(${name} PROPERTIES
93    OSX_ARCHITECTURES "${LIB_ARCH}"
94    LIBRARY_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR})
95  install(TARGETS ${name}
96    LIBRARY DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR})
97endmacro()
98
99# Unittests support.
100set(COMPILER_RT_GTEST_PATH ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest)
101set(COMPILER_RT_GTEST_SOURCE ${COMPILER_RT_GTEST_PATH}/gtest-all.cc)
102set(COMPILER_RT_GTEST_INCLUDE_CFLAGS
103  -DGTEST_NO_LLVM_RAW_OSTREAM=1
104  -I${COMPILER_RT_GTEST_PATH}/include
105)
106
107# Use Clang to link objects into a single executable with just-built
108# Clang, using specific link flags. Make executable a part of provided
109# test_suite.
110# add_compiler_rt_test(<test_suite> <test_name>
111#                      OBJECTS <object files>
112#                      DEPS <deps (e.g. runtime libs)>
113#                      LINK_FLAGS <link flags>)
114macro(add_compiler_rt_test test_suite test_name)
115  parse_arguments(TEST "OBJECTS;DEPS;LINK_FLAGS" "" ${ARGN})
116  set(output_bin "${CMAKE_CURRENT_BINARY_DIR}/${test_name}")
117  add_custom_target(${test_name}
118    COMMAND clang ${TEST_OBJECTS} -o "${output_bin}"
119            ${TEST_LINK_FLAGS}
120    DEPENDS clang ${TEST_DEPS})
121  # Make the test suite depend on the binary.
122  add_dependencies(${test_suite} ${test_name})
123endmacro()
124