From 175f9dc5c390675bebdb6a5317769824a03ebf34 Mon Sep 17 00:00:00 2001 From: implicitfield <114500360+implicitfield@users.noreply.github.com> Date: Wed, 20 Nov 2024 15:26:53 +0200 Subject: [PATCH] LibC: Symlink headers into the sysroot at configure-time This removes the need to have the install_libc_headers target, since LibC's headers will now get installed before anything gets built. By extension, this also prevents said target from re-running on every build. --- Kernel/CMakeLists.txt | 3 +-- Kernel/Prekernel/CMakeLists.txt | 1 - Userland/DynamicLoader/CMakeLists.txt | 1 - Userland/Libraries/LibC/CMakeLists.txt | 18 +++++------------- Userland/Libraries/LibCrypt/CMakeLists.txt | 1 - Userland/Libraries/LibSanitizer/CMakeLists.txt | 1 - Userland/Libraries/LibSystem/CMakeLists.txt | 1 - Userland/Libraries/LibTest/CMakeLists.txt | 5 ----- Userland/Libraries/LibTimeZone/CMakeLists.txt | 3 --- 9 files changed, 6 insertions(+), 28 deletions(-) diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index bbb72737860..b37f8b67287 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -803,11 +803,10 @@ add_compile_definitions(KERNEL) add_link_options(LINKER:-z,notext) add_library(kernel_heap STATIC ${KERNEL_HEAP_SOURCES}) -add_dependencies(kernel_heap install_libc_headers) target_link_libraries(kernel_heap PUBLIC GenericClangPlugin) add_executable(Kernel ${SOURCES}) -add_dependencies(Kernel generate_EscapeSequenceStateMachine.h generate_version_header install_libc_headers) +add_dependencies(Kernel generate_EscapeSequenceStateMachine.h generate_version_header) target_link_libraries(Kernel PUBLIC GenericClangPlugin) if("${SERENITY_ARCH}" STREQUAL "aarch64") diff --git a/Kernel/Prekernel/CMakeLists.txt b/Kernel/Prekernel/CMakeLists.txt index 4831065ae8d..7761dba66c6 100644 --- a/Kernel/Prekernel/CMakeLists.txt +++ b/Kernel/Prekernel/CMakeLists.txt @@ -40,7 +40,6 @@ add_compile_definitions(PREKERNEL) add_executable(${PREKERNEL_TARGET} ${SOURCES} $) add_dependencies(${PREKERNEL_TARGET} Kernel) -add_dependencies(${PREKERNEL_TARGET} install_libc_headers) target_compile_options(${PREKERNEL_TARGET} PRIVATE -no-pie -fno-pic -fno-threadsafe-statics) target_link_options(${PREKERNEL_TARGET} PRIVATE LINKER:-T ${CMAKE_CURRENT_SOURCE_DIR}/linker.ld -nostdlib LINKER:--no-pie) diff --git a/Userland/DynamicLoader/CMakeLists.txt b/Userland/DynamicLoader/CMakeLists.txt index a04c473a4bb..e66d584983b 100644 --- a/Userland/DynamicLoader/CMakeLists.txt +++ b/Userland/DynamicLoader/CMakeLists.txt @@ -8,7 +8,6 @@ target_compile_definitions(DynamicLoader_CompileOptions INTERFACE NO_TLS _DYNAMI target_compile_options(DynamicLoader_CompileOptions INTERFACE -fno-rtti -fpie -ffunction-sections -fdata-sections) target_link_options(DynamicLoader_CompileOptions INTERFACE -nolibc -nostdlib++ -nostartfiles -static-libgcc -fpie -Wl,--gc-sections) target_link_options(DynamicLoader_CompileOptions INTERFACE -fno-sanitize=undefined) # Sanitizer runtime is linked in manually -add_dependencies(DynamicLoader_CompileOptions install_libc_headers) add_executable(Loader.so ${SOURCES}) diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index d83515d1999..aff7eb20533 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -218,27 +218,20 @@ set(HEADERS ) # ===== LibC headers ===== -add_custom_target(install_libc_headers) - -# Copy LibC's headers into the sysroot to satisfy libc++'s include priority requirements. +# NOTE: We have to symlink LibC's headers into the sysroot to satisfy libc++'s include priority +# requirements. foreach(RELATIVE_HEADER_PATH IN LISTS HEADERS) get_filename_component(directory ${RELATIVE_HEADER_PATH} DIRECTORY) + get_filename_component(name ${RELATIVE_HEADER_PATH} NAME) string(REPLACE "../" "" subdirectory "${directory}") file(MAKE_DIRECTORY "${CMAKE_STAGING_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${subdirectory}") - add_custom_command( - TARGET install_libc_headers - PRE_BUILD - COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${RELATIVE_HEADER_PATH}" "${CMAKE_STAGING_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${subdirectory}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - VERBATIM - ) + file(CREATE_LINK "${CMAKE_CURRENT_SOURCE_DIR}/${RELATIVE_HEADER_PATH}" "${CMAKE_STAGING_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}/${subdirectory}/${name}" SYMBOLIC) endforeach() # ===== Start files ===== # NOTE: We link all these against NoCoverage so that we don't break ports by requiring coverage # symbols in runtime/startup objects. add_library(crt0 STATIC crt0.cpp) -add_dependencies(crt0 install_libc_headers) target_link_libraries(crt0 PRIVATE NoCoverage) add_custom_command( TARGET crt0 @@ -249,7 +242,6 @@ add_custom_command( # some convincing that this is the case. if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") add_library(crt0_shared STATIC crt0_shared.cpp) - add_dependencies(crt0_shared install_libc_headers) target_link_libraries(crt0_shared PRIVATE NoCoverage) add_custom_command( TARGET crt0_shared @@ -283,7 +275,7 @@ else() endif() serenity_libc(LibC c) -add_dependencies(LibC crt0 install_libc_headers) +add_dependencies(LibC crt0) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") add_dependencies(LibC crti crt0_shared crtn) endif() diff --git a/Userland/Libraries/LibCrypt/CMakeLists.txt b/Userland/Libraries/LibCrypt/CMakeLists.txt index 46101c37f6c..6ecc98ca1c4 100644 --- a/Userland/Libraries/LibCrypt/CMakeLists.txt +++ b/Userland/Libraries/LibCrypt/CMakeLists.txt @@ -3,7 +3,6 @@ # To avoid a circular dependency chain with LibCrypt --> LibCrypto --> LibCore --> LibCrypt # We include the SHA2 implementation from LibCrypto here manually add_library(LibCryptSHA2 OBJECT ../LibCrypto/Hash/SHA2.cpp) -add_dependencies(LibCryptSHA2 install_libc_headers) set_target_properties(LibCryptSHA2 PROPERTIES CXX_VISIBILITY_PRESET hidden) set_target_properties(LibCryptSHA2 PROPERTIES VISIBILITY_INLINES_HIDDEN ON) diff --git a/Userland/Libraries/LibSanitizer/CMakeLists.txt b/Userland/Libraries/LibSanitizer/CMakeLists.txt index b4d02cc294f..01368d252af 100644 --- a/Userland/Libraries/LibSanitizer/CMakeLists.txt +++ b/Userland/Libraries/LibSanitizer/CMakeLists.txt @@ -4,7 +4,6 @@ set(SOURCES ) serenity_libc(LibUBSanitizer ubsan) -add_dependencies(LibUBSanitizer install_libc_headers) target_link_options(LibUBSanitizer PRIVATE -nostdlib) add_library(DynamicLoader_LibUBSanitizer STATIC UBSanitizer.cpp) diff --git a/Userland/Libraries/LibSystem/CMakeLists.txt b/Userland/Libraries/LibSystem/CMakeLists.txt index 5fe4d7953f9..1d555d88c2f 100644 --- a/Userland/Libraries/LibSystem/CMakeLists.txt +++ b/Userland/Libraries/LibSystem/CMakeLists.txt @@ -3,7 +3,6 @@ set(SOURCES ) serenity_libc(LibSystem system) -add_dependencies(LibSystem install_libc_headers) target_link_options(LibSystem PRIVATE -nostdlib) add_library(DynamicLoader_LibSystem STATIC ${SOURCES}) diff --git a/Userland/Libraries/LibTest/CMakeLists.txt b/Userland/Libraries/LibTest/CMakeLists.txt index de22ff79a9d..8f6a9d4ac75 100644 --- a/Userland/Libraries/LibTest/CMakeLists.txt +++ b/Userland/Libraries/LibTest/CMakeLists.txt @@ -11,8 +11,3 @@ target_link_libraries(LibTest PRIVATE LibCore) add_library(LibTestMain OBJECT TestMain.cpp) add_library(JavaScriptTestRunnerMain OBJECT JavaScriptTestRunnerMain.cpp) - -if (SERENITYOS) - add_dependencies(LibTestMain install_libc_headers) - add_dependencies(JavaScriptTestRunnerMain install_libc_headers) -endif() diff --git a/Userland/Libraries/LibTimeZone/CMakeLists.txt b/Userland/Libraries/LibTimeZone/CMakeLists.txt index c1cf99953ba..042d8406429 100644 --- a/Userland/Libraries/LibTimeZone/CMakeLists.txt +++ b/Userland/Libraries/LibTimeZone/CMakeLists.txt @@ -13,6 +13,3 @@ target_compile_definitions(LibTimeZone PRIVATE ENABLE_TIME_ZONE_DATA=$