Skip to content

Commit

Permalink
Support building phobos against a system copy of zlib
Browse files Browse the repository at this point in the history
This is achieved by linking the dynamic variant of phobos against zlib
and having the compiler add -lz when linking an application that
embeds the static variant of phobos.

Signed-off-by: Andrei Horodniceanu <[email protected]>
  • Loading branch information
the-horo committed Sep 4, 2024
1 parent 0cc531e commit c2b3503
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 17 deletions.
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,9 @@ set(LDC_ENABLE_ASSERTIONS "${LLVM_ENABLE_ASSERTIONS}" CACHE BOOL "Enable LDC ass
# Allow user to specify mimalloc.o location, to be linked with `ldc2` only
set(ALTERNATIVE_MALLOC_O "" CACHE STRING "If specified, adds ALTERNATIVE_MALLOC_O object file to LDC link, to override the CRT malloc.")

# Most linux distributions have a policy of not bundling dependencies like zlib
set(PHOBOS_SYSTEM_ZLIB OFF CACHE BOOL "Use system zlib instead of Phobos' vendored version")

if(D_VERSION EQUAL 1)
message(FATAL_ERROR "D version 1 is no longer supported.
Please consider using D version 2 or checkout the 'd1' git branch for the last version supporting D version 1.")
Expand Down Expand Up @@ -290,6 +293,9 @@ if(SANITIZE)
endif()
endif()
append("${SANITIZE_CXXFLAGS}" LDC_CXXFLAGS)
if(PHOBOS_SYSTEM_ZLIB)
append("-DPHOBOS_SYSTEM_ZLIB" LDC_CXXFLAGS)
endif()
# LLVM_CXXFLAGS may contain -Werror which causes compile errors with dmd source
string(REPLACE "-Werror " "" LLVM_CXXFLAGS ${LLVM_CXXFLAGS})
if (UNIX AND NOT "${LLVM_LDFLAGS}" STREQUAL "")
Expand Down
4 changes: 4 additions & 0 deletions driver/linker-gcc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -583,6 +583,10 @@ void ArgsBuilder::build(llvm::StringRef outputPath,
for (const auto &name : defaultLibNames) {
args.push_back("-l" + name);
}
#ifdef PHOBOS_SYSTEM_ZLIB
if (!defaultLibNames.empty() && !linkAgainstSharedDefaultLibs())
args.push_back("-lz");
#endif

// libs added via pragma(lib, libname)
for (auto ls : global.params.linkswitches) {
Expand Down
54 changes: 37 additions & 17 deletions runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,10 @@ if (RT_SUPPORT_SANITIZERS)
list(APPEND D_FLAGS -d-version=SupportSanitizers)
endif()

if(PHOBOS_SYSTEM_ZLIB)
message(STATUS "-- Building PHOBOS against system zlib")
endif()

# Auto-detect TARGET_SYSTEM from host
if("${TARGET_SYSTEM}" STREQUAL "AUTO")
set(TARGET_SYSTEM ${CMAKE_SYSTEM_NAME})
Expand Down Expand Up @@ -243,14 +247,22 @@ if(PHOBOS2_DIR)
list(REMOVE_ITEM PHOBOS2_D ${PHOBOS2_D_WINDOWS})
endif()

# Phobos C parts
file(GLOB_RECURSE PHOBOS2_C ${PHOBOS2_DIR}/etc/*.c)
# remove zlib test modules
list(REMOVE_ITEM PHOBOS2_C
${PHOBOS2_DIR}/etc/c/zlib/test/example.c
${PHOBOS2_DIR}/etc/c/zlib/test/infcover.c
${PHOBOS2_DIR}/etc/c/zlib/test/minigzip.c
)
if(PHOBOS_SYSTEM_ZLIB)
find_package(ZLIB REQUIRED)
else()
# Phobos C parts
file(GLOB_RECURSE PHOBOS2_C ${PHOBOS2_DIR}/etc/*.c)
# remove zlib test modules
list(REMOVE_ITEM PHOBOS2_C
${PHOBOS2_DIR}/etc/c/zlib/test/example.c
${PHOBOS2_DIR}/etc/c/zlib/test/infcover.c
${PHOBOS2_DIR}/etc/c/zlib/test/minigzip.c
)
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
if (HAVE_UNISTD_H)
append("-DHAVE_UNISTD_H" CMAKE_C_FLAGS)
endif()
endif()
endif()

#
Expand Down Expand Up @@ -397,11 +409,6 @@ if("${TARGET_SYSTEM}" MATCHES "MSVC")
# warning C4996: zlib uses 'deprecated' POSIX names
append("/wd4100 /wd4127 /wd4131 /wd4206 /wd4244 /wd4245 /wd4267 /wd4996" CMAKE_C_FLAGS_RELEASE)
endif()
CHECK_INCLUDE_FILE(unistd.h HAVE_UNISTD_H)
if (HAVE_UNISTD_H)
# Needed for zlib
append("-DHAVE_UNISTD_H" CMAKE_C_FLAGS)
endif()
# 2) Set all other CMAKE_C_FLAGS variants to CMAKE_C_FLAGS_RELEASE
set(variables
CMAKE_C_FLAGS_DEBUG
Expand All @@ -412,6 +419,16 @@ foreach(variable ${variables})
set(${variable} "${CMAKE_C_FLAGS_RELEASE}")
endforeach()

function(link_zlib phobos_target library_type)
if(PHOBOS_SYSTEM_ZLIB)
if(${library_type} STREQUAL "SHARED")
target_link_libraries(${phobos_target} ZLIB::ZLIB)
endif()
else()
target_sources(${phobos_target} PRIVATE ${PHOBOS2_C})
endif()
endfunction()

# Compiles the given D modules to object files, and if enabled, bitcode files.
# The paths of the output files are appended to outlist_o and outlist_bc, respectively.
macro(dc src_files src_basedir d_flags output_basedir emit_bc all_at_once single_obj_name outlist_o outlist_bc)
Expand Down Expand Up @@ -638,8 +655,8 @@ macro(build_runtime_libs druntime_o druntime_bc phobos2_o phobos2_bc c_flags ld_
list(APPEND ${outlist_targets} druntime-ldc${target_suffix})

if(PHOBOS2_DIR)
add_library(phobos2-ldc${target_suffix} ${library_type}
${phobos2_o} ${PHOBOS2_C})
add_library(phobos2-ldc${target_suffix} ${library_type} ${phobos2_o})
link_zlib(phobos2-ldc${target_suffix} ${library_type})
set_common_library_properties(phobos2-ldc${target_suffix}
phobos2-ldc${lib_suffix} ${output_path}
"${c_flags}" "${ld_flags}" ${is_shared}
Expand Down Expand Up @@ -669,8 +686,8 @@ macro(build_runtime_libs druntime_o druntime_bc phobos2_o phobos2_bc c_flags ld_
"${c_flags}" "${ld_flags}" OFF
)

add_library(phobos2-ldc-lto${target_suffix} STATIC
${phobos2_bc} ${PHOBOS2_C})
add_library(phobos2-ldc-lto${target_suffix} STATIC ${phobos2_bc})
link_zlib(phobos2-ldc-lto${target_suffix} STATIC)
set_common_library_properties(phobos2-ldc-lto${target_suffix}
phobos2-ldc-lto${lib_suffix} ${output_path}
"${c_flags}" "${ld_flags}" OFF
Expand Down Expand Up @@ -1004,6 +1021,9 @@ function(build_test_runners name_suffix path_suffix d_flags linkflags is_shared)
LINK_FLAGS ${linkflags}
LINK_DEPENDS ${tested_lib_path}
)
if(PHOBOS_SYSTEM_ZLIB AND "${is_shared}" STREQUAL "OFF")
target_link_libraries(${phobos_name} ZLIB::ZLIB)
endif()
add_test(build-${phobos_name} "${CMAKE_COMMAND}" --build ${CMAKE_BINARY_DIR} --target ${phobos_name})
set(_GLOBAL_TESTRUNNERS "${_GLOBAL_TESTRUNNERS};${phobos_name}" CACHE INTERNAL "")
endif()
Expand Down

0 comments on commit c2b3503

Please sign in to comment.