1include(LLVMParseArguments) 2 3# Compile a source into an object file with COMPILER_RT_TEST_COMPILER using 4# a provided compile flags and dependenices. 5# clang_compile(<object> <source> 6# CFLAGS <list of compile flags> 7# DEPS <list of dependencies>) 8macro(clang_compile object_file source) 9 parse_arguments(SOURCE "CFLAGS;DEPS" "" ${ARGN}) 10 get_filename_component(source_rpath ${source} REALPATH) 11 if(NOT COMPILER_RT_STANDALONE_BUILD) 12 list(APPEND SOURCE_DEPS clang) 13 endif() 14 string(REGEX MATCH "[.](cc|cpp)$" is_cxx ${source_rpath}) 15 if(is_cxx) 16 string(REPLACE " " ";" global_flags "${CMAKE_CXX_FLAGS}") 17 else() 18 string(REPLACE " " ";" global_flags "${CMAKE_C_FLAGS}") 19 endif() 20 # On Windows, CMAKE_*_FLAGS are built for MSVC but we use the GCC clang.exe 21 # which doesn't support flags starting with "/smth". Replace those with 22 # "-smth" equivalents. 23 if(MSVC) 24 string(REGEX REPLACE "^/" "-" global_flags "${global_flags}") 25 string(REPLACE ";/" ";-" global_flags "${global_flags}") 26 endif() 27 # Ignore unknown warnings. CMAKE_CXX_FLAGS may contain GCC-specific options 28 # which are not supported by Clang. 29 list(APPEND global_flags -Wno-unknown-warning-option) 30 set(compile_flags ${global_flags} ${SOURCE_CFLAGS}) 31 add_custom_command( 32 OUTPUT ${object_file} 33 COMMAND ${COMPILER_RT_TEST_COMPILER} ${compile_flags} -c 34 -o "${object_file}" 35 ${source_rpath} 36 MAIN_DEPENDENCY ${source} 37 DEPENDS ${SOURCE_DEPS}) 38endmacro() 39