diff options
author | Siva Chandra Reddy <sivachandra@google.com> | 2020-04-17 18:42:40 -0700 |
---|---|---|
committer | Siva Chandra Reddy <sivachandra@google.com> | 2020-04-21 09:24:17 -0700 |
commit | 8c2e66226fb74114fc0e57f239721065d800d33f (patch) | |
tree | c7e176e5d817c35c2a0771566388d9a34f550c6c /libc/cmake/modules/LLVMLibCLibraryRules.cmake | |
parent | 177c065e5065ef140c1e83ab655c3aad904a3a40 (diff) | |
download | llvm-8c2e66226fb74114fc0e57f239721065d800d33f.zip llvm-8c2e66226fb74114fc0e57f239721065d800d33f.tar.gz llvm-8c2e66226fb74114fc0e57f239721065d800d33f.tar.bz2 |
[libc] [NFC] Split the CMake rules into multiple files.
Summary:
The single file was getting too long to be convenient to navigate. This
patch splits it up two into 4 files one each for header rules,
object rules, library rules, and test rules.
Reviewers: abrachet, alexshap
Subscribers: mgorny, tschuett, libc-commits
Tags: #libc-project
Differential Revision: https://reviews.llvm.org/D78536
Diffstat (limited to 'libc/cmake/modules/LLVMLibCLibraryRules.cmake')
-rw-r--r-- | libc/cmake/modules/LLVMLibCLibraryRules.cmake | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/libc/cmake/modules/LLVMLibCLibraryRules.cmake b/libc/cmake/modules/LLVMLibCLibraryRules.cmake new file mode 100644 index 0000000..9b30b85 --- /dev/null +++ b/libc/cmake/modules/LLVMLibCLibraryRules.cmake @@ -0,0 +1,126 @@ +# A rule to build a library from a collection of entrypoint objects. +# Usage: +# add_entrypoint_library( +# DEPENDS <list of add_entrypoint_object targets> +# ) +function(add_entrypoint_library target_name) + cmake_parse_arguments( + "ENTRYPOINT_LIBRARY" + "" # No optional arguments + "" # No single value arguments + "DEPENDS" # Multi-value arguments + ${ARGN} + ) + if(NOT ENTRYPOINT_LIBRARY_DEPENDS) + message(FATAL_ERROR "'add_entrypoint_library' target requires a DEPENDS list " + "of 'add_entrypoint_object' targets.") + endif() + + set(obj_list "") + foreach(dep IN LISTS ENTRYPOINT_LIBRARY_DEPENDS) + get_target_property(dep_type ${dep} "TARGET_TYPE") + if(NOT (${dep_type} STREQUAL ${ENTRYPOINT_OBJ_TARGET_TYPE})) + message(FATAL_ERROR "Dependency '${dep}' of 'add_entrypoint_collection' is " + "not an 'add_entrypoint_object' target.") + endif() + get_target_property(target_obj_files ${dep} "OBJECT_FILES") + list(APPEND obj_list "${target_obj_files}") + endforeach(dep) + list(REMOVE_DUPLICATES obj_list) + + set(library_file "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${target_name}${CMAKE_STATIC_LIBRARY_SUFFIX}") + add_custom_command( + OUTPUT ${library_file} + COMMAND ${CMAKE_AR} -r ${library_file} ${obj_list} + DEPENDS ${obj_list} + ) + add_custom_target( + ${target_name} + ALL + DEPENDS ${library_file} + ) +endfunction(add_entrypoint_library) + +# Rule to build a shared library of redirector objects. +function(add_redirector_library target_name) + cmake_parse_arguments( + "REDIRECTOR_LIBRARY" + "" + "" + "DEPENDS" + ${ARGN} + ) + + set(obj_files "") + foreach(dep IN LISTS REDIRECTOR_LIBRARY_DEPENDS) + # TODO: Ensure that each dep is actually a add_redirector_object target. + list(APPEND obj_files $<TARGET_OBJECTS:${dep}>) + endforeach(dep) + + # TODO: Call the linker explicitly instead of calling the compiler driver to + # prevent DT_NEEDED on C++ runtime. + add_library( + ${target_name} + SHARED + ${obj_files} + ) + set_target_properties(${target_name} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) + + target_link_libraries( + ${target_name} + -nostdlib -lc -lm + ) + + set_target_properties( + ${target_name} + PROPERTIES + LINKER_LANGUAGE "C" + ) +endfunction(add_redirector_library) + +# Rule to add header only libraries. +# Usage +# add_header_library( +# <target name> +# HDRS <list of .h files part of the library> +# DEPENDS <list of dependencies> +# ) +function(add_header_library target_name) + cmake_parse_arguments( + "ADD_HEADER" + "" # No optional arguments + "" # No Single value arguments + "HDRS;DEPENDS" # Multi-value arguments + ${ARGN} + ) + + if(NOT ADD_HEADER_HDRS) + message(FATAL_ERROR "'add_header_library' target requires a HDRS list of .h files.") + endif() + + get_fq_target_name(${target_name} fq_target_name) + + set(FULL_HDR_PATHS "") + # TODO: Remove this foreach block when we can switch to the new + # version of the CMake policy CMP0076. + foreach(hdr IN LISTS ADD_HEADER_HDRS) + list(APPEND FULL_HDR_PATHS ${CMAKE_CURRENT_SOURCE_DIR}/${hdr}) + endforeach() + + set(interface_target_name "${fq_target_name}_header_library__") + + add_library(${interface_target_name} INTERFACE) + target_sources(${interface_target_name} INTERFACE ${FULL_HDR_PATHS}) + if(ADD_HEADER_DEPENDS) + get_fq_deps_list(fq_deps_list ${ADD_HEADER_DEPENDS}) + add_dependencies(${interface_target_name} ${fq_deps_list}) + endif() + + add_custom_target(${fq_target_name}) + add_dependencies(${fq_target_name} ${interface_target_name}) + set_target_properties( + ${fq_target_name} + PROPERTIES + "TARGET_TYPE" "HDR_LIBRARY" + ) +endfunction(add_header_library) |