aboutsummaryrefslogtreecommitdiff
path: root/libc/cmake/modules/LLVMLibCLibraryRules.cmake
diff options
context:
space:
mode:
authorSiva Chandra Reddy <sivachandra@google.com>2020-04-17 18:42:40 -0700
committerSiva Chandra Reddy <sivachandra@google.com>2020-04-21 09:24:17 -0700
commit8c2e66226fb74114fc0e57f239721065d800d33f (patch)
treec7e176e5d817c35c2a0771566388d9a34f550c6c /libc/cmake/modules/LLVMLibCLibraryRules.cmake
parent177c065e5065ef140c1e83ab655c3aad904a3a40 (diff)
downloadllvm-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.cmake126
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)