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