summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetr Hosek <phosek@chromium.org>2019-05-01 02:49:45 +0000
committerPetr Hosek <phosek@chromium.org>2019-05-01 02:49:45 +0000
commitec9ec0d054a786360bc94a5a3fd481ce829f9f15 (patch)
tree93aa6fe884fb82407a9ed0be579ab6267faa4cac
parentb20d701596ed811bb95b838ebabfd3965d84bac9 (diff)
downloadcompiler-rt-ec9ec0d054a786360bc94a5a3fd481ce829f9f15.tar.gz
[compiler-rt] Rework the object build support
The initial implementation didn't properly support cross-compilation via the runtime build, the updated implementation should address that by expanding the CMAKE_C_COMPILE_OBJECT variable with correct values. Differential Revision: https://reviews.llvm.org/D61356 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@359644 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--cmake/Modules/AddCompilerRT.cmake41
1 files changed, 33 insertions, 8 deletions
diff --git a/cmake/Modules/AddCompilerRT.cmake b/cmake/Modules/AddCompilerRT.cmake
index 8b6518d13..531d6fd09 100644
--- a/cmake/Modules/AddCompilerRT.cmake
+++ b/cmake/Modules/AddCompilerRT.cmake
@@ -274,16 +274,41 @@ function(add_compiler_rt_runtime name type)
endif()
if(type STREQUAL "OBJECT")
- string(TOUPPER ${CMAKE_BUILD_TYPE} config)
- get_property(cflags SOURCE ${sources_${libname}} PROPERTY COMPILE_FLAGS)
- separate_arguments(cflags)
+ get_property(cflags_${libname} SOURCE ${sources_${libname}} PROPERTY COMPILE_FLAGS)
+ if(CMAKE_C_COMPILER_ID MATCHES Clang AND CMAKE_C_COMPILER_TARGET)
+ list(APPEND cflags_${libname} "-target ${CMAKE_C_COMPILER_TARGET}")
+ endif()
+ string(REPLACE ";" " " extra_cflags_${libname} "${extra_cflags_${libname}}")
+ string(REGEX MATCHALL "<[A-Za-z0-9_]*>" substitutions
+ ${CMAKE_C_COMPILE_OBJECT})
+ set(compile_command_${libname} "${CMAKE_C_COMPILE_OBJECT}")
+ set(output_file_${libname} ${output_name_${libname}}${CMAKE_C_OUTPUT_EXTENSION})
+ foreach(substitution ${substitutions})
+ if(substitution STREQUAL "<CMAKE_C_COMPILER>")
+ string(REPLACE "<CMAKE_C_COMPILER>" "${CMAKE_C_COMPILER}"
+ compile_command_${libname} ${compile_command_${libname}})
+ elseif(substitution STREQUAL "<OBJECT>")
+ string(REPLACE "<OBJECT>" "${output_dir_${libname}}/${output_file_${libname}}"
+ compile_command_${libname} ${compile_command_${libname}})
+ elseif(substitution STREQUAL "<SOURCE>")
+ string(REPLACE "<SOURCE>" "${sources_${libname}}"
+ compile_command_${libname} ${compile_command_${libname}})
+ elseif(substitution STREQUAL "<FLAGS>")
+ string(REPLACE "<FLAGS>" "${CMAKE_C_FLAGS} ${cflags_${libname}} ${extra_cflags_${libname}}"
+ compile_command_${libname} ${compile_command_${libname}})
+ else()
+ string(REPLACE "${substitution}" "" compile_command_${libname}
+ ${compile_command_${libname}})
+ endif()
+ endforeach()
+ separate_arguments(compile_command_${libname})
add_custom_command(
- OUTPUT ${output_dir_${libname}}/${output_name_${libname}}.o
- COMMAND ${CMAKE_C_COMPILER} ${sources_${libname}} ${cflags} ${extra_cflags_${libname}} -c -o ${output_dir_${libname}}/${output_name_${libname}}.o
+ OUTPUT ${output_dir_${libname}}/${output_file_${libname}}
+ COMMAND ${compile_command_${libname}}
DEPENDS ${sources_${libname}}
- COMMENT "Building C object ${output_name_${libname}}.o")
- add_custom_target(${libname} DEPENDS ${output_dir_${libname}}/${output_name_${libname}}.o)
- install(FILES ${output_dir_${libname}}/${output_name_${libname}}.o
+ COMMENT "Building C object ${output_file_${libname}}")
+ add_custom_target(${libname} DEPENDS ${output_dir_${libname}}/${output_file_${libname}})
+ install(FILES ${output_dir_${libname}}/${output_file_${libname}}
DESTINATION ${install_dir_${libname}}
${COMPONENT_OPTION})
else()