diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a179867ac..d23d1499c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -30,7 +30,8 @@ include(cmake/external-libraries.cmake) include(cmake/init-compilation-flags.cmake) include(cmake/popular-common.cmake) -# OpenSSL building +# Common third-parties build +include(${THIRD_PARTY_DIR}/zlib-cmake/zlib.cmake) include(${THIRD_PARTY_DIR}/openssl-cmake/openssl.cmake) # TODO: use FetchContent_Declare instead of include_directories diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 1abaaf4c30..3b7a0e90b0 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -73,3 +73,27 @@ function(update_git_submodule submodule_path) message(FATAL_ERROR "Failed to update Git submodule ${submodule_path}: ${update_stdout} ${update_stderr}") endif() endfunction() + +function(detect_xcode_sdk_path OUTPUT_VARIABLE) + # Use execute_process to run the xcrun command and capture the output + execute_process( + COMMAND xcrun --sdk macosx --show-sdk-path + OUTPUT_VARIABLE SDK_PATH + OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_VARIABLE ERROR_MSG + RESULT_VARIABLE RESULT + ) + + # Check if the command was successful + if(RESULT EQUAL 0) + # Check if the SDK_PATH is not empty + if(SDK_PATH) + set(${OUTPUT_VARIABLE} "${SDK_PATH}" PARENT_SCOPE) + message(STATUS "Detected Xcode SDK path: ${SDK_PATH}") + else() + message(FATAL_ERROR "Failed to detect Xcode SDK path: Output is empty.") + endif() + else() + message(FATAL_ERROR "Failed to detect Xcode SDK path: ${ERROR_MSG}") + endif() +endfunction() diff --git a/common/common-tests.cmake b/common/common-tests.cmake index 08fdd17ae3..dd66e14871 100644 --- a/common/common-tests.cmake +++ b/common/common-tests.cmake @@ -20,5 +20,5 @@ prepend(COMMON_TESTS_SOURCES ${COMMON_DIR}/ ucontext/ucontext-portable-test.cpp) prepare_cross_platform_libs(COMMON_TESTS_LIBS zstd) -set(COMMON_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${COMMON_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto z) +set(COMMON_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${COMMON_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto ZLIB::ZLIB_NO_PIC) vk_add_unittest(common "${COMMON_TESTS_LIBS}" ${COMMON_TESTS_SOURCES}) diff --git a/common/common.cmake b/common/common.cmake index 0e989f6792..5bdb611b2a 100644 --- a/common/common.cmake +++ b/common/common.cmake @@ -64,3 +64,5 @@ if(COMPILER_CLANG) endif() vk_add_library(common_src OBJECT ${COMMON_ALL_SOURCES}) +target_include_directories(common_src PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS}) +add_dependencies(common_src openssl zlib-no-pic) diff --git a/common/kfs/kfs.cpp b/common/kfs/kfs.cpp index 0be87e98be..f078b169d6 100644 --- a/common/kfs/kfs.cpp +++ b/common/kfs/kfs.cpp @@ -17,7 +17,7 @@ #include #include #include -#include +#include "zlib/zlib.h" #include #include "common/binlog/kdb-binlog-common.h" diff --git a/compiler/compiler-settings.cpp b/compiler/compiler-settings.cpp index 26961f3cdf..4da163ed1c 100644 --- a/compiler/compiler-settings.cpp +++ b/compiler/compiler-settings.cpp @@ -145,8 +145,8 @@ void append_if_doesnt_contain(std::string &ld_flags, const T &libs, vk::string_v } } -void append_3dparty_headers(std::string &cxx_flags, const std::string &path_to_3dparty, const std::string &libname) noexcept { - cxx_flags += " -I" + path_to_3dparty + "include/" + libname; +void append_3dparty_headers(std::string &cxx_flags, const std::string &path_to_3dparty) noexcept { + cxx_flags += " -I" + path_to_3dparty + "include/"; } void append_3dparty_lib(std::string &ld_flags, const std::string &path_to_3dparty, const std::string &libname) noexcept { @@ -159,7 +159,6 @@ void append_curl([[maybe_unused]] std::string &cxx_flags, std::string &ld_flags, ld_flags += " -lcurl"; #else // TODO make it as an option? - append_3dparty_headers(cxx_flags, path_to_3dparty, "curl"); append_3dparty_lib(ld_flags, path_to_3dparty, "curl"); #endif } @@ -364,10 +363,12 @@ void CompilerSettings::init() { auto third_party_path = kphp_src_path.get() + "objs/"; + append_3dparty_headers(cxx_default_flags, third_party_path); + ld_flags.value_ = extra_ld_flags.get(); append_curl(cxx_default_flags, ld_flags.value_, third_party_path); append_apple_options(cxx_default_flags, ld_flags.value_); - std::vector system_installed_static_libs{"pcre", "re2", "yaml-cpp", "h3", "z", "zstd", "nghttp2", "kphp-timelib"}; + std::vector system_installed_static_libs{"pcre", "re2", "yaml-cpp", "h3", "zstd", "nghttp2", "kphp-timelib"}; #ifdef KPHP_TIMELIB_LIB_DIR ld_flags.value_ += " -L" KPHP_TIMELIB_LIB_DIR; @@ -423,9 +424,14 @@ void CompilerSettings::init() { system_installed_dynamic_libs.emplace_back("rt"); #endif - append_3dparty_headers(cxx_default_flags, third_party_path, "openssl"); - append_3dparty_lib(ld_flags.value_, third_party_path, "ssl"); - append_3dparty_lib(ld_flags.value_, third_party_path, "crypto"); + if (is_k2_mode) { + append_3dparty_lib(ld_flags.value_, third_party_path, "z-pic"); + } else { + append_3dparty_lib(ld_flags.value_, third_party_path, "z-no-pic"); + append_3dparty_lib(ld_flags.value_, third_party_path, "ssl"); + append_3dparty_lib(ld_flags.value_, third_party_path, "crypto"); + } + append_if_doesnt_contain(ld_flags.value_, system_installed_dynamic_libs, "-l"); ld_flags.value_ += " -rdynamic"; diff --git a/net/net-tests.cmake b/net/net-tests.cmake index da3089def7..b49477a216 100644 --- a/net/net-tests.cmake +++ b/net/net-tests.cmake @@ -5,5 +5,5 @@ prepend(NET_TESTS_SOURCES ${BASE_DIR}/net/ time-slice-test.cpp) prepare_cross_platform_libs(NET_TESTS_LIBS zstd) -set(NET_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto z) +set(NET_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto ZLIB::ZLIB_NO_PIC) vk_add_unittest(net "${NET_TESTS_LIBS}" ${NET_TESTS_SOURCES}) diff --git a/runtime-light/runtime-light.cmake b/runtime-light/runtime-light.cmake index d91e6476c6..2deba5067f 100644 --- a/runtime-light/runtime-light.cmake +++ b/runtime-light/runtime-light.cmake @@ -1,10 +1,8 @@ # prepare third-parties update_git_submodule(${THIRD_PARTY_DIR}/abseil-cpp "--recursive") update_git_submodule(${THIRD_PARTY_DIR}/pcre2 "--recursive") -update_git_submodule(${THIRD_PARTY_DIR}/zlib "--recursive") include(${THIRD_PARTY_DIR}/abseil-cpp-cmake/abseil-cpp.cmake) include(${THIRD_PARTY_DIR}/pcre2-cmake/pcre2.cmake) -include(${THIRD_PARTY_DIR}/zlib-cmake/zlib.cmake) set(THIRD_PARTY_INCLUDE -I${OBJS_DIR}/include -I${THIRD_PARTY_DIR} -I${THIRD_PARTY_DIR}/abseil-cpp) @@ -54,8 +52,9 @@ string(JOIN " " ABSEIL_LIBS ${ABSEIL_LIBS}) set_property( TARGET runtime-light PROPERTY RUNTIME_LINK_LIBS - "${ABSEIL_LIBS} ${ZLIB_LIB_DIR}/libz.a ${PCRE2_LIB_DIR}/libpcre2-8.a" + "${ABSEIL_LIBS} ${ZLIB_PIC_LIBRARIES} ${PCRE2_LIB_DIR}/libpcre2-8.a" ) +add_dependencies(runtime-light zlib-pic) if(APPLE) target_link_options(runtime-light PUBLIC -undefined dynamic_lookup) diff --git a/runtime/runtime.cmake b/runtime/runtime.cmake index 32acd5a67a..738a715313 100644 --- a/runtime/runtime.cmake +++ b/runtime/runtime.cmake @@ -139,13 +139,13 @@ allow_deprecated_declarations(${BASE_DIR}/runtime/allocator.cpp ${BASE_DIR}/runt allow_deprecated_declarations_for_apple(${BASE_DIR}/runtime/inter-process-mutex.cpp) vk_add_library(kphp_runtime OBJECT ${KPHP_RUNTIME_ALL_SOURCES}) -target_include_directories(kphp_runtime PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${CURL_INCLUDE_DIR}) +target_include_directories(kphp_runtime PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS}) add_dependencies(kphp_runtime kphp-timelib curl) -add_dependencies(curl openssl) +add_dependencies(curl openssl zlib-no-pic) prepare_cross_platform_libs(RUNTIME_LIBS yaml-cpp re2 zstd h3) # todo: linking between static libs is no-op, is this redundant? do we need to add mysqlclient here? -set(RUNTIME_LIBS vk::kphp_runtime vk::kphp_server vk::runtime-common vk::popular_common vk::unicode vk::common_src vk::binlog_src vk::net_src ${RUNTIME_LIBS} CURL::curl OpenSSL::SSL OpenSSL::Crypto m z pthread) +set(RUNTIME_LIBS vk::kphp_runtime vk::kphp_server vk::runtime-common vk::popular_common vk::unicode vk::common_src vk::binlog_src vk::net_src ${RUNTIME_LIBS} CURL::curl OpenSSL::SSL OpenSSL::Crypto m ZLIB::ZLIB_NO_PIC pthread) vk_add_library(kphp-full-runtime STATIC) target_link_libraries(kphp-full-runtime PUBLIC ${RUNTIME_LIBS}) set_target_properties(kphp-full-runtime PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${OBJS_DIR}) @@ -188,6 +188,7 @@ file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/php_lib_version.cpp ]]) add_library(php_lib_version_j OBJECT ${CMAKE_CURRENT_BINARY_DIR}/php_lib_version.cpp) +target_include_directories(php_lib_version_j PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS}) target_compile_options(php_lib_version_j PRIVATE -I. -E) add_dependencies(php_lib_version_j kphp-full-runtime) diff --git a/runtime/zlib.h b/runtime/zlib.h index 6e039357e8..9a9ee1250e 100644 --- a/runtime/zlib.h +++ b/runtime/zlib.h @@ -4,7 +4,7 @@ #pragma once -#include +#include "zlib/zlib.h" #include "common/wrappers/string_view.h" diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake index 770166282e..281215c86f 100644 --- a/third-party/curl-cmake/curl.cmake +++ b/third-party/curl-cmake/curl.cmake @@ -7,7 +7,11 @@ set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl/install) file(MAKE_DIRECTORY ${CURL_BUILD_DIR}) file(MAKE_DIRECTORY ${CURL_INSTALL_DIR}) -set(CURL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -Wno-deprecated-declarations") +set(CURL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -Wno-deprecated-declarations") +if(NOT APPLE) + set(CURL_COMPILE_FLAGS "${CURL_COMPILE_FLAGS} -static") +endif() + # Suppress compiler-specific warnings caused by -O3 if(COMPILER_CLANG) set(CURL_COMPILE_FLAGS "${CURL_COMPILE_FLAGS} -Wno-string-plus-int") @@ -34,21 +38,27 @@ set(CURL_CMAKE_ARGS -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR} -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES} -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR} + -DCURL_ZLIB=ON + -DZLIB_FOUND=ON + -DCURL_SPECIAL_LIBZ=ON + -DZLIB_ROOT=${ZLIB_NO_PIC_ROOT} + -DZLIB_LIBRARIES=${ZLIB_NO_PIC_LIBRARIES} + -DZLIB_INCLUDE_DIR=${ZLIB_NO_PIC_INCLUDE_DIRS}/zlib -DCMAKE_C_FLAGS=${CURL_COMPILE_FLAGS} - -DCURL_TEST=Off + -DCMAKE_POSITION_INDEPENDENT_CODE=OFF ) ExternalProject_Add( curl - DEPENDS openssl + DEPENDS openssl zlib-no-pic PREFIX ${CURL_BUILD_DIR} SOURCE_DIR ${CURL_SOURCE_DIR} INSTALL_DIR ${CURL_INSTALL_DIR} BUILD_BYPRODUCTS ${CURL_INSTALL_DIR}/lib/libcurl.a CONFIGURE_COMMAND - COMMAND ${CMAKE_COMMAND} ${CURL_CMAKE_ARGS} -S ${CURL_SOURCE_DIR} -B ${CURL_BUILD_DIR} + COMMAND ${CMAKE_COMMAND} ${CURL_CMAKE_ARGS} -S ${CURL_SOURCE_DIR} -B ${CURL_BUILD_DIR} -Wno-dev BUILD_COMMAND - COMMAND ${CMAKE_COMMAND} --build ${CURL_BUILD_DIR} --config $ + COMMAND ${CMAKE_COMMAND} --build ${CURL_BUILD_DIR} --config $ -j INSTALL_COMMAND COMMAND ${CMAKE_COMMAND} --install ${CURL_BUILD_DIR} --prefix ${CURL_INSTALL_DIR} --config $ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CURL_INSTALL_DIR}/include ${INCLUDE_DIR} @@ -56,14 +66,14 @@ ExternalProject_Add( BUILD_IN_SOURCE 0 ) -set(CURL_INCLUDE_DIR ${CURL_INSTALL_DIR}/include) +set(CURL_INCLUDE_DIRS ${CURL_INSTALL_DIR}/include) # Ensure the include directory exists -file(MAKE_DIRECTORY ${CURL_INCLUDE_DIR}) +file(MAKE_DIRECTORY ${CURL_INCLUDE_DIRS}) add_library(CURL::curl STATIC IMPORTED) set_target_properties(CURL::curl PROPERTIES IMPORTED_LOCATION ${CURL_INSTALL_DIR}/lib/libcurl.a - INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIR} + INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS} ) # Set variables indicating that curl has been installed diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake index c55d06be9b..d7edf3966b 100644 --- a/third-party/openssl-cmake/openssl.cmake +++ b/third-party/openssl-cmake/openssl.cmake @@ -9,7 +9,7 @@ set(OPENSSL_PATCH_SERIES ${OPENSSL_BUILD_DIR}/debian/patches/series) file(MAKE_DIRECTORY ${OPENSSL_BUILD_DIR}) file(MAKE_DIRECTORY ${OPENSSL_INSTALL_DIR}) -set(OPENSSL_COMPILE_FLAGS "$ENV{CFLAGS} -g0") +set(OPENSSL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -static") # The configuration has been based on: # https://packages.debian.org/buster/libssl1.1 @@ -24,6 +24,11 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") set(OPENSSL_CONFIGURE_EXTRA_OPTION enable-ec_nistp_64_gcc_128) endif() +if(APPLE) + detect_xcode_sdk_path(CMAKE_OSX_SYSROOT) + set(OPENSSL_COMPILE_FLAGS "${OPENSSL_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}") +endif() + ExternalProject_Add( openssl PREFIX ${OPENSSL_BUILD_DIR} @@ -35,11 +40,11 @@ ExternalProject_Add( COMMAND ${CMAKE_COMMAND} -E copy_directory ${OPENSSL_SOURCE_DIR} ${OPENSSL_BUILD_DIR} COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${OPENSSL_BUILD_DIR} -DPATCH_SERIES=${OPENSSL_PATCH_SERIES} -DPATCH_DIR=${OPENSSL_PATCH_DIR} -P ../../cmake/apply_patches.cmake CONFIGURE_COMMAND - COMMAND ./config --prefix=${OPENSSL_INSTALL_DIR} --openssldir=/usr/lib/ssl no-shared no-pic no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms no-tests ${OPENSSL_CONFIGURE_EXTRA_OPTION} + COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${OPENSSL_COMPILE_FLAGS} ./config --prefix=${OPENSSL_INSTALL_DIR} --openssldir=/usr/lib/ssl no-shared no-pic no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms no-tests ${OPENSSL_CONFIGURE_EXTRA_OPTION} BUILD_COMMAND - COMMAND ${CMAKE_COMMAND} -E env CFLAGS=${OPENSSL_COMPILE_FLAGS} make + COMMAND make build_libs -j INSTALL_COMMAND - COMMAND make install_sw + COMMAND make install_dev COMMAND ${CMAKE_COMMAND} -E copy_directory ${OPENSSL_INSTALL_DIR}/include ${INCLUDE_DIR} COMMAND ${CMAKE_COMMAND} -E copy ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${LIB_DIR} COMMAND ${CMAKE_COMMAND} -E copy ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a ${LIB_DIR} diff --git a/third-party/zlib b/third-party/zlib index ef24c4c750..51b7f2abda 160000 --- a/third-party/zlib +++ b/third-party/zlib @@ -1 +1 @@ -Subproject commit ef24c4c7502169f016dcd2a26923dbaf3216748c +Subproject commit 51b7f2abdade71cd9bb0e7a373ef2610ec6f9daf diff --git a/third-party/zlib-cmake/zlib-no-pic.cmake b/third-party/zlib-cmake/zlib-no-pic.cmake new file mode 100644 index 0000000000..fbc8fd83b8 --- /dev/null +++ b/third-party/zlib-cmake/zlib-no-pic.cmake @@ -0,0 +1,52 @@ +set(ZLIB_NO_PIC_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/zlib-no-pic/build) +set(ZLIB_NO_PIC_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/zlib-no-pic/install) +set(ZLIB_NO_PIC_INCLUDE_DIRS ${ZLIB_NO_PIC_INSTALL_DIR}/include) +set(ZLIB_NO_PIC_LIBRARIES ${ZLIB_NO_PIC_INSTALL_DIR}/lib/libz-no-pic.a) +# Ensure the build, installation and "include" directories exists +file(MAKE_DIRECTORY ${ZLIB_NO_PIC_BUILD_DIR}) +file(MAKE_DIRECTORY ${ZLIB_NO_PIC_INSTALL_DIR}) +file(MAKE_DIRECTORY ${ZLIB_NO_PIC_INCLUDE_DIRS}) + +# For further optional differences +if(COMPILE_RUNTIME_LIGHT) + set(ZLIB_NO_PIC_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} -fno-pic") +else() + set(ZLIB_NO_PIC_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} -fno-pic") +endif() + +if(NOT APPLE) + set(ZLIB_NO_PIC_COMPILE_FLAGS "${ZLIB_NO_PIC_COMPILE_FLAGS} -static") +endif() + +ExternalProject_Add( + zlib-no-pic + PREFIX ${ZLIB_NO_PIC_BUILD_DIR} + SOURCE_DIR ${ZLIB_SOURCE_DIR} + INSTALL_DIR ${ZLIB_NO_PIC_INSTALL_DIR} + BINARY_DIR ${ZLIB_NO_PIC_BUILD_DIR} + BUILD_BYPRODUCTS ${ZLIB_NO_PIC_INSTALL_DIR}/lib/libz-no-pic.a + CONFIGURE_COMMAND + COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZLIB_SOURCE_DIR} ${ZLIB_NO_PIC_BUILD_DIR} + COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${ZLIB_NO_PIC_COMPILE_FLAGS} ./configure --prefix=${ZLIB_NO_PIC_INSTALL_DIR} --includedir=${ZLIB_NO_PIC_INCLUDE_DIRS}/zlib --static + BUILD_COMMAND + COMMAND make libz.a -j + INSTALL_COMMAND + COMMAND make install + COMMAND ${CMAKE_COMMAND} -E copy ${ZLIB_NO_PIC_INSTALL_DIR}/lib/libz.a ${ZLIB_NO_PIC_INSTALL_DIR}/lib/libz-no-pic.a + COMMAND ${CMAKE_COMMAND} -E copy ${ZLIB_NO_PIC_INSTALL_DIR}/lib/libz-no-pic.a ${LIB_DIR} + BUILD_IN_SOURCE 0 +) + +add_library(ZLIB::ZLIB_NO_PIC STATIC IMPORTED) +set_target_properties(ZLIB::ZLIB_NO_PIC PROPERTIES + IMPORTED_LOCATION ${ZLIB_NO_PIC_LIBRARIES} + INTERFACE_INCLUDE_DIRECTORIES ${ZLIB_NO_PIC_INCLUDE_DIRS} +) + +# Ensure that the zlib are built before they are used +add_dependencies(ZLIB::ZLIB_NO_PIC zlib-no-pic) + +# Set variables indicating that zlib has been installed +set(ZLIB_NO_PIC_ROOT ${ZLIB_NO_PIC_INSTALL_DIR}) + +cmake_print_variables(ZLIB_NO_PIC_LIBRARIES) diff --git a/third-party/zlib-cmake/zlib-pic.cmake b/third-party/zlib-cmake/zlib-pic.cmake new file mode 100644 index 0000000000..228b3648e0 --- /dev/null +++ b/third-party/zlib-cmake/zlib-pic.cmake @@ -0,0 +1,48 @@ +set(ZLIB_PIC_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/zlib-pic/build) +set(ZLIB_PIC_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/zlib-pic/install) +set(ZLIB_PIC_INCLUDE_DIRS ${ZLIB_PIC_INSTALL_DIR}/include) +set(ZLIB_PIC_LIBRARIES ${ZLIB_PIC_INSTALL_DIR}/lib/libz-pic.a) +# Ensure the build, installation and "include" directories exists +file(MAKE_DIRECTORY ${ZLIB_PIC_BUILD_DIR}) +file(MAKE_DIRECTORY ${ZLIB_PIC_INSTALL_DIR}) +file(MAKE_DIRECTORY ${ZLIB_PIC_INCLUDE_DIRS}) + +# For further optional differences +if(COMPILE_RUNTIME_LIGHT) + set(ZLIB_PIC_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} -fPIC") +else() + set(ZLIB_PIC_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} -fPIC") +endif() + +ExternalProject_Add( + zlib-pic + PREFIX ${ZLIB_PIC_BUILD_DIR} + SOURCE_DIR ${ZLIB_SOURCE_DIR} + INSTALL_DIR ${ZLIB_PIC_INSTALL_DIR} + BINARY_DIR ${ZLIB_PIC_BUILD_DIR} + BUILD_BYPRODUCTS ${ZLIB_PIC_INSTALL_DIR}/lib/libz-pic.a + CONFIGURE_COMMAND + COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZLIB_SOURCE_DIR} ${ZLIB_PIC_BUILD_DIR} + COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${ZLIB_PIC_COMPILE_FLAGS} ./configure --prefix=${ZLIB_PIC_INSTALL_DIR} --includedir=${ZLIB_PIC_INCLUDE_DIRS}/zlib --static + BUILD_COMMAND + COMMAND make libz.a -j + INSTALL_COMMAND + COMMAND make install + COMMAND ${CMAKE_COMMAND} -E copy ${ZLIB_PIC_INSTALL_DIR}/lib/libz.a ${ZLIB_PIC_INSTALL_DIR}/lib/libz-pic.a + COMMAND ${CMAKE_COMMAND} -E copy ${ZLIB_PIC_INSTALL_DIR}/lib/libz-pic.a ${LIB_DIR} + BUILD_IN_SOURCE 0 +) + +add_library(ZLIB::ZLIB_PIC STATIC IMPORTED) +set_target_properties(ZLIB::ZLIB_PIC PROPERTIES + IMPORTED_LOCATION ${ZLIB_PIC_LIBRARIES} + INTERFACE_INCLUDE_DIRECTORIES ${ZLIB_PIC_INCLUDE_DIRS} +) + +# Ensure that the zlib are built before they are used +add_dependencies(ZLIB::ZLIB_PIC zlib-pic) + +# Set variables indicating that zlib has been installed +set(ZLIB_PIC_ROOT ${ZLIB_PIC_INSTALL_DIR}) + +cmake_print_variables(ZLIB_PIC_LIBRARIES) diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake index f7b243d42d..5c3d9e3ee5 100644 --- a/third-party/zlib-cmake/zlib.cmake +++ b/third-party/zlib-cmake/zlib.cmake @@ -1,16 +1,17 @@ -if(COMPILE_RUNTIME_LIGHT) - set(ZLIB_BUILD_EXAMPLES OFF BOOL "Disable ZLIB_BUILD_EXAMPLES") - set(ZLIB_COMPILE_FLAGS "-O3" "-fPIC") +update_git_submodule(${THIRD_PARTY_DIR}/zlib "--recursive") - set(RENAME_ZCONF OFF) - add_subdirectory(${THIRD_PARTY_DIR}/zlib ${CMAKE_BINARY_DIR}/third-party/zlib) +set(ZLIB_SOURCE_DIR ${THIRD_PARTY_DIR}/zlib) - target_compile_definitions(zlibstatic PRIVATE Z_HAVE_UNISTD_H) - target_compile_definitions(zlib PRIVATE Z_HAVE_UNISTD_H) - target_compile_options(zlibstatic PUBLIC ${ZLIB_COMPILE_FLAGS}) +# The configuration has been based on: +# https://sources.debian.org/src/zlib/1%3A1.3.dfsg%2Breally1.3.1-1/debian/rules/#L20 +set(ZLIB_COMMON_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -Wall -O3 -D_REENTRANT") - # Set output directories for zlib targets - set(ZLIB_LIB_DIR "${OBJS_DIR}/lib") - set_target_properties(zlibstatic PROPERTIES ARCHIVE_OUTPUT_DIRECTORY - ${ZLIB_LIB_DIR}) +if(APPLE) + detect_xcode_sdk_path(CMAKE_OSX_SYSROOT) + set(ZLIB_COMMON_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}") endif() + +include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-pic.cmake) +include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-no-pic.cmake) + +set(ZLIB_FOUND ON) diff --git a/vkext/vkext-tl-memcache.cpp b/vkext/vkext-tl-memcache.cpp index 5466708205..143131b36c 100644 --- a/vkext/vkext-tl-memcache.cpp +++ b/vkext/vkext-tl-memcache.cpp @@ -3,7 +3,7 @@ // Distributed under the GPL v3 License, see LICENSE.notice.txt #include -#include +#include "zlib/zlib.h" #include "vkext/vkext-rpc-include.h" #include "vkext/vkext-rpc.h" diff --git a/vkext/vkext.cmake b/vkext/vkext.cmake index 3b181d0aaf..35dc399841 100644 --- a/vkext/vkext.cmake +++ b/vkext/vkext.cmake @@ -73,8 +73,9 @@ foreach(PHP_VERSION IN ITEMS "" "7.4" "8.0" "8.1" "8.2" "8.3") endif() target_compile_definitions(${VKEXT_TARGET} PRIVATE -DVKEXT -DPHP_ATOM_INC) target_compile_options(${VKEXT_TARGET} PRIVATE -Wno-unused-parameter -Wno-float-conversion -Wno-ignored-qualifiers) - target_include_directories(${VKEXT_TARGET} PRIVATE ${PHP_SOURCE} ${PHP_SOURCE}/main ${PHP_SOURCE}/Zend ${PHP_SOURCE}/TSRM ${BASE_DIR}) - target_link_libraries(${VKEXT_TARGET} PRIVATE vk::flex_data_shared) + target_include_directories(${VKEXT_TARGET} PRIVATE ${PHP_SOURCE} ${PHP_SOURCE}/main ${PHP_SOURCE}/Zend ${PHP_SOURCE}/TSRM ${BASE_DIR} ${ZLIB_PIC_INCLUDE_DIRS}) + add_dependencies(${VKEXT_TARGET} zlib-pic) + target_link_libraries(${VKEXT_TARGET} PRIVATE vk::flex_data_shared ZLIB::ZLIB_PIC) set_target_properties(${VKEXT_TARGET} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${OBJS_DIR}/vkext/modules${PHP_VERSION}/ LIBRARY_OUTPUT_NAME vkext