From ae67cabe11b9dcffc09cd274d8554a2a23e4bdc6 Mon Sep 17 00:00:00 2001 From: Itamar Date: Sun, 14 Mar 2021 21:39:09 +0200 Subject: [PATCH] CMake: Make libc.a self-contained Previously, libc.a contained undefined symbols from ssp and libsystem, which caused static compilation to fail. We now generate libc.a with a custom CMake rule that combines all object files from libc, ssp and libsystem to form libc.a Closes #5758. --- Userland/Libraries/LibC/CMakeLists.txt | 28 ++++++++++++++++++--- Userland/Libraries/LibSystem/CMakeLists.txt | 3 +++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibC/CMakeLists.txt b/Userland/Libraries/LibC/CMakeLists.txt index 9c9fe32be6..11509525f7 100644 --- a/Userland/Libraries/LibC/CMakeLists.txt +++ b/Userland/Libraries/LibC/CMakeLists.txt @@ -85,11 +85,31 @@ add_custom_command( set(SOURCES ${LIBC_SOURCES} ${AK_SOURCES} ${ELF_SOURCES} ${ASM_SOURCES}) -serenity_libc_static(LibCStatic c) -target_link_libraries(LibCStatic crt0 ssp system) -add_dependencies(LibCStatic LibM LibSystem) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++") +add_library(LibCStaticWithoutDeps STATIC ${SOURCES}) +target_link_libraries(LibCStaticWithoutDeps crt0 ssp) +add_dependencies(LibCStaticWithoutDeps LibM LibSystem) + +add_custom_target(LibCStatic + COMMAND ${CMAKE_AR} -x $ + COMMAND ${CMAKE_AR} -x $ + COMMAND ${CMAKE_AR} -x $ + COMMAND ${CMAKE_AR} -qcs ${CMAKE_CURRENT_BINARY_DIR}/libc.a *.o + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + DEPENDS LibCStaticWithoutDeps ssp LibSystemStatic + ) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/libc.a DESTINATION ${CMAKE_INSTALL_PREFIX}/usr/lib/) +file(GLOB TEMP_OBJ_FILES ${CMAKE_CURRENT_BINARY_DIR}/*.o) +set_property( + TARGET LibCStatic + APPEND + PROPERTY ADDITIONAL_CLEAN_FILES ${TEMP_OBJ_FILES} +) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++") serenity_libc(LibC c) target_link_libraries(LibC crt0 ssp system) -add_dependencies(LibC LibM LibSystem) + +# We mark LibCStatic as a dependency of LibC because this triggers the build of the LibCStatic target +add_dependencies(LibC LibM LibSystem LibCStatic) diff --git a/Userland/Libraries/LibSystem/CMakeLists.txt b/Userland/Libraries/LibSystem/CMakeLists.txt index f93dbe2c9b..61ffa0622f 100644 --- a/Userland/Libraries/LibSystem/CMakeLists.txt +++ b/Userland/Libraries/LibSystem/CMakeLists.txt @@ -5,3 +5,6 @@ set(SOURCES set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -nostdlib") serenity_libc(LibSystem system) target_include_directories(LibSystem PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +add_library(LibSystemStatic STATIC ${SOURCES}) +target_include_directories(LibSystemStatic PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})