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 for either OSX or iOS simulator 25# with name "<name>.<os>" targeting multiple architectures. 26# add_compiler_rt_darwin_object_library(<name> <os> ARCH <architectures> 27# SOURCES <source files> 28# CFLAGS <compile flags> 29# DEFS <compile definitions>) 30macro(add_compiler_rt_darwin_object_library name os) 31 parse_arguments(LIB "ARCH;SOURCES;CFLAGS;DEFS" "" ${ARGN}) 32 set(libname "${name}.${os}") 33 add_library(${libname} OBJECT ${LIB_SOURCES}) 34 set_target_compile_flags(${libname} ${LIB_CFLAGS} ${DARWIN_${os}_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 or shared runtime for a given architecture and puts it in the 41# proper directory in the build and install trees. 42# add_compiler_rt_runtime(<name> <arch> {STATIC,SHARED} 43# SOURCES <source files> 44# CFLAGS <compile flags> 45# DEFS <compile definitions>) 46macro(add_compiler_rt_runtime name arch type) 47 if(CAN_TARGET_${arch}) 48 parse_arguments(LIB "SOURCES;CFLAGS;DEFS;OUTPUT_NAME" "" ${ARGN}) 49 add_library(${name} ${type} ${LIB_SOURCES}) 50 # Setup compile flags and definitions. 51 set_target_compile_flags(${name} 52 ${TARGET_${arch}_CFLAGS} ${LIB_CFLAGS}) 53 set_target_link_flags(${name} 54 ${TARGET_${arch}_CFLAGS} ${LIB_CFLAGS}) 55 set_property(TARGET ${name} APPEND PROPERTY 56 COMPILE_DEFINITIONS ${LIB_DEFS}) 57 # Setup correct output directory in the build tree. 58 set_target_properties(${name} PROPERTIES 59 ARCHIVE_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR} 60 LIBRARY_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR}) 61 if (LIB_OUTPUT_NAME) 62 set_target_properties(${name} PROPERTIES 63 OUTPUT_NAME ${LIB_OUTPUT_NAME}) 64 endif() 65 # Add installation command. 66 install(TARGETS ${name} 67 ARCHIVE DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR} 68 LIBRARY DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR}) 69 else() 70 message(FATAL_ERROR "Archtecture ${arch} can't be targeted") 71 endif() 72endmacro() 73 74# Same as add_compiler_rt_runtime(... STATIC), but creates a universal library 75# for several architectures. 76# add_compiler_rt_osx_static_runtime(<name> ARCH <architectures> 77# SOURCES <source files> 78# CFLAGS <compile flags> 79# DEFS <compile definitions>) 80macro(add_compiler_rt_osx_static_runtime name) 81 parse_arguments(LIB "ARCH;SOURCES;CFLAGS;DEFS" "" ${ARGN}) 82 add_library(${name} STATIC ${LIB_SOURCES}) 83 set_target_compile_flags(${name} ${LIB_CFLAGS}) 84 set_property(TARGET ${name} APPEND PROPERTY 85 COMPILE_DEFINITIONS ${LIB_DEFS}) 86 set_target_properties(${name} PROPERTIES 87 OSX_ARCHITECTURES "${LIB_ARCH}" 88 ARCHIVE_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR}) 89 install(TARGETS ${name} 90 ARCHIVE DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR}) 91endmacro() 92 93# Adds dynamic runtime library on osx/iossim, which supports multiple 94# architectures. 95# add_compiler_rt_darwin_dynamic_runtime(<name> <os> 96# ARCH <architectures> 97# SOURCES <source files> 98# CFLAGS <compile flags> 99# DEFS <compile definitions> 100# LINKFLAGS <link flags>) 101macro(add_compiler_rt_darwin_dynamic_runtime name os) 102 parse_arguments(LIB "ARCH;SOURCES;CFLAGS;DEFS;LINKFLAGS" "" ${ARGN}) 103 add_library(${name} SHARED ${LIB_SOURCES}) 104 set_target_compile_flags(${name} ${LIB_CFLAGS} ${DARWIN_${os}_CFLAGS}) 105 set_target_link_flags(${name} ${LIB_LINKFLAGS} ${DARWIN_${os}_LINKFLAGS}) 106 set_property(TARGET ${name} APPEND PROPERTY 107 COMPILE_DEFINITIONS ${LIB_DEFS}) 108 set_target_properties(${name} PROPERTIES 109 OSX_ARCHITECTURES "${LIB_ARCH}" 110 LIBRARY_OUTPUT_DIRECTORY ${COMPILER_RT_LIBRARY_OUTPUT_DIR}) 111 install(TARGETS ${name} 112 LIBRARY DESTINATION ${COMPILER_RT_LIBRARY_INSTALL_DIR}) 113endmacro() 114 115# Unittests support. 116set(COMPILER_RT_GTEST_PATH ${LLVM_MAIN_SRC_DIR}/utils/unittest/googletest) 117set(COMPILER_RT_GTEST_SOURCE ${COMPILER_RT_GTEST_PATH}/src/gtest-all.cc) 118set(COMPILER_RT_GTEST_CFLAGS 119 -DGTEST_NO_LLVM_RAW_OSTREAM=1 120 -I${COMPILER_RT_GTEST_PATH}/include 121 -I${COMPILER_RT_GTEST_PATH} 122) 123 124# Link objects into a single executable with COMPILER_RT_TEST_COMPILER, 125# using specified link flags. Make executable a part of provided 126# test_suite. 127# add_compiler_rt_test(<test_suite> <test_name> 128# OBJECTS <object files> 129# DEPS <deps (e.g. runtime libs)> 130# LINK_FLAGS <link flags>) 131macro(add_compiler_rt_test test_suite test_name) 132 parse_arguments(TEST "OBJECTS;DEPS;LINK_FLAGS" "" ${ARGN}) 133 set(output_bin "${CMAKE_CURRENT_BINARY_DIR}/${test_name}") 134 # Use host compiler in a standalone build, and just-built Clang otherwise. 135 if(NOT COMPILER_RT_STANDALONE_BUILD) 136 list(APPEND TEST_DEPS clang) 137 endif() 138 add_custom_target(${test_name} 139 COMMAND ${COMPILER_RT_TEST_COMPILER} ${TEST_OBJECTS} -o "${output_bin}" 140 ${TEST_LINK_FLAGS} 141 DEPENDS ${TEST_DEPS}) 142 # Make the test suite depend on the binary. 143 add_dependencies(${test_suite} ${test_name}) 144endmacro() 145 146macro(add_compiler_rt_resource_file target_name file_name) 147 set(src_file "${CMAKE_CURRENT_SOURCE_DIR}/${file_name}") 148 set(dst_file "${COMPILER_RT_OUTPUT_DIR}/${file_name}") 149 add_custom_command(OUTPUT ${dst_file} 150 DEPENDS ${src_file} 151 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src_file} ${dst_file} 152 COMMENT "Copying ${file_name}...") 153 add_custom_target(${target_name} DEPENDS ${dst_file}) 154 # Install in Clang resource directory. 155 install(FILES ${file_name} DESTINATION ${COMPILER_RT_INSTALL_PATH}) 156endmacro() 157 158macro(add_compiler_rt_script name) 159 set(dst ${COMPILER_RT_EXEC_OUTPUT_DIR}/${name}) 160 set(src ${CMAKE_CURRENT_SOURCE_DIR}/${name}) 161 add_custom_command(OUTPUT ${dst} 162 DEPENDS ${src} 163 COMMAND ${CMAKE_COMMAND} -E copy_if_different ${src} ${dst} 164 COMMENT "Copying ${name}...") 165 add_custom_target(${name} DEPENDS ${dst}) 166 install(FILES ${dst} 167 PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE 168 DESTINATION ${COMPILER_RT_INSTALL_PATH}/bin) 169endmacro(add_compiler_rt_script src name) 170