From c74e1bc654ae3b6269bf97183253fb745d5d0010 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Tue, 4 Feb 2025 15:38:23 +0300
Subject: [PATCH 01/20] Add passing CFLAGS to third-parties
Signed-off-by: Petr Shumilov
---
third-party/curl-cmake/curl.cmake | 2 +-
third-party/openssl-cmake/openssl.cmake | 6 +++---
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index d18886e8cc..bebd1c7b16 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -4,7 +4,7 @@ set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl)
# Ensure the installation directory exists
file(MAKE_DIRECTORY ${CURL_INSTALL_DIR})
-set(CURL_COMPILE_FLAGS "-g0 -Wno-deprecated-declarations")
+set(CURL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -Wno-deprecated-declarations")
# Suppress compiler-specific warnings caused by -O3
if(COMPILER_CLANG)
set(CURL_COMPILE_FLAGS "${CURL_COMPILE_FLAGS} -Wno-string-plus-int")
diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake
index 046033b68a..85144bd903 100644
--- a/third-party/openssl-cmake/openssl.cmake
+++ b/third-party/openssl-cmake/openssl.cmake
@@ -4,7 +4,7 @@ set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/openssl)
# Ensure the installation directory exists
file(MAKE_DIRECTORY ${OPENSSL_INSTALL_DIR})
-set(OPENSSL_COMPILE_FLAGS "-g0")
+set(OPENSSL_COMPILE_FLAGS "$ENV{CFLAGS} -g0")
# The configuration has been based on:
# https://packages.debian.org/buster/libssl1.1
@@ -21,9 +21,9 @@ endif()
ExternalProject_Add(openssl
SOURCE_DIR ${THIRD_PARTY_DIR}/openssl
- CONFIGURE_COMMAND ./config --prefix=${OPENSSL_INSTALL_DIR} --openssldir=/usr/lib/ssl no-shared no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms ${OPENSSL_CONFIGURE_EXTRA_OPTION}
+ CONFIGURE_COMMAND env CFLAGS=${OPENSSL_COMPILE_FLAGS} ./config --prefix=${OPENSSL_INSTALL_DIR} --openssldir=/usr/lib/ssl no-shared no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms ${OPENSSL_CONFIGURE_EXTRA_OPTION}
BUILD_BYPRODUCTS ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- BUILD_COMMAND make CFLAGS=${OPENSSL_COMPILE_FLAGS}
+ BUILD_COMMAND env CFLAGS=${OPENSSL_COMPILE_FLAGS} make
INSTALL_COMMAND
make install_sw &&
${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/third-party/openssl/include/ ${OBJS_DIR}/include &&
From 3fc1aefb2dec68e7a3d633a6ac1a233400d2432a Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 7 Feb 2025 19:01:59 +0300
Subject: [PATCH 02/20] Remove BUILD_IN_SOURCE to keep third-party directories
clean
Signed-off-by: Petr Shumilov
---
cmake/init-global-vars.cmake | 6 ++++
third-party/curl-cmake/curl.cmake | 39 +++++++++++++++++--------
third-party/openssl-cmake/openssl.cmake | 36 +++++++++++++++--------
3 files changed, 57 insertions(+), 24 deletions(-)
diff --git a/cmake/init-global-vars.cmake b/cmake/init-global-vars.cmake
index daf74f970a..f57db464d6 100644
--- a/cmake/init-global-vars.cmake
+++ b/cmake/init-global-vars.cmake
@@ -5,6 +5,8 @@ set(COMMON_DIR "${BASE_DIR}/common")
set(THIRD_PARTY_DIR "${BASE_DIR}/third-party")
set(OBJS_DIR ${BASE_DIR}/objs)
set(BIN_DIR ${OBJS_DIR}/bin)
+set(LIB_DIR ${OBJS_DIR}/lib)
+set(INCLUDE_DIR ${OBJS_DIR}/include)
set(GENERATED_DIR "${OBJS_DIR}/generated")
set(AUTO_DIR "${GENERATED_DIR}/auto")
set(RUNTIME_LIGHT_DIR "${BASE_DIR}/runtime-light")
@@ -94,4 +96,8 @@ else()
set(DEFAULT_KPHP_PATH ${BASE_DIR})
endif()
+# Ensure the dir for dependencies will be created
+file(MAKE_DIRECTORY ${LIB_DIR})
+file(MAKE_DIRECTORY ${INCLUDE_DIR})
+
cmake_print_variables(CMAKE_INSTALL_PREFIX CPACK_PACKAGING_INSTALL_PREFIX)
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index bebd1c7b16..770166282e 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -1,7 +1,10 @@
update_git_submodule(${THIRD_PARTY_DIR}/curl "--remote")
-set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl)
-# Ensure the installation directory exists
+set(CURL_SOURCE_DIR ${THIRD_PARTY_DIR}/curl)
+set(CURL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/curl/build)
+set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl/install)
+# Ensure the build and installation directories exists
+file(MAKE_DIRECTORY ${CURL_BUILD_DIR})
file(MAKE_DIRECTORY ${CURL_INSTALL_DIR})
set(CURL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -Wno-deprecated-declarations")
@@ -15,10 +18,7 @@ endif()
# The configuration has been based on:
# https://github.com/VKCOM/curl/commit/00364cc6d672d9271032dbfbae3cfbc5e5f8542c
# ./configure --prefix=/opt/curl7600 --without-librtmp --without-libssh2 --disable-ldap --disable-ldaps --disable-threaded-resolver --with-nghttp2 --enable-versioned-symbols
-ExternalProject_Add(
- curl
- SOURCE_DIR ${THIRD_PARTY_DIR}/curl
- CMAKE_ARGS
+set(CURL_CMAKE_ARGS
-DBUILD_TESTING=OFF
-DCURL_WERROR=OFF # Recommend to enable when optimization level less than -O3
-DBUILD_CURL_EXE=OFF
@@ -30,17 +30,30 @@ ExternalProject_Add(
-DENABLE_THREADED_RESOLVER=OFF # Disable threaded resolver.
-DUSE_NGHTTP2=ON # Enable HTTP/2 support.
-DCMAKE_USE_OPENSSL=ON
+ -DOPENSSL_FOUND=ON
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
-DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
- -DCMAKE_INSTALL_PREFIX=${CURL_INSTALL_DIR}
+ -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
-DCMAKE_C_FLAGS=${CURL_COMPILE_FLAGS}
- BUILD_COMMAND ${CMAKE_COMMAND} --build . --config $
+ -DCURL_TEST=Off
+)
+
+ExternalProject_Add(
+ curl
+ DEPENDS openssl
+ 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}
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} --build ${CURL_BUILD_DIR} --config $
INSTALL_COMMAND
- ${CMAKE_COMMAND} --install . --config $ &&
- ${CMAKE_COMMAND} -E copy_directory ${CURL_INSTALL_DIR}/include ${OBJS_DIR}/include &&
- ${CMAKE_COMMAND} -E copy ${CURL_INSTALL_DIR}/lib/libcurl.a ${OBJS_DIR}/lib/
- BUILD_IN_SOURCE 1
+ COMMAND ${CMAKE_COMMAND} --install ${CURL_BUILD_DIR} --prefix ${CURL_INSTALL_DIR} --config $
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${CURL_INSTALL_DIR}/include ${INCLUDE_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${CURL_INSTALL_DIR}/lib/libcurl.a ${LIB_DIR}
+ BUILD_IN_SOURCE 0
)
set(CURL_INCLUDE_DIR ${CURL_INSTALL_DIR}/include)
@@ -56,3 +69,5 @@ set_target_properties(CURL::curl PROPERTIES
# Set variables indicating that curl has been installed
set(CURL_FOUND ON)
set(CURL_LIBRARIES ${CURL_INSTALL_DIR}/lib/libcurl.a)
+
+cmake_print_variables(CURL_LIBRARIES)
diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake
index 85144bd903..43012ee4df 100644
--- a/third-party/openssl-cmake/openssl.cmake
+++ b/third-party/openssl-cmake/openssl.cmake
@@ -1,7 +1,10 @@
update_git_submodule(${THIRD_PARTY_DIR}/openssl "--remote")
-set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/openssl)
-# Ensure the installation directory exists
+set(OPENSSL_SOURCE_DIR ${THIRD_PARTY_DIR}/openssl)
+set(OPENSSL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/build)
+set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/install)
+# Ensure the build and installation directories exists
+file(MAKE_DIRECTORY ${OPENSSL_BUILD_DIR})
file(MAKE_DIRECTORY ${OPENSSL_INSTALL_DIR})
set(OPENSSL_COMPILE_FLAGS "$ENV{CFLAGS} -g0")
@@ -19,17 +22,24 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
set(OPENSSL_CONFIGURE_EXTRA_OPTION enable-ec_nistp_64_gcc_128)
endif()
-ExternalProject_Add(openssl
- SOURCE_DIR ${THIRD_PARTY_DIR}/openssl
- CONFIGURE_COMMAND env CFLAGS=${OPENSSL_COMPILE_FLAGS} ./config --prefix=${OPENSSL_INSTALL_DIR} --openssldir=/usr/lib/ssl no-shared no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms ${OPENSSL_CONFIGURE_EXTRA_OPTION}
+ExternalProject_Add(
+ openssl
+ PREFIX ${OPENSSL_BUILD_DIR}
+ SOURCE_DIR ${OPENSSL_SOURCE_DIR}
+ INSTALL_DIR ${OPENSSL_INSTALL_DIR}
+ BINARY_DIR ${OPENSSL_BUILD_DIR}
BUILD_BYPRODUCTS ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- BUILD_COMMAND env CFLAGS=${OPENSSL_COMPILE_FLAGS} make
+ CONFIGURE_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${OPENSSL_SOURCE_DIR} ${OPENSSL_BUILD_DIR}
+ 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}
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E env CFLAGS=${OPENSSL_COMPILE_FLAGS} make
INSTALL_COMMAND
- make install_sw &&
- ${CMAKE_COMMAND} -E copy_directory ${CMAKE_BINARY_DIR}/third-party/openssl/include/ ${OBJS_DIR}/include &&
- ${CMAKE_COMMAND} -E copy ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OBJS_DIR}/lib/ &&
- ${CMAKE_COMMAND} -E copy ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a ${OBJS_DIR}/lib/
- BUILD_IN_SOURCE 1
+ COMMAND make install_sw
+ 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}
+ BUILD_IN_SOURCE 0
)
set(OPENSSL_INCLUDE_DIR ${OPENSSL_INSTALL_DIR}/include)
@@ -58,4 +68,6 @@ set(OPENSSL_ROOT_DIR ${OPENSSL_INSTALL_DIR})
set(OPENSSL_LIBRARIES ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a)
set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a)
set(OPENSSL_SSL_LIBRARY ${OPENSSL_INSTALL_DIR}/lib/libssl.a)
-set(OPENSSL_USE_STATIC_LIBS TRUE)
+set(OPENSSL_USE_STATIC_LIBS ON)
+
+cmake_print_variables(OPENSSL_LIBRARIES)
From 9d87bfb41eaf5a00d4cf80ca22e0255c7afa89e8 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Wed, 12 Feb 2025 16:12:31 +0300
Subject: [PATCH 03/20] Add patch applying for OpenSSL
Signed-off-by: Petr Shumilov
---
.github/workflows/Dockerfile.buster | 2 +-
.github/workflows/Dockerfile.focal | 2 +-
.github/workflows/Dockerfile.jammy | 2 +-
.gitmodules | 4 +--
cmake/apply_patches.cmake | 35 +++++++++++++++++++++++++
third-party/openssl | 2 +-
third-party/openssl-cmake/openssl.cmake | 12 ++++++---
7 files changed, 49 insertions(+), 10 deletions(-)
create mode 100644 cmake/apply_patches.cmake
diff --git a/.github/workflows/Dockerfile.buster b/.github/workflows/Dockerfile.buster
index 034e196cb3..21e547154c 100644
--- a/.github/workflows/Dockerfile.buster
+++ b/.github/workflows/Dockerfile.buster
@@ -19,7 +19,7 @@ RUN apt-get update && \
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 467B942D3A79BD29 && \
apt-get update && \
apt-get install -y --no-install-recommends \
- git cmake-data=3.18* cmake=3.18* make g++ gperf netcat \
+ git cmake-data=3.18* cmake=3.18* make g++ gperf netcat patch \
python3.7 python3-dev libpython3-dev python3-pip python3-setuptools python3-wheel mysql-server libmysqlclient-dev && \
pip3 install -r /tmp/requirements.txt && \
apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
diff --git a/.github/workflows/Dockerfile.focal b/.github/workflows/Dockerfile.focal
index 2a6f02d99d..10c0fdba51 100644
--- a/.github/workflows/Dockerfile.focal
+++ b/.github/workflows/Dockerfile.focal
@@ -12,7 +12,7 @@ RUN apt-get update && \
add-apt-repository ppa:deadsnakes/ppa && \
apt-get update && \
apt-get install -y --no-install-recommends \
- git cmake make clang g++ g++-10 gperf netcat \
+ git cmake make clang g++ g++-10 gperf netcat patch \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools mysql-server libmysqlclient-dev && \
python3.7 -m pip install pip && python3.7 -m pip install -r /tmp/requirements.txt && \
apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
diff --git a/.github/workflows/Dockerfile.jammy b/.github/workflows/Dockerfile.jammy
index cb445104e1..cb667c503b 100644
--- a/.github/workflows/Dockerfile.jammy
+++ b/.github/workflows/Dockerfile.jammy
@@ -16,7 +16,7 @@ RUN apt update && \
add-apt-repository ppa:deadsnakes/ppa && \
apt update && \
apt install -y --no-install-recommends \
- build-essential devscripts fakeroot git cmake make g++ lld gperf netcat \
+ build-essential devscripts fakeroot git cmake make g++ lld gperf netcat patch \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools && \
apt install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
libzstd-dev libyaml-cpp-dev libnghttp2-dev zlib1g-dev php7.4-dev libnuma-dev unzip && \
diff --git a/.gitmodules b/.gitmodules
index 107f016fc8..daab73053c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -9,8 +9,8 @@
url = https://github.com/PCRE2Project/pcre2.git
[submodule "third-party/openssl"]
path = third-party/openssl
- url = https://github.com/openssl/openssl.git
- branch = OpenSSL_1_1_1-stable
+ url = https://salsa.debian.org/debian/openssl.git
+ branch = debian/buster
[submodule "third-party/curl"]
path = third-party/curl
url = https://github.com/VKCOM/curl.git
diff --git a/cmake/apply_patches.cmake b/cmake/apply_patches.cmake
new file mode 100644
index 0000000000..9cf1b26c98
--- /dev/null
+++ b/cmake/apply_patches.cmake
@@ -0,0 +1,35 @@
+function(apply_patches_from_series build_dir series_file patch_dir)
+ # Check for the presence of the patch utility
+ find_program(PATCH_EXECUTABLE patch)
+ if(NOT PATCH_EXECUTABLE)
+ message(FATAL_ERROR "The 'patch' utility is not found on this system.")
+ endif()
+
+ # Read the series file and apply each patch listed
+ file(READ "${series_file}" series_content)
+ string(REPLACE "\n" ";" series_list "${series_content}")
+
+ foreach(patch IN LISTS series_list)
+ if(NOT patch STREQUAL "")
+ # Construct the full path to the patch file
+ set(patch_file "${patch_dir}${patch}")
+
+ # Apply the patch using GNU patch
+ execute_process(
+ COMMAND ${PATCH_EXECUTABLE} -p1 -i "${patch_file}"
+ WORKING_DIRECTORY "${build_dir}"
+ RESULT_VARIABLE result
+ OUTPUT_VARIABLE output
+ ERROR_VARIABLE error
+ )
+
+ if(NOT result EQUAL 0)
+ message(FATAL_ERROR "Failed to apply patch: ${patch}\nOutput: ${output}\nError: ${error}")
+ else()
+ message(STATUS "Applied patch: ${patch}")
+ endif()
+ endif()
+ endforeach()
+endfunction()
+
+apply_patches_from_series(${BUILD_DIR} ${PATCH_SERIES} ${PATCH_DIR})
diff --git a/third-party/openssl b/third-party/openssl
index b372b1f764..ddafec437b 160000
--- a/third-party/openssl
+++ b/third-party/openssl
@@ -1 +1 @@
-Subproject commit b372b1f76450acdfed1e2301a39810146e28b02c
+Subproject commit ddafec437b0f371490126a3af2577150b56dae81
diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake
index 43012ee4df..c55d06be9b 100644
--- a/third-party/openssl-cmake/openssl.cmake
+++ b/third-party/openssl-cmake/openssl.cmake
@@ -1,8 +1,10 @@
update_git_submodule(${THIRD_PARTY_DIR}/openssl "--remote")
-set(OPENSSL_SOURCE_DIR ${THIRD_PARTY_DIR}/openssl)
-set(OPENSSL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/build)
-set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/install)
+set(OPENSSL_SOURCE_DIR ${THIRD_PARTY_DIR}/openssl)
+set(OPENSSL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/build)
+set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/install)
+set(OPENSSL_PATCH_DIR ${OPENSSL_BUILD_DIR}/debian/patches/)
+set(OPENSSL_PATCH_SERIES ${OPENSSL_BUILD_DIR}/debian/patches/series)
# Ensure the build and installation directories exists
file(MAKE_DIRECTORY ${OPENSSL_BUILD_DIR})
file(MAKE_DIRECTORY ${OPENSSL_INSTALL_DIR})
@@ -29,8 +31,10 @@ ExternalProject_Add(
INSTALL_DIR ${OPENSSL_INSTALL_DIR}
BINARY_DIR ${OPENSSL_BUILD_DIR}
BUILD_BYPRODUCTS ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- CONFIGURE_COMMAND
+ PATCH_COMMAND
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}
BUILD_COMMAND
COMMAND ${CMAKE_COMMAND} -E env CFLAGS=${OPENSSL_COMPILE_FLAGS} make
From bc063a192a143a2fd310da0750be01442803cc02 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 14 Feb 2025 19:44:07 +0300
Subject: [PATCH 04/20] Add zlib vendoring
Signed-off-by: Petr Shumilov
---
CMakeLists.txt | 3 +-
cmake/utils.cmake | 24 +++++++++++
common/common-tests.cmake | 7 +++-
common/common.cmake | 7 ++++
common/kfs/kfs.cpp | 2 +-
compiler/compiler-settings.cpp | 15 ++++---
net/net-tests.cmake | 7 +++-
runtime-light/runtime-light.cmake | 5 +--
runtime/runtime.cmake | 7 ++--
runtime/zlib.h | 2 +-
third-party/curl-cmake/curl.cmake | 26 ++++++++----
third-party/openssl-cmake/openssl.cmake | 13 ++++--
third-party/zlib | 2 +-
third-party/zlib-cmake/zlib-no-pic.cmake | 53 ++++++++++++++++++++++++
third-party/zlib-cmake/zlib-pic.cmake | 49 ++++++++++++++++++++++
third-party/zlib-cmake/zlib.cmake | 25 +++++------
vkext/vkext-tl-memcache.cpp | 2 +-
vkext/vkext.cmake | 5 ++-
18 files changed, 210 insertions(+), 44 deletions(-)
create mode 100644 third-party/zlib-cmake/zlib-no-pic.cmake
create mode 100644 third-party/zlib-cmake/zlib-pic.cmake
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..c53d419d61 100644
--- a/common/common-tests.cmake
+++ b/common/common-tests.cmake
@@ -20,5 +20,10 @@ 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)
+if(COMPILE_RUNTIME_LIGHT)
+ set(COMMON_TESTS_LIBS ${COMMON_TESTS_LIBS} ZLIB::ZLIB_PIC)
+else()
+ set(COMMON_TESTS_LIBS ${COMMON_TESTS_LIBS} ZLIB::ZLIB_NO_PIC)
+endif()
vk_add_unittest(common "${COMMON_TESTS_LIBS}" ${COMMON_TESTS_SOURCES})
diff --git a/common/common.cmake b/common/common.cmake
index 0e989f6792..1e8b192b25 100644
--- a/common/common.cmake
+++ b/common/common.cmake
@@ -64,3 +64,10 @@ if(COMPILER_CLANG)
endif()
vk_add_library(common_src OBJECT ${COMMON_ALL_SOURCES})
+if(COMPILE_RUNTIME_LIGHT)
+ target_include_directories(common_src PUBLIC ${ZLIB_PIC_INCLUDE_DIRS})
+ add_dependencies(common_src openssl zlib-pic)
+else()
+ target_include_directories(common_src PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS})
+ add_dependencies(common_src openssl zlib-no-pic)
+endif()
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..80962051fb 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,7 +424,11 @@ void CompilerSettings::init() {
system_installed_dynamic_libs.emplace_back("rt");
#endif
- append_3dparty_headers(cxx_default_flags, third_party_path, "openssl");
+ 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");
diff --git a/net/net-tests.cmake b/net/net-tests.cmake
index da3089def7..be98fe22ee 100644
--- a/net/net-tests.cmake
+++ b/net/net-tests.cmake
@@ -5,5 +5,10 @@ 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)
+if(COMPILE_RUNTIME_LIGHT)
+ set(NET_TESTS_LIBS ${NET_TESTS_LIBS} ZLIB::ZLIB_PIC)
+else()
+ set(NET_TESTS_LIBS ${NET_TESTS_LIBS} ZLIB::ZLIB_NO_PIC)
+endif()
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..a2758a8c68
--- /dev/null
+++ b/third-party/zlib-cmake/zlib-no-pic.cmake
@@ -0,0 +1,53 @@
+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}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZLIB_NO_PIC_INCLUDE_DIRS} ${INCLUDE_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..021bcb958a
--- /dev/null
+++ b/third-party/zlib-cmake/zlib-pic.cmake
@@ -0,0 +1,49 @@
+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}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZLIB_PIC_INCLUDE_DIRS} ${INCLUDE_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
From 1c9a288a0df77fcb75d264fc38b027be3e72287a Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Tue, 18 Feb 2025 19:59:54 +0300
Subject: [PATCH 05/20] Add nghttp2 vendoring
Signed-off-by: Petr Shumilov
---
.github/workflows/Dockerfile.buster | 2 +-
.github/workflows/Dockerfile.focal | 2 +-
.github/workflows/Dockerfile.jammy | 2 +-
.gitmodules | 4 +
CMakeLists.txt | 6 +-
compiler/compiler-settings.cpp | 3 +-
.../compiling-kphp-from-sources.md | 4 +-
runtime/runtime.cmake | 7 +-
third-party/curl-cmake/curl.cmake | 23 +++--
third-party/nghttp2 | 1 +
third-party/nghttp2-cmake/nghttp2.cmake | 86 +++++++++++++++++++
third-party/zlib-cmake/zlib.cmake | 5 +-
12 files changed, 123 insertions(+), 22 deletions(-)
create mode 160000 third-party/nghttp2
create mode 100644 third-party/nghttp2-cmake/nghttp2.cmake
diff --git a/.github/workflows/Dockerfile.buster b/.github/workflows/Dockerfile.buster
index 21e547154c..1af9711ce1 100644
--- a/.github/workflows/Dockerfile.buster
+++ b/.github/workflows/Dockerfile.buster
@@ -23,7 +23,7 @@ RUN apt-get update && \
python3.7 python3-dev libpython3-dev python3-pip python3-setuptools python3-wheel mysql-server libmysqlclient-dev && \
pip3 install -r /tmp/requirements.txt && \
apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev libnghttp2-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
+ libzstd-dev libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
libpq5=14.* postgresql-14 postgresql-server-dev-14 libpq-dev=14.* libnuma-dev composer && \
rm -rf /var/lib/apt/lists/* && \
update-alternatives --set php /usr/bin/php7.4
diff --git a/.github/workflows/Dockerfile.focal b/.github/workflows/Dockerfile.focal
index 10c0fdba51..435df9f2f7 100644
--- a/.github/workflows/Dockerfile.focal
+++ b/.github/workflows/Dockerfile.focal
@@ -16,7 +16,7 @@ RUN apt-get update && \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools mysql-server libmysqlclient-dev && \
python3.7 -m pip install pip && python3.7 -m pip install -r /tmp/requirements.txt && \
apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev libnghttp2-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
+ libzstd-dev libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
libpq5=14.* postgresql-14 postgresql-server-dev-14 libpq-dev=14.* libnuma-dev composer unzip && \
rm -rf /var/lib/apt/lists/*
diff --git a/.github/workflows/Dockerfile.jammy b/.github/workflows/Dockerfile.jammy
index cb667c503b..aee6dda76c 100644
--- a/.github/workflows/Dockerfile.jammy
+++ b/.github/workflows/Dockerfile.jammy
@@ -19,7 +19,7 @@ RUN apt update && \
build-essential devscripts fakeroot git cmake make g++ lld gperf netcat patch \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools && \
apt install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev libnghttp2-dev zlib1g-dev php7.4-dev libnuma-dev unzip && \
+ libzstd-dev libyaml-cpp-dev zlib1g-dev php7.4-dev libnuma-dev unzip && \
# Install MySQL-related and PostgreSQL-related libraries from the Ubuntu 20.04 (Focal Fossa) repository.
# Ubuntu 22.04 has moved to OpenSSL 3.0; however, KPHP relies on OpenSSL 1.1.1.
# Therefore, we use downgraded libraries that are compatible with OpenSSL 1.1.1.
diff --git a/.gitmodules b/.gitmodules
index daab73053c..ac8e86a285 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -15,3 +15,7 @@
path = third-party/curl
url = https://github.com/VKCOM/curl.git
branch = dpkg-build-7.60.0
+[submodule "third-party/nghttp2"]
+ path = third-party/nghttp2
+ url = https://salsa.debian.org/debian/nghttp2.git
+ branch = buster
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d23d1499c5..ed25042184 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.16)
project(kphp
VERSION 1.0.1
- LANGUAGES CXX ASM
+ LANGUAGES C CXX ASM
DESCRIPTION "Compiler for PHP (aka KPHP)"
HOMEPAGE_URL https://github.com/VKCOM/kphp)
@@ -122,8 +122,8 @@ install(FILES ${AUTO_DIR}/runtime/runtime-headers.h
COMPONENT KPHP
DESTINATION ${INSTALL_KPHP_SOURCE}/objs/generated/auto/runtime/)
-set(CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS "vk-flex-data, libuber-h3, libpcre3-dev, libre2-dev, libyaml-cpp-dev, zlib1g-dev, \
- libzstd-dev, g++, libnghttp2-dev, kphp-timelib, libnuma-dev")
+set(CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS "vk-flex-data, libuber-h3, libpcre3-dev, libre2-dev, libyaml-cpp-dev, \
+ libzstd-dev, g++, kphp-timelib, libnuma-dev")
if (PDO_DRIVER_MYSQL)
set(CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS "${CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS}, libmysqlclient-dev")
diff --git a/compiler/compiler-settings.cpp b/compiler/compiler-settings.cpp
index 80962051fb..b7f620dd6b 100644
--- a/compiler/compiler-settings.cpp
+++ b/compiler/compiler-settings.cpp
@@ -368,7 +368,7 @@ void CompilerSettings::init() {
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", "zstd", "nghttp2", "kphp-timelib"};
+ std::vector system_installed_static_libs{"pcre", "re2", "yaml-cpp", "h3", "zstd", "kphp-timelib"};
#ifdef KPHP_TIMELIB_LIB_DIR
ld_flags.value_ += " -L" KPHP_TIMELIB_LIB_DIR;
@@ -431,6 +431,7 @@ void CompilerSettings::init() {
}
append_3dparty_lib(ld_flags.value_, third_party_path, "ssl");
append_3dparty_lib(ld_flags.value_, third_party_path, "crypto");
+ append_3dparty_lib(ld_flags.value_, third_party_path, "nghttp2");
append_if_doesnt_contain(ld_flags.value_, system_installed_dynamic_libs, "-l");
ld_flags.value_ += " -rdynamic";
diff --git a/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md b/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md
index 19ba70f813..b26917751f 100644
--- a/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md
+++ b/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md
@@ -54,7 +54,7 @@ Install packages
apt-get update
apt install git cmake-data=3.16* cmake=3.16* make g++ gperf python3-minimal python3-jsonschema \
curl-kphp-vk libuber-h3-dev kphp-timelib libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev libnghttp2-dev zlib1g-dev php7.4-dev libmysqlclient-dev libnuma-dev \
+ libzstd-dev libyaml-cpp-dev php7.4-dev libmysqlclient-dev libnuma-dev \
postgresql postgresql-server-dev-all libpq-dev libldap-dev libkrb5-dev
```
@@ -74,7 +74,7 @@ Install packages
apt-get update
apt install git cmake make g++ gperf python3-minimal python3-jsonschema \
curl-kphp-vk libuber-h3-dev kphp-timelib libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev libnghttp2-dev zlib1g-dev php7.4-dev libmysqlclient-dev libnuma-dev \
+ libzstd-dev libyaml-cpp-dev php7.4-dev libmysqlclient-dev libnuma-dev \
postgresql postgresql-server-dev-all libpq-dev libldap-dev libkrb5-dev
```
diff --git a/runtime/runtime.cmake b/runtime/runtime.cmake
index 738a715313..b0e811f920 100644
--- a/runtime/runtime.cmake
+++ b/runtime/runtime.cmake
@@ -1,4 +1,5 @@
-# CURL Building
+# CURL Build
+include(${THIRD_PARTY_DIR}/nghttp2-cmake/nghttp2.cmake)
include(${THIRD_PARTY_DIR}/curl-cmake/curl.cmake)
prepend(KPHP_RUNTIME_DATETIME_SOURCES datetime/
@@ -150,8 +151,8 @@ 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})
-prepare_cross_platform_libs(RUNTIME_LINK_TEST_LIBS pcre nghttp2 kphp-timelib)
-set(RUNTIME_LINK_TEST_LIBS vk::flex_data_static CURL::curl OpenSSL::SSL ${NUMA_LIB} ${RUNTIME_LINK_TEST_LIBS} ${EPOLL_SHIM_LIB} ${ICONV_LIB} ${RT_LIB} dl)
+prepare_cross_platform_libs(RUNTIME_LINK_TEST_LIBS pcre kphp-timelib)
+set(RUNTIME_LINK_TEST_LIBS vk::flex_data_static CURL::curl OpenSSL::SSL NGHTTP2::nghttp2 ${NUMA_LIB} ${RUNTIME_LINK_TEST_LIBS} ${EPOLL_SHIM_LIB} ${ICONV_LIB} ${RT_LIB} dl)
if (PDO_DRIVER_MYSQL)
list(APPEND RUNTIME_LINK_TEST_LIBS mysqlclient)
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index 281215c86f..a05ef56efe 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -3,9 +3,11 @@ update_git_submodule(${THIRD_PARTY_DIR}/curl "--remote")
set(CURL_SOURCE_DIR ${THIRD_PARTY_DIR}/curl)
set(CURL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/curl/build)
set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl/install)
-# Ensure the build and installation directories exists
+set(CURL_INCLUDE_DIRS ${CURL_INSTALL_DIR}/include)
+# Ensure the build, installation and "include" directories exists
file(MAKE_DIRECTORY ${CURL_BUILD_DIR})
file(MAKE_DIRECTORY ${CURL_INSTALL_DIR})
+file(MAKE_DIRECTORY ${CURL_INCLUDE_DIRS})
set(CURL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -Wno-deprecated-declarations")
if(NOT APPLE)
@@ -23,8 +25,13 @@ endif()
# https://github.com/VKCOM/curl/commit/00364cc6d672d9271032dbfbae3cfbc5e5f8542c
# ./configure --prefix=/opt/curl7600 --without-librtmp --without-libssh2 --disable-ldap --disable-ldaps --disable-threaded-resolver --with-nghttp2 --enable-versioned-symbols
set(CURL_CMAKE_ARGS
+ -DCMAKE_C_FLAGS=${CURL_COMPILE_FLAGS}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_FLAGS=${CURL_COMPILE_FLAGS}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_POSITION_INDEPENDENT_CODE=OFF
-DBUILD_TESTING=OFF
- -DCURL_WERROR=OFF # Recommend to enable when optimization level less than -O3
+ -DCURL_WERROR=ON # Recommend to enable when optimization level less than -O3
-DBUILD_CURL_EXE=OFF
-DCURL_STATICLIB=ON
-DUSE_LIBRTMP=OFF # Disable RTMP support.
@@ -44,13 +51,15 @@ set(CURL_CMAKE_ARGS
-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}
- -DCMAKE_POSITION_INDEPENDENT_CODE=OFF
+ -DNGHTTP2_FOUND=ON
+ -DNGHTTP2_ROOT=${NGHTTP2_ROOT}
+ -DNGHTTP2_LIBRARY=${NGHTTP2_LIBRARIES}
+ -DNGHTTP2_INCLUDE_DIR=${NGHTTP2_INCLUDE_DIRS}
)
ExternalProject_Add(
curl
- DEPENDS openssl zlib-no-pic
+ DEPENDS openssl zlib-no-pic nghttp2
PREFIX ${CURL_BUILD_DIR}
SOURCE_DIR ${CURL_SOURCE_DIR}
INSTALL_DIR ${CURL_INSTALL_DIR}
@@ -66,10 +75,6 @@ ExternalProject_Add(
BUILD_IN_SOURCE 0
)
-set(CURL_INCLUDE_DIRS ${CURL_INSTALL_DIR}/include)
-# Ensure the include directory exists
-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
diff --git a/third-party/nghttp2 b/third-party/nghttp2
new file mode 160000
index 0000000000..b6618cde43
--- /dev/null
+++ b/third-party/nghttp2
@@ -0,0 +1 @@
+Subproject commit b6618cde43069191dd566316510efad68576dfaf
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
new file mode 100644
index 0000000000..1b35c72578
--- /dev/null
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -0,0 +1,86 @@
+update_git_submodule(${THIRD_PARTY_DIR}/nghttp2 "--remote")
+
+set(NGHTTP2_SOURCE_DIR ${THIRD_PARTY_DIR}/nghttp2)
+set(NGHTTP2_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/nghttp2/build)
+set(NGHTTP2_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/nghttp2/install)
+set(NGHTTP2_INCLUDE_DIRS ${NGHTTP2_INSTALL_DIR}/include)
+set(NGHTTP2_PATCH_DIR ${NGHTTP2_BUILD_DIR}/debian/patches/)
+set(NGHTTP2_PATCH_SERIES ${NGHTTP2_BUILD_DIR}/debian/patches/series)
+# Ensure the build, installation and "include" directories exists
+file(MAKE_DIRECTORY ${NGHTTP2_BUILD_DIR})
+file(MAKE_DIRECTORY ${NGHTTP2_INSTALL_DIR})
+file(MAKE_DIRECTORY ${NGHTTP2_INCLUDE_DIRS})
+
+set(NGHTTP2_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic")
+if(NOT APPLE)
+ set(NGHTTP2_COMPILE_FLAGS "${NGHTTP2_COMPILE_FLAGS} -static")
+endif()
+
+# The configuration has been based on:
+# https://salsa.debian.org/debian/nghttp2/-/blob/buster/debian/rules#L8
+set(NGHTTP2_CMAKE_ARGS
+ -DCMAKE_C_FLAGS=${NGHTTP2_COMPILE_FLAGS}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_FLAGS=${NGHTTP2_COMPILE_FLAGS}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_POSITION_INDEPENDENT_CODE=OFF
+ -DENABLE_WERROR=ON
+ -DENABLE_THREADS=OFF
+ -DENABLE_APP=OFF
+ -DENABLE_HPACK_TOOLS=OFF
+ -DENABLE_ASIO_LIB=OFF
+ -DENABLE_EXAMPLES=OFF
+ -DENABLE_PYTHON_BINDINGS=OFF
+ -DENABLE_FAILMALLOC=OFF
+ -DENABLE_LIB_ONLY=ON
+ -DENABLE_STATIC_LIB=ON
+ -DENABLE_SHARED_LIB=OFF
+ -DWITH_LIBXML2=OFF
+ -DWITH_JEMALLOC=OFF
+ -DWITH_SPDYLAY=OFF
+ -DWITH_MRUBY=OFF
+ -DWITH_NEVERBLEED=OFF
+ -DOPENSSL_FOUND=ON
+ -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
+ -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
+ -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
+ -DZLIB_FOUND=ON
+ -DZLIB_ROOT=${ZLIB_NO_PIC_ROOT}
+ -DZLIB_LIBRARIES=${ZLIB_NO_PIC_LIBRARIES}
+ -DZLIB_INCLUDE_DIR=${ZLIB_NO_PIC_INCLUDE_DIRS}/zlib
+)
+
+ExternalProject_Add(
+ nghttp2
+ DEPENDS openssl zlib-no-pic
+ PREFIX ${NGHTTP2_BUILD_DIR}
+ SOURCE_DIR ${NGHTTP2_SOURCE_DIR}
+ INSTALL_DIR ${NGHTTP2_INSTALL_DIR}
+ BINARY_DIR ${NGHTTP2_BUILD_DIR}
+ BUILD_BYPRODUCTS ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a
+ PATCH_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${NGHTTP2_SOURCE_DIR} ${NGHTTP2_BUILD_DIR}
+ COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${NGHTTP2_BUILD_DIR} -DPATCH_SERIES=${NGHTTP2_PATCH_SERIES} -DPATCH_DIR=${NGHTTP2_PATCH_DIR} -P ../../cmake/apply_patches.cmake
+ CONFIGURE_COMMAND
+ COMMAND ${CMAKE_COMMAND} ${NGHTTP2_CMAKE_ARGS} -S ${NGHTTP2_SOURCE_DIR} -B ${NGHTTP2_BUILD_DIR} -Wno-dev
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} --build ${NGHTTP2_BUILD_DIR} --config $ -j
+ INSTALL_COMMAND
+ COMMAND ${CMAKE_COMMAND} --install ${NGHTTP2_BUILD_DIR} --prefix ${NGHTTP2_INSTALL_DIR} --config $
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${NGHTTP2_INSTALL_DIR}/include ${INCLUDE_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a ${LIB_DIR}
+ BUILD_IN_SOURCE 0
+)
+
+add_library(NGHTTP2::nghttp2 STATIC IMPORTED)
+set_target_properties(NGHTTP2::nghttp2 PROPERTIES
+ IMPORTED_LOCATION ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a
+ INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
+)
+
+# Set variables indicating that NGHTTP2 has been installed
+set(NGHTTP2_FOUND ON)
+set(NGHTTP2_ROOT ${NGHTTP2_INSTALL_DIR})
+set(NGHTTP2_LIBRARIES ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a)
+
+cmake_print_variables(NGHTTP2_LIBRARIES)
diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake
index 5c3d9e3ee5..b17a3e2b04 100644
--- a/third-party/zlib-cmake/zlib.cmake
+++ b/third-party/zlib-cmake/zlib.cmake
@@ -11,7 +11,10 @@ if(APPLE)
set(ZLIB_COMMON_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
endif()
+if (NOT COMPILE_RUNTIME_LIGHT)
+ include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-no-pic.cmake)
+endif ()
+
include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-pic.cmake)
-include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-no-pic.cmake)
set(ZLIB_FOUND ON)
From 82bf25e8c21c26d7d3dedd737b143bf0229e5532 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Wed, 19 Feb 2025 18:52:35 +0300
Subject: [PATCH 06/20] Update source url for OpenSSL and Nghttp2
Signed-off-by: Petr Shumilov
---
.gitmodules | 4 ++--
third-party/curl-cmake/curl.cmake | 11 ++++++-----
third-party/nghttp2-cmake/nghttp2.cmake | 4 ++--
3 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/.gitmodules b/.gitmodules
index ac8e86a285..f2c8020ede 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -9,7 +9,7 @@
url = https://github.com/PCRE2Project/pcre2.git
[submodule "third-party/openssl"]
path = third-party/openssl
- url = https://salsa.debian.org/debian/openssl.git
+ url = https://github.com/VKCOM/openssl.git
branch = debian/buster
[submodule "third-party/curl"]
path = third-party/curl
@@ -17,5 +17,5 @@
branch = dpkg-build-7.60.0
[submodule "third-party/nghttp2"]
path = third-party/nghttp2
- url = https://salsa.debian.org/debian/nghttp2.git
+ url = https://github.com/VKCOM/nghttp2.git
branch = buster
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index a05ef56efe..3e1f597e48 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -1,9 +1,10 @@
update_git_submodule(${THIRD_PARTY_DIR}/curl "--remote")
-set(CURL_SOURCE_DIR ${THIRD_PARTY_DIR}/curl)
-set(CURL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/curl/build)
-set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl/install)
-set(CURL_INCLUDE_DIRS ${CURL_INSTALL_DIR}/include)
+set(CURL_SOURCE_DIR ${THIRD_PARTY_DIR}/curl)
+set(CURL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/curl/build)
+set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl/install)
+set(CURL_LIBRARIES ${CURL_INSTALL_DIR}/lib/libcurl.a)
+set(CURL_INCLUDE_DIRS ${CURL_INSTALL_DIR}/include)
# Ensure the build, installation and "include" directories exists
file(MAKE_DIRECTORY ${CURL_BUILD_DIR})
file(MAKE_DIRECTORY ${CURL_INSTALL_DIR})
@@ -77,7 +78,7 @@ ExternalProject_Add(
add_library(CURL::curl STATIC IMPORTED)
set_target_properties(CURL::curl PROPERTIES
- IMPORTED_LOCATION ${CURL_INSTALL_DIR}/lib/libcurl.a
+ IMPORTED_LOCATION ${CURL_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
)
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
index 1b35c72578..895dbd3774 100644
--- a/third-party/nghttp2-cmake/nghttp2.cmake
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -3,6 +3,7 @@ update_git_submodule(${THIRD_PARTY_DIR}/nghttp2 "--remote")
set(NGHTTP2_SOURCE_DIR ${THIRD_PARTY_DIR}/nghttp2)
set(NGHTTP2_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/nghttp2/build)
set(NGHTTP2_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/nghttp2/install)
+set(NGHTTP2_LIBRARIES ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a)
set(NGHTTP2_INCLUDE_DIRS ${NGHTTP2_INSTALL_DIR}/include)
set(NGHTTP2_PATCH_DIR ${NGHTTP2_BUILD_DIR}/debian/patches/)
set(NGHTTP2_PATCH_SERIES ${NGHTTP2_BUILD_DIR}/debian/patches/series)
@@ -74,13 +75,12 @@ ExternalProject_Add(
add_library(NGHTTP2::nghttp2 STATIC IMPORTED)
set_target_properties(NGHTTP2::nghttp2 PROPERTIES
- IMPORTED_LOCATION ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a
+ IMPORTED_LOCATION ${NGHTTP2_LIBRARIES}
INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
)
# Set variables indicating that NGHTTP2 has been installed
set(NGHTTP2_FOUND ON)
set(NGHTTP2_ROOT ${NGHTTP2_INSTALL_DIR})
-set(NGHTTP2_LIBRARIES ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a)
cmake_print_variables(NGHTTP2_LIBRARIES)
From 49f583702e83e5f1f84b6ce3d727d0ba6e7be3b4 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Thu, 20 Feb 2025 19:17:22 +0300
Subject: [PATCH 07/20] Add zstd vendoring
Signed-off-by: Petr Shumilov
---
.github/workflows/Build.yml | 2 +-
.github/workflows/Dockerfile.buster | 2 +-
.github/workflows/Dockerfile.focal | 2 +-
.github/workflows/Dockerfile.jammy | 2 +-
.github/workflows/macos.yml | 2 +-
.gitmodules | 4 ++
CMakeLists.txt | 4 +-
common/common-tests.cmake | 3 +-
common/common.cmake | 6 +-
common/kfs/kfs.cpp | 2 +-
common/tl/methods/rwm.cpp | 2 +-
compiler/compiler-settings.cpp | 9 +--
.../compiling-kphp-from-sources.md | 6 +-
net/net-tests.cmake | 3 +-
runtime/runtime.cmake | 8 +--
runtime/zstd.cpp | 2 +-
tests/cpp/runtime/zstd-test.cpp | 2 +-
third-party/curl-cmake/curl.cmake | 1 -
third-party/nghttp2-cmake/nghttp2.cmake | 4 +-
third-party/zstd | 1 +
third-party/zstd-cmake/zstd.cmake | 63 +++++++++++++++++++
21 files changed, 100 insertions(+), 30 deletions(-)
create mode 160000 third-party/zstd
create mode 100644 third-party/zstd-cmake/zstd.cmake
diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml
index f6db40aa21..3a951e68ad 100644
--- a/.github/workflows/Build.yml
+++ b/.github/workflows/Build.yml
@@ -146,7 +146,7 @@ jobs:
run: |
brew tap shivammathur/php
brew update
- brew install python@3.13 re2c cmake coreutils libiconv re2 pcre yaml-cpp zstd googletest shivammathur/php/php@7.4
+ brew install python@3.13 re2c cmake coreutils libiconv re2 pcre yaml-cpp googletest shivammathur/php/php@7.4
brew link --overwrite --force shivammathur/php/php@7.4
/opt/homebrew/opt/python@3.13/libexec/bin/python -m pip install --upgrade pip --break-system-packages && /opt/homebrew/opt/python@3.13/libexec/bin/pip install --break-system-packages jsonschema
diff --git a/.github/workflows/Dockerfile.buster b/.github/workflows/Dockerfile.buster
index 1af9711ce1..ea9f60b15e 100644
--- a/.github/workflows/Dockerfile.buster
+++ b/.github/workflows/Dockerfile.buster
@@ -23,7 +23,7 @@ RUN apt-get update && \
python3.7 python3-dev libpython3-dev python3-pip python3-setuptools python3-wheel mysql-server libmysqlclient-dev && \
pip3 install -r /tmp/requirements.txt && \
apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
+ libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
libpq5=14.* postgresql-14 postgresql-server-dev-14 libpq-dev=14.* libnuma-dev composer && \
rm -rf /var/lib/apt/lists/* && \
update-alternatives --set php /usr/bin/php7.4
diff --git a/.github/workflows/Dockerfile.focal b/.github/workflows/Dockerfile.focal
index 435df9f2f7..8f40b66b3b 100644
--- a/.github/workflows/Dockerfile.focal
+++ b/.github/workflows/Dockerfile.focal
@@ -16,7 +16,7 @@ RUN apt-get update && \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools mysql-server libmysqlclient-dev && \
python3.7 -m pip install pip && python3.7 -m pip install -r /tmp/requirements.txt && \
apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
+ libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
libpq5=14.* postgresql-14 postgresql-server-dev-14 libpq-dev=14.* libnuma-dev composer unzip && \
rm -rf /var/lib/apt/lists/*
diff --git a/.github/workflows/Dockerfile.jammy b/.github/workflows/Dockerfile.jammy
index aee6dda76c..5b2667424b 100644
--- a/.github/workflows/Dockerfile.jammy
+++ b/.github/workflows/Dockerfile.jammy
@@ -19,7 +19,7 @@ RUN apt update && \
build-essential devscripts fakeroot git cmake make g++ lld gperf netcat patch \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools && \
apt install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev zlib1g-dev php7.4-dev libnuma-dev unzip && \
+ libyaml-cpp-dev zlib1g-dev php7.4-dev libnuma-dev unzip && \
# Install MySQL-related and PostgreSQL-related libraries from the Ubuntu 20.04 (Focal Fossa) repository.
# Ubuntu 22.04 has moved to OpenSSL 3.0; however, KPHP relies on OpenSSL 1.1.1.
# Therefore, we use downgraded libraries that are compatible with OpenSSL 1.1.1.
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index fdbba19f34..12ca64606c 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -33,7 +33,7 @@ jobs:
run: |
brew tap shivammathur/php
brew update
- brew install python@3.13 re2c cmake coreutils libiconv re2 pcre yaml-cpp zstd googletest shivammathur/php/php@7.4
+ brew install python@3.13 re2c cmake coreutils libiconv re2 pcre yaml-cpp googletest shivammathur/php/php@7.4
brew link --overwrite --force shivammathur/php/php@7.4
/opt/homebrew/opt/python@3.13/libexec/bin/python -m pip install --upgrade pip --break-system-packages && /opt/homebrew/opt/python@3.13/libexec/bin/pip install --break-system-packages jsonschema
diff --git a/.gitmodules b/.gitmodules
index f2c8020ede..2db392968b 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -19,3 +19,7 @@
path = third-party/nghttp2
url = https://github.com/VKCOM/nghttp2.git
branch = buster
+[submodule "third-party/zstd"]
+ path = third-party/zstd
+ url = https://github.com/VKCOM/libzstd.git
+ branch = master
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ed25042184..207c12864d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,9 +33,11 @@ include(cmake/popular-common.cmake)
# Common third-parties build
include(${THIRD_PARTY_DIR}/zlib-cmake/zlib.cmake)
include(${THIRD_PARTY_DIR}/openssl-cmake/openssl.cmake)
+include(${THIRD_PARTY_DIR}/zstd-cmake/zstd.cmake)
# TODO: use FetchContent_Declare instead of include_directories
include_directories(.)
+include_directories(${INCLUDE_DIR})
# Custom modules
include(${BASE_DIR}/flex/flex.cmake)
@@ -123,7 +125,7 @@ install(FILES ${AUTO_DIR}/runtime/runtime-headers.h
DESTINATION ${INSTALL_KPHP_SOURCE}/objs/generated/auto/runtime/)
set(CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS "vk-flex-data, libuber-h3, libpcre3-dev, libre2-dev, libyaml-cpp-dev, \
- libzstd-dev, g++, kphp-timelib, libnuma-dev")
+ g++, kphp-timelib, libnuma-dev")
if (PDO_DRIVER_MYSQL)
set(CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS "${CPACK_DEBIAN_KPHP_PACKAGE_DEPENDS}, libmysqlclient-dev")
diff --git a/common/common-tests.cmake b/common/common-tests.cmake
index c53d419d61..30293a7f8c 100644
--- a/common/common-tests.cmake
+++ b/common/common-tests.cmake
@@ -19,8 +19,7 @@ prepend(COMMON_TESTS_SOURCES ${COMMON_DIR}/
wrappers/string_view-test.cpp
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)
+set(COMMON_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${COMMON_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto ZSTD::zstd)
if(COMPILE_RUNTIME_LIGHT)
set(COMMON_TESTS_LIBS ${COMMON_TESTS_LIBS} ZLIB::ZLIB_PIC)
else()
diff --git a/common/common.cmake b/common/common.cmake
index 1e8b192b25..5b55b3ae90 100644
--- a/common/common.cmake
+++ b/common/common.cmake
@@ -64,10 +64,12 @@ if(COMPILER_CLANG)
endif()
vk_add_library(common_src OBJECT ${COMMON_ALL_SOURCES})
+add_dependencies(common_src openssl zstd)
+target_include_directories(common_src PUBLIC ${ZSTD_INCLUDE_DIRS})
if(COMPILE_RUNTIME_LIGHT)
+ add_dependencies(common_src zlib-pic)
target_include_directories(common_src PUBLIC ${ZLIB_PIC_INCLUDE_DIRS})
- add_dependencies(common_src openssl zlib-pic)
else()
+ add_dependencies(common_src zlib-no-pic)
target_include_directories(common_src PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS})
- add_dependencies(common_src openssl zlib-no-pic)
endif()
diff --git a/common/kfs/kfs.cpp b/common/kfs/kfs.cpp
index f078b169d6..ac36843821 100644
--- a/common/kfs/kfs.cpp
+++ b/common/kfs/kfs.cpp
@@ -18,7 +18,7 @@
#include
#include
#include "zlib/zlib.h"
-#include
+#include "zstd/zstd.h"
#include "common/binlog/kdb-binlog-common.h"
#include "common/binlog/snapshot-shifts.h"
diff --git a/common/tl/methods/rwm.cpp b/common/tl/methods/rwm.cpp
index a19099204f..1d12b19ea4 100644
--- a/common/tl/methods/rwm.cpp
+++ b/common/tl/methods/rwm.cpp
@@ -5,7 +5,7 @@
#include "common/tl/methods/rwm.h"
#include
-#include
+#include "zstd/zstd.h"
#include "common/algorithms/arithmetic.h"
#include "common/tl/methods/compression.h"
diff --git a/compiler/compiler-settings.cpp b/compiler/compiler-settings.cpp
index b7f620dd6b..e63c1d2da6 100644
--- a/compiler/compiler-settings.cpp
+++ b/compiler/compiler-settings.cpp
@@ -368,7 +368,7 @@ void CompilerSettings::init() {
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", "zstd", "kphp-timelib"};
+ std::vector system_installed_static_libs{"pcre", "re2", "yaml-cpp", "h3", "kphp-timelib"};
#ifdef KPHP_TIMELIB_LIB_DIR
ld_flags.value_ += " -L" KPHP_TIMELIB_LIB_DIR;
@@ -424,14 +424,15 @@ void CompilerSettings::init() {
system_installed_dynamic_libs.emplace_back("rt");
#endif
+ append_3dparty_lib(ld_flags.value_, third_party_path, "ssl");
+ append_3dparty_lib(ld_flags.value_, third_party_path, "crypto");
+ append_3dparty_lib(ld_flags.value_, third_party_path, "nghttp2");
+ append_3dparty_lib(ld_flags.value_, third_party_path, "zstd");
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_3dparty_lib(ld_flags.value_, third_party_path, "nghttp2");
append_if_doesnt_contain(ld_flags.value_, system_installed_dynamic_libs, "-l");
ld_flags.value_ += " -rdynamic";
diff --git a/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md b/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md
index b26917751f..ae0a36b5e7 100644
--- a/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md
+++ b/docs/kphp-internals/developing-and-extending-kphp/compiling-kphp-from-sources.md
@@ -54,7 +54,7 @@ Install packages
apt-get update
apt install git cmake-data=3.16* cmake=3.16* make g++ gperf python3-minimal python3-jsonschema \
curl-kphp-vk libuber-h3-dev kphp-timelib libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev php7.4-dev libmysqlclient-dev libnuma-dev \
+ libyaml-cpp-dev php7.4-dev libmysqlclient-dev libnuma-dev \
postgresql postgresql-server-dev-all libpq-dev libldap-dev libkrb5-dev
```
@@ -74,7 +74,7 @@ Install packages
apt-get update
apt install git cmake make g++ gperf python3-minimal python3-jsonschema \
curl-kphp-vk libuber-h3-dev kphp-timelib libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
- libzstd-dev libyaml-cpp-dev php7.4-dev libmysqlclient-dev libnuma-dev \
+ libyaml-cpp-dev php7.4-dev libmysqlclient-dev libnuma-dev \
postgresql postgresql-server-dev-all libpq-dev libldap-dev libkrb5-dev
```
@@ -85,7 +85,7 @@ Make sure you have `brew` and `clang` (at least `Apple clang version 10.0.0`)
# Install dependencies
brew tap shivammathur/php
brew update
-brew install re2c cmake coreutils openssl libiconv re2 pcre yaml-cpp zstd googletest shivammathur/php/php@7.4
+brew install re2c cmake coreutils openssl libiconv re2 pcre yaml-cpp googletest shivammathur/php/php@7.4
brew link --overwrite shivammathur/php/php@7.4
pip3 install jsonschema
diff --git a/net/net-tests.cmake b/net/net-tests.cmake
index be98fe22ee..e81ddfb9ea 100644
--- a/net/net-tests.cmake
+++ b/net/net-tests.cmake
@@ -4,8 +4,7 @@ prepend(NET_TESTS_SOURCES ${BASE_DIR}/net/
net-test.cpp
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)
+set(NET_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto ZSTD::zstd)
if(COMPILE_RUNTIME_LIGHT)
set(NET_TESTS_LIBS ${NET_TESTS_LIBS} ZLIB::ZLIB_PIC)
else()
diff --git a/runtime/runtime.cmake b/runtime/runtime.cmake
index b0e811f920..f649dfc4e8 100644
--- a/runtime/runtime.cmake
+++ b/runtime/runtime.cmake
@@ -140,13 +140,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} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS})
+target_include_directories(kphp_runtime PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
-add_dependencies(kphp_runtime kphp-timelib curl)
+add_dependencies(kphp_runtime kphp-timelib curl zstd)
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 ZLIB::ZLIB_NO_PIC pthread)
+prepare_cross_platform_libs(RUNTIME_LIBS yaml-cpp re2 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 ZLIB::ZLIB_NO_PIC ZSTD::zstd 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})
diff --git a/runtime/zstd.cpp b/runtime/zstd.cpp
index e9ca4ee673..9142b0a314 100644
--- a/runtime/zstd.cpp
+++ b/runtime/zstd.cpp
@@ -4,7 +4,7 @@
#define ZSTD_STATIC_LINKING_ONLY
-#include
+#include "zstd/zstd.h"
#include "common/smart_ptrs/unique_ptr_with_delete_function.h"
#include "runtime-common/stdlib/string/string-context.h"
diff --git a/tests/cpp/runtime/zstd-test.cpp b/tests/cpp/runtime/zstd-test.cpp
index e31ea84843..93177bc8cd 100644
--- a/tests/cpp/runtime/zstd-test.cpp
+++ b/tests/cpp/runtime/zstd-test.cpp
@@ -1,6 +1,6 @@
#include
-#include
+#include "zstd/zstd.h"
#include "runtime-common/stdlib/string/string-context.h"
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index 3e1f597e48..29c9ea924d 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -84,6 +84,5 @@ set_target_properties(CURL::curl PROPERTIES
# Set variables indicating that curl has been installed
set(CURL_FOUND ON)
-set(CURL_LIBRARIES ${CURL_INSTALL_DIR}/lib/libcurl.a)
cmake_print_variables(CURL_LIBRARIES)
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
index 895dbd3774..8749ccd265 100644
--- a/third-party/nghttp2-cmake/nghttp2.cmake
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -68,8 +68,8 @@ ExternalProject_Add(
COMMAND ${CMAKE_COMMAND} --build ${NGHTTP2_BUILD_DIR} --config $ -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} --install ${NGHTTP2_BUILD_DIR} --prefix ${NGHTTP2_INSTALL_DIR} --config $
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${NGHTTP2_INSTALL_DIR}/include ${INCLUDE_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${NGHTTP2_INCLUDE_DIRS} ${INCLUDE_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${NGHTTP2_LIBRARIES} ${LIB_DIR}
BUILD_IN_SOURCE 0
)
diff --git a/third-party/zstd b/third-party/zstd
new file mode 160000
index 0000000000..f9ed7f255e
--- /dev/null
+++ b/third-party/zstd
@@ -0,0 +1 @@
+Subproject commit f9ed7f255ef267cbcbedf65268ce410b8e92eabd
diff --git a/third-party/zstd-cmake/zstd.cmake b/third-party/zstd-cmake/zstd.cmake
new file mode 100644
index 0000000000..17dd5e4c6d
--- /dev/null
+++ b/third-party/zstd-cmake/zstd.cmake
@@ -0,0 +1,63 @@
+update_git_submodule(${THIRD_PARTY_DIR}/zstd "--remote")
+
+set(ZSTD_SOURCE_DIR ${THIRD_PARTY_DIR}/zstd)
+set(ZSTD_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/zstd/build)
+set(ZSTD_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/zstd/install)
+set(ZSTD_BINARY_DIR ${ZSTD_BUILD_DIR}/lib)
+set(ZSTD_LIBRARIES ${ZSTD_INSTALL_DIR}/lib/libzstd.a)
+set(ZSTD_INCLUDE_DIRS ${ZSTD_INSTALL_DIR}/include)
+set(ZSTD_PATCH_DIR ${ZSTD_BUILD_DIR}/debian/patches/)
+set(ZSTD_PATCH_SERIES ${ZSTD_BUILD_DIR}/debian/patches/series)
+# Ensure the build, installation and "include" directories exists
+file(MAKE_DIRECTORY ${ZSTD_BUILD_DIR})
+file(MAKE_DIRECTORY ${ZSTD_INSTALL_DIR})
+file(MAKE_DIRECTORY ${ZSTD_INCLUDE_DIRS})
+
+# The configuration has been based on:
+# https://sources.debian.org/src/libzstd/1.4.8%2Bdfsg-2.1/debian/rules/
+set(ZSTD_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -Wno-unused-but-set-variable")
+if(NOT APPLE)
+ set(ZSTD_COMPILE_FLAGS "${ZSTD_COMPILE_FLAGS} -static")
+endif()
+
+set(ZSTD_MAKE_ARGS
+ CC=${CMAKE_C_COMPILER}
+ CFLAGS=${OPENSSL_COMPILE_FLAGS}
+)
+
+set(ZSTD_MAKE_INSTALL_ARGS
+ PREFIX=${ZSTD_INSTALL_DIR}
+ INCLUDEDIR=${ZSTD_INSTALL_DIR}/include/zstd
+)
+
+ExternalProject_Add(
+ zstd
+ PREFIX ${ZSTD_BUILD_DIR}
+ SOURCE_DIR ${ZSTD_SOURCE_DIR}
+ INSTALL_DIR ${ZSTD_INSTALL_DIR}
+ BINARY_DIR ${ZSTD_BINARY_DIR}
+ BUILD_BYPRODUCTS ${ZSTD_INSTALL_DIR}/lib/libzstd.a
+ PATCH_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZSTD_SOURCE_DIR} ${ZSTD_BUILD_DIR}
+ COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${ZSTD_BUILD_DIR} -DPATCH_SERIES=${ZSTD_PATCH_SERIES} -DPATCH_DIR=${ZSTD_PATCH_DIR} -P ../../cmake/apply_patches.cmake
+ CONFIGURE_COMMAND
+ COMMAND # Nothing to configure
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E env ${ZSTD_MAKE_ARGS} make libzstd.a -j
+ INSTALL_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E env ${ZSTD_MAKE_INSTALL_ARGS} make install-static install-includes
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZSTD_INCLUDE_DIRS} ${INCLUDE_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${ZSTD_LIBRARIES} ${LIB_DIR}
+ BUILD_IN_SOURCE 0
+)
+
+add_library(ZSTD::zstd STATIC IMPORTED)
+set_target_properties(ZSTD::zstd PROPERTIES
+ IMPORTED_LOCATION ${ZSTD_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
+)
+
+# Set variables indicating that zstd has been installed
+set(ZSTD_FOUND ON)
+
+cmake_print_variables(ZSTD_LIBRARIES)
From 196fdbc6dc624a51737457125b8fed86e6e334e1 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Mon, 24 Feb 2025 23:16:26 +0300
Subject: [PATCH 08/20] Factorize runtime library into PIC and non-PIC versions
---
CMakeLists.txt | 10 +-
cmake/external-libraries.cmake | 1 +
cmake/init-global-vars.cmake | 1 +
cmake/popular-common.cmake | 4 +-
cmake/utils.cmake | 159 +++++++++++++++++++++---
common/binlog/binlog.cmake | 3 +-
common/common-tests.cmake | 7 +-
common/common.cmake | 17 ++-
common/tl/compiler/tl-compiler.cmake | 2 +-
common/tl2php/tl2php.cmake | 2 +-
common/unicode/unicode.cmake | 18 +--
compiler/compiler-settings.cpp | 30 +++--
compiler/compiler.cmake | 2 +-
net/net-tests.cmake | 7 +-
net/net.cmake | 3 +-
runtime-common/runtime-common.cmake | 7 +-
runtime-light/runtime-light.cmake | 2 +-
runtime/runtime.cmake | 71 +++++++++--
server/server.cmake | 3 +-
tests/cpp/runtime/runtime-tests.cmake | 2 +-
tests/cpp/server/server-tests.cmake | 2 +-
tests/tests.cmake | 2 +-
third-party/curl-cmake/curl.cmake | 23 +++-
third-party/nghttp2-cmake/nghttp2.cmake | 21 ++++
third-party/openssl-cmake/openssl.cmake | 35 +++++-
third-party/zlib-cmake/zlib.cmake | 120 ++++++++++++++++--
third-party/zstd-cmake/zstd.cmake | 32 ++++-
27 files changed, 480 insertions(+), 106 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 207c12864d..32d5070cb9 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -73,7 +73,7 @@ add_custom_target(kphp ALL DEPENDS ${OBJS_DIR}/php_lib_version.sha256)
if (COMPILE_RUNTIME_LIGHT)
add_dependencies(kphp kphp2cpp kphp-light-runtime)
else ()
- add_dependencies(kphp kphp2cpp kphp-full-runtime)
+ add_dependencies(kphp kphp2cpp kphp-full-runtime-no-pic kphp-full-runtime-pic)
endif ()
install(TARGETS kphp2cpp
@@ -86,10 +86,12 @@ if (COMPILE_RUNTIME_LIGHT)
COMPONENT KPHP
LIBRARY DESTINATION ${INSTALL_KPHP_SOURCE}/objs)
else ()
- install(TARGETS kphp-full-runtime
+ install(FILES ${OBJS_DIR}/libkphp-full-runtime-no-pic.a
COMPONENT KPHP
- LIBRARY DESTINATION ${INSTALL_KPHP_SOURCE}/objs
- ARCHIVE DESTINATION ${INSTALL_KPHP_SOURCE}/objs)
+ DESTINATION ${INSTALL_KPHP_SOURCE}/objs)
+ install(FILES ${OBJS_DIR}/libkphp-full-runtime-pic.a
+ COMPONENT KPHP
+ DESTINATION ${INSTALL_KPHP_SOURCE}/objs)
endif ()
install(DIRECTORY ${OBJS_DIR}/include
diff --git a/cmake/external-libraries.cmake b/cmake/external-libraries.cmake
index f88954a907..0ec4da23a2 100644
--- a/cmake/external-libraries.cmake
+++ b/cmake/external-libraries.cmake
@@ -66,6 +66,7 @@ else()
)
message(STATUS "---------------------")
FetchContent_MakeAvailable(h3)
+ set_target_properties(h3 PROPERTIES DOWNLOADED_LIBRARY 1)
include_directories(${h3_BINARY_DIR}/src/include)
add_definitions(-DKPHP_H3_LIB_DIR="${h3_BINARY_DIR}/lib")
add_link_options(-L${h3_BINARY_DIR}/lib)
diff --git a/cmake/init-global-vars.cmake b/cmake/init-global-vars.cmake
index f57db464d6..86e73d6177 100644
--- a/cmake/init-global-vars.cmake
+++ b/cmake/init-global-vars.cmake
@@ -13,6 +13,7 @@ set(RUNTIME_LIGHT_DIR "${BASE_DIR}/runtime-light")
set(RUNTIME_COMMON_DIR "${BASE_DIR}/runtime-common")
if(APPLE)
+ detect_xcode_sdk_path(CMAKE_OSX_SYSROOT)
set(ICONV_LIB iconv)
else()
set(RT_LIB rt)
diff --git a/cmake/popular-common.cmake b/cmake/popular-common.cmake
index bf42ac2f09..568d13b8d6 100644
--- a/cmake/popular-common.cmake
+++ b/cmake/popular-common.cmake
@@ -51,5 +51,5 @@ if(COMPILE_RUNTIME_LIGHT)
target_link_options(light-common PUBLIC -stdlib=libc++)
endif()
-vk_add_library(popular_common OBJECT ${POPULAR_COMMON_SOURCES})
-set_property(TARGET popular_common PROPERTY POSITION_INDEPENDENT_CODE ON)
+vk_add_library_no_pic(popular-common-no-pic OBJECT ${POPULAR_COMMON_SOURCES})
+vk_add_library_pic(popular-common-pic OBJECT ${POPULAR_COMMON_SOURCES})
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 3b7a0e90b0..80e7b5a054 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -9,6 +9,24 @@ function(vk_add_library)
add_library(vk::${ARGV0} ALIAS ${ARGV0})
endfunction()
+function(vk_add_library_pic)
+ add_library(${ARGV})
+ set_target_properties(${ARGV0} PROPERTIES
+ POSITION_INDEPENDENT_CODE 1
+ COMPILE_FLAGS "-fPIC"
+ )
+endfunction()
+
+function(vk_add_library_no_pic)
+ add_library(${ARGV})
+ set_target_properties(${ARGV0} PROPERTIES
+ POSITION_INDEPENDENT_CODE 0
+ COMPILE_FLAGS "-fno-pic -static"
+ )
+endfunction()
+
+
+
function(prepend VAR_NAME PREFIX)
list(TRANSFORM ARGN PREPEND ${PREFIX} OUTPUT_VARIABLE ${VAR_NAME})
set(${VAR_NAME} ${${VAR_NAME}} PARENT_SCOPE)
@@ -57,20 +75,20 @@ function(check_compiler_version compiler_name compiler_version)
endfunction(check_compiler_version)
# Function to initialize and update specific Git submodule
-function(update_git_submodule submodule_path)
- message(STATUS "Updating Git submodule ${submodule_path} ...")
+function(update_git_submodule SUBMODULE_PATH)
+ message(STATUS "Updating Git submodule ${SUBMODULE_PATH} ...")
# Update submodules
execute_process(
- COMMAND ${GIT_EXECUTABLE} submodule update --init ${ARGN} ${submodule_path}
+ COMMAND ${GIT_EXECUTABLE} submodule update --init ${ARGN} ${SUBMODULE_PATH}
WORKING_DIRECTORY ${BASE_DIR}
- RESULT_VARIABLE update_return_code
- OUTPUT_VARIABLE update_stdout
- ERROR_VARIABLE update_stderr
+ RESULT_VARIABLE return_code
+ OUTPUT_VARIABLE stdout
+ ERROR_VARIABLE stderr
)
- if(NOT update_return_code EQUAL 0)
- message(FATAL_ERROR "Failed to update Git submodule ${submodule_path}: ${update_stdout} ${update_stderr}")
+ if(NOT return_code EQUAL 0)
+ message(FATAL_ERROR "Failed to update Git submodule ${SUBMODULE_PATH}: ${stdout} ${stderr}")
endif()
endfunction()
@@ -78,22 +96,131 @@ 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_VARIABLE sdk_path
OUTPUT_STRIP_TRAILING_WHITESPACE
- ERROR_VARIABLE ERROR_MSG
- RESULT_VARIABLE RESULT
+ ERROR_VARIABLE stderr
+ RESULT_VARIABLE return_code
)
# Check if the command was successful
- if(RESULT EQUAL 0)
+ if(return_code 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}")
+ 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}")
+ message(FATAL_ERROR "Failed to detect Xcode SDK path: ${stderr}")
+ endif()
+endfunction()
+
+# Parameters:
+# TARGET - The initial target of runtime library whose dependencies will be combined.
+# COMBINED_TARGET - The name of the final static runtime library to be created.
+function(combine_static_runtime_library TARGET COMBINED_TARGET)
+ list(APPEND dependencies_list ${TARGET})
+
+ # DFS for dependencies
+ function(collect_dependencies ROOT_TARGET)
+ set(target_linked_libraries_kind LINK_LIBRARIES)
+ get_target_property(target_kind ${ROOT_TARGET} TYPE)
+ if (${target_kind} STREQUAL "INTERFACE_LIBRARY")
+ set(target_linked_libraries_kind INTERFACE_LINK_LIBRARIES)
+ endif()
+
+ # Get the list of linked libraries for the target.
+ get_target_property(public_deps ${ROOT_TARGET} ${target_linked_libraries_kind})
+
+ foreach(dep IN LISTS public_deps)
+ if(TARGET ${dep})
+ get_target_property(alias ${dep} ALIASED_TARGET)
+ if(TARGET ${alias})
+ set(dep ${alias})
+ endif()
+
+ get_target_property(is_downloaded_lib ${dep} DOWNLOADED_LIBRARY)
+ if(is_downloaded_lib EQUAL 1)
+ continue()
+ endif()
+
+ get_target_property(dep_kind ${dep} TYPE)
+ if(${dep_kind} STREQUAL "STATIC_LIBRARY")
+ list(APPEND dependencies_list ${dep})
+ endif()
+
+ get_property(visited GLOBAL PROPERTY _${TARGET}_depends_on_${dep})
+ if(NOT visited)
+ set_property(GLOBAL PROPERTY _${TARGET}_depends_on_${dep} ON)
+ collect_dependencies(${dep})
+ endif()
+ endif()
+ endforeach()
+ set(dependencies_list ${dependencies_list} PARENT_SCOPE)
+ endfunction()
+
+ # Start collecting dependencies from the initial target.
+ collect_dependencies(${TARGET})
+ list(REMOVE_DUPLICATES dependencies_list)
+
+ set(combined_target_path ${OBJS_DIR}/lib${COMBINED_TARGET}.a)
+
+ if(CMAKE_CXX_COMPILER_ID MATCHES "^(Clang|GNU)$")
+ file(WRITE ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar.in "CREATE ${combined_target_path}\n" )
+
+ foreach(dep IN LISTS dependencies_list)
+ file(APPEND ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar.in "ADDLIB $\n")
+ endforeach()
+ file(APPEND ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar.in "SAVE\n")
+ file(APPEND ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar.in "END\n")
+
+ file(GENERATE
+ OUTPUT ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar
+ INPUT ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar.in
+ )
+
+ set(ar_tool ${CMAKE_AR})
+ # If LTO is enabled
+ if(CMAKE_INTERPROCEDURAL_OPTIMIZATION)
+ set(ar_tool ${CMAKE_CXX_COMPILER_AR})
+ endif()
+
+ add_custom_command(
+ COMMAND ${ar_tool} -M < ${CMAKE_BINARY_DIR}/${COMBINED_TARGET}.ar
+ OUTPUT ${combined_target_path}
+ COMMENT "Bundling ${COMBINED_TARGET}"
+ VERBATIM
+ )
+ elseif(CMAKE_CXX_COMPILER_ID MATCHES "^AppleClang$")
+ set(ar_tool libtool)
+ # If LTO is enabled
+ if (CMAKE_INTERPROCEDURAL_OPTIMIZATION)
+ set(ar_tool ${CMAKE_CXX_COMPILER_AR})
+ endif()
+
+ list(TRANSFORM dependencies_list PREPEND "$")
+
+ add_custom_command(
+ COMMAND cmake -E echo "$>>"
+ COMMAND ${ar_tool} -static -o ${combined_target_path} "$>>"
+ COMMAND_EXPAND_LISTS
+ OUTPUT ${combined_target_path}
+ COMMENT "Bundling ${COMBINED_TARGET}"
+ VERBATIM
+ )
+ else()
+ message(FATAL_ERROR "Unknown toolchain for runtime library combining")
endif()
+
+ add_custom_target(_combined_${TARGET} ALL DEPENDS ${combined_target_path})
+ add_dependencies(_combined_${TARGET} ${TARGET})
+
+ add_library(${COMBINED_TARGET} STATIC IMPORTED)
+ set_target_properties(${COMBINED_TARGET}
+ PROPERTIES
+ IMPORTED_LOCATION ${combined_target_path}
+ INTERFACE_INCLUDE_DIRECTORIES $)
+ add_dependencies(${COMBINED_TARGET} _combined_${TARGET})
endfunction()
diff --git a/common/binlog/binlog.cmake b/common/binlog/binlog.cmake
index 1a6ecbadb9..b76a473cbc 100644
--- a/common/binlog/binlog.cmake
+++ b/common/binlog/binlog.cmake
@@ -6,4 +6,5 @@ prepend(BINLOG_SOURCES ${COMMON_DIR}/binlog/
binlog-buffer-replay.cpp
binlog-snapshot.cpp)
-vk_add_library(binlog_src OBJECT ${BINLOG_SOURCES})
+vk_add_library_no_pic(binlog-src-no-pic OBJECT ${BINLOG_SOURCES})
+vk_add_library_pic(binlog-src-pic OBJECT ${BINLOG_SOURCES})
\ No newline at end of file
diff --git a/common/common-tests.cmake b/common/common-tests.cmake
index 30293a7f8c..61f208fdee 100644
--- a/common/common-tests.cmake
+++ b/common/common-tests.cmake
@@ -19,10 +19,5 @@ prepend(COMMON_TESTS_SOURCES ${COMMON_DIR}/
wrappers/string_view-test.cpp
ucontext/ucontext-portable-test.cpp)
-set(COMMON_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${COMMON_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto ZSTD::zstd)
-if(COMPILE_RUNTIME_LIGHT)
- set(COMMON_TESTS_LIBS ${COMMON_TESTS_LIBS} ZLIB::ZLIB_PIC)
-else()
- set(COMMON_TESTS_LIBS ${COMMON_TESTS_LIBS} ZLIB::ZLIB_NO_PIC)
-endif()
+set(COMMON_TESTS_LIBS common-src-no-pic net-src-no-pic binlog-src-no-pic unicode-no-pic ${EPOLL_SHIM_LIB} OpenSSL::no-pic::Crypto ZSTD::no-pic::zstd ZLIB::no-pic::zlib)
vk_add_unittest(common "${COMMON_TESTS_LIBS}" ${COMMON_TESTS_SOURCES})
diff --git a/common/common.cmake b/common/common.cmake
index 5b55b3ae90..3ce9857ebf 100644
--- a/common/common.cmake
+++ b/common/common.cmake
@@ -63,13 +63,10 @@ if(COMPILER_CLANG)
set_source_files_properties(${COMMON_DIR}/string-processing.cpp PROPERTIES COMPILE_FLAGS -Wno-invalid-source-encoding)
endif()
-vk_add_library(common_src OBJECT ${COMMON_ALL_SOURCES})
-add_dependencies(common_src openssl zstd)
-target_include_directories(common_src PUBLIC ${ZSTD_INCLUDE_DIRS})
-if(COMPILE_RUNTIME_LIGHT)
- add_dependencies(common_src zlib-pic)
- target_include_directories(common_src PUBLIC ${ZLIB_PIC_INCLUDE_DIRS})
-else()
- add_dependencies(common_src zlib-no-pic)
- target_include_directories(common_src PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS})
-endif()
+vk_add_library_no_pic(common-src-no-pic OBJECT ${COMMON_ALL_SOURCES})
+add_dependencies(common-src-no-pic OpenSSL::no-pic::Crypto ZLIB::no-pic::zlib ZSTD::no-pic::zstd)
+target_include_directories(common-src-no-pic PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
+
+vk_add_library_pic(common-src-pic OBJECT ${COMMON_ALL_SOURCES})
+add_dependencies(common-src-pic OpenSSL::pic::Crypto ZLIB::pic::zlib ZSTD::pic::zstd)
+target_include_directories(common-src-pic PUBLIC ${ZLIB_PIC_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
diff --git a/common/tl/compiler/tl-compiler.cmake b/common/tl/compiler/tl-compiler.cmake
index 40ca5a70ae..4bd70f8be5 100644
--- a/common/tl/compiler/tl-compiler.cmake
+++ b/common/tl/compiler/tl-compiler.cmake
@@ -2,6 +2,6 @@ set(TL_COMPILER_DIR ${COMMON_DIR}/tl/compiler)
set(TL_COMPILER_SOURCES ${TL_COMPILER_DIR}/tl-compiler.cpp ${TL_COMPILER_DIR}/tl-parser-new.cpp)
add_executable(tl-compiler ${TL_COMPILER_SOURCES})
-target_link_libraries(tl-compiler PRIVATE vk::popular_common pthread)
+target_link_libraries(tl-compiler PRIVATE popular-common-no-pic pthread)
target_link_options(tl-compiler PRIVATE ${NO_PIE})
set_target_properties(tl-compiler PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
diff --git a/common/tl2php/tl2php.cmake b/common/tl2php/tl2php.cmake
index 072d33a04b..6c325dab4d 100644
--- a/common/tl2php/tl2php.cmake
+++ b/common/tl2php/tl2php.cmake
@@ -10,6 +10,6 @@ prepend(TL2PHP_SOURCES ${COMMON_DIR}/tl2php/
tl-to-php-classes-converter.cpp)
add_executable(tl2php ${TL2PHP_SOURCES})
-target_link_libraries(tl2php PRIVATE pthread vk::popular_common vk::tlo_parsing_src)
+target_link_libraries(tl2php PRIVATE pthread popular-common-no-pic vk::tlo_parsing_src)
target_link_options(tl2php PRIVATE ${NO_PIE})
set_target_properties(tl2php PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
diff --git a/common/unicode/unicode.cmake b/common/unicode/unicode.cmake
index 488eda1abb..60796b5aa9 100644
--- a/common/unicode/unicode.cmake
+++ b/common/unicode/unicode.cmake
@@ -34,18 +34,22 @@ add_custom_command(
set(UNICODE_SOURCES unicode-utils.cpp utf8-utils.cpp)
if (COMPILE_RUNTIME_LIGHT)
- set(UNICODE_SOURCES_FOR_COMP "${UNICODE_SOURCES}")
- configure_file(${BASE_DIR}/compiler/unicode_sources.h.in ${AUTO_DIR}/compiler/unicode_sources.h)
+ set(UNICODE_SOURCES_FOR_COMP "${UNICODE_SOURCES}")
+ configure_file(${BASE_DIR}/compiler/unicode_sources.h.in ${AUTO_DIR}/compiler/unicode_sources.h)
endif()
prepend(UNICODE_SOURCES ${UNICODE_DIR}/ ${UNICODE_SOURCES})
if (COMPILE_RUNTIME_LIGHT)
- vk_add_library(light-unicode OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
- set_property(TARGET light-unicode PROPERTY POSITION_INDEPENDENT_CODE ON)
+ vk_add_library(light-unicode OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+ set_property(TARGET light-unicode PROPERTY POSITION_INDEPENDENT_CODE ON)
- target_compile_options(light-unicode PUBLIC -stdlib=libc++ -fPIC)
- target_link_options(light-unicode PUBLIC -stdlib=libc++)
+ target_compile_options(light-unicode PUBLIC -stdlib=libc++ -fPIC)
+ target_link_options(light-unicode PUBLIC -stdlib=libc++)
endif()
-vk_add_library(unicode OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+vk_add_library_no_pic(unicode-no-pic OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+vk_add_library_pic(unicode-pic OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+
+# Prevent race-condition in "unicode raw data generation" operations
+add_dependencies(unicode-pic unicode-no-pic)
diff --git a/compiler/compiler-settings.cpp b/compiler/compiler-settings.cpp
index e63c1d2da6..749cb38bae 100644
--- a/compiler/compiler-settings.cpp
+++ b/compiler/compiler-settings.cpp
@@ -149,11 +149,11 @@ void append_3dparty_headers(std::string &cxx_flags, const std::string &path_to_3
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 {
+[[maybe_unused]] void append_3dparty_lib(std::string &ld_flags, const std::string &path_to_3dparty, const std::string &libname) noexcept {
ld_flags += " " + path_to_3dparty + "lib/lib" + libname + ".a";
}
-void append_curl([[maybe_unused]] std::string &cxx_flags, std::string &ld_flags, [[maybe_unused]] const std::string &path_to_3dparty) noexcept {
+[[maybe_unused]] void append_curl([[maybe_unused]] std::string &cxx_flags, std::string &ld_flags, [[maybe_unused]] const std::string &path_to_3dparty) noexcept {
if (!contains_lib(ld_flags, "curl")) {
#if defined(__APPLE__)
ld_flags += " -lcurl";
@@ -247,7 +247,11 @@ void CompilerSettings::init() {
if (is_k2_mode) {
link_file.value_ = kphp_src_path.get() + "/objs/libkphp-light-runtime.a";
} else {
- link_file.value_ = kphp_src_path.get() + "/objs/libkphp-full-runtime.a";
+ if (dynamic_incremental_linkage.get()) {
+ link_file.value_ = kphp_src_path.get() + "/objs/libkphp-full-runtime-pic.a";
+ } else {
+ link_file.value_ = kphp_src_path.get() + "/objs/libkphp-full-runtime-no-pic.a";
+ }
}
}
link_file.value_ = get_full_path(link_file.get());
@@ -366,7 +370,7 @@ void CompilerSettings::init() {
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_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", "kphp-timelib"};
@@ -424,15 +428,15 @@ void CompilerSettings::init() {
system_installed_dynamic_libs.emplace_back("rt");
#endif
- append_3dparty_lib(ld_flags.value_, third_party_path, "ssl");
- append_3dparty_lib(ld_flags.value_, third_party_path, "crypto");
- append_3dparty_lib(ld_flags.value_, third_party_path, "nghttp2");
- append_3dparty_lib(ld_flags.value_, third_party_path, "zstd");
- 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_3dparty_lib(ld_flags.value_, third_party_path, "nghttp2");
+// append_3dparty_lib(ld_flags.value_, third_party_path, "zstd");
+// 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_if_doesnt_contain(ld_flags.value_, system_installed_dynamic_libs, "-l");
ld_flags.value_ += " -rdynamic";
diff --git a/compiler/compiler.cmake b/compiler/compiler.cmake
index b38ee4b4f4..3ec17d9b4e 100644
--- a/compiler/compiler.cmake
+++ b/compiler/compiler.cmake
@@ -277,7 +277,7 @@ target_include_directories(kphp2cpp PUBLIC ${KPHP_COMPILER_DIR})
add_dependencies(kphp2cpp openssl)
prepare_cross_platform_libs(COMPILER_LIBS yaml-cpp re2)
-set(COMPILER_LIBS vk::kphp2cpp_src vk::tlo_parsing_src vk::popular_common ${COMPILER_LIBS} fmt::fmt OpenSSL::Crypto pthread)
+set(COMPILER_LIBS vk::kphp2cpp_src vk::tlo_parsing_src popular-common-no-pic ${COMPILER_LIBS} fmt::fmt OpenSSL::Crypto pthread)
if(NOT APPLE)
list(APPEND COMPILER_LIBS stdc++fs)
endif()
diff --git a/net/net-tests.cmake b/net/net-tests.cmake
index e81ddfb9ea..78eb8524bd 100644
--- a/net/net-tests.cmake
+++ b/net/net-tests.cmake
@@ -4,10 +4,5 @@ prepend(NET_TESTS_SOURCES ${BASE_DIR}/net/
net-test.cpp
time-slice-test.cpp)
-set(NET_TESTS_LIBS vk::common_src vk::net_src vk::binlog_src vk::unicode ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::Crypto ZSTD::zstd)
-if(COMPILE_RUNTIME_LIGHT)
- set(NET_TESTS_LIBS ${NET_TESTS_LIBS} ZLIB::ZLIB_PIC)
-else()
- set(NET_TESTS_LIBS ${NET_TESTS_LIBS} ZLIB::ZLIB_NO_PIC)
-endif()
+set(NET_TESTS_LIBS common-src-no-pic net-src-no-pic binlog-src-no-pic unicode-no-pic ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::no-pic::Crypto ZSTD::no-pic::zstd ZLIB::no-pic::zlib)
vk_add_unittest(net "${NET_TESTS_LIBS}" ${NET_TESTS_SOURCES})
diff --git a/net/net.cmake b/net/net.cmake
index bbd16bebbe..0c3acdabbd 100644
--- a/net/net.cmake
+++ b/net/net.cmake
@@ -23,4 +23,5 @@ prepend(NET_SOURCES ${BASE_DIR}/net/
net-msg.cpp
net-msg-part.cpp)
-vk_add_library(net_src OBJECT ${NET_SOURCES})
+vk_add_library_no_pic(net-src-no-pic OBJECT ${NET_SOURCES})
+vk_add_library_pic(net-src-pic OBJECT ${NET_SOURCES})
\ No newline at end of file
diff --git a/runtime-common/runtime-common.cmake b/runtime-common/runtime-common.cmake
index 0394fb58be..d51c5d4276 100644
--- a/runtime-common/runtime-common.cmake
+++ b/runtime-common/runtime-common.cmake
@@ -10,8 +10,11 @@ if(COMPILE_RUNTIME_LIGHT)
endif()
prepend(RUNTIME_COMMON_SRC ${RUNTIME_COMMON_DIR}/ "${RUNTIME_COMMON_SRC}")
-vk_add_library(runtime-common OBJECT ${RUNTIME_COMMON_SRC})
+vk_add_library_no_pic(runtime-common-no-pic OBJECT ${RUNTIME_COMMON_SRC})
+vk_add_library_pic(runtime-common-pic OBJECT ${RUNTIME_COMMON_SRC})
if(COMPILE_RUNTIME_LIGHT)
- target_compile_options(runtime-common PUBLIC -stdlib=libc++ -fPIC)
+ target_compile_options(runtime-common-pic PUBLIC -stdlib=libc++ -fPIC)
endif()
+
+
diff --git a/runtime-light/runtime-light.cmake b/runtime-light/runtime-light.cmake
index 2deba5067f..57e3cb69ea 100644
--- a/runtime-light/runtime-light.cmake
+++ b/runtime-light/runtime-light.cmake
@@ -65,7 +65,7 @@ endif()
vk_add_library(kphp-light-runtime STATIC)
target_link_libraries(
kphp-light-runtime PUBLIC vk::light-common vk::light-unicode
- vk::runtime-light vk::runtime-common)
+ vk::runtime-light runtime-common-pic)
set_target_properties(kphp-light-runtime PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
${OBJS_DIR})
diff --git a/runtime/runtime.cmake b/runtime/runtime.cmake
index f649dfc4e8..1887143805 100644
--- a/runtime/runtime.cmake
+++ b/runtime/runtime.cmake
@@ -139,17 +139,65 @@ set(KPHP_RUNTIME_ALL_SOURCES
allow_deprecated_declarations(${BASE_DIR}/runtime/allocator.cpp ${BASE_DIR}/runtime/openssl.cpp)
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} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
-
-add_dependencies(kphp_runtime kphp-timelib curl zstd)
-add_dependencies(curl openssl zlib-no-pic)
+#### NO PIC
+vk_add_library_no_pic(kphp-runtime-no-pic STATIC ${KPHP_RUNTIME_ALL_SOURCES})
+target_include_directories(kphp-runtime-no-pic PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
+
+prepare_cross_platform_libs(RUNTIME_LIBS_NO_PIC yaml-cpp re2 h3)
+set(RUNTIME_LIBS_NO_PIC
+ kphp-server-no-pic
+ runtime-common-no-pic
+ popular-common-no-pic
+ unicode-no-pic
+ common-src-no-pic
+ binlog-src-no-pic
+ net-src-no-pic
+ ${RUNTIME_LIBS_NO_PIC}
+ CURL::no-pic::curl
+ OpenSSL::no-pic::SSL
+ OpenSSL::no-pic::Crypto
+ ZLIB::no-pic::zlib
+ NGHTTP2::no-pic::nghttp2
+ ZSTD::no-pic::zstd
+ m
+ pthread
+)
+target_link_libraries(kphp-runtime-no-pic PUBLIC ${RUNTIME_LIBS_NO_PIC})
+
+add_dependencies(kphp-runtime-no-pic kphp-timelib OpenSSL::no-pic::Crypto OpenSSL::no-pic::SSL CURL::no-pic::curl NGHTTP2::no-pic::nghttp2 ZLIB::no-pic::zlib ZSTD::no-pic::zstd)
+combine_static_runtime_library(kphp-runtime-no-pic kphp-full-runtime-no-pic)
+
+set(RUNTIME_FULL_LIBS_NO_PIC kphp-runtime-no-pic ${RUNTIME_LIBS_NO_PIC})
+###
+
+#### PIC
+vk_add_library_pic(kphp-runtime-pic STATIC ${KPHP_RUNTIME_ALL_SOURCES})
+target_include_directories(kphp-runtime-pic PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
+
+prepare_cross_platform_libs(RUNTIME_LIBS_PIC yaml-cpp re2 h3)
+set(RUNTIME_LIBS_PIC
+ kphp-server-pic
+ runtime-common-pic
+ popular-common-pic
+ unicode-pic
+ common-src-pic
+ binlog-src-pic
+ net-src-pic
+ ${RUNTIME_LIBS_PIC}
+ CURL::pic::curl
+ OpenSSL::pic::SSL
+ OpenSSL::pic::Crypto
+ ZLIB::pic::zlib
+ NGHTTP2::pic::nghttp2
+ ZSTD::pic::zstd
+ m
+ pthread
+)
+target_link_libraries(kphp-runtime-pic PUBLIC ${RUNTIME_LIBS_PIC})
-prepare_cross_platform_libs(RUNTIME_LIBS yaml-cpp re2 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 ZLIB::ZLIB_NO_PIC ZSTD::zstd 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})
+add_dependencies(kphp-runtime-pic kphp-timelib OpenSSL::pic::Crypto OpenSSL::pic::SSL CURL::pic::curl NGHTTP2::pic::nghttp2 ZLIB::pic::zlib ZSTD::pic::zstd)
+combine_static_runtime_library(kphp-runtime-pic kphp-full-runtime-pic)
+###
prepare_cross_platform_libs(RUNTIME_LINK_TEST_LIBS pcre kphp-timelib)
set(RUNTIME_LINK_TEST_LIBS vk::flex_data_static CURL::curl OpenSSL::SSL NGHTTP2::nghttp2 ${NUMA_LIB} ${RUNTIME_LINK_TEST_LIBS} ${EPOLL_SHIM_LIB} ${ICONV_LIB} ${RT_LIB} dl)
@@ -189,9 +237,8 @@ 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)
+add_dependencies(php_lib_version_j kphp-full-runtime-no-pic kphp-full-runtime-pic)
add_custom_command(OUTPUT ${OBJS_DIR}/php_lib_version.sha256
COMMAND tail -n +3 $ | sha256sum | awk '{print $$1}' > ${OBJS_DIR}/php_lib_version.sha256
diff --git a/server/server.cmake b/server/server.cmake
index 9e2f22ebe9..913c6a700f 100644
--- a/server/server.cmake
+++ b/server/server.cmake
@@ -73,4 +73,5 @@ set(KPHP_SERVER_ALL_SOURCES
${KPHP_DATABASE_DRIVERS_PGSQL_SOURCES})
allow_deprecated_declarations_for_apple(${BASE_DIR}/server/php-runner.cpp)
-vk_add_library(kphp_server OBJECT ${KPHP_SERVER_ALL_SOURCES})
+vk_add_library_no_pic(kphp-server-no-pic OBJECT ${KPHP_SERVER_ALL_SOURCES})
+vk_add_library_pic(kphp-server-pic OBJECT ${KPHP_SERVER_ALL_SOURCES})
\ No newline at end of file
diff --git a/tests/cpp/runtime/runtime-tests.cmake b/tests/cpp/runtime/runtime-tests.cmake
index 731da98fe6..b454b94f0b 100644
--- a/tests/cpp/runtime/runtime-tests.cmake
+++ b/tests/cpp/runtime/runtime-tests.cmake
@@ -24,4 +24,4 @@ prepend(RUNTIME_TESTS_SOURCES ${BASE_DIR}/tests/cpp/runtime/
zstd-test.cpp)
allow_deprecated_declarations_for_apple(${BASE_DIR}/tests/cpp/runtime/inter-process-mutex-test.cpp)
-vk_add_unittest(runtime "${RUNTIME_LIBS};${RUNTIME_LINK_TEST_LIBS}" ${RUNTIME_TESTS_SOURCES})
+vk_add_unittest(runtime "${RUNTIME_FULL_LIBS_NO_PIC};${RUNTIME_LINK_TEST_LIBS}" ${RUNTIME_TESTS_SOURCES})
diff --git a/tests/cpp/server/server-tests.cmake b/tests/cpp/server/server-tests.cmake
index 55b7368d46..b9bd42a860 100644
--- a/tests/cpp/server/server-tests.cmake
+++ b/tests/cpp/server/server-tests.cmake
@@ -10,4 +10,4 @@ if(COMPILER_GCC)
set_source_files_properties(${BASE_DIR}/tests/cpp/server/confdata-binlog-events-test.cpp PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow)
endif()
-vk_add_unittest(server "${RUNTIME_LIBS};${RUNTIME_LINK_TEST_LIBS}" ${SERVER_TESTS_SOURCES} ${BASE_DIR}/tests/cpp/runtime/_runtime-tests-env.cpp)
+vk_add_unittest(server "${RUNTIME_FULL_LIBS_NO_PIC};${RUNTIME_LINK_TEST_LIBS}" ${SERVER_TESTS_SOURCES} ${BASE_DIR}/tests/cpp/runtime/_runtime-tests-env.cpp)
diff --git a/tests/tests.cmake b/tests/tests.cmake
index d752ca9a4e..bbd16655bb 100644
--- a/tests/tests.cmake
+++ b/tests/tests.cmake
@@ -2,7 +2,7 @@ if(KPHP_TESTS)
function(vk_add_unittest TEST_NAME SRC_LIBS)
set(TEST_NAME unittests-${TEST_NAME})
add_executable(${TEST_NAME} ${ARGN})
- target_link_libraries(${TEST_NAME} PRIVATE GTest::GTest GTest::Main gmock ${SRC_LIBS} vk::popular_common)
+ target_link_libraries(${TEST_NAME} PRIVATE GTest::GTest GTest::Main gmock ${SRC_LIBS} popular-common-no-pic)
target_link_options(${TEST_NAME} PRIVATE ${NO_PIE})
# because of https://github.com/VKCOM/kphp/actions/runs/5463884925/jobs/9945150190
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index 29c9ea924d..cd24cf1253 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -28,8 +28,6 @@ endif()
set(CURL_CMAKE_ARGS
-DCMAKE_C_FLAGS=${CURL_COMPILE_FLAGS}
-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
- -DCMAKE_CXX_FLAGS=${CURL_COMPILE_FLAGS}
- -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
-DCMAKE_POSITION_INDEPENDENT_CODE=OFF
-DBUILD_TESTING=OFF
-DCURL_WERROR=ON # Recommend to enable when optimization level less than -O3
@@ -82,6 +80,27 @@ set_target_properties(CURL::curl PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
)
+add_dependencies(CURL::curl curl)
+
+
+##############################
+add_library(CURL::pic::curl STATIC IMPORTED)
+set_target_properties(CURL::pic::curl PROPERTIES
+ IMPORTED_LOCATION ${CURL_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
+)
+
+add_dependencies(CURL::pic::curl curl)
+
+add_library(CURL::no-pic::curl STATIC IMPORTED)
+set_target_properties(CURL::no-pic::curl PROPERTIES
+ IMPORTED_LOCATION ${CURL_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
+)
+
+add_dependencies(CURL::no-pic::curl curl)
+###############################
+
# Set variables indicating that curl has been installed
set(CURL_FOUND ON)
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
index 8749ccd265..9ae9443052 100644
--- a/third-party/nghttp2-cmake/nghttp2.cmake
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -79,6 +79,27 @@ set_target_properties(NGHTTP2::nghttp2 PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
)
+add_dependencies(NGHTTP2::nghttp2 nghttp2)
+
+########################################
+add_library(NGHTTP2::pic::nghttp2 STATIC IMPORTED)
+set_target_properties(NGHTTP2::pic::nghttp2 PROPERTIES
+ IMPORTED_LOCATION ${NGHTTP2_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
+)
+
+add_dependencies(NGHTTP2::pic::nghttp2 nghttp2)
+
+add_library(NGHTTP2::no-pic::nghttp2 STATIC IMPORTED)
+set_target_properties(NGHTTP2::no-pic::nghttp2 PROPERTIES
+ IMPORTED_LOCATION ${NGHTTP2_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
+)
+
+add_dependencies(NGHTTP2::no-pic::nghttp2 nghttp2)
+###############################################
+
+
# Set variables indicating that NGHTTP2 has been installed
set(NGHTTP2_FOUND ON)
set(NGHTTP2_ROOT ${NGHTTP2_INSTALL_DIR})
diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake
index d7edf3966b..ed284d51cf 100644
--- a/third-party/openssl-cmake/openssl.cmake
+++ b/third-party/openssl-cmake/openssl.cmake
@@ -25,7 +25,6 @@ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
endif()
if(APPLE)
- detect_xcode_sdk_path(CMAKE_OSX_SYSROOT)
set(OPENSSL_COMPILE_FLAGS "${OPENSSL_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
endif()
@@ -71,6 +70,40 @@ set_target_properties(OpenSSL::Crypto PROPERTIES
add_dependencies(OpenSSL::SSL openssl)
add_dependencies(OpenSSL::Crypto openssl)
+
+##########################################
+add_library(OpenSSL::pic::SSL STATIC IMPORTED)
+set_target_properties(OpenSSL::pic::SSL PROPERTIES
+ IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libssl.a
+ INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
+)
+
+add_library(OpenSSL::pic::Crypto STATIC IMPORTED)
+set_target_properties(OpenSSL::pic::Crypto PROPERTIES
+ IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
+ INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
+)
+
+add_dependencies(OpenSSL::pic::SSL openssl)
+add_dependencies(OpenSSL::pic::Crypto openssl)
+
+
+add_library(OpenSSL::no-pic::SSL STATIC IMPORTED)
+set_target_properties(OpenSSL::no-pic::SSL PROPERTIES
+ IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libssl.a
+ INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
+)
+
+add_library(OpenSSL::no-pic::Crypto STATIC IMPORTED)
+set_target_properties(OpenSSL::no-pic::Crypto PROPERTIES
+ IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
+ INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
+)
+
+add_dependencies(OpenSSL::no-pic::SSL openssl)
+add_dependencies(OpenSSL::no-pic::Crypto openssl)
+###################
+
# Set variables indicating that OpenSSL has been found and specify its library locations
set(OPENSSL_FOUND ON)
set(OPENSSL_ROOT_DIR ${OPENSSL_INSTALL_DIR})
diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake
index b17a3e2b04..ff08ffca43 100644
--- a/third-party/zlib-cmake/zlib.cmake
+++ b/third-party/zlib-cmake/zlib.cmake
@@ -1,20 +1,114 @@
update_git_submodule(${THIRD_PARTY_DIR}/zlib "--recursive")
-set(ZLIB_SOURCE_DIR ${THIRD_PARTY_DIR}/zlib)
+function(build_zlib PIC_MODE)
+ set(PROJECT_GENERIC_NAME zlib)
+ set(TARGET_NAMESPACE ZLIB)
+ set(TARGET_GENERIC_NAME ZLIB)
-# 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(PROJECT_NAME)
+ set(TARGET_NAME)
+ set(EXTRA_COMPILE_FLAGS)
+ set(SUFFIX)
-if(APPLE)
- detect_xcode_sdk_path(CMAKE_OSX_SYSROOT)
- set(ZLIB_COMMON_COMPILE_FLAGS "${ZLIB_COMMON_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
-endif()
+ if(PIC_MODE)
+ set(SUFFIX "-pic")
+ set(EXTRA_COMPILE_FLAGS "-fPIC")
+ set(TARGET_NAME "${TARGET_GENERIC_NAME}_PIC")
+ else()
+ set(SUFFIX "-no-pic")
+ set(EXTRA_COMPILE_FLAGS "-fno-pic")
+ if(NOT APPLE)
+ set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -static")
+ endif()
+ set(TARGET_NAME "${TARGET_GENERIC_NAME}_NO_PIC")
+ endif()
-if (NOT COMPILE_RUNTIME_LIGHT)
- include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-no-pic.cmake)
-endif ()
+ if(APPLE)
+ set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
+ endif()
-include(${THIRD_PARTY_DIR}/zlib-cmake/zlib-pic.cmake)
+ set(PROJECT_NAME "${PROJECT_GENERIC_NAME}${SUFFIX}")
-set(ZLIB_FOUND ON)
+ set(SOURCE_DIR ${THIRD_PARTY_DIR}/zlib)
+ set(BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/${PROJECT_NAME}/build)
+ set(INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/${PROJECT_NAME}/install)
+ set(INCLUDE_DIRS ${INSTALL_DIR}/include)
+ set(LIBRARIES ${INSTALL_DIR}/lib/libz${SUFFIX}.a)
+ # Ensure the build, installation and "include" directories exists
+ file(MAKE_DIRECTORY ${BUILD_DIR})
+ file(MAKE_DIRECTORY ${INSTALL_DIR})
+ file(MAKE_DIRECTORY ${INCLUDE_DIRS})
+
+ set(COMPILE_FLAGS "$ENV{CFLAGS} -g0 -Wall -O3 -D_REENTRANT ${EXTRA_COMPILE_FLAGS}")
+
+ message(STATUS "Zlib Summary:
+
+ PIC mode: ${PIC_MODE}
+ Source dir: ${SOURCE_DIR}
+ Build dir: ${BUILD_DIR}
+ Install dir: ${INSTALL_DIR}
+ Include dirs: ${INCLUDE_DIRS}
+ Libraries: ${LIBRARIES}
+ Compiler:
+ C compiler: ${CMAKE_C_COMPILER}
+ CFLAGS: ${COMPILE_FLAGS}
+ ")
+
+ ExternalProject_Add(
+ ${PROJECT_NAME}
+ PREFIX ${BUILD_DIR}
+ SOURCE_DIR ${SOURCE_DIR}
+ INSTALL_DIR ${INSTALL_DIR}
+ BINARY_DIR ${BUILD_DIR}
+ BUILD_BYPRODUCTS ${LIBRARIES}
+ CONFIGURE_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE_DIR} ${BUILD_DIR}
+ COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${COMPILE_FLAGS} ./configure --prefix=${INSTALL_DIR} --includedir=${INCLUDE_DIRS}/zlib --static
+ BUILD_COMMAND
+ COMMAND make libz.a -j
+ INSTALL_COMMAND
+ COMMAND make install
+ COMMAND ${CMAKE_COMMAND} -E copy ${INSTALL_DIR}/lib/libz.a ${LIBRARIES}
+ COMMAND ${CMAKE_COMMAND} -E copy ${LIBRARIES} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${INCLUDE_DIRS} ${INCLUDE_DIR}
+ BUILD_IN_SOURCE 0
+ )
+
+ add_library(${TARGET_NAMESPACE}::${TARGET_NAME} STATIC IMPORTED)
+ set_target_properties(${TARGET_NAMESPACE}::${TARGET_NAME} PROPERTIES
+ IMPORTED_LOCATION ${LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}
+ )
+
+ # Ensure that the zlib are built before they are used
+ add_dependencies(${TARGET_NAMESPACE}::${TARGET_NAME} ${PROJECT_NAME})
+
+ ######################################
+ if(PIC_MODE)
+ add_library(${TARGET_NAMESPACE}::pic::zlib STATIC IMPORTED)
+ set_target_properties(${TARGET_NAMESPACE}::pic::zlib PROPERTIES
+ IMPORTED_LOCATION ${LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}
+ )
+ add_dependencies(${TARGET_NAMESPACE}::pic::zlib ${PROJECT_NAME})
+ else()
+ add_library(${TARGET_NAMESPACE}::no-pic::zlib STATIC IMPORTED)
+ set_target_properties(${TARGET_NAMESPACE}::no-pic::zlib PROPERTIES
+ IMPORTED_LOCATION ${LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}
+ )
+ add_dependencies(${TARGET_NAMESPACE}::no-pic::zlib ${PROJECT_NAME})
+ endif()
+ ######################################
+
+ # Set variables indicating that zlib has been installed
+ set(${TARGET_NAME}_ROOT ${INSTALL_DIR} PARENT_SCOPE)
+ set(${TARGET_NAME}_INCLUDE_DIRS ${INCLUDE_DIRS} PARENT_SCOPE)
+ set(${TARGET_NAME}_LIBRARIES ${LIBRARIES} PARENT_SCOPE)
+ set(ZLIB_FOUND ON PARENT_SCOPE)
+endfunction()
+
+# PIC is OFF
+build_zlib(OFF)
+# PIC is ON
+build_zlib(ON)
diff --git a/third-party/zstd-cmake/zstd.cmake b/third-party/zstd-cmake/zstd.cmake
index 17dd5e4c6d..d5fcfe3c0a 100644
--- a/third-party/zstd-cmake/zstd.cmake
+++ b/third-party/zstd-cmake/zstd.cmake
@@ -16,13 +16,15 @@ file(MAKE_DIRECTORY ${ZSTD_INCLUDE_DIRS})
# The configuration has been based on:
# https://sources.debian.org/src/libzstd/1.4.8%2Bdfsg-2.1/debian/rules/
set(ZSTD_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -Wno-unused-but-set-variable")
-if(NOT APPLE)
+if(APPLE)
+ set(ZSTD_COMPILE_FLAGS "${ZSTD_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
+else()
set(ZSTD_COMPILE_FLAGS "${ZSTD_COMPILE_FLAGS} -static")
endif()
set(ZSTD_MAKE_ARGS
CC=${CMAKE_C_COMPILER}
- CFLAGS=${OPENSSL_COMPILE_FLAGS}
+ CFLAGS=${ZSTD_COMPILE_FLAGS}
)
set(ZSTD_MAKE_INSTALL_ARGS
@@ -57,6 +59,32 @@ set_target_properties(ZSTD::zstd PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
)
+# Ensure that the zstd are built before they are used
+add_dependencies(ZSTD::zstd zstd)
+
+####################################
+add_library(ZSTD::pic::zstd STATIC IMPORTED)
+set_target_properties(ZSTD::pic::zstd PROPERTIES
+ IMPORTED_LOCATION ${ZSTD_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
+)
+
+# Ensure that the zstd are built before they are used
+add_dependencies(ZSTD::pic::zstd zstd)
+
+
+add_library(ZSTD::no-pic::zstd STATIC IMPORTED)
+set_target_properties(ZSTD::no-pic::zstd PROPERTIES
+ IMPORTED_LOCATION ${ZSTD_LIBRARIES}
+ INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
+)
+
+# Ensure that the zstd are built before they are used
+add_dependencies(ZSTD::no-pic::zstd zstd)
+#################################################
+
+
+
# Set variables indicating that zstd has been installed
set(ZSTD_FOUND ON)
From df74c565ad5ad26ebfc4e8829ae1b2a35348590d Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Wed, 26 Feb 2025 15:34:44 +0300
Subject: [PATCH 09/20] Fix order in unicode target build
Signed-off-by: Petr Shumilov
---
common/unicode/unicode.cmake | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/common/unicode/unicode.cmake b/common/unicode/unicode.cmake
index 60796b5aa9..cb72efc7e8 100644
--- a/common/unicode/unicode.cmake
+++ b/common/unicode/unicode.cmake
@@ -30,6 +30,7 @@ add_custom_command(
COMMAND generate_unicode_utils ${UNICODE_DATA_LIST} ${AUTO_DIR}/common/unicode-utils-auto.h
DEPENDS ${UNICODE_DATA_LIST}
COMMENT "unicode-utils-auto.h generation")
+add_custom_target(unicode-utils-auto ALL DEPENDS ${AUTO_DIR}/common/unicode-utils-auto.h)
set(UNICODE_SOURCES unicode-utils.cpp utf8-utils.cpp)
@@ -42,6 +43,7 @@ prepend(UNICODE_SOURCES ${UNICODE_DIR}/ ${UNICODE_SOURCES})
if (COMPILE_RUNTIME_LIGHT)
vk_add_library(light-unicode OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+ add_dependencies(light-unicode unicode-utils-auto)
set_property(TARGET light-unicode PROPERTY POSITION_INDEPENDENT_CODE ON)
target_compile_options(light-unicode PUBLIC -stdlib=libc++ -fPIC)
@@ -51,5 +53,7 @@ endif()
vk_add_library_no_pic(unicode-no-pic OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
vk_add_library_pic(unicode-pic OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+add_dependencies(unicode-no-pic unicode-utils-auto)
+
# Prevent race-condition in "unicode raw data generation" operations
add_dependencies(unicode-pic unicode-no-pic)
From 9cfe22cd1f2db2c8e83ffa50d59d482f23750c01 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Wed, 26 Feb 2025 15:44:51 +0300
Subject: [PATCH 10/20] Ignore deprecation warning in gtest internals
Signed-off-by: Petr Shumilov
---
common/common-tests.cmake | 2 ++
1 file changed, 2 insertions(+)
diff --git a/common/common-tests.cmake b/common/common-tests.cmake
index 61f208fdee..fafbb21b86 100644
--- a/common/common-tests.cmake
+++ b/common/common-tests.cmake
@@ -19,5 +19,7 @@ prepend(COMMON_TESTS_SOURCES ${COMMON_DIR}/
wrappers/string_view-test.cpp
ucontext/ucontext-portable-test.cpp)
+allow_deprecated_declarations(${COMMON_TESTS_SOURCES}/algorithms/projections-test.cpp)
+
set(COMMON_TESTS_LIBS common-src-no-pic net-src-no-pic binlog-src-no-pic unicode-no-pic ${EPOLL_SHIM_LIB} OpenSSL::no-pic::Crypto ZSTD::no-pic::zstd ZLIB::no-pic::zlib)
vk_add_unittest(common "${COMMON_TESTS_LIBS}" ${COMMON_TESTS_SOURCES})
From 11f4ca48b8baf48d2014d931ec97bee9ae350336 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Wed, 26 Feb 2025 21:27:20 +0300
Subject: [PATCH 11/20] Replace vk_add_library into vk_add_library_pic and
vk_add_library_no_pic
Signed-off-by: Petr Shumilov
---
CMakeLists.txt | 4 +-
cmake/init-global-vars.cmake | 19 +++++--
cmake/popular-common.cmake | 7 ++-
cmake/utils.cmake | 31 +++++++++--
common/common-tests.cmake | 2 +-
common/tl/compiler/tl-compiler.cmake | 4 +-
common/tl2php/tl2php.cmake | 4 +-
common/tlo-parsing/tlo-parsing.cmake | 19 ++++---
common/unicode/unicode.cmake | 14 ++---
compiler/compiler-settings.cpp | 2 +-
compiler/compiler.cmake | 10 ++--
flex/flex.cmake | 30 +++++++----
net/net-tests.cmake | 2 +-
net/net.cmake | 2 +-
runtime-common/runtime-common.cmake | 4 +-
runtime-light/runtime-light.cmake | 36 ++++++-------
runtime/runtime.cmake | 74 +++++++++++++++++++--------
server/server.cmake | 2 +-
tests/cpp/runtime/runtime-tests.cmake | 2 +-
tests/cpp/server/server-tests.cmake | 2 +-
tests/tests.cmake | 4 +-
vkext/vkext.cmake | 21 ++++----
22 files changed, 180 insertions(+), 115 deletions(-)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 32d5070cb9..2bc5f4998f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -71,7 +71,7 @@ endif()
add_custom_target(kphp ALL DEPENDS ${OBJS_DIR}/php_lib_version.sha256)
if (COMPILE_RUNTIME_LIGHT)
- add_dependencies(kphp kphp2cpp kphp-light-runtime)
+ add_dependencies(kphp kphp2cpp kphp-light-runtime-pic)
else ()
add_dependencies(kphp kphp2cpp kphp-full-runtime-no-pic kphp-full-runtime-pic)
endif ()
@@ -82,7 +82,7 @@ install(TARGETS kphp2cpp
install_symlink(${VK_INSTALL_DIR}/bin/kphp2cpp ${CMAKE_INSTALL_PREFIX}/bin/kphp KPHP)
if (COMPILE_RUNTIME_LIGHT)
- install(TARGETS kphp-light-runtime
+ install(TARGETS kphp-light-runtime-pic
COMPONENT KPHP
LIBRARY DESTINATION ${INSTALL_KPHP_SOURCE}/objs)
else ()
diff --git a/cmake/init-global-vars.cmake b/cmake/init-global-vars.cmake
index 86e73d6177..e84db924a5 100644
--- a/cmake/init-global-vars.cmake
+++ b/cmake/init-global-vars.cmake
@@ -12,6 +12,11 @@ set(AUTO_DIR "${GENERATED_DIR}/auto")
set(RUNTIME_LIGHT_DIR "${BASE_DIR}/runtime-light")
set(RUNTIME_COMMON_DIR "${BASE_DIR}/runtime-common")
+set(PIC_LIBRARY_SUFFIX "-pic")
+set(PIC_NAMESPACE_NAME "pic")
+set(NO_PIC_LIBRARY_SUFFIX "-no-pic")
+set(NO_PIC_NAMESPACE_NAME "no-pic")
+
if(APPLE)
detect_xcode_sdk_path(CMAKE_OSX_SYSROOT)
set(ICONV_LIB iconv)
@@ -31,11 +36,15 @@ endif()
find_program(PHP_BIN php REQUIRED)
-if(NOT APPLE)
- check_cxx_compiler_flag(-no-pie NO_PIE_IS_FOUND)
- if(NO_PIE_IS_FOUND)
- set(NO_PIE -no-pie)
- endif()
+check_cxx_compiler_flag(-no-pie NO_PIE_IS_FOUND)
+if(NO_PIE_IS_FOUND)
+ set(PIE_MODE_FLAGS -no-pie)
+ set(PIC_MODE_ENABLED ON)
+ set(PIC_MODE ${NO_PIC_NAMESPACE_NAME})
+else()
+ set(PIE_MODE_FLAGS)
+ set(PIC_MODE_ENABLED OFF)
+ set(PIC_MODE ${PIC_NAMESPACE_NAME})
endif()
# add extra build type release without NDEBUG flag
diff --git a/cmake/popular-common.cmake b/cmake/popular-common.cmake
index 568d13b8d6..1c5d43c1b3 100644
--- a/cmake/popular-common.cmake
+++ b/cmake/popular-common.cmake
@@ -45,10 +45,9 @@ if(APPLE)
endif()
if(COMPILE_RUNTIME_LIGHT)
- vk_add_library(light-common OBJECT ${LIGHT_COMMON_SOURCES})
- set_property(TARGET light-common PROPERTY POSITION_INDEPENDENT_CODE ON)
- target_compile_options(light-common PUBLIC -stdlib=libc++ -fPIC)
- target_link_options(light-common PUBLIC -stdlib=libc++)
+ vk_add_library_pic(light-common-pic OBJECT ${LIGHT_COMMON_SOURCES})
+ target_compile_options(light-common-pic PUBLIC -stdlib=libc++)
+ target_link_options(light-common-pic PUBLIC -stdlib=libc++)
endif()
vk_add_library_no_pic(popular-common-no-pic OBJECT ${POPULAR_COMMON_SOURCES})
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 80e7b5a054..b58d8a6114 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -4,9 +4,30 @@ function(string_to_list STRING_NAME LIST_NAME)
string(REPLACE " " ";" "${LIST_NAME}" ${STRING_NAME})
endfunction()
-function(vk_add_library)
- add_library(${ARGV})
- add_library(vk::${ARGV0} ALIAS ${ARGV0})
+function(check_vk_library_suffix TARGET SUFFIX)
+ string(LENGTH "${SUFFIX}" suffix_length)
+ string(LENGTH "${TARGET}" target_length)
+
+ math(EXPR suffix_begin "${target_length} - ${suffix_length}")
+ string(SUBSTRING "${TARGET}" ${suffix_begin} -1 expected_suffix)
+
+ if(NOT expected_suffix STREQUAL "${SUFFIX}")
+ message(FATAL_ERROR "vk library name '${TARGET}' does not end with the required suffix '${SUFFIX}'.")
+ endif()
+endfunction()
+
+function(add_vk_library_to_pic_namespace TARGET)
+ check_vk_library_suffix(${TARGET} ${PIC_LIBRARY_SUFFIX})
+
+ string(REGEX REPLACE "${PIC_LIBRARY_SUFFIX}$" "" new_target "${TARGET}")
+ add_library(vk::${PIC_NAMESPACE_NAME}::${new_target} ALIAS ${TARGET})
+endfunction()
+
+function(add_vk_library_to_no_pic_namespace TARGET)
+ check_vk_library_suffix(${TARGET} ${NO_PIC_LIBRARY_SUFFIX})
+
+ string(REGEX REPLACE "${NO_PIC_LIBRARY_SUFFIX}$" "" new_target "${TARGET}")
+ add_library(vk::${NO_PIC_NAMESPACE_NAME}::${new_target} ALIAS ${TARGET})
endfunction()
function(vk_add_library_pic)
@@ -15,6 +36,7 @@ function(vk_add_library_pic)
POSITION_INDEPENDENT_CODE 1
COMPILE_FLAGS "-fPIC"
)
+ add_vk_library_to_pic_namespace(${ARGV0})
endfunction()
function(vk_add_library_no_pic)
@@ -23,10 +45,9 @@ function(vk_add_library_no_pic)
POSITION_INDEPENDENT_CODE 0
COMPILE_FLAGS "-fno-pic -static"
)
+ add_vk_library_to_no_pic_namespace(${ARGV0})
endfunction()
-
-
function(prepend VAR_NAME PREFIX)
list(TRANSFORM ARGN PREPEND ${PREFIX} OUTPUT_VARIABLE ${VAR_NAME})
set(${VAR_NAME} ${${VAR_NAME}} PARENT_SCOPE)
diff --git a/common/common-tests.cmake b/common/common-tests.cmake
index fafbb21b86..df450ea94d 100644
--- a/common/common-tests.cmake
+++ b/common/common-tests.cmake
@@ -21,5 +21,5 @@ prepend(COMMON_TESTS_SOURCES ${COMMON_DIR}/
allow_deprecated_declarations(${COMMON_TESTS_SOURCES}/algorithms/projections-test.cpp)
-set(COMMON_TESTS_LIBS common-src-no-pic net-src-no-pic binlog-src-no-pic unicode-no-pic ${EPOLL_SHIM_LIB} OpenSSL::no-pic::Crypto ZSTD::no-pic::zstd ZLIB::no-pic::zlib)
+set(COMMON_TESTS_LIBS vk::${PIC_MODE}::common-src vk::${PIC_MODE}::net-src vk::${PIC_MODE}::binlog-src vk::${PIC_MODE}::unicode ${EPOLL_SHIM_LIB} OpenSSL::${PIC_MODE}::Crypto ZSTD::${PIC_MODE}::zstd ZLIB::${PIC_MODE}::zlib)
vk_add_unittest(common "${COMMON_TESTS_LIBS}" ${COMMON_TESTS_SOURCES})
diff --git a/common/tl/compiler/tl-compiler.cmake b/common/tl/compiler/tl-compiler.cmake
index 4bd70f8be5..75fba29855 100644
--- a/common/tl/compiler/tl-compiler.cmake
+++ b/common/tl/compiler/tl-compiler.cmake
@@ -2,6 +2,6 @@ set(TL_COMPILER_DIR ${COMMON_DIR}/tl/compiler)
set(TL_COMPILER_SOURCES ${TL_COMPILER_DIR}/tl-compiler.cpp ${TL_COMPILER_DIR}/tl-parser-new.cpp)
add_executable(tl-compiler ${TL_COMPILER_SOURCES})
-target_link_libraries(tl-compiler PRIVATE popular-common-no-pic pthread)
-target_link_options(tl-compiler PRIVATE ${NO_PIE})
+target_link_libraries(tl-compiler PRIVATE vk::${PIC_MODE}::popular-common pthread)
+target_link_options(tl-compiler PRIVATE ${PIE_MODE_FLAGS})
set_target_properties(tl-compiler PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
diff --git a/common/tl2php/tl2php.cmake b/common/tl2php/tl2php.cmake
index 6c325dab4d..3aff65c187 100644
--- a/common/tl2php/tl2php.cmake
+++ b/common/tl2php/tl2php.cmake
@@ -10,6 +10,6 @@ prepend(TL2PHP_SOURCES ${COMMON_DIR}/tl2php/
tl-to-php-classes-converter.cpp)
add_executable(tl2php ${TL2PHP_SOURCES})
-target_link_libraries(tl2php PRIVATE pthread popular-common-no-pic vk::tlo_parsing_src)
-target_link_options(tl2php PRIVATE ${NO_PIE})
+target_link_libraries(tl2php PRIVATE pthread vk::${PIC_MODE}::popular-common vk::${PIC_MODE}::tlo_parsing_src)
+target_link_options(tl2php PRIVATE ${PIE_MODE_FLAGS})
set_target_properties(tl2php PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
diff --git a/common/tlo-parsing/tlo-parsing.cmake b/common/tlo-parsing/tlo-parsing.cmake
index 0901b55cd5..83a01de7c5 100644
--- a/common/tlo-parsing/tlo-parsing.cmake
+++ b/common/tlo-parsing/tlo-parsing.cmake
@@ -9,33 +9,32 @@ prepend(TLO_PARSING_OBJECTS ${COMMON_DIR}/tlo-parsing/
tl-scheme-final-check.cpp
tlo-parser.cpp)
-vk_add_library(tlo_parsing_src OBJECT ${TLO_PARSING_OBJECTS})
-
-set_target_properties(tlo_parsing_src PROPERTIES POSITION_INDEPENDENT_CODE 1)
+vk_add_library_pic(tlo_parsing_src-pic OBJECT ${TLO_PARSING_OBJECTS})
+vk_add_library_no_pic(tlo_parsing_src-no-pic OBJECT ${TLO_PARSING_OBJECTS})
prepend(TLO_PARSING_PUBLIC_HEADERS ${COMMON_DIR}/tlo-parsing/
tl-objects.h
tl-dependency-graph.h
tlo-parsing.h)
-vk_add_library(tlo_parsing_static STATIC $)
-set_target_properties(tlo_parsing_static PROPERTIES
+vk_add_library_no_pic(tlo_parsing_static-no-pic STATIC $)
+set_target_properties(tlo_parsing_static-no-pic PROPERTIES
OUTPUT_NAME tlo_parsing
PUBLIC_HEADER "${TLO_PARSING_PUBLIC_HEADERS}")
-install(TARGETS tlo_parsing_static
+install(TARGETS tlo_parsing_static-no-pic
COMPONENT TLO_PARSING_DEV
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/tlo-parsing)
-vk_add_library(tlo_parsing_shared SHARED $)
-set_target_properties(tlo_parsing_shared PROPERTIES OUTPUT_NAME tlo_parsing)
+vk_add_library_pic(tlo_parsing_shared-pic SHARED $)
+set_target_properties(tlo_parsing_shared-pic PROPERTIES OUTPUT_NAME tlo_parsing)
if(NOT APPLE)
- target_link_options(tlo_parsing_shared PRIVATE -Wl,--version-script=${COMMON_DIR}/tlo-parsing/tlo-parsing-lib-exported-symbols.map)
+ target_link_options(tlo_parsing_shared-pic PRIVATE -Wl,--version-script=${COMMON_DIR}/tlo-parsing/tlo-parsing-lib-exported-symbols.map)
endif()
-install(TARGETS tlo_parsing_shared
+install(TARGETS tlo_parsing_shared-pic
COMPONENT TLO_PARSING
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/common/unicode/unicode.cmake b/common/unicode/unicode.cmake
index cb72efc7e8..e669a4d8d3 100644
--- a/common/unicode/unicode.cmake
+++ b/common/unicode/unicode.cmake
@@ -41,18 +41,14 @@ endif()
prepend(UNICODE_SOURCES ${UNICODE_DIR}/ ${UNICODE_SOURCES})
-if (COMPILE_RUNTIME_LIGHT)
- vk_add_library(light-unicode OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
- add_dependencies(light-unicode unicode-utils-auto)
- set_property(TARGET light-unicode PROPERTY POSITION_INDEPENDENT_CODE ON)
-
- target_compile_options(light-unicode PUBLIC -stdlib=libc++ -fPIC)
- target_link_options(light-unicode PUBLIC -stdlib=libc++)
-endif()
-
vk_add_library_no_pic(unicode-no-pic OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
vk_add_library_pic(unicode-pic OBJECT ${UNICODE_SOURCES} ${AUTO_DIR}/common/unicode-utils-auto.h)
+if (COMPILE_RUNTIME_LIGHT)
+ target_compile_options(unicode-pic PUBLIC -stdlib=libc++)
+ target_link_options(unicode-pic PUBLIC -stdlib=libc++)
+endif()
+
add_dependencies(unicode-no-pic unicode-utils-auto)
# Prevent race-condition in "unicode raw data generation" operations
diff --git a/compiler/compiler-settings.cpp b/compiler/compiler-settings.cpp
index 749cb38bae..3488c6131d 100644
--- a/compiler/compiler-settings.cpp
+++ b/compiler/compiler-settings.cpp
@@ -245,7 +245,7 @@ void CompilerSettings::init() {
bool is_k2_mode = mode.get().substr(0, 3) == "k2-";
if (link_file.value_.empty()) {
if (is_k2_mode) {
- link_file.value_ = kphp_src_path.get() + "/objs/libkphp-light-runtime.a";
+ link_file.value_ = kphp_src_path.get() + "/objs/libkphp-light-runtime-pic.a";
} else {
if (dynamic_incremental_linkage.get()) {
link_file.value_ = kphp_src_path.get() + "/objs/libkphp-full-runtime-pic.a";
diff --git a/compiler/compiler.cmake b/compiler/compiler.cmake
index 3ec17d9b4e..c554f4f935 100644
--- a/compiler/compiler.cmake
+++ b/compiler/compiler.cmake
@@ -237,7 +237,7 @@ list(APPEND KPHP_COMPILER_SOURCES
${RUNTIME_BUILD_INFO}
${AUTO_DIR}/compiler/rewrite-rules/early_opt.cpp)
-vk_add_library(kphp2cpp_src OBJECT ${KPHP_COMPILER_SOURCES})
+vk_add_library_no_pic(kphp2cpp_src-no-pic OBJECT ${KPHP_COMPILER_SOURCES})
file(MAKE_DIRECTORY ${KPHP_COMPILER_AUTO_DIR})
add_custom_command(OUTPUT ${KEYWORDS_SET}
@@ -270,23 +270,23 @@ set_property(SOURCE ${KPHP_COMPILER_DIR}/kphp2cpp.cpp
APPEND
PROPERTY COMPILE_DEFINITIONS
DEFAULT_KPHP_PATH="${DEFAULT_KPHP_PATH}/"
- KPHP_HAS_NO_PIE="${NO_PIE}")
+ KPHP_HAS_NO_PIE="${PIE_MODE_FLAGS}")
add_executable(kphp2cpp ${KPHP_COMPILER_DIR}/kphp2cpp.cpp)
target_include_directories(kphp2cpp PUBLIC ${KPHP_COMPILER_DIR})
add_dependencies(kphp2cpp openssl)
prepare_cross_platform_libs(COMPILER_LIBS yaml-cpp re2)
-set(COMPILER_LIBS vk::kphp2cpp_src vk::tlo_parsing_src popular-common-no-pic ${COMPILER_LIBS} fmt::fmt OpenSSL::Crypto pthread)
+set(COMPILER_LIBS vk::no-pic::kphp2cpp_src vk::no-pic::tlo_parsing_src vk::no-pic::popular-common ${COMPILER_LIBS} fmt::fmt OpenSSL::no-pic::Crypto pthread)
if(NOT APPLE)
list(APPEND COMPILER_LIBS stdc++fs)
endif()
target_link_libraries(kphp2cpp PRIVATE ${COMPILER_LIBS})
-target_link_options(kphp2cpp PRIVATE ${NO_PIE})
+target_link_options(kphp2cpp PRIVATE ${PIE_MODE_FLAGS})
set_target_properties(kphp2cpp PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_DIR})
-add_dependencies(kphp2cpp_src auto_vertices_generation_target)
+add_dependencies(kphp2cpp_src-no-pic auto_vertices_generation_target)
if(COMPILE_RUNTIME_LIGHT)
add_compile_definitions(RUNTIME_LIGHT)
add_dependencies(kphp2cpp php_lib_version_sha_256)
diff --git a/flex/flex.cmake b/flex/flex.cmake
index ef9b180c14..1302abbfda 100644
--- a/flex/flex.cmake
+++ b/flex/flex.cmake
@@ -13,31 +13,43 @@ add_custom_command(
${FLEX_DIR}/lib/vkext-flex-generate.lib.php
${FLEX_DIR}/lib/configs/flex-config.php
COMMENT "vk-flex-data generation")
+add_custom_target(flex-data ALL DEPENDS ${FLEX_DATA_SRC})
if(COMPILER_CLANG)
set_source_files_properties(${FLEX_DATA_SRC} PROPERTIES COMPILE_FLAGS -Wno-invalid-source-encoding)
endif()
-vk_add_library(flex_data_shared SHARED ${FLEX_SOURCES})
-vk_add_library(flex_data_static STATIC ${FLEX_SOURCES})
+vk_add_library_pic(flex-data-src-pic OBJECT ${FLEX_SOURCES})
+add_dependencies(flex-data-src-pic flex-data)
+vk_add_library_no_pic(flex-data-src-no-pic OBJECT ${FLEX_SOURCES})
+add_dependencies(flex-data-src-no-pic flex-data)
+
+vk_add_library_pic(flex_data_shared-pic SHARED $)
+add_dependencies(flex_data_shared-pic flex-data-src-pic)
+
+vk_add_library_no_pic(flex_data_static-no-pic STATIC $)
+add_dependencies(flex_data_static-no-pic flex-data-src-no-pic)
+
check_cxx_compiler_flag(-fno-sanitize=all NO_SANITIZE_IS_FOUND)
if(NO_SANITIZE_IS_FOUND)
- target_compile_options(flex_data_shared PRIVATE -fno-sanitize=all)
- target_link_options(flex_data_shared PRIVATE -fno-sanitize=all)
+ target_compile_options(flex-data-src-pic PRIVATE -fno-sanitize=all)
+ target_link_options(flex-data-src-pic PRIVATE -fno-sanitize=all)
+ target_compile_options(flex_data_shared-pic PRIVATE -fno-sanitize=all)
+ target_link_options(flex_data_shared-pic PRIVATE -fno-sanitize=all)
endif()
# to prevent double generation of ${FLEX_DATA_SRC}
-add_dependencies(flex_data_shared flex_data_static)
+add_dependencies(flex_data_shared-pic flex_data_static-no-pic)
-set_target_properties(flex_data_shared flex_data_static
+set_target_properties(flex_data_shared-pic flex_data_static-no-pic
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${OBJS_DIR}/flex
ARCHIVE_OUTPUT_DIRECTORY ${OBJS_DIR}/flex
OUTPUT_NAME vk-flex-data)
add_custom_command(
- TARGET flex_data_static POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy $ ${OBJS_DIR}/lib/libvk-flex-data.a
+ TARGET flex_data_static-no-pic POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy $ ${OBJS_DIR}/lib/libvk-flex-data.a
)
-install(TARGETS flex_data_shared flex_data_static
+install(TARGETS flex_data_shared-pic flex_data_static-no-pic
COMPONENT FLEX
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/net/net-tests.cmake b/net/net-tests.cmake
index 78eb8524bd..b457b568f6 100644
--- a/net/net-tests.cmake
+++ b/net/net-tests.cmake
@@ -4,5 +4,5 @@ prepend(NET_TESTS_SOURCES ${BASE_DIR}/net/
net-test.cpp
time-slice-test.cpp)
-set(NET_TESTS_LIBS common-src-no-pic net-src-no-pic binlog-src-no-pic unicode-no-pic ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::no-pic::Crypto ZSTD::no-pic::zstd ZLIB::no-pic::zlib)
+set(NET_TESTS_LIBS vk::${PIC_MODE}::common-src vk::${PIC_MODE}::net-src vk::${PIC_MODE}::binlog-src vk::${PIC_MODE}::unicode ${NET_TESTS_LIBS} ${EPOLL_SHIM_LIB} OpenSSL::${PIC_MODE}::Crypto ZSTD::${PIC_MODE}::zstd ZLIB::${PIC_MODE}::zlib)
vk_add_unittest(net "${NET_TESTS_LIBS}" ${NET_TESTS_SOURCES})
diff --git a/net/net.cmake b/net/net.cmake
index 0c3acdabbd..8bd6854616 100644
--- a/net/net.cmake
+++ b/net/net.cmake
@@ -24,4 +24,4 @@ prepend(NET_SOURCES ${BASE_DIR}/net/
net-msg-part.cpp)
vk_add_library_no_pic(net-src-no-pic OBJECT ${NET_SOURCES})
-vk_add_library_pic(net-src-pic OBJECT ${NET_SOURCES})
\ No newline at end of file
+vk_add_library_pic(net-src-pic OBJECT ${NET_SOURCES})
diff --git a/runtime-common/runtime-common.cmake b/runtime-common/runtime-common.cmake
index d51c5d4276..f58a411ebb 100644
--- a/runtime-common/runtime-common.cmake
+++ b/runtime-common/runtime-common.cmake
@@ -14,7 +14,5 @@ vk_add_library_no_pic(runtime-common-no-pic OBJECT ${RUNTIME_COMMON_SRC})
vk_add_library_pic(runtime-common-pic OBJECT ${RUNTIME_COMMON_SRC})
if(COMPILE_RUNTIME_LIGHT)
- target_compile_options(runtime-common-pic PUBLIC -stdlib=libc++ -fPIC)
+ target_compile_options(runtime-common-pic PUBLIC -stdlib=libc++)
endif()
-
-
diff --git a/runtime-light/runtime-light.cmake b/runtime-light/runtime-light.cmake
index 57e3cb69ea..ed75fd5cf7 100644
--- a/runtime-light/runtime-light.cmake
+++ b/runtime-light/runtime-light.cmake
@@ -39,35 +39,35 @@ configure_file(${BASE_DIR}/compiler/runtime_sources.h.in
prepend(RUNTIME_LIGHT_SRC ${RUNTIME_LIGHT_DIR}/ "${RUNTIME_LIGHT_SRC}")
-vk_add_library(runtime-light OBJECT ${RUNTIME_LIGHT_SRC})
-set_property(TARGET runtime-light PROPERTY POSITION_INDEPENDENT_CODE ON)
-set_target_properties(runtime-light PROPERTIES LIBRARY_OUTPUT_DIRECTORY
+vk_add_library_pic(runtime-light-pic OBJECT ${RUNTIME_LIGHT_SRC})
+set_target_properties(runtime-light-pic PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${BASE_DIR}/objs)
target_compile_options(
- runtime-light PUBLIC -stdlib=libc++ -iquote ${GENERATED_DIR}
+ runtime-light-pic PUBLIC -stdlib=libc++ -iquote ${GENERATED_DIR}
${THIRD_PARTY_INCLUDE} -fPIC -O3)
-target_link_options(runtime-light PUBLIC -stdlib=libc++ -static-libstdc++)
+target_link_options(runtime-light-pic PUBLIC -stdlib=libc++ -static-libstdc++)
# add statically linking libraries
string(JOIN " " ABSEIL_LIBS ${ABSEIL_LIBS})
set_property(
- TARGET runtime-light
+ TARGET runtime-light-pic
PROPERTY RUNTIME_LINK_LIBS
"${ABSEIL_LIBS} ${ZLIB_PIC_LIBRARIES} ${PCRE2_LIB_DIR}/libpcre2-8.a"
)
-add_dependencies(runtime-light zlib-pic)
+add_dependencies(runtime-light-pic ZLIB::pic::zlib)
if(APPLE)
- target_link_options(runtime-light PUBLIC -undefined dynamic_lookup)
+ target_link_options(runtime-light-pic PUBLIC -undefined dynamic_lookup)
else()
- target_link_options(runtime-light PUBLIC --allow-shlib-undefined)
+ target_link_options(runtime-light-pic PUBLIC --allow-shlib-undefined)
endif()
-vk_add_library(kphp-light-runtime STATIC)
+vk_add_library_pic(kphp-light-runtime-pic STATIC)
target_link_libraries(
- kphp-light-runtime PUBLIC vk::light-common vk::light-unicode
- vk::runtime-light runtime-common-pic)
-set_target_properties(kphp-light-runtime PROPERTIES ARCHIVE_OUTPUT_DIRECTORY
- ${OBJS_DIR})
+ kphp-light-runtime-pic PUBLIC vk::pic::light-common vk::pic::unicode
+ vk::pic::runtime-light vk::pic::runtime-common)
+set_target_properties(kphp-light-runtime-pic PROPERTIES
+ ARCHIVE_OUTPUT_DIRECTORY ${OBJS_DIR}
+ LIBRARY_OUTPUT_NAME libkphp-light-runtime.a)
file(
GLOB_RECURSE KPHP_RUNTIME_ALL_HEADERS
@@ -102,7 +102,7 @@ add_library(php_lib_version_j OBJECT
target_compile_options(php_lib_version_j PRIVATE -I. ${THIRD_PARTY_INCLUDE} -E)
target_compile_options(php_lib_version_j PUBLIC -stdlib=libc++)
target_link_options(php_lib_version_j PUBLIC -stdlib=libc++ -static-libstdc++)
-add_dependencies(php_lib_version_j kphp-light-runtime)
+add_dependencies(php_lib_version_j kphp-light-runtime-pic)
add_custom_command(
OUTPUT ${OBJS_DIR}/php_lib_version.sha256
@@ -116,11 +116,11 @@ add_custom_target(php_lib_version_sha_256
get_property(
RUNTIME_COMPILE_FLAGS
- TARGET runtime-light
+ TARGET runtime-light-pic
PROPERTY COMPILE_OPTIONS)
get_property(
RUNTIME_INCLUDE_DIRS
- TARGET runtime-light
+ TARGET runtime-light-pic
PROPERTY INCLUDE_DIRECTORIES)
list(JOIN RUNTIME_COMPILE_FLAGS "\;" RUNTIME_COMPILE_FLAGS)
@@ -130,7 +130,7 @@ configure_file(${BASE_DIR}/compiler/runtime_compile_flags.h.in
get_property(
RUNTIME_LINK_LIBS
- TARGET runtime-light
+ TARGET runtime-light-pic
PROPERTY RUNTIME_LINK_LIBS)
list(JOIN RUNTIME_LINK_LIBS "\;" RUNTIME_LINK_LIBS)
string(REPLACE "\"" "\\\"" RUNTIME_LINK_LIBS ${RUNTIME_LINK_LIBS})
diff --git a/runtime/runtime.cmake b/runtime/runtime.cmake
index 1887143805..662dd64495 100644
--- a/runtime/runtime.cmake
+++ b/runtime/runtime.cmake
@@ -139,20 +139,21 @@ set(KPHP_RUNTIME_ALL_SOURCES
allow_deprecated_declarations(${BASE_DIR}/runtime/allocator.cpp ${BASE_DIR}/runtime/openssl.cpp)
allow_deprecated_declarations_for_apple(${BASE_DIR}/runtime/inter-process-mutex.cpp)
+prepare_cross_platform_libs(SYSTEM_INSTALLED_LIBS yaml-cpp re2 h3)
+
#### NO PIC
vk_add_library_no_pic(kphp-runtime-no-pic STATIC ${KPHP_RUNTIME_ALL_SOURCES})
target_include_directories(kphp-runtime-no-pic PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
-prepare_cross_platform_libs(RUNTIME_LIBS_NO_PIC yaml-cpp re2 h3)
set(RUNTIME_LIBS_NO_PIC
- kphp-server-no-pic
- runtime-common-no-pic
- popular-common-no-pic
- unicode-no-pic
- common-src-no-pic
- binlog-src-no-pic
- net-src-no-pic
- ${RUNTIME_LIBS_NO_PIC}
+ vk::no-pic::kphp-server
+ vk::no-pic::runtime-common
+ vk::no-pic::popular-common
+ vk::no-pic::unicode
+ vk::no-pic::common-src
+ vk::no-pic::binlog-src
+ vk::no-pic::net-src
+ ${SYSTEM_INSTALLED_LIBS}
CURL::no-pic::curl
OpenSSL::no-pic::SSL
OpenSSL::no-pic::Crypto
@@ -166,24 +167,21 @@ target_link_libraries(kphp-runtime-no-pic PUBLIC ${RUNTIME_LIBS_NO_PIC})
add_dependencies(kphp-runtime-no-pic kphp-timelib OpenSSL::no-pic::Crypto OpenSSL::no-pic::SSL CURL::no-pic::curl NGHTTP2::no-pic::nghttp2 ZLIB::no-pic::zlib ZSTD::no-pic::zstd)
combine_static_runtime_library(kphp-runtime-no-pic kphp-full-runtime-no-pic)
-
-set(RUNTIME_FULL_LIBS_NO_PIC kphp-runtime-no-pic ${RUNTIME_LIBS_NO_PIC})
###
#### PIC
vk_add_library_pic(kphp-runtime-pic STATIC ${KPHP_RUNTIME_ALL_SOURCES})
target_include_directories(kphp-runtime-pic PUBLIC ${BASE_DIR} ${OPENSSL_INCLUDE_DIR} ${ZLIB_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
-prepare_cross_platform_libs(RUNTIME_LIBS_PIC yaml-cpp re2 h3)
set(RUNTIME_LIBS_PIC
- kphp-server-pic
- runtime-common-pic
- popular-common-pic
- unicode-pic
- common-src-pic
- binlog-src-pic
- net-src-pic
- ${RUNTIME_LIBS_PIC}
+ vk::pic::kphp-server
+ vk::pic::runtime-common
+ vk::pic::popular-common
+ vk::pic::unicode
+ vk::pic::common-src
+ vk::pic::binlog-src
+ vk::pic::net-src
+ ${SYSTEM_INSTALLED_LIBS}
CURL::pic::curl
OpenSSL::pic::SSL
OpenSSL::pic::Crypto
@@ -199,8 +197,39 @@ add_dependencies(kphp-runtime-pic kphp-timelib OpenSSL::pic::Crypto OpenSSL::pic
combine_static_runtime_library(kphp-runtime-pic kphp-full-runtime-pic)
###
-prepare_cross_platform_libs(RUNTIME_LINK_TEST_LIBS pcre kphp-timelib)
-set(RUNTIME_LINK_TEST_LIBS vk::flex_data_static CURL::curl OpenSSL::SSL NGHTTP2::nghttp2 ${NUMA_LIB} ${RUNTIME_LINK_TEST_LIBS} ${EPOLL_SHIM_LIB} ${ICONV_LIB} ${RT_LIB} dl)
+set(RUNTIME_LIBS
+ vk::${PIC_MODE}::kphp-runtime
+ vk::${PIC_MODE}::kphp-server
+ vk::${PIC_MODE}::runtime-common
+ vk::${PIC_MODE}::popular-common
+ vk::${PIC_MODE}::unicode
+ vk::${PIC_MODE}::common-src
+ vk::${PIC_MODE}::binlog-src
+ vk::${PIC_MODE}::net-src
+ ${SYSTEM_INSTALLED_LIBS}
+ CURL::${PIC_MODE}::curl
+ OpenSSL::${PIC_MODE}::SSL
+ OpenSSL::${PIC_MODE}::Crypto
+ ZLIB::${PIC_MODE}::zlib
+ NGHTTP2::${PIC_MODE}::nghttp2
+ ZSTD::${PIC_MODE}::zstd
+ m
+ pthread
+)
+
+prepare_cross_platform_libs(SYSTEM_INSTALLED_TEST_LIB pcre kphp-timelib)
+set(RUNTIME_LINK_TEST_LIBS
+ vk::${PIC_MODE}::flex-data-src
+ CURL::${PIC_MODE}::curl
+ OpenSSL::${PIC_MODE}::SSL
+ NGHTTP2::${PIC_MODE}::nghttp2
+ ${NUMA_LIB}
+ ${SYSTEM_INSTALLED_TEST_LIB}
+ ${EPOLL_SHIM_LIB}
+ ${ICONV_LIB}
+ ${RT_LIB}
+ dl
+)
if (PDO_DRIVER_MYSQL)
list(APPEND RUNTIME_LINK_TEST_LIBS mysqlclient)
@@ -237,6 +266,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 ${OPENSSL_INCLUDE_DIR} ${ZLIB_NO_PIC_INCLUDE_DIRS} ${CURL_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
target_compile_options(php_lib_version_j PRIVATE -I. -E)
add_dependencies(php_lib_version_j kphp-full-runtime-no-pic kphp-full-runtime-pic)
diff --git a/server/server.cmake b/server/server.cmake
index 913c6a700f..fec617ecf4 100644
--- a/server/server.cmake
+++ b/server/server.cmake
@@ -74,4 +74,4 @@ set(KPHP_SERVER_ALL_SOURCES
allow_deprecated_declarations_for_apple(${BASE_DIR}/server/php-runner.cpp)
vk_add_library_no_pic(kphp-server-no-pic OBJECT ${KPHP_SERVER_ALL_SOURCES})
-vk_add_library_pic(kphp-server-pic OBJECT ${KPHP_SERVER_ALL_SOURCES})
\ No newline at end of file
+vk_add_library_pic(kphp-server-pic OBJECT ${KPHP_SERVER_ALL_SOURCES})
diff --git a/tests/cpp/runtime/runtime-tests.cmake b/tests/cpp/runtime/runtime-tests.cmake
index b454b94f0b..731da98fe6 100644
--- a/tests/cpp/runtime/runtime-tests.cmake
+++ b/tests/cpp/runtime/runtime-tests.cmake
@@ -24,4 +24,4 @@ prepend(RUNTIME_TESTS_SOURCES ${BASE_DIR}/tests/cpp/runtime/
zstd-test.cpp)
allow_deprecated_declarations_for_apple(${BASE_DIR}/tests/cpp/runtime/inter-process-mutex-test.cpp)
-vk_add_unittest(runtime "${RUNTIME_FULL_LIBS_NO_PIC};${RUNTIME_LINK_TEST_LIBS}" ${RUNTIME_TESTS_SOURCES})
+vk_add_unittest(runtime "${RUNTIME_LIBS};${RUNTIME_LINK_TEST_LIBS}" ${RUNTIME_TESTS_SOURCES})
diff --git a/tests/cpp/server/server-tests.cmake b/tests/cpp/server/server-tests.cmake
index b9bd42a860..55b7368d46 100644
--- a/tests/cpp/server/server-tests.cmake
+++ b/tests/cpp/server/server-tests.cmake
@@ -10,4 +10,4 @@ if(COMPILER_GCC)
set_source_files_properties(${BASE_DIR}/tests/cpp/server/confdata-binlog-events-test.cpp PROPERTIES COMPILE_FLAGS -Wno-stringop-overflow)
endif()
-vk_add_unittest(server "${RUNTIME_FULL_LIBS_NO_PIC};${RUNTIME_LINK_TEST_LIBS}" ${SERVER_TESTS_SOURCES} ${BASE_DIR}/tests/cpp/runtime/_runtime-tests-env.cpp)
+vk_add_unittest(server "${RUNTIME_LIBS};${RUNTIME_LINK_TEST_LIBS}" ${SERVER_TESTS_SOURCES} ${BASE_DIR}/tests/cpp/runtime/_runtime-tests-env.cpp)
diff --git a/tests/tests.cmake b/tests/tests.cmake
index bbd16655bb..19a31851f5 100644
--- a/tests/tests.cmake
+++ b/tests/tests.cmake
@@ -2,8 +2,8 @@ if(KPHP_TESTS)
function(vk_add_unittest TEST_NAME SRC_LIBS)
set(TEST_NAME unittests-${TEST_NAME})
add_executable(${TEST_NAME} ${ARGN})
- target_link_libraries(${TEST_NAME} PRIVATE GTest::GTest GTest::Main gmock ${SRC_LIBS} popular-common-no-pic)
- target_link_options(${TEST_NAME} PRIVATE ${NO_PIE})
+ target_link_libraries(${TEST_NAME} PRIVATE GTest::GTest GTest::Main gmock ${SRC_LIBS} vk::${PIC_MODE}::popular-common)
+ target_link_options(${TEST_NAME} PRIVATE ${PIE_MODE_FLAGS})
# because of https://github.com/VKCOM/kphp/actions/runs/5463884925/jobs/9945150190
gtest_discover_tests(${TEST_NAME} PROPERTIES DISCOVERY_TIMEOUT 600)
diff --git a/vkext/vkext.cmake b/vkext/vkext.cmake
index 35dc399841..0c8f741239 100644
--- a/vkext/vkext.cmake
+++ b/vkext/vkext.cmake
@@ -67,16 +67,17 @@ foreach(PHP_VERSION IN ITEMS "" "7.4" "8.0" "8.1" "8.2" "8.3")
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(VKEXT_TARGET vkext${PHP_VERSION})
- vk_add_library(${VKEXT_TARGET} SHARED ${VKEXT_SOURCES} ${VKEXT_COMMON_SOURCES})
+ vk_add_library_pic(${VKEXT_TARGET}-pic SHARED ${VKEXT_SOURCES} ${VKEXT_COMMON_SOURCES})
+ add_custom_target(${VKEXT_TARGET} ALL DEPENDS ${VKEXT_TARGET}-pic)
if(APPLE)
- target_link_options(${VKEXT_TARGET} PRIVATE -undefined dynamic_lookup)
+ target_link_options(${VKEXT_TARGET}-pic PRIVATE -undefined dynamic_lookup)
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} ${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
+ target_compile_definitions(${VKEXT_TARGET}-pic PRIVATE -DVKEXT -DPHP_ATOM_INC)
+ target_compile_options(${VKEXT_TARGET}-pic PRIVATE -Wno-unused-parameter -Wno-float-conversion -Wno-ignored-qualifiers)
+ target_include_directories(${VKEXT_TARGET}-pic PRIVATE ${PHP_SOURCE} ${PHP_SOURCE}/main ${PHP_SOURCE}/Zend ${PHP_SOURCE}/TSRM ${BASE_DIR} ${ZLIB_PIC_INCLUDE_DIRS})
+ add_dependencies(${VKEXT_TARGET}-pic ZLIB::pic::zlib)
+ target_link_libraries(${VKEXT_TARGET}-pic PRIVATE vk::pic::flex_data_shared ZLIB::pic::zlib)
+ set_target_properties(${VKEXT_TARGET}-pic PROPERTIES
LIBRARY_OUTPUT_DIRECTORY ${OBJS_DIR}/vkext/modules${PHP_VERSION}/
LIBRARY_OUTPUT_NAME vkext
PREFIX "")
@@ -85,8 +86,8 @@ foreach(PHP_VERSION IN ITEMS "" "7.4" "8.0" "8.1" "8.2" "8.3")
set_source_files_properties(${VKEXT_DIR}/vkext.cpp PROPERTIES COMPILE_FLAGS -Wno-unused-result)
if(NO_SANITIZE_IS_FOUND)
- target_compile_options(${VKEXT_TARGET} PRIVATE -fno-sanitize=all)
- target_link_options(${VKEXT_TARGET} PRIVATE -fno-sanitize=all)
+ target_compile_options(${VKEXT_TARGET}-pic PRIVATE -fno-sanitize=all)
+ target_link_options(${VKEXT_TARGET}-pic PRIVATE -fno-sanitize=all)
endif()
if(PHP_VERSION)
From e89b869f9734fed0d1ddc20e24208be1652cca45 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Thu, 27 Feb 2025 20:39:07 +0300
Subject: [PATCH 12/20] Introduce pic and no-pic build variants for zstd
Signed-off-by: Petr Shumilov
---
cmake/init-global-vars.cmake | 7 +-
cmake/utils.cmake | 45 ++++++++
third-party/zlib-cmake/zlib.cmake | 133 +++++++++------------
third-party/zstd-cmake/zstd.cmake | 185 ++++++++++++++++--------------
4 files changed, 199 insertions(+), 171 deletions(-)
diff --git a/cmake/init-global-vars.cmake b/cmake/init-global-vars.cmake
index e84db924a5..90e10cb434 100644
--- a/cmake/init-global-vars.cmake
+++ b/cmake/init-global-vars.cmake
@@ -12,10 +12,13 @@ set(AUTO_DIR "${GENERATED_DIR}/auto")
set(RUNTIME_LIGHT_DIR "${BASE_DIR}/runtime-light")
set(RUNTIME_COMMON_DIR "${BASE_DIR}/runtime-common")
-set(PIC_LIBRARY_SUFFIX "-pic")
set(PIC_NAMESPACE_NAME "pic")
-set(NO_PIC_LIBRARY_SUFFIX "-no-pic")
+set(PIC_LIBRARY_SUFFIX "-${PIC_NAMESPACE_NAME}")
+set(PIC_LIBRARY_SPECIFIER "PIC")
+
set(NO_PIC_NAMESPACE_NAME "no-pic")
+set(NO_PIC_LIBRARY_SUFFIX "-${NO_PIC_NAMESPACE_NAME}")
+set(NO_PIC_LIBRARY_SPECIFIER "NO_PIC")
if(APPLE)
detect_xcode_sdk_path(CMAKE_OSX_SYSROOT)
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index b58d8a6114..282213aa67 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -245,3 +245,48 @@ function(combine_static_runtime_library TARGET COMBINED_TARGET)
INTERFACE_INCLUDE_DIRECTORIES $)
add_dependencies(${COMBINED_TARGET} _combined_${TARGET})
endfunction()
+
+function(get_submodule_remote_url SUBMODULE_PATH RESULT_VAR)
+ execute_process(
+ COMMAND ${GIT_EXECUTABLE} config --file ${CMAKE_SOURCE_DIR}/.gitmodules --get submodule.${SUBMODULE_PATH}.url
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ OUTPUT_VARIABLE submodule_url
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+ set(${RESULT_VAR} "${submodule_url}" PARENT_SCOPE)
+endfunction()
+
+function(get_submodule_version SUBMODULE_PATH RESULT_VAR)
+ execute_process(
+ COMMAND ${GIT_EXECUTABLE} -C ${SUBMODULE_PATH} describe --tags
+ WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
+ OUTPUT_VARIABLE submodule_version
+ OUTPUT_STRIP_TRAILING_WHITESPACE
+ ERROR_QUIET
+ )
+ set(${RESULT_VAR} "${submodule_version}" PARENT_SCOPE)
+endfunction()
+
+function(make_third_party_configuration PIC_ENABLED PROJECT_GENERIC_NAME TARGET_NAMESPACE ARTIFACT_NAME PROJECT_NAME EXTRA_COMPILE_FLAGS TARGET_NAME LIB_PREFIX ARCHIVE_NAME)
+ if(PIC_ENABLED)
+ set(${PROJECT_NAME} "${PROJECT_GENERIC_NAME}${PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
+ if(APPLE)
+ set(${EXTRA_COMPILE_FLAGS} "-fPIC --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
+ else()
+ set(${EXTRA_COMPILE_FLAGS} "-fPIC" PARENT_SCOPE)
+ endif()
+ set(${TARGET_NAME} ${TARGET_NAMESPACE}::${PIC_NAMESPACE_NAME}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
+ set(${LIB_PREFIX} ${TARGET_NAMESPACE}_${PIC_LIBRARY_SPECIFIER}_ PARENT_SCOPE)
+ set(${ARCHIVE_NAME} "${ARTIFACT_NAME}${PIC_LIBRARY_SUFFIX}.a" PARENT_SCOPE)
+ else()
+ set(${PROJECT_NAME} "${PROJECT_GENERIC_NAME}${NO_PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
+ if(APPLE)
+ set(${EXTRA_COMPILE_FLAGS} "-fno-pic --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
+ else()
+ set(${EXTRA_COMPILE_FLAGS} "-fno-pic -static" PARENT_SCOPE)
+ endif()
+ set(${TARGET_NAME} ${TARGET_NAMESPACE}::${NO_PIC_NAMESPACE_NAME}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
+ set(${LIB_PREFIX} ${TARGET_NAMESPACE}_${NO_PIC_LIBRARY_SPECIFIER}_ PARENT_SCOPE)
+ set(${ARCHIVE_NAME} "${ARTIFACT_NAME}${NO_PIC_LIBRARY_SUFFIX}.a" PARENT_SCOPE)
+ endif()
+endfunction()
diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake
index ff08ffca43..b3d4f6ee93 100644
--- a/third-party/zlib-cmake/zlib.cmake
+++ b/third-party/zlib-cmake/zlib.cmake
@@ -1,114 +1,85 @@
update_git_submodule(${THIRD_PARTY_DIR}/zlib "--recursive")
+get_submodule_version(${THIRD_PARTY_DIR}/zlib ZLIB_VERSION)
+get_submodule_remote_url(third-party/zlib ZLIB_SOURCE_URL)
-function(build_zlib PIC_MODE)
- set(PROJECT_GENERIC_NAME zlib)
- set(TARGET_NAMESPACE ZLIB)
- set(TARGET_GENERIC_NAME ZLIB)
+function(build_zlib PIC_ENABLED)
+ set(project_generic_name zlib)
+ set(target_namespace ZLIB)
+ set(artifact_name libz)
- set(PROJECT_NAME)
- set(TARGET_NAME)
- set(EXTRA_COMPILE_FLAGS)
- set(SUFFIX)
-
- if(PIC_MODE)
- set(SUFFIX "-pic")
- set(EXTRA_COMPILE_FLAGS "-fPIC")
- set(TARGET_NAME "${TARGET_GENERIC_NAME}_PIC")
- else()
- set(SUFFIX "-no-pic")
- set(EXTRA_COMPILE_FLAGS "-fno-pic")
- if(NOT APPLE)
- set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} -static")
- endif()
- set(TARGET_NAME "${TARGET_GENERIC_NAME}_NO_PIC")
- endif()
-
- if(APPLE)
- set(EXTRA_COMPILE_FLAGS "${EXTRA_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
- endif()
-
- set(PROJECT_NAME "${PROJECT_GENERIC_NAME}${SUFFIX}")
+ make_third_party_configuration(${PIC_ENABLED} ${project_generic_name} ${target_namespace} ${artifact_name}
+ project_name
+ extra_compile_flags
+ target_name
+ lib_prefix
+ archive_name
+ )
- set(SOURCE_DIR ${THIRD_PARTY_DIR}/zlib)
- set(BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/${PROJECT_NAME}/build)
- set(INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/${PROJECT_NAME}/install)
- set(INCLUDE_DIRS ${INSTALL_DIR}/include)
- set(LIBRARIES ${INSTALL_DIR}/lib/libz${SUFFIX}.a)
+ set(source_dir ${THIRD_PARTY_DIR}/${project_generic_name})
+ set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
+ set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
+ set(include_dirs ${install_dir}/include)
+ set(libraries ${install_dir}/lib/${archive_name})
# Ensure the build, installation and "include" directories exists
- file(MAKE_DIRECTORY ${BUILD_DIR})
- file(MAKE_DIRECTORY ${INSTALL_DIR})
- file(MAKE_DIRECTORY ${INCLUDE_DIRS})
+ file(MAKE_DIRECTORY ${build_dir})
+ file(MAKE_DIRECTORY ${install_dir})
+ file(MAKE_DIRECTORY ${include_dirs})
- set(COMPILE_FLAGS "$ENV{CFLAGS} -g0 -Wall -O3 -D_REENTRANT ${EXTRA_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(compile_flags "$ENV{CFLAGS} -g0 -Wall -O3 -D_REENTRANT ${extra_compile_flags}")
message(STATUS "Zlib Summary:
- PIC mode: ${PIC_MODE}
- Source dir: ${SOURCE_DIR}
- Build dir: ${BUILD_DIR}
- Install dir: ${INSTALL_DIR}
- Include dirs: ${INCLUDE_DIRS}
- Libraries: ${LIBRARIES}
+ PIC enabled: ${PIC_ENABLED}
+ Version: ${ZLIB_VERSION}
+ Source: ${ZLIB_SOURCE_URL}
+ Include dirs: ${include_dirs}
+ Libraries: ${libraries}
+ Target name: ${target_name}
Compiler:
C compiler: ${CMAKE_C_COMPILER}
- CFLAGS: ${COMPILE_FLAGS}
+ CFLAGS: ${compile_flags}
")
ExternalProject_Add(
- ${PROJECT_NAME}
- PREFIX ${BUILD_DIR}
- SOURCE_DIR ${SOURCE_DIR}
- INSTALL_DIR ${INSTALL_DIR}
- BINARY_DIR ${BUILD_DIR}
- BUILD_BYPRODUCTS ${LIBRARIES}
+ ${project_name}
+ PREFIX ${build_dir}
+ SOURCE_DIR ${source_dir}
+ INSTALL_DIR ${install_dir}
+ BINARY_DIR ${build_dir}
+ BUILD_BYPRODUCTS ${libraries}
CONFIGURE_COMMAND
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${SOURCE_DIR} ${BUILD_DIR}
- COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${COMPILE_FLAGS} ./configure --prefix=${INSTALL_DIR} --includedir=${INCLUDE_DIRS}/zlib --static
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${source_dir} ${build_dir}
+ COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${compile_flags} ./configure --prefix=${install_dir} --includedir=${include_dirs}/zlib --static
BUILD_COMMAND
COMMAND make libz.a -j
INSTALL_COMMAND
COMMAND make install
- COMMAND ${CMAKE_COMMAND} -E copy ${INSTALL_DIR}/lib/libz.a ${LIBRARIES}
- COMMAND ${CMAKE_COMMAND} -E copy ${LIBRARIES} ${LIB_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${INCLUDE_DIRS} ${INCLUDE_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/libz.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
)
- add_library(${TARGET_NAMESPACE}::${TARGET_NAME} STATIC IMPORTED)
- set_target_properties(${TARGET_NAMESPACE}::${TARGET_NAME} PROPERTIES
- IMPORTED_LOCATION ${LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}
+ add_library(${target_name} STATIC IMPORTED)
+ set_target_properties(${target_name} PROPERTIES
+ IMPORTED_LOCATION ${libraries}
+ INTERFACE_INCLUDE_DIRECTORIES ${include_dirs}
)
# Ensure that the zlib are built before they are used
- add_dependencies(${TARGET_NAMESPACE}::${TARGET_NAME} ${PROJECT_NAME})
-
- ######################################
- if(PIC_MODE)
- add_library(${TARGET_NAMESPACE}::pic::zlib STATIC IMPORTED)
- set_target_properties(${TARGET_NAMESPACE}::pic::zlib PROPERTIES
- IMPORTED_LOCATION ${LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}
- )
- add_dependencies(${TARGET_NAMESPACE}::pic::zlib ${PROJECT_NAME})
- else()
- add_library(${TARGET_NAMESPACE}::no-pic::zlib STATIC IMPORTED)
- set_target_properties(${TARGET_NAMESPACE}::no-pic::zlib PROPERTIES
- IMPORTED_LOCATION ${LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${INCLUDE_DIRS}
- )
- add_dependencies(${TARGET_NAMESPACE}::no-pic::zlib ${PROJECT_NAME})
- endif()
- ######################################
+ add_dependencies(${target_name} ${project_name})
# Set variables indicating that zlib has been installed
- set(${TARGET_NAME}_ROOT ${INSTALL_DIR} PARENT_SCOPE)
- set(${TARGET_NAME}_INCLUDE_DIRS ${INCLUDE_DIRS} PARENT_SCOPE)
- set(${TARGET_NAME}_LIBRARIES ${LIBRARIES} PARENT_SCOPE)
- set(ZLIB_FOUND ON PARENT_SCOPE)
+ set(${lib_prefix}ROOT ${install_dir} PARENT_SCOPE)
+ set(${lib_prefix}INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${lib_prefix}LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
build_zlib(OFF)
# PIC is ON
build_zlib(ON)
+
+set(ZLIB_FOUND ON)
diff --git a/third-party/zstd-cmake/zstd.cmake b/third-party/zstd-cmake/zstd.cmake
index d5fcfe3c0a..b79150ab41 100644
--- a/third-party/zstd-cmake/zstd.cmake
+++ b/third-party/zstd-cmake/zstd.cmake
@@ -1,91 +1,100 @@
update_git_submodule(${THIRD_PARTY_DIR}/zstd "--remote")
+get_submodule_version(${THIRD_PARTY_DIR}/zstd ZSTD_VERSION)
+get_submodule_remote_url(third-party/zstd ZSTD_SOURCE_URL)
+
+function(build_zstd PIC_ENABLED)
+ set(project_generic_name zstd)
+ set(target_namespace ZSTD)
+ set(artifact_name libzstd)
+
+ make_third_party_configuration(${PIC_ENABLED} ${project_generic_name} ${target_namespace} ${artifact_name}
+ project_name
+ extra_compile_flags
+ target_name
+ lib_prefix
+ archive_name
+ )
+
+ set(source_dir ${THIRD_PARTY_DIR}/${project_generic_name})
+ set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
+ set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
+ set(binary_dir ${build_dir}/lib)
+ set(include_dirs ${install_dir}/include)
+ set(libraries ${install_dir}/lib/${archive_name})
+ set(patch_dir ${build_dir}/debian/patches/)
+ set(patch_series ${build_dir}/debian/patches/series)
+ # Ensure the build, installation and "include" directories exists
+ file(MAKE_DIRECTORY ${build_dir})
+ file(MAKE_DIRECTORY ${install_dir})
+ file(MAKE_DIRECTORY ${include_dirs})
+
+ # The configuration has been based on:
+ # https://sources.debian.org/src/libzstd/1.4.8%2Bdfsg-2.1/debian/rules/
+ set(compile_flags "$ENV{CFLAGS} -g0 -Wno-unused-but-set-variable ${extra_compile_flags}")
+
+ message(STATUS "ZSTD Summary:
+
+ PIC enabled: ${PIC_ENABLED}
+ Version: ${ZSTD_VERSION}
+ Source: ${ZSTD_SOURCE_URL}
+ Include dirs: ${include_dirs}
+ Libraries: ${libraries}
+ Target name: ${target_name}
+ Compiler:
+ C compiler: ${CMAKE_C_COMPILER}
+ CFLAGS: ${compile_flags}
+ ")
+
+ set(make_args
+ CC=${CMAKE_C_COMPILER}
+ CFLAGS=${compile_flags}
+ )
+
+ set(make_install_args
+ PREFIX=${install_dir}
+ INCLUDEDIR=${install_dir}/include/zstd
+ )
+
+ ExternalProject_Add(
+ ${project_name}
+ PREFIX ${build_dir}
+ SOURCE_DIR ${source_dir}
+ INSTALL_DIR ${install_dir}
+ BINARY_DIR ${binary_dir}
+ BUILD_BYPRODUCTS ${libraries}
+ PATCH_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${source_dir} ${build_dir}
+ COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${build_dir} -DPATCH_SERIES=${patch_series} -DPATCH_DIR=${patch_dir} -P ../../cmake/apply_patches.cmake
+ CONFIGURE_COMMAND
+ COMMAND # Nothing to configure
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E env ${make_args} make libzstd.a -j
+ INSTALL_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E env ${make_install_args} make install-static install-includes
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/libzstd.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
+ BUILD_IN_SOURCE 0
+ )
+
+ add_library(${target_name} STATIC IMPORTED)
+ set_target_properties(${target_name} PROPERTIES
+ IMPORTED_LOCATION ${libraries}
+ INTERFACE_INCLUDE_DIRECTORIES ${include_dirs}
+ )
+
+ # Ensure that the ZSTD are built before they are used
+ add_dependencies(${target_name} ${project_name})
+
+ # Set variables indicating that ZSTD has been installed
+ set(${lib_prefix}ROOT ${install_dir} PARENT_SCOPE)
+ set(${lib_prefix}INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${lib_prefix}LIBRARIES ${libraries} PARENT_SCOPE)
+endfunction()
+
+# PIC is OFF
+build_zstd(OFF)
+# PIC is ON
+build_zstd(ON)
-set(ZSTD_SOURCE_DIR ${THIRD_PARTY_DIR}/zstd)
-set(ZSTD_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/zstd/build)
-set(ZSTD_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/zstd/install)
-set(ZSTD_BINARY_DIR ${ZSTD_BUILD_DIR}/lib)
-set(ZSTD_LIBRARIES ${ZSTD_INSTALL_DIR}/lib/libzstd.a)
-set(ZSTD_INCLUDE_DIRS ${ZSTD_INSTALL_DIR}/include)
-set(ZSTD_PATCH_DIR ${ZSTD_BUILD_DIR}/debian/patches/)
-set(ZSTD_PATCH_SERIES ${ZSTD_BUILD_DIR}/debian/patches/series)
-# Ensure the build, installation and "include" directories exists
-file(MAKE_DIRECTORY ${ZSTD_BUILD_DIR})
-file(MAKE_DIRECTORY ${ZSTD_INSTALL_DIR})
-file(MAKE_DIRECTORY ${ZSTD_INCLUDE_DIRS})
-
-# The configuration has been based on:
-# https://sources.debian.org/src/libzstd/1.4.8%2Bdfsg-2.1/debian/rules/
-set(ZSTD_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -Wno-unused-but-set-variable")
-if(APPLE)
- set(ZSTD_COMPILE_FLAGS "${ZSTD_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
-else()
- set(ZSTD_COMPILE_FLAGS "${ZSTD_COMPILE_FLAGS} -static")
-endif()
-
-set(ZSTD_MAKE_ARGS
- CC=${CMAKE_C_COMPILER}
- CFLAGS=${ZSTD_COMPILE_FLAGS}
-)
-
-set(ZSTD_MAKE_INSTALL_ARGS
- PREFIX=${ZSTD_INSTALL_DIR}
- INCLUDEDIR=${ZSTD_INSTALL_DIR}/include/zstd
-)
-
-ExternalProject_Add(
- zstd
- PREFIX ${ZSTD_BUILD_DIR}
- SOURCE_DIR ${ZSTD_SOURCE_DIR}
- INSTALL_DIR ${ZSTD_INSTALL_DIR}
- BINARY_DIR ${ZSTD_BINARY_DIR}
- BUILD_BYPRODUCTS ${ZSTD_INSTALL_DIR}/lib/libzstd.a
- PATCH_COMMAND
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZSTD_SOURCE_DIR} ${ZSTD_BUILD_DIR}
- COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${ZSTD_BUILD_DIR} -DPATCH_SERIES=${ZSTD_PATCH_SERIES} -DPATCH_DIR=${ZSTD_PATCH_DIR} -P ../../cmake/apply_patches.cmake
- CONFIGURE_COMMAND
- COMMAND # Nothing to configure
- BUILD_COMMAND
- COMMAND ${CMAKE_COMMAND} -E env ${ZSTD_MAKE_ARGS} make libzstd.a -j
- INSTALL_COMMAND
- COMMAND ${CMAKE_COMMAND} -E env ${ZSTD_MAKE_INSTALL_ARGS} make install-static install-includes
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZSTD_INCLUDE_DIRS} ${INCLUDE_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ${ZSTD_LIBRARIES} ${LIB_DIR}
- BUILD_IN_SOURCE 0
-)
-
-add_library(ZSTD::zstd STATIC IMPORTED)
-set_target_properties(ZSTD::zstd PROPERTIES
- IMPORTED_LOCATION ${ZSTD_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
-)
-
-# Ensure that the zstd are built before they are used
-add_dependencies(ZSTD::zstd zstd)
-
-####################################
-add_library(ZSTD::pic::zstd STATIC IMPORTED)
-set_target_properties(ZSTD::pic::zstd PROPERTIES
- IMPORTED_LOCATION ${ZSTD_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
-)
-
-# Ensure that the zstd are built before they are used
-add_dependencies(ZSTD::pic::zstd zstd)
-
-
-add_library(ZSTD::no-pic::zstd STATIC IMPORTED)
-set_target_properties(ZSTD::no-pic::zstd PROPERTIES
- IMPORTED_LOCATION ${ZSTD_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${ZSTD_INCLUDE_DIRS}
-)
-
-# Ensure that the zstd are built before they are used
-add_dependencies(ZSTD::no-pic::zstd zstd)
-#################################################
-
-
-
-# Set variables indicating that zstd has been installed
set(ZSTD_FOUND ON)
-
-cmake_print_variables(ZSTD_LIBRARIES)
From 3356ba84c36c2911a7cbd9acdf8b81adbe08880d Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 28 Feb 2025 17:19:45 +0300
Subject: [PATCH 13/20] Introduce pic and no-pic build variants for nghttp2
Signed-off-by: Petr Shumilov
---
cmake/init-global-vars.cmake | 12 +-
cmake/utils.cmake | 16 +-
third-party/nghttp2-cmake/nghttp2.cmake | 204 +++++++++++++-----------
third-party/zlib-cmake/zlib.cmake | 25 +--
third-party/zstd-cmake/zstd.cmake | 25 +--
5 files changed, 152 insertions(+), 130 deletions(-)
diff --git a/cmake/init-global-vars.cmake b/cmake/init-global-vars.cmake
index 90e10cb434..06ee6a0cac 100644
--- a/cmake/init-global-vars.cmake
+++ b/cmake/init-global-vars.cmake
@@ -12,12 +12,12 @@ set(AUTO_DIR "${GENERATED_DIR}/auto")
set(RUNTIME_LIGHT_DIR "${BASE_DIR}/runtime-light")
set(RUNTIME_COMMON_DIR "${BASE_DIR}/runtime-common")
-set(PIC_NAMESPACE_NAME "pic")
-set(PIC_LIBRARY_SUFFIX "-${PIC_NAMESPACE_NAME}")
+set(PIC_NAMESPACE "pic")
+set(PIC_LIBRARY_SUFFIX "-${PIC_NAMESPACE}")
set(PIC_LIBRARY_SPECIFIER "PIC")
-set(NO_PIC_NAMESPACE_NAME "no-pic")
-set(NO_PIC_LIBRARY_SUFFIX "-${NO_PIC_NAMESPACE_NAME}")
+set(NO_PIC_NAMESPACE "no-pic")
+set(NO_PIC_LIBRARY_SUFFIX "-${NO_PIC_NAMESPACE}")
set(NO_PIC_LIBRARY_SPECIFIER "NO_PIC")
if(APPLE)
@@ -43,11 +43,11 @@ check_cxx_compiler_flag(-no-pie NO_PIE_IS_FOUND)
if(NO_PIE_IS_FOUND)
set(PIE_MODE_FLAGS -no-pie)
set(PIC_MODE_ENABLED ON)
- set(PIC_MODE ${NO_PIC_NAMESPACE_NAME})
+ set(PIC_MODE ${NO_PIC_NAMESPACE})
else()
set(PIE_MODE_FLAGS)
set(PIC_MODE_ENABLED OFF)
- set(PIC_MODE ${PIC_NAMESPACE_NAME})
+ set(PIC_MODE ${PIC_NAMESPACE})
endif()
# add extra build type release without NDEBUG flag
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index 282213aa67..b9200c44b0 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -20,14 +20,14 @@ function(add_vk_library_to_pic_namespace TARGET)
check_vk_library_suffix(${TARGET} ${PIC_LIBRARY_SUFFIX})
string(REGEX REPLACE "${PIC_LIBRARY_SUFFIX}$" "" new_target "${TARGET}")
- add_library(vk::${PIC_NAMESPACE_NAME}::${new_target} ALIAS ${TARGET})
+ add_library(vk::${PIC_NAMESPACE}::${new_target} ALIAS ${TARGET})
endfunction()
function(add_vk_library_to_no_pic_namespace TARGET)
check_vk_library_suffix(${TARGET} ${NO_PIC_LIBRARY_SUFFIX})
string(REGEX REPLACE "${NO_PIC_LIBRARY_SUFFIX}$" "" new_target "${TARGET}")
- add_library(vk::${NO_PIC_NAMESPACE_NAME}::${new_target} ALIAS ${TARGET})
+ add_library(vk::${NO_PIC_NAMESPACE}::${new_target} ALIAS ${TARGET})
endfunction()
function(vk_add_library_pic)
@@ -267,26 +267,28 @@ function(get_submodule_version SUBMODULE_PATH RESULT_VAR)
set(${RESULT_VAR} "${submodule_version}" PARENT_SCOPE)
endfunction()
-function(make_third_party_configuration PIC_ENABLED PROJECT_GENERIC_NAME TARGET_NAMESPACE ARTIFACT_NAME PROJECT_NAME EXTRA_COMPILE_FLAGS TARGET_NAME LIB_PREFIX ARCHIVE_NAME)
+function(make_third_party_configuration PIC_ENABLED PROJECT_GENERIC_NAME PROJECT_GENERIC_NAMESPACE ARTIFACT_NAME PROJECT_NAME TARGET_NAME EXTRA_COMPILE_FLAGS ARCHIVE_NAME NAMESPACE LIB_SPECIFIER)
if(PIC_ENABLED)
set(${PROJECT_NAME} "${PROJECT_GENERIC_NAME}${PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
+ set(${TARGET_NAME} ${PROJECT_GENERIC_NAMESPACE}::${PIC_NAMESPACE}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
if(APPLE)
set(${EXTRA_COMPILE_FLAGS} "-fPIC --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
else()
set(${EXTRA_COMPILE_FLAGS} "-fPIC" PARENT_SCOPE)
endif()
- set(${TARGET_NAME} ${TARGET_NAMESPACE}::${PIC_NAMESPACE_NAME}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
- set(${LIB_PREFIX} ${TARGET_NAMESPACE}_${PIC_LIBRARY_SPECIFIER}_ PARENT_SCOPE)
set(${ARCHIVE_NAME} "${ARTIFACT_NAME}${PIC_LIBRARY_SUFFIX}.a" PARENT_SCOPE)
+ set(${NAMESPACE} ${PIC_NAMESPACE} PARENT_SCOPE)
+ set(${LIB_SPECIFIER} ${PIC_LIBRARY_SPECIFIER} PARENT_SCOPE)
else()
set(${PROJECT_NAME} "${PROJECT_GENERIC_NAME}${NO_PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
+ set(${TARGET_NAME} ${PROJECT_GENERIC_NAMESPACE}::${NO_PIC_NAMESPACE}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
if(APPLE)
set(${EXTRA_COMPILE_FLAGS} "-fno-pic --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
else()
set(${EXTRA_COMPILE_FLAGS} "-fno-pic -static" PARENT_SCOPE)
endif()
- set(${TARGET_NAME} ${TARGET_NAMESPACE}::${NO_PIC_NAMESPACE_NAME}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
- set(${LIB_PREFIX} ${TARGET_NAMESPACE}_${NO_PIC_LIBRARY_SPECIFIER}_ PARENT_SCOPE)
set(${ARCHIVE_NAME} "${ARTIFACT_NAME}${NO_PIC_LIBRARY_SUFFIX}.a" PARENT_SCOPE)
+ set(${NAMESPACE} ${NO_PIC_NAMESPACE} PARENT_SCOPE)
+ set(${LIB_SPECIFIER} ${NO_PIC_LIBRARY_SPECIFIER} PARENT_SCOPE)
endif()
endfunction()
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
index 9ae9443052..bd0edd5c3e 100644
--- a/third-party/nghttp2-cmake/nghttp2.cmake
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -1,107 +1,125 @@
update_git_submodule(${THIRD_PARTY_DIR}/nghttp2 "--remote")
+get_submodule_version(${THIRD_PARTY_DIR}/nghttp2 NGHTTP2_VERSION)
+get_submodule_remote_url(third-party/nghttp2 NGHTTP2_SOURCE_URL)
-set(NGHTTP2_SOURCE_DIR ${THIRD_PARTY_DIR}/nghttp2)
-set(NGHTTP2_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/nghttp2/build)
-set(NGHTTP2_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/nghttp2/install)
-set(NGHTTP2_LIBRARIES ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a)
-set(NGHTTP2_INCLUDE_DIRS ${NGHTTP2_INSTALL_DIR}/include)
-set(NGHTTP2_PATCH_DIR ${NGHTTP2_BUILD_DIR}/debian/patches/)
-set(NGHTTP2_PATCH_SERIES ${NGHTTP2_BUILD_DIR}/debian/patches/series)
-# Ensure the build, installation and "include" directories exists
-file(MAKE_DIRECTORY ${NGHTTP2_BUILD_DIR})
-file(MAKE_DIRECTORY ${NGHTTP2_INSTALL_DIR})
-file(MAKE_DIRECTORY ${NGHTTP2_INCLUDE_DIRS})
+set(PROJECT_GENERIC_NAME nghttp2)
+set(PROJECT_GENERIC_NAMESPACE NGHTTP2)
+set(ARTIFACT_NAME libnghttp2)
-set(NGHTTP2_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic")
-if(NOT APPLE)
- set(NGHTTP2_COMPILE_FLAGS "${NGHTTP2_COMPILE_FLAGS} -static")
-endif()
+function(build_nghttp2 PIC_ENABLED)
+ make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
+ project_name
+ target_name
+ extra_compile_flags
+ archive_name
+ pic_namespace
+ pic_lib_specifier
+ )
-# The configuration has been based on:
-# https://salsa.debian.org/debian/nghttp2/-/blob/buster/debian/rules#L8
-set(NGHTTP2_CMAKE_ARGS
- -DCMAKE_C_FLAGS=${NGHTTP2_COMPILE_FLAGS}
- -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
- -DCMAKE_CXX_FLAGS=${NGHTTP2_COMPILE_FLAGS}
- -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
- -DCMAKE_POSITION_INDEPENDENT_CODE=OFF
- -DENABLE_WERROR=ON
- -DENABLE_THREADS=OFF
- -DENABLE_APP=OFF
- -DENABLE_HPACK_TOOLS=OFF
- -DENABLE_ASIO_LIB=OFF
- -DENABLE_EXAMPLES=OFF
- -DENABLE_PYTHON_BINDINGS=OFF
- -DENABLE_FAILMALLOC=OFF
- -DENABLE_LIB_ONLY=ON
- -DENABLE_STATIC_LIB=ON
- -DENABLE_SHARED_LIB=OFF
- -DWITH_LIBXML2=OFF
- -DWITH_JEMALLOC=OFF
- -DWITH_SPDYLAY=OFF
- -DWITH_MRUBY=OFF
- -DWITH_NEVERBLEED=OFF
- -DOPENSSL_FOUND=ON
- -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
- -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
- -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
- -DZLIB_FOUND=ON
- -DZLIB_ROOT=${ZLIB_NO_PIC_ROOT}
- -DZLIB_LIBRARIES=${ZLIB_NO_PIC_LIBRARIES}
- -DZLIB_INCLUDE_DIR=${ZLIB_NO_PIC_INCLUDE_DIRS}/zlib
-)
+ set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
+ set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
+ set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
+ set(include_dirs ${install_dir}/include)
+ set(libraries ${install_dir}/lib/${archive_name})
+ set(patch_dir ${build_dir}/debian/patches/)
+ set(patch_series ${build_dir}/debian/patches/series)
+ # Ensure the build, installation and "include" directories exists
+ file(MAKE_DIRECTORY ${build_dir})
+ file(MAKE_DIRECTORY ${install_dir})
+ file(MAKE_DIRECTORY ${include_dirs})
-ExternalProject_Add(
- nghttp2
- DEPENDS openssl zlib-no-pic
- PREFIX ${NGHTTP2_BUILD_DIR}
- SOURCE_DIR ${NGHTTP2_SOURCE_DIR}
- INSTALL_DIR ${NGHTTP2_INSTALL_DIR}
- BINARY_DIR ${NGHTTP2_BUILD_DIR}
- BUILD_BYPRODUCTS ${NGHTTP2_INSTALL_DIR}/lib/libnghttp2.a
- PATCH_COMMAND
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${NGHTTP2_SOURCE_DIR} ${NGHTTP2_BUILD_DIR}
- COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${NGHTTP2_BUILD_DIR} -DPATCH_SERIES=${NGHTTP2_PATCH_SERIES} -DPATCH_DIR=${NGHTTP2_PATCH_DIR} -P ../../cmake/apply_patches.cmake
- CONFIGURE_COMMAND
- COMMAND ${CMAKE_COMMAND} ${NGHTTP2_CMAKE_ARGS} -S ${NGHTTP2_SOURCE_DIR} -B ${NGHTTP2_BUILD_DIR} -Wno-dev
- BUILD_COMMAND
- COMMAND ${CMAKE_COMMAND} --build ${NGHTTP2_BUILD_DIR} --config $ -j
- INSTALL_COMMAND
- COMMAND ${CMAKE_COMMAND} --install ${NGHTTP2_BUILD_DIR} --prefix ${NGHTTP2_INSTALL_DIR} --config $
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${NGHTTP2_INCLUDE_DIRS} ${INCLUDE_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ${NGHTTP2_LIBRARIES} ${LIB_DIR}
- BUILD_IN_SOURCE 0
-)
+ # The configuration has been based on:
+ # https://sources.debian.org/src/libzstd/1.4.8%2Bdfsg-2.1/debian/rules/
+ set(compile_flags "$ENV{CFLAGS} -g0 ${extra_compile_flags}")
-add_library(NGHTTP2::nghttp2 STATIC IMPORTED)
-set_target_properties(NGHTTP2::nghttp2 PROPERTIES
- IMPORTED_LOCATION ${NGHTTP2_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
-)
+ message(STATUS "NGHTTP2 Summary:
-add_dependencies(NGHTTP2::nghttp2 nghttp2)
+ PIC enabled: ${PIC_ENABLED}
+ Version: ${NGHTTP2_VERSION}
+ Source: ${NGHTTP2_SOURCE_URL}
+ Include dirs: ${include_dirs}
+ Libraries: ${libraries}
+ Target name: ${target_name}
+ Compiler:
+ C compiler: ${CMAKE_C_COMPILER}
+ CFLAGS: ${compile_flags}
+ ")
-########################################
-add_library(NGHTTP2::pic::nghttp2 STATIC IMPORTED)
-set_target_properties(NGHTTP2::pic::nghttp2 PROPERTIES
- IMPORTED_LOCATION ${NGHTTP2_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
-)
+ # The configuration has been based on:
+ # https://salsa.debian.org/debian/nghttp2/-/blob/buster/debian/rules#L8
+ set(cmake_args
+ -DCMAKE_C_FLAGS=${compile_flags}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_FLAGS=${compile_flags}
+ -DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}
+ -DCMAKE_POSITION_INDEPENDENT_CODE=${PIC_ENABLED}
+ -DENABLE_WERROR=ON
+ -DENABLE_THREADS=OFF
+ -DENABLE_APP=OFF
+ -DENABLE_HPACK_TOOLS=OFF
+ -DENABLE_ASIO_LIB=OFF
+ -DENABLE_EXAMPLES=OFF
+ -DENABLE_PYTHON_BINDINGS=OFF
+ -DENABLE_FAILMALLOC=OFF
+ -DENABLE_LIB_ONLY=ON
+ -DENABLE_STATIC_LIB=ON
+ -DENABLE_SHARED_LIB=OFF
+ -DWITH_LIBXML2=OFF
+ -DWITH_JEMALLOC=OFF
+ -DWITH_SPDYLAY=OFF
+ -DWITH_MRUBY=OFF
+ -DWITH_NEVERBLEED=OFF
+ -DOPENSSL_FOUND=ON
+ -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
+ -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
+ -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
+ -DZLIB_FOUND=ON
+ -DZLIB_ROOT=${ZLIB_${pic_lib_specifier}_ROOT}
+ -DZLIB_LIBRARIES=${ZLIB_${pic_lib_specifier}_LIBRARIES}
+ -DZLIB_INCLUDE_DIR=${ZLIB_${pic_lib_specifier}_INCLUDE_DIRS}/zlib
+ )
-add_dependencies(NGHTTP2::pic::nghttp2 nghttp2)
+ ExternalProject_Add(
+ ${project_name}
+ DEPENDS openssl ZLIB::${pic_namespace}::zlib
+ PREFIX ${build_dir}
+ SOURCE_DIR ${source_dir}
+ INSTALL_DIR ${install_dir}
+ BINARY_DIR ${build_dir}
+ BUILD_BYPRODUCTS ${libraries}
+ PATCH_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${source_dir} ${build_dir}
+ COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${build_dir} -DPATCH_SERIES=${patch_series} -DPATCH_DIR=${patch_dir} -P ../../cmake/apply_patches.cmake
+ CONFIGURE_COMMAND
+ COMMAND ${CMAKE_COMMAND} ${cmake_args} -S ${source_dir} -B ${build_dir} -Wno-dev
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} --build ${build_dir} --config $ -j
+ INSTALL_COMMAND
+ COMMAND ${CMAKE_COMMAND} --install ${build_dir} --prefix ${install_dir} --config $
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
+ BUILD_IN_SOURCE 0
+ )
-add_library(NGHTTP2::no-pic::nghttp2 STATIC IMPORTED)
-set_target_properties(NGHTTP2::no-pic::nghttp2 PROPERTIES
- IMPORTED_LOCATION ${NGHTTP2_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${NGHTTP2_INCLUDE_DIRS}
-)
+ add_library(${target_name} STATIC IMPORTED)
+ set_target_properties(${target_name} PROPERTIES
+ IMPORTED_LOCATION ${libraries}
+ INTERFACE_INCLUDE_DIRECTORIES ${include_dirs}
+ )
-add_dependencies(NGHTTP2::no-pic::nghttp2 nghttp2)
-###############################################
+ # Ensure that the Nghttp2 are built before they are used
+ add_dependencies(${target_name} ${project_name})
+ # Set variables indicating that Nghttp2 has been installed
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+endfunction()
-# Set variables indicating that NGHTTP2 has been installed
-set(NGHTTP2_FOUND ON)
-set(NGHTTP2_ROOT ${NGHTTP2_INSTALL_DIR})
+# PIC is OFF
+build_nghttp2(OFF)
+# PIC is ON
+build_nghttp2(ON)
-cmake_print_variables(NGHTTP2_LIBRARIES)
+set(NGHTTP2_FOUND ON)
diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake
index b3d4f6ee93..a85e59bb9d 100644
--- a/third-party/zlib-cmake/zlib.cmake
+++ b/third-party/zlib-cmake/zlib.cmake
@@ -2,20 +2,21 @@ update_git_submodule(${THIRD_PARTY_DIR}/zlib "--recursive")
get_submodule_version(${THIRD_PARTY_DIR}/zlib ZLIB_VERSION)
get_submodule_remote_url(third-party/zlib ZLIB_SOURCE_URL)
-function(build_zlib PIC_ENABLED)
- set(project_generic_name zlib)
- set(target_namespace ZLIB)
- set(artifact_name libz)
+set(PROJECT_GENERIC_NAME zlib)
+set(PROJECT_GENERIC_NAMESPACE ZLIB)
+set(ARTIFACT_NAME libz)
- make_third_party_configuration(${PIC_ENABLED} ${project_generic_name} ${target_namespace} ${artifact_name}
+function(build_zlib PIC_ENABLED)
+ make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
project_name
- extra_compile_flags
target_name
- lib_prefix
+ extra_compile_flags
archive_name
+ pic_namespace
+ pic_lib_specifier
)
- set(source_dir ${THIRD_PARTY_DIR}/${project_generic_name})
+ set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
@@ -56,7 +57,7 @@ function(build_zlib PIC_ENABLED)
COMMAND make libz.a -j
INSTALL_COMMAND
COMMAND make install
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/libz.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
@@ -72,9 +73,9 @@ function(build_zlib PIC_ENABLED)
add_dependencies(${target_name} ${project_name})
# Set variables indicating that zlib has been installed
- set(${lib_prefix}ROOT ${install_dir} PARENT_SCOPE)
- set(${lib_prefix}INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
- set(${lib_prefix}LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
diff --git a/third-party/zstd-cmake/zstd.cmake b/third-party/zstd-cmake/zstd.cmake
index b79150ab41..f13d830167 100644
--- a/third-party/zstd-cmake/zstd.cmake
+++ b/third-party/zstd-cmake/zstd.cmake
@@ -2,20 +2,21 @@ update_git_submodule(${THIRD_PARTY_DIR}/zstd "--remote")
get_submodule_version(${THIRD_PARTY_DIR}/zstd ZSTD_VERSION)
get_submodule_remote_url(third-party/zstd ZSTD_SOURCE_URL)
-function(build_zstd PIC_ENABLED)
- set(project_generic_name zstd)
- set(target_namespace ZSTD)
- set(artifact_name libzstd)
+set(PROJECT_GENERIC_NAME zstd)
+set(PROJECT_GENERIC_NAMESPACE ZSTD)
+set(ARTIFACT_NAME libzstd)
- make_third_party_configuration(${PIC_ENABLED} ${project_generic_name} ${target_namespace} ${artifact_name}
+function(build_zstd PIC_ENABLED)
+ make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
project_name
- extra_compile_flags
target_name
- lib_prefix
+ extra_compile_flags
archive_name
+ pic_namespace
+ pic_lib_specifier
)
- set(source_dir ${THIRD_PARTY_DIR}/${project_generic_name})
+ set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(binary_dir ${build_dir}/lib)
@@ -71,7 +72,7 @@ function(build_zstd PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} -E env ${make_args} make libzstd.a -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} -E env ${make_install_args} make install-static install-includes
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/libzstd.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
@@ -87,9 +88,9 @@ function(build_zstd PIC_ENABLED)
add_dependencies(${target_name} ${project_name})
# Set variables indicating that ZSTD has been installed
- set(${lib_prefix}ROOT ${install_dir} PARENT_SCOPE)
- set(${lib_prefix}INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
- set(${lib_prefix}LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
From c688744d9ec2f45a3dc7e2e280e20bfe69252b6a Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 28 Feb 2025 17:20:03 +0300
Subject: [PATCH 14/20] Introduce pic and no-pic build variants for curl
Signed-off-by: Petr Shumilov
---
third-party/curl-cmake/curl.cmake | 201 ++++++++++++++++--------------
1 file changed, 109 insertions(+), 92 deletions(-)
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index cd24cf1253..3ae1f12d7c 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -1,107 +1,124 @@
update_git_submodule(${THIRD_PARTY_DIR}/curl "--remote")
+get_submodule_version(${THIRD_PARTY_DIR}/curl CURL_VERSION)
+get_submodule_remote_url(third-party/curl CURL_SOURCE_URL)
-set(CURL_SOURCE_DIR ${THIRD_PARTY_DIR}/curl)
-set(CURL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/curl/build)
-set(CURL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/curl/install)
-set(CURL_LIBRARIES ${CURL_INSTALL_DIR}/lib/libcurl.a)
-set(CURL_INCLUDE_DIRS ${CURL_INSTALL_DIR}/include)
-# Ensure the build, installation and "include" directories exists
-file(MAKE_DIRECTORY ${CURL_BUILD_DIR})
-file(MAKE_DIRECTORY ${CURL_INSTALL_DIR})
-file(MAKE_DIRECTORY ${CURL_INCLUDE_DIRS})
+set(PROJECT_GENERIC_NAME curl)
+set(PROJECT_GENERIC_NAMESPACE CURL)
+set(ARTIFACT_NAME libcurl)
-set(CURL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -Wno-deprecated-declarations")
-if(NOT APPLE)
- set(CURL_COMPILE_FLAGS "${CURL_COMPILE_FLAGS} -static")
-endif()
+function(build_curl PIC_ENABLED)
+ make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
+ project_name
+ target_name
+ extra_compile_flags
+ archive_name
+ pic_namespace
+ pic_lib_specifier
+ )
-# Suppress compiler-specific warnings caused by -O3
-if(COMPILER_CLANG)
- set(CURL_COMPILE_FLAGS "${CURL_COMPILE_FLAGS} -Wno-string-plus-int")
-else()
- set(CURL_COMPILE_FLAGS "${CURL_COMPILE_FLAGS} -Wno-stringop-truncation -Wno-maybe-uninitialized -Wno-stringop-overflow")
-endif()
+ set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
+ set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
+ set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
+ set(include_dirs ${install_dir}/include)
+ set(libraries ${install_dir}/lib/${archive_name})
+ # Ensure the build, installation and "include" directories exists
+ file(MAKE_DIRECTORY ${build_dir})
+ file(MAKE_DIRECTORY ${install_dir})
+ file(MAKE_DIRECTORY ${include_dirs})
-# The configuration has been based on:
-# https://github.com/VKCOM/curl/commit/00364cc6d672d9271032dbfbae3cfbc5e5f8542c
-# ./configure --prefix=/opt/curl7600 --without-librtmp --without-libssh2 --disable-ldap --disable-ldaps --disable-threaded-resolver --with-nghttp2 --enable-versioned-symbols
-set(CURL_CMAKE_ARGS
- -DCMAKE_C_FLAGS=${CURL_COMPILE_FLAGS}
- -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
- -DCMAKE_POSITION_INDEPENDENT_CODE=OFF
- -DBUILD_TESTING=OFF
- -DCURL_WERROR=ON # Recommend to enable when optimization level less than -O3
- -DBUILD_CURL_EXE=OFF
- -DCURL_STATICLIB=ON
- -DUSE_LIBRTMP=OFF # Disable RTMP support.
- -DCMAKE_USE_LIBSSH2=OFF # Disable libssh2 support.
- -DCURL_DISABLE_LDAP=ON # Disable LDAP support.
- -DCURL_DISABLE_LDAPS=ON # Disable LDAPS support.
- -DENABLE_THREADED_RESOLVER=OFF # Disable threaded resolver.
- -DUSE_NGHTTP2=ON # Enable HTTP/2 support.
- -DCMAKE_USE_OPENSSL=ON
- -DOPENSSL_FOUND=ON
- -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
- -DNGHTTP2_FOUND=ON
- -DNGHTTP2_ROOT=${NGHTTP2_ROOT}
- -DNGHTTP2_LIBRARY=${NGHTTP2_LIBRARIES}
- -DNGHTTP2_INCLUDE_DIR=${NGHTTP2_INCLUDE_DIRS}
-)
+ set(compile_flags "$ENV{CFLAGS} -g0 -Wno-deprecated-declarations ${extra_compile_flags}")
-ExternalProject_Add(
- curl
- DEPENDS openssl zlib-no-pic nghttp2
- 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} -Wno-dev
- BUILD_COMMAND
- 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}
- COMMAND ${CMAKE_COMMAND} -E copy ${CURL_INSTALL_DIR}/lib/libcurl.a ${LIB_DIR}
- BUILD_IN_SOURCE 0
-)
+ # Suppress compiler-specific warnings caused by -O3
+ if(COMPILER_CLANG)
+ set(compile_flags "${compile_flags} -Wno-string-plus-int")
+ else()
+ set(compile_flags "${compile_flags} -Wno-stringop-truncation -Wno-maybe-uninitialized -Wno-stringop-overflow")
+ endif()
-add_library(CURL::curl STATIC IMPORTED)
-set_target_properties(CURL::curl PROPERTIES
- IMPORTED_LOCATION ${CURL_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
-)
+ message(STATUS "CURL Summary:
-add_dependencies(CURL::curl curl)
+ PIC enabled: ${PIC_ENABLED}
+ Version: ${CURL_VERSION}
+ Source: ${CURL_SOURCE_URL}
+ Include dirs: ${include_dirs}
+ Libraries: ${libraries}
+ Target name: ${target_name}
+ Compiler:
+ C compiler: ${CMAKE_C_COMPILER}
+ CFLAGS: ${compile_flags}
+ ")
+ # The configuration has been based on:
+ # https://github.com/VKCOM/curl/commit/00364cc6d672d9271032dbfbae3cfbc5e5f8542c
+ # ./configure --prefix=/opt/curl7600 --without-librtmp --without-libssh2 --disable-ldap --disable-ldaps --disable-threaded-resolver --with-nghttp2 --enable-versioned-symbols
+ set(cmake_args
+ -DCMAKE_C_FLAGS=${compile_flags}
+ -DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}
+ -DCMAKE_POSITION_INDEPENDENT_CODE=${PIC_ENABLED}
+ -DBUILD_TESTING=OFF
+ -DCURL_WERROR=ON # Recommend to enable when optimization level less than -O3
+ -DBUILD_CURL_EXE=OFF
+ -DCURL_STATICLIB=ON
+ -DUSE_LIBRTMP=OFF # Disable RTMP support.
+ -DCMAKE_USE_LIBSSH2=OFF # Disable libssh2 support.
+ -DCURL_DISABLE_LDAP=ON # Disable LDAP support.
+ -DCURL_DISABLE_LDAPS=ON # Disable LDAPS support.
+ -DENABLE_THREADED_RESOLVER=OFF # Disable threaded resolver.
+ -DUSE_NGHTTP2=ON # Enable HTTP/2 support.
+ -DCMAKE_USE_OPENSSL=ON
+ -DOPENSSL_FOUND=ON
+ -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_${pic_lib_specifier}_ROOT}
+ -DZLIB_LIBRARIES=${ZLIB_${pic_lib_specifier}_LIBRARIES}
+ -DZLIB_INCLUDE_DIR=${ZLIB_${pic_lib_specifier}_INCLUDE_DIRS}/zlib
+ -DNGHTTP2_FOUND=ON
+ -DNGHTTP2_ROOT=${NGHTTP2_${pic_lib_specifier}_ROOT}
+ -DNGHTTP2_LIBRARY=${NGHTTP2_${pic_lib_specifier}_LIBRARIES}
+ -DNGHTTP2_INCLUDE_DIR=${NGHTTP2_${pic_lib_specifier}_INCLUDE_DIRS}
+ )
-##############################
-add_library(CURL::pic::curl STATIC IMPORTED)
-set_target_properties(CURL::pic::curl PROPERTIES
- IMPORTED_LOCATION ${CURL_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
-)
+ ExternalProject_Add(
+ ${project_name}
+ DEPENDS openssl ZLIB::${pic_namespace}::zlib NGHTTP2::${pic_namespace}::nghttp2
+ PREFIX ${build_dir}
+ SOURCE_DIR ${source_dir}
+ INSTALL_DIR ${install_dir}
+ BUILD_BYPRODUCTS ${libraries}
+ CONFIGURE_COMMAND
+ COMMAND ${CMAKE_COMMAND} ${cmake_args} -S ${source_dir} -B ${build_dir} -Wno-dev
+ BUILD_COMMAND
+ COMMAND ${CMAKE_COMMAND} --build ${build_dir} --config $ -j
+ INSTALL_COMMAND
+ COMMAND ${CMAKE_COMMAND} --install ${build_dir} --prefix ${install_dir} --config $
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
+ BUILD_IN_SOURCE 0
+ )
-add_dependencies(CURL::pic::curl curl)
+ add_library(${target_name} STATIC IMPORTED)
+ set_target_properties(${target_name} PROPERTIES
+ IMPORTED_LOCATION ${libraries}
+ INTERFACE_INCLUDE_DIRECTORIES ${include_dirs}
+ )
-add_library(CURL::no-pic::curl STATIC IMPORTED)
-set_target_properties(CURL::no-pic::curl PROPERTIES
- IMPORTED_LOCATION ${CURL_LIBRARIES}
- INTERFACE_INCLUDE_DIRECTORIES ${CURL_INCLUDE_DIRS}
-)
+ # Ensure that the curl are built before they are used
+ add_dependencies(${target_name} ${project_name})
-add_dependencies(CURL::no-pic::curl curl)
-###############################
+ # Set variables indicating that curl has been installed
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+endfunction()
-# Set variables indicating that curl has been installed
-set(CURL_FOUND ON)
+# PIC is OFF
+build_curl(OFF)
+# PIC is ON
+build_curl(ON)
-cmake_print_variables(CURL_LIBRARIES)
+set(CURL_FOUND ON)
From 4170aed789711470df3ae2d0dd88fdf515410089 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 28 Feb 2025 19:44:08 +0300
Subject: [PATCH 15/20] Introduce pic and no-pic build variants for OpenSSL
Signed-off-by: Petr Shumilov
---
compiler/compiler.cmake | 2 +-
third-party/curl-cmake/curl.cmake | 26 +--
third-party/nghttp2-cmake/nghttp2.cmake | 26 +--
third-party/openssl-cmake/openssl.cmake | 236 +++++++++++++-----------
third-party/zlib-cmake/zlib.cmake | 18 +-
third-party/zstd-cmake/zstd.cmake | 18 +-
6 files changed, 170 insertions(+), 156 deletions(-)
diff --git a/compiler/compiler.cmake b/compiler/compiler.cmake
index c554f4f935..c99c258312 100644
--- a/compiler/compiler.cmake
+++ b/compiler/compiler.cmake
@@ -274,7 +274,7 @@ set_property(SOURCE ${KPHP_COMPILER_DIR}/kphp2cpp.cpp
add_executable(kphp2cpp ${KPHP_COMPILER_DIR}/kphp2cpp.cpp)
target_include_directories(kphp2cpp PUBLIC ${KPHP_COMPILER_DIR})
-add_dependencies(kphp2cpp openssl)
+add_dependencies(kphp2cpp OpenSSL::no-pic::Crypto)
prepare_cross_platform_libs(COMPILER_LIBS yaml-cpp re2)
set(COMPILER_LIBS vk::no-pic::kphp2cpp_src vk::no-pic::tlo_parsing_src vk::no-pic::popular-common ${COMPILER_LIBS} fmt::fmt OpenSSL::no-pic::Crypto pthread)
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index 3ae1f12d7c..d787e9cb3a 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -2,12 +2,12 @@ update_git_submodule(${THIRD_PARTY_DIR}/curl "--remote")
get_submodule_version(${THIRD_PARTY_DIR}/curl CURL_VERSION)
get_submodule_remote_url(third-party/curl CURL_SOURCE_URL)
-set(PROJECT_GENERIC_NAME curl)
-set(PROJECT_GENERIC_NAMESPACE CURL)
-set(ARTIFACT_NAME libcurl)
+set(CURL_PROJECT_GENERIC_NAME curl)
+set(CURL_PROJECT_GENERIC_NAMESPACE CURL)
+set(CURL_ARTIFACT_NAME libcurl)
function(build_curl PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${CURL_PROJECT_GENERIC_NAME} ${CURL_PROJECT_GENERIC_NAMESPACE} ${CURL_ARTIFACT_NAME}
project_name
target_name
extra_compile_flags
@@ -16,7 +16,7 @@ function(build_curl PIC_ENABLED)
pic_lib_specifier
)
- set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
+ set(source_dir ${THIRD_PARTY_DIR}/${CURL_PROJECT_GENERIC_NAME})
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
@@ -67,9 +67,9 @@ function(build_curl PIC_ENABLED)
-DUSE_NGHTTP2=ON # Enable HTTP/2 support.
-DCMAKE_USE_OPENSSL=ON
-DOPENSSL_FOUND=ON
- -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
- -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
- -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
+ -DOPENSSL_ROOT_DIR=${OPENSSL_${pic_lib_specifier}_ROOT_DIR}
+ -DOPENSSL_LIBRARIES=${OPENSSL_${pic_lib_specifier}_LIBRARIES}
+ -DOPENSSL_INCLUDE_DIR=${OPENSSL_${pic_lib_specifier}_INCLUDE_DIR}
-DCURL_ZLIB=ON
-DZLIB_FOUND=ON
-DCURL_SPECIAL_LIBZ=ON
@@ -84,7 +84,7 @@ function(build_curl PIC_ENABLED)
ExternalProject_Add(
${project_name}
- DEPENDS openssl ZLIB::${pic_namespace}::zlib NGHTTP2::${pic_namespace}::nghttp2
+ DEPENDS OpenSSL::${pic_namespace}::Crypto OpenSSL::${pic_namespace}::SSL ZLIB::${pic_namespace}::zlib NGHTTP2::${pic_namespace}::nghttp2
PREFIX ${build_dir}
SOURCE_DIR ${source_dir}
INSTALL_DIR ${install_dir}
@@ -95,7 +95,7 @@ function(build_curl PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} --build ${build_dir} --config $ -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} --install ${build_dir} --prefix ${install_dir} --config $
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${CURL_ARTIFACT_NAME}.a ${libraries}
COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
@@ -111,9 +111,9 @@ function(build_curl PIC_ENABLED)
add_dependencies(${target_name} ${project_name})
# Set variables indicating that curl has been installed
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${CURL_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${CURL_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${CURL_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
index bd0edd5c3e..fdc5c0b762 100644
--- a/third-party/nghttp2-cmake/nghttp2.cmake
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -2,12 +2,12 @@ update_git_submodule(${THIRD_PARTY_DIR}/nghttp2 "--remote")
get_submodule_version(${THIRD_PARTY_DIR}/nghttp2 NGHTTP2_VERSION)
get_submodule_remote_url(third-party/nghttp2 NGHTTP2_SOURCE_URL)
-set(PROJECT_GENERIC_NAME nghttp2)
-set(PROJECT_GENERIC_NAMESPACE NGHTTP2)
-set(ARTIFACT_NAME libnghttp2)
+set(NGHTTP2_PROJECT_GENERIC_NAME nghttp2)
+set(NGHTTP2_PROJECT_GENERIC_NAMESPACE NGHTTP2)
+set(NGHTTP2_ARTIFACT_NAME libnghttp2)
function(build_nghttp2 PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${NGHTTP2_PROJECT_GENERIC_NAME} ${NGHTTP2_PROJECT_GENERIC_NAMESPACE} ${NGHTTP2_ARTIFACT_NAME}
project_name
target_name
extra_compile_flags
@@ -16,7 +16,7 @@ function(build_nghttp2 PIC_ENABLED)
pic_lib_specifier
)
- set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
+ set(source_dir ${THIRD_PARTY_DIR}/${NGHTTP2_PROJECT_GENERIC_NAME})
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
@@ -70,9 +70,9 @@ function(build_nghttp2 PIC_ENABLED)
-DWITH_MRUBY=OFF
-DWITH_NEVERBLEED=OFF
-DOPENSSL_FOUND=ON
- -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
- -DOPENSSL_LIBRARIES=${OPENSSL_LIBRARIES}
- -DOPENSSL_INCLUDE_DIR=${OPENSSL_INCLUDE_DIR}
+ -DOPENSSL_ROOT_DIR=${OPENSSL_${pic_lib_specifier}_ROOT_DIR}
+ -DOPENSSL_LIBRARIES=${OPENSSL_${pic_lib_specifier}_LIBRARIES}
+ -DOPENSSL_INCLUDE_DIR=${OPENSSL_${pic_lib_specifier}_INCLUDE_DIR}
-DZLIB_FOUND=ON
-DZLIB_ROOT=${ZLIB_${pic_lib_specifier}_ROOT}
-DZLIB_LIBRARIES=${ZLIB_${pic_lib_specifier}_LIBRARIES}
@@ -81,7 +81,7 @@ function(build_nghttp2 PIC_ENABLED)
ExternalProject_Add(
${project_name}
- DEPENDS openssl ZLIB::${pic_namespace}::zlib
+ DEPENDS OpenSSL::${pic_namespace}::Crypto OpenSSL::${pic_namespace}::SSL ZLIB::${pic_namespace}::zlib
PREFIX ${build_dir}
SOURCE_DIR ${source_dir}
INSTALL_DIR ${install_dir}
@@ -96,7 +96,7 @@ function(build_nghttp2 PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} --build ${build_dir} --config $ -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} --install ${build_dir} --prefix ${install_dir} --config $
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${NGHTTP2_ARTIFACT_NAME}.a ${libraries}
COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
@@ -112,9 +112,9 @@ function(build_nghttp2 PIC_ENABLED)
add_dependencies(${target_name} ${project_name})
# Set variables indicating that Nghttp2 has been installed
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${NGHTTP2_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${NGHTTP2_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${NGHTTP2_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake
index ed284d51cf..74a4edfc36 100644
--- a/third-party/openssl-cmake/openssl.cmake
+++ b/third-party/openssl-cmake/openssl.cmake
@@ -1,115 +1,129 @@
update_git_submodule(${THIRD_PARTY_DIR}/openssl "--remote")
+get_submodule_version(${THIRD_PARTY_DIR}/openssl OPENSSL_VERSION)
+get_submodule_remote_url(third-party/openssl OPENSSL_SOURCE_URL)
+
+set(OPENSSL_PROJECT_GENERIC_NAME openssl)
+set(OPENSSL_PROJECT_GENERIC_NAMESPACE OpenSSL)
+set(OPENSSL_FOUND_VARIABLE_PREFIX OPENSSL)
+set(OPENSSL_CRYPTO_ARTIFACT_NAME libcrypto)
+set(OPENSSL_SSL_ARTIFACT_NAME libssl)
+set(OPENSSL_CRYPTO_TARGET Crypto)
+set(OPENSSL_SSL_TARGET SSL)
+
+function(build_openssl PIC_ENABLED)
+ make_third_party_configuration(${PIC_ENABLED} ${OPENSSL_PROJECT_GENERIC_NAME} ${OPENSSL_PROJECT_GENERIC_NAMESPACE} ""
+ project_name
+ target_name
+ extra_compile_flags
+ archive_name
+ pic_namespace
+ pic_lib_specifier
+ )
+
+ set(source_dir ${THIRD_PARTY_DIR}/${OPENSSL_PROJECT_GENERIC_NAME})
+ set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
+ set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
+ set(include_dirs ${install_dir}/include)
+ set(crypto_library ${install_dir}/lib/${OPENSSL_CRYPTO_ARTIFACT_NAME}-${pic_namespace}.a)
+ set(ssl_library ${install_dir}/lib/${OPENSSL_SSL_ARTIFACT_NAME}-${pic_namespace}.a)
+ set(libraries ${crypto_library} ${ssl_library})
+ set(patch_dir ${build_dir}/debian/patches/)
+ set(patch_series ${build_dir}/debian/patches/series)
+ set(crypto_target ${OPENSSL_PROJECT_GENERIC_NAMESPACE}::${pic_namespace}::${OPENSSL_CRYPTO_TARGET})
+ set(ssl_target ${OPENSSL_PROJECT_GENERIC_NAMESPACE}::${pic_namespace}::${OPENSSL_SSL_TARGET})
+ # Ensure the build, installation and "include" directories exists
+ file(MAKE_DIRECTORY ${build_dir})
+ file(MAKE_DIRECTORY ${install_dir})
+ file(MAKE_DIRECTORY ${include_dirs})
+
+ set(compile_flags "$ENV{CFLAGS} -g0 ${extra_compile_flags}")
+
+ # The configuration has been based on:
+ # https://packages.debian.org/buster/libssl1.1
+ #
+ # CONFARGS = --prefix=/usr --openssldir=/usr/lib/ssl --libdir=lib/$(DEB_HOST_MULTIARCH) no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms
+ # ...
+ # ifeq ($(DEB_HOST_ARCH_CPU), amd64)
+ # CONFARGS += enable-ec_nistp_64_gcc_128
+ # endif
+ #
+ set(configure_flags --openssldir=/usr/lib/ssl no-shared no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms no-tests)
+ if (NOT PIC_ENABLED)
+ set(configure_flags ${configure_flags} no-pic -static)
+ endif()
+ if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+ set(configure_flags ${configure_flags} enable-ec_nistp_64_gcc_128)
+ endif()
+
+ message(STATUS "OpenSSL Summary:
+
+ PIC enabled: ${PIC_ENABLED}
+ Version: ${OPENSSL_VERSION}
+ Source: ${OPENSSL_SOURCE_URL}
+ Include dirs: ${include_dirs}
+ Crypto lib: ${crypto_library}
+ Crypto target: ${crypto_target}
+ SSL lib: ${ssl_library}
+ SSL target: ${ssl_target}
+ Configure:
+ Flags: ${configure_flags}
+ Compiler:
+ C compiler: ${CMAKE_C_COMPILER}
+ CFLAGS: ${compile_flags}
+ ")
+
+ ExternalProject_Add(
+ ${project_name}
+ PREFIX ${build_dir}
+ SOURCE_DIR ${source_dir}
+ INSTALL_DIR ${install_dir}
+ BINARY_DIR ${build_dir}
+ BUILD_BYPRODUCTS ${libraries}
+ PATCH_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${source_dir} ${build_dir}
+ COMMAND ${CMAKE_COMMAND} -DBUILD_DIR=${build_dir} -DPATCH_SERIES=${patch_series} -DPATCH_DIR=${patch_dir} -P ../../cmake/apply_patches.cmake
+ CONFIGURE_COMMAND
+ COMMAND ${CMAKE_COMMAND} -E env CC=${CMAKE_C_COMPILER} CFLAGS=${compile_flags} ./config --prefix=${install_dir} ${configure_flags}
+ BUILD_COMMAND
+ COMMAND make build_libs -j
+ INSTALL_COMMAND
+ COMMAND make install_dev
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${OPENSSL_CRYPTO_ARTIFACT_NAME}.a ${crypto_library}
+ COMMAND ${CMAKE_COMMAND} -E copy ${crypto_library} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${OPENSSL_SSL_ARTIFACT_NAME}.a ${ssl_library}
+ COMMAND ${CMAKE_COMMAND} -E copy ${ssl_library} ${LIB_DIR}
+ COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
+ BUILD_IN_SOURCE 0
+ )
+
+ add_library(${crypto_target} STATIC IMPORTED)
+ set_target_properties(${crypto_target} PROPERTIES
+ IMPORTED_LOCATION ${crypto_library}
+ INTERFACE_INCLUDE_DIRECTORIES ${include_dirs}
+ )
+
+ add_library(${ssl_target} STATIC IMPORTED)
+ set_target_properties(${ssl_target} PROPERTIES
+ IMPORTED_LOCATION ${ssl_library}
+ INTERFACE_INCLUDE_DIRECTORIES ${include_dirs}
+ )
+
+ # Ensure that the ssl and crypto are built before they are used
+ add_dependencies(${crypto_target} ${project_name})
+ add_dependencies(${ssl_target} ${project_name})
+
+ # Set variables indicating that OpenSSL has been installed
+ set(${OPENSSL_FOUND_VARIABLE_PREFIX}_${pic_lib_specifier}_ROOT_DIR ${install_dir} PARENT_SCOPE)
+ set(${OPENSSL_FOUND_VARIABLE_PREFIX}_${pic_lib_specifier}_INCLUDE_DIR ${include_dirs} PARENT_SCOPE)
+ set(${OPENSSL_FOUND_VARIABLE_PREFIX}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${OPENSSL_FOUND_VARIABLE_PREFIX}_${pic_lib_specifier}_CRYPTO_LIBRARY ${crypto_library} PARENT_SCOPE)
+ set(${OPENSSL_FOUND_VARIABLE_PREFIX}_${pic_lib_specifier}_SSL_LIBRARY ${ssl_library} PARENT_SCOPE)
+endfunction()
+
+# PIC is OFF
+build_openssl(OFF)
+# PIC is ON
+build_openssl(ON)
-set(OPENSSL_SOURCE_DIR ${THIRD_PARTY_DIR}/openssl)
-set(OPENSSL_BUILD_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/build)
-set(OPENSSL_INSTALL_DIR ${CMAKE_BINARY_DIR}/third-party/openssl/install)
-set(OPENSSL_PATCH_DIR ${OPENSSL_BUILD_DIR}/debian/patches/)
-set(OPENSSL_PATCH_SERIES ${OPENSSL_BUILD_DIR}/debian/patches/series)
-# Ensure the build and installation directories exists
-file(MAKE_DIRECTORY ${OPENSSL_BUILD_DIR})
-file(MAKE_DIRECTORY ${OPENSSL_INSTALL_DIR})
-
-set(OPENSSL_COMPILE_FLAGS "$ENV{CFLAGS} -g0 -fno-pic -static")
-
-# The configuration has been based on:
-# https://packages.debian.org/buster/libssl1.1
-#
-# CONFARGS = --prefix=/usr --openssldir=/usr/lib/ssl --libdir=lib/$(DEB_HOST_MULTIARCH) no-idea no-mdc2 no-rc5 no-zlib no-ssl3 enable-unit-test no-ssl3-method enable-rfc3779 enable-cms
-# ...
-# ifeq ($(DEB_HOST_ARCH_CPU), amd64)
-# CONFARGS += enable-ec_nistp_64_gcc_128
-# endif
-#
-if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
- set(OPENSSL_CONFIGURE_EXTRA_OPTION enable-ec_nistp_64_gcc_128)
-endif()
-
-if(APPLE)
- set(OPENSSL_COMPILE_FLAGS "${OPENSSL_COMPILE_FLAGS} --sysroot ${CMAKE_OSX_SYSROOT}")
-endif()
-
-ExternalProject_Add(
- openssl
- PREFIX ${OPENSSL_BUILD_DIR}
- SOURCE_DIR ${OPENSSL_SOURCE_DIR}
- INSTALL_DIR ${OPENSSL_INSTALL_DIR}
- BINARY_DIR ${OPENSSL_BUILD_DIR}
- BUILD_BYPRODUCTS ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- PATCH_COMMAND
- 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 ${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 make build_libs -j
- INSTALL_COMMAND
- 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}
- BUILD_IN_SOURCE 0
-)
-
-set(OPENSSL_INCLUDE_DIR ${OPENSSL_INSTALL_DIR}/include)
-# Ensure the include directory exists
-file(MAKE_DIRECTORY ${OPENSSL_INCLUDE_DIR})
-
-add_library(OpenSSL::SSL STATIC IMPORTED)
-set_target_properties(OpenSSL::SSL PROPERTIES
- IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libssl.a
- INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
-)
-
-add_library(OpenSSL::Crypto STATIC IMPORTED)
-set_target_properties(OpenSSL::Crypto PROPERTIES
- IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
-)
-
-# Ensure that the OpenSSL libraries are built before they are used
-add_dependencies(OpenSSL::SSL openssl)
-add_dependencies(OpenSSL::Crypto openssl)
-
-
-##########################################
-add_library(OpenSSL::pic::SSL STATIC IMPORTED)
-set_target_properties(OpenSSL::pic::SSL PROPERTIES
- IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libssl.a
- INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
-)
-
-add_library(OpenSSL::pic::Crypto STATIC IMPORTED)
-set_target_properties(OpenSSL::pic::Crypto PROPERTIES
- IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
-)
-
-add_dependencies(OpenSSL::pic::SSL openssl)
-add_dependencies(OpenSSL::pic::Crypto openssl)
-
-
-add_library(OpenSSL::no-pic::SSL STATIC IMPORTED)
-set_target_properties(OpenSSL::no-pic::SSL PROPERTIES
- IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libssl.a
- INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
-)
-
-add_library(OpenSSL::no-pic::Crypto STATIC IMPORTED)
-set_target_properties(OpenSSL::no-pic::Crypto PROPERTIES
- IMPORTED_LOCATION ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a
- INTERFACE_INCLUDE_DIRECTORIES ${OPENSSL_INCLUDE_DIR}
-)
-
-add_dependencies(OpenSSL::no-pic::SSL openssl)
-add_dependencies(OpenSSL::no-pic::Crypto openssl)
-###################
-
-# Set variables indicating that OpenSSL has been found and specify its library locations
set(OPENSSL_FOUND ON)
-set(OPENSSL_ROOT_DIR ${OPENSSL_INSTALL_DIR})
-set(OPENSSL_LIBRARIES ${OPENSSL_INSTALL_DIR}/lib/libssl.a ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a)
-set(OPENSSL_CRYPTO_LIBRARY ${OPENSSL_INSTALL_DIR}/lib/libcrypto.a)
-set(OPENSSL_SSL_LIBRARY ${OPENSSL_INSTALL_DIR}/lib/libssl.a)
set(OPENSSL_USE_STATIC_LIBS ON)
-
-cmake_print_variables(OPENSSL_LIBRARIES)
diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake
index a85e59bb9d..7fcdf836b3 100644
--- a/third-party/zlib-cmake/zlib.cmake
+++ b/third-party/zlib-cmake/zlib.cmake
@@ -2,12 +2,12 @@ update_git_submodule(${THIRD_PARTY_DIR}/zlib "--recursive")
get_submodule_version(${THIRD_PARTY_DIR}/zlib ZLIB_VERSION)
get_submodule_remote_url(third-party/zlib ZLIB_SOURCE_URL)
-set(PROJECT_GENERIC_NAME zlib)
-set(PROJECT_GENERIC_NAMESPACE ZLIB)
-set(ARTIFACT_NAME libz)
+set(ZLIB_PROJECT_GENERIC_NAME zlib)
+set(ZLIB_PROJECT_GENERIC_NAMESPACE ZLIB)
+set(ZLIB_ARTIFACT_NAME libz)
function(build_zlib PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${ZLIB_PROJECT_GENERIC_NAME} ${ZLIB_PROJECT_GENERIC_NAMESPACE} ${ZLIB_ARTIFACT_NAME}
project_name
target_name
extra_compile_flags
@@ -16,7 +16,7 @@ function(build_zlib PIC_ENABLED)
pic_lib_specifier
)
- set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
+ set(source_dir ${THIRD_PARTY_DIR}/${ZLIB_PROJECT_GENERIC_NAME})
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
@@ -57,7 +57,7 @@ function(build_zlib PIC_ENABLED)
COMMAND make libz.a -j
INSTALL_COMMAND
COMMAND make install
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ZLIB_ARTIFACT_NAME}.a ${libraries}
COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
@@ -73,9 +73,9 @@ function(build_zlib PIC_ENABLED)
add_dependencies(${target_name} ${project_name})
# Set variables indicating that zlib has been installed
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${ZLIB_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${ZLIB_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${ZLIB_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
diff --git a/third-party/zstd-cmake/zstd.cmake b/third-party/zstd-cmake/zstd.cmake
index f13d830167..e243b8bcad 100644
--- a/third-party/zstd-cmake/zstd.cmake
+++ b/third-party/zstd-cmake/zstd.cmake
@@ -2,12 +2,12 @@ update_git_submodule(${THIRD_PARTY_DIR}/zstd "--remote")
get_submodule_version(${THIRD_PARTY_DIR}/zstd ZSTD_VERSION)
get_submodule_remote_url(third-party/zstd ZSTD_SOURCE_URL)
-set(PROJECT_GENERIC_NAME zstd)
-set(PROJECT_GENERIC_NAMESPACE ZSTD)
-set(ARTIFACT_NAME libzstd)
+set(ZSTD_PROJECT_GENERIC_NAME zstd)
+set(ZSTD_PROJECT_GENERIC_NAMESPACE ZSTD)
+set(ZSTD_ARTIFACT_NAME libzstd)
function(build_zstd PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${PROJECT_GENERIC_NAME} ${PROJECT_GENERIC_NAMESPACE} ${ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${ZSTD_PROJECT_GENERIC_NAME} ${ZSTD_PROJECT_GENERIC_NAMESPACE} ${ZSTD_ARTIFACT_NAME}
project_name
target_name
extra_compile_flags
@@ -16,7 +16,7 @@ function(build_zstd PIC_ENABLED)
pic_lib_specifier
)
- set(source_dir ${THIRD_PARTY_DIR}/${PROJECT_GENERIC_NAME})
+ set(source_dir ${THIRD_PARTY_DIR}/${ZSTD_PROJECT_GENERIC_NAME})
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(binary_dir ${build_dir}/lib)
@@ -72,7 +72,7 @@ function(build_zstd PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} -E env ${make_args} make libzstd.a -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} -E env ${make_install_args} make install-static install-includes
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ARTIFACT_NAME}.a ${libraries}
+ COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ZSTD_ARTIFACT_NAME}.a ${libraries}
COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
@@ -88,9 +88,9 @@ function(build_zstd PIC_ENABLED)
add_dependencies(${target_name} ${project_name})
# Set variables indicating that ZSTD has been installed
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
- set(${PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
+ set(${ZSTD_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_ROOT ${install_dir} PARENT_SCOPE)
+ set(${ZSTD_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_INCLUDE_DIRS ${include_dirs} PARENT_SCOPE)
+ set(${ZSTD_PROJECT_GENERIC_NAMESPACE}_${pic_lib_specifier}_LIBRARIES ${libraries} PARENT_SCOPE)
endfunction()
# PIC is OFF
From 0d97b3925410a147879e1f0dffee1ed73eb8b08f Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 28 Feb 2025 20:51:46 +0300
Subject: [PATCH 16/20] Remove useless cmake files
Signed-off-by: Petr Shumilov
---
third-party/zlib-cmake/zlib-no-pic.cmake | 53 ------------------------
third-party/zlib-cmake/zlib-pic.cmake | 49 ----------------------
2 files changed, 102 deletions(-)
delete mode 100644 third-party/zlib-cmake/zlib-no-pic.cmake
delete mode 100644 third-party/zlib-cmake/zlib-pic.cmake
diff --git a/third-party/zlib-cmake/zlib-no-pic.cmake b/third-party/zlib-cmake/zlib-no-pic.cmake
deleted file mode 100644
index a2758a8c68..0000000000
--- a/third-party/zlib-cmake/zlib-no-pic.cmake
+++ /dev/null
@@ -1,53 +0,0 @@
-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}
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZLIB_NO_PIC_INCLUDE_DIRS} ${INCLUDE_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
deleted file mode 100644
index 021bcb958a..0000000000
--- a/third-party/zlib-cmake/zlib-pic.cmake
+++ /dev/null
@@ -1,49 +0,0 @@
-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}
- COMMAND ${CMAKE_COMMAND} -E copy_directory ${ZLIB_PIC_INCLUDE_DIRS} ${INCLUDE_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)
From c633d284d1675d2436596fdd2f4bd563f7ad68e4 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Fri, 28 Feb 2025 21:39:27 +0300
Subject: [PATCH 17/20] Remove unnecessary copying of third-party artifacts
into objs/lib
Signed-off-by: Petr Shumilov
---
cmake/utils.cmake | 28 ++++++++++++-------------
compiler/compiler-settings.cpp | 26 -----------------------
flex/flex.cmake | 4 ----
third-party/curl-cmake/curl.cmake | 7 ++-----
third-party/nghttp2-cmake/nghttp2.cmake | 7 ++-----
third-party/openssl-cmake/openssl.cmake | 11 +++-------
third-party/zlib-cmake/zlib.cmake | 7 ++-----
third-party/zstd-cmake/zstd.cmake | 7 ++-----
8 files changed, 24 insertions(+), 73 deletions(-)
diff --git a/cmake/utils.cmake b/cmake/utils.cmake
index b9200c44b0..38ce0ad5f6 100644
--- a/cmake/utils.cmake
+++ b/cmake/utils.cmake
@@ -267,28 +267,26 @@ function(get_submodule_version SUBMODULE_PATH RESULT_VAR)
set(${RESULT_VAR} "${submodule_version}" PARENT_SCOPE)
endfunction()
-function(make_third_party_configuration PIC_ENABLED PROJECT_GENERIC_NAME PROJECT_GENERIC_NAMESPACE ARTIFACT_NAME PROJECT_NAME TARGET_NAME EXTRA_COMPILE_FLAGS ARCHIVE_NAME NAMESPACE LIB_SPECIFIER)
+function(make_third_party_configuration PIC_ENABLED PROJECT_GENERIC_NAME PROJECT_GENERIC_NAMESPACE OUT_PROJECT_NAME OUT_TARGET_NAME OUT_EXTRA_COMPILE_FLAGS OUT_NAMESPACE OUT_LIB_SPECIFIER)
if(PIC_ENABLED)
- set(${PROJECT_NAME} "${PROJECT_GENERIC_NAME}${PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
- set(${TARGET_NAME} ${PROJECT_GENERIC_NAMESPACE}::${PIC_NAMESPACE}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
+ set(${OUT_PROJECT_NAME} "${PROJECT_GENERIC_NAME}${PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
+ set(${OUT_TARGET_NAME} ${PROJECT_GENERIC_NAMESPACE}::${PIC_NAMESPACE}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
if(APPLE)
- set(${EXTRA_COMPILE_FLAGS} "-fPIC --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
+ set(${OUT_EXTRA_COMPILE_FLAGS} "-fPIC --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
else()
- set(${EXTRA_COMPILE_FLAGS} "-fPIC" PARENT_SCOPE)
+ set(${OUT_EXTRA_COMPILE_FLAGS} "-fPIC" PARENT_SCOPE)
endif()
- set(${ARCHIVE_NAME} "${ARTIFACT_NAME}${PIC_LIBRARY_SUFFIX}.a" PARENT_SCOPE)
- set(${NAMESPACE} ${PIC_NAMESPACE} PARENT_SCOPE)
- set(${LIB_SPECIFIER} ${PIC_LIBRARY_SPECIFIER} PARENT_SCOPE)
+ set(${OUT_NAMESPACE} ${PIC_NAMESPACE} PARENT_SCOPE)
+ set(${OUT_LIB_SPECIFIER} ${PIC_LIBRARY_SPECIFIER} PARENT_SCOPE)
else()
- set(${PROJECT_NAME} "${PROJECT_GENERIC_NAME}${NO_PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
- set(${TARGET_NAME} ${PROJECT_GENERIC_NAMESPACE}::${NO_PIC_NAMESPACE}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
+ set(${OUT_PROJECT_NAME} "${PROJECT_GENERIC_NAME}${NO_PIC_LIBRARY_SUFFIX}" PARENT_SCOPE)
+ set(${OUT_TARGET_NAME} ${PROJECT_GENERIC_NAMESPACE}::${NO_PIC_NAMESPACE}::${PROJECT_GENERIC_NAME} PARENT_SCOPE)
if(APPLE)
- set(${EXTRA_COMPILE_FLAGS} "-fno-pic --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
+ set(${OUT_EXTRA_COMPILE_FLAGS} "-fno-pic --sysroot ${CMAKE_OSX_SYSROOT}" PARENT_SCOPE)
else()
- set(${EXTRA_COMPILE_FLAGS} "-fno-pic -static" PARENT_SCOPE)
+ set(${OUT_EXTRA_COMPILE_FLAGS} "-fno-pic -static" PARENT_SCOPE)
endif()
- set(${ARCHIVE_NAME} "${ARTIFACT_NAME}${NO_PIC_LIBRARY_SUFFIX}.a" PARENT_SCOPE)
- set(${NAMESPACE} ${NO_PIC_NAMESPACE} PARENT_SCOPE)
- set(${LIB_SPECIFIER} ${NO_PIC_LIBRARY_SPECIFIER} PARENT_SCOPE)
+ set(${OUT_NAMESPACE} ${NO_PIC_NAMESPACE} PARENT_SCOPE)
+ set(${OUT_LIB_SPECIFIER} ${NO_PIC_LIBRARY_SPECIFIER} PARENT_SCOPE)
endif()
endfunction()
diff --git a/compiler/compiler-settings.cpp b/compiler/compiler-settings.cpp
index 3488c6131d..2628e19be0 100644
--- a/compiler/compiler-settings.cpp
+++ b/compiler/compiler-settings.cpp
@@ -149,21 +149,6 @@ void append_3dparty_headers(std::string &cxx_flags, const std::string &path_to_3
cxx_flags += " -I" + path_to_3dparty + "include/";
}
-[[maybe_unused]] void append_3dparty_lib(std::string &ld_flags, const std::string &path_to_3dparty, const std::string &libname) noexcept {
- ld_flags += " " + path_to_3dparty + "lib/lib" + libname + ".a";
-}
-
-[[maybe_unused]] void append_curl([[maybe_unused]] std::string &cxx_flags, std::string &ld_flags, [[maybe_unused]] const std::string &path_to_3dparty) noexcept {
- if (!contains_lib(ld_flags, "curl")) {
-#if defined(__APPLE__)
- ld_flags += " -lcurl";
-#else
- // TODO make it as an option?
- append_3dparty_lib(ld_flags, path_to_3dparty, "curl");
-#endif
- }
-}
-
void append_apple_options(std::string &cxx_flags, std::string &ld_flags) noexcept {
#if defined(__APPLE__)
#ifdef __arm64__
@@ -370,7 +355,6 @@ void CompilerSettings::init() {
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", "kphp-timelib"};
@@ -428,16 +412,6 @@ void CompilerSettings::init() {
system_installed_dynamic_libs.emplace_back("rt");
#endif
-// append_3dparty_lib(ld_flags.value_, third_party_path, "ssl");
-// append_3dparty_lib(ld_flags.value_, third_party_path, "crypto");
-// append_3dparty_lib(ld_flags.value_, third_party_path, "nghttp2");
-// append_3dparty_lib(ld_flags.value_, third_party_path, "zstd");
-// 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_if_doesnt_contain(ld_flags.value_, system_installed_dynamic_libs, "-l");
ld_flags.value_ += " -rdynamic";
diff --git a/flex/flex.cmake b/flex/flex.cmake
index 1302abbfda..c3061f7c4a 100644
--- a/flex/flex.cmake
+++ b/flex/flex.cmake
@@ -44,10 +44,6 @@ set_target_properties(flex_data_shared-pic flex_data_static-no-pic
PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${OBJS_DIR}/flex
ARCHIVE_OUTPUT_DIRECTORY ${OBJS_DIR}/flex
OUTPUT_NAME vk-flex-data)
-add_custom_command(
- TARGET flex_data_static-no-pic POST_BUILD
- COMMAND ${CMAKE_COMMAND} -E copy $ ${OBJS_DIR}/lib/libvk-flex-data.a
-)
install(TARGETS flex_data_shared-pic flex_data_static-no-pic
COMPONENT FLEX
diff --git a/third-party/curl-cmake/curl.cmake b/third-party/curl-cmake/curl.cmake
index d787e9cb3a..6d27bbbc01 100644
--- a/third-party/curl-cmake/curl.cmake
+++ b/third-party/curl-cmake/curl.cmake
@@ -7,11 +7,10 @@ set(CURL_PROJECT_GENERIC_NAMESPACE CURL)
set(CURL_ARTIFACT_NAME libcurl)
function(build_curl PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${CURL_PROJECT_GENERIC_NAME} ${CURL_PROJECT_GENERIC_NAMESPACE} ${CURL_ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${CURL_PROJECT_GENERIC_NAME} ${CURL_PROJECT_GENERIC_NAMESPACE}
project_name
target_name
extra_compile_flags
- archive_name
pic_namespace
pic_lib_specifier
)
@@ -20,7 +19,7 @@ function(build_curl PIC_ENABLED)
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
- set(libraries ${install_dir}/lib/${archive_name})
+ set(libraries ${install_dir}/lib/${CURL_ARTIFACT_NAME}.a)
# Ensure the build, installation and "include" directories exists
file(MAKE_DIRECTORY ${build_dir})
file(MAKE_DIRECTORY ${install_dir})
@@ -95,8 +94,6 @@ function(build_curl PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} --build ${build_dir} --config $ -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} --install ${build_dir} --prefix ${install_dir} --config $
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${CURL_ARTIFACT_NAME}.a ${libraries}
- COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
)
diff --git a/third-party/nghttp2-cmake/nghttp2.cmake b/third-party/nghttp2-cmake/nghttp2.cmake
index fdc5c0b762..d48a7dd25d 100644
--- a/third-party/nghttp2-cmake/nghttp2.cmake
+++ b/third-party/nghttp2-cmake/nghttp2.cmake
@@ -7,11 +7,10 @@ set(NGHTTP2_PROJECT_GENERIC_NAMESPACE NGHTTP2)
set(NGHTTP2_ARTIFACT_NAME libnghttp2)
function(build_nghttp2 PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${NGHTTP2_PROJECT_GENERIC_NAME} ${NGHTTP2_PROJECT_GENERIC_NAMESPACE} ${NGHTTP2_ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${NGHTTP2_PROJECT_GENERIC_NAME} ${NGHTTP2_PROJECT_GENERIC_NAMESPACE}
project_name
target_name
extra_compile_flags
- archive_name
pic_namespace
pic_lib_specifier
)
@@ -20,7 +19,7 @@ function(build_nghttp2 PIC_ENABLED)
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
- set(libraries ${install_dir}/lib/${archive_name})
+ set(libraries ${install_dir}/lib/${NGHTTP2_ARTIFACT_NAME}.a)
set(patch_dir ${build_dir}/debian/patches/)
set(patch_series ${build_dir}/debian/patches/series)
# Ensure the build, installation and "include" directories exists
@@ -96,8 +95,6 @@ function(build_nghttp2 PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} --build ${build_dir} --config $ -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} --install ${build_dir} --prefix ${install_dir} --config $
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${NGHTTP2_ARTIFACT_NAME}.a ${libraries}
- COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
)
diff --git a/third-party/openssl-cmake/openssl.cmake b/third-party/openssl-cmake/openssl.cmake
index 74a4edfc36..0fec65a816 100644
--- a/third-party/openssl-cmake/openssl.cmake
+++ b/third-party/openssl-cmake/openssl.cmake
@@ -11,11 +11,10 @@ set(OPENSSL_CRYPTO_TARGET Crypto)
set(OPENSSL_SSL_TARGET SSL)
function(build_openssl PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${OPENSSL_PROJECT_GENERIC_NAME} ${OPENSSL_PROJECT_GENERIC_NAMESPACE} ""
+ make_third_party_configuration(${PIC_ENABLED} ${OPENSSL_PROJECT_GENERIC_NAME} ${OPENSSL_PROJECT_GENERIC_NAMESPACE}
project_name
target_name
extra_compile_flags
- archive_name
pic_namespace
pic_lib_specifier
)
@@ -24,8 +23,8 @@ function(build_openssl PIC_ENABLED)
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
- set(crypto_library ${install_dir}/lib/${OPENSSL_CRYPTO_ARTIFACT_NAME}-${pic_namespace}.a)
- set(ssl_library ${install_dir}/lib/${OPENSSL_SSL_ARTIFACT_NAME}-${pic_namespace}.a)
+ set(crypto_library ${install_dir}/lib/${OPENSSL_CRYPTO_ARTIFACT_NAME}.a)
+ set(ssl_library ${install_dir}/lib/${OPENSSL_SSL_ARTIFACT_NAME}.a)
set(libraries ${crypto_library} ${ssl_library})
set(patch_dir ${build_dir}/debian/patches/)
set(patch_series ${build_dir}/debian/patches/series)
@@ -88,10 +87,6 @@ function(build_openssl PIC_ENABLED)
COMMAND make build_libs -j
INSTALL_COMMAND
COMMAND make install_dev
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${OPENSSL_CRYPTO_ARTIFACT_NAME}.a ${crypto_library}
- COMMAND ${CMAKE_COMMAND} -E copy ${crypto_library} ${LIB_DIR}
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${OPENSSL_SSL_ARTIFACT_NAME}.a ${ssl_library}
- COMMAND ${CMAKE_COMMAND} -E copy ${ssl_library} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
)
diff --git a/third-party/zlib-cmake/zlib.cmake b/third-party/zlib-cmake/zlib.cmake
index 7fcdf836b3..d405019db2 100644
--- a/third-party/zlib-cmake/zlib.cmake
+++ b/third-party/zlib-cmake/zlib.cmake
@@ -7,11 +7,10 @@ set(ZLIB_PROJECT_GENERIC_NAMESPACE ZLIB)
set(ZLIB_ARTIFACT_NAME libz)
function(build_zlib PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${ZLIB_PROJECT_GENERIC_NAME} ${ZLIB_PROJECT_GENERIC_NAMESPACE} ${ZLIB_ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${ZLIB_PROJECT_GENERIC_NAME} ${ZLIB_PROJECT_GENERIC_NAMESPACE}
project_name
target_name
extra_compile_flags
- archive_name
pic_namespace
pic_lib_specifier
)
@@ -20,7 +19,7 @@ function(build_zlib PIC_ENABLED)
set(build_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/build)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(include_dirs ${install_dir}/include)
- set(libraries ${install_dir}/lib/${archive_name})
+ set(libraries ${install_dir}/lib/${ZLIB_ARTIFACT_NAME}.a)
# Ensure the build, installation and "include" directories exists
file(MAKE_DIRECTORY ${build_dir})
file(MAKE_DIRECTORY ${install_dir})
@@ -57,8 +56,6 @@ function(build_zlib PIC_ENABLED)
COMMAND make libz.a -j
INSTALL_COMMAND
COMMAND make install
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ZLIB_ARTIFACT_NAME}.a ${libraries}
- COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
)
diff --git a/third-party/zstd-cmake/zstd.cmake b/third-party/zstd-cmake/zstd.cmake
index e243b8bcad..4899067a0c 100644
--- a/third-party/zstd-cmake/zstd.cmake
+++ b/third-party/zstd-cmake/zstd.cmake
@@ -7,11 +7,10 @@ set(ZSTD_PROJECT_GENERIC_NAMESPACE ZSTD)
set(ZSTD_ARTIFACT_NAME libzstd)
function(build_zstd PIC_ENABLED)
- make_third_party_configuration(${PIC_ENABLED} ${ZSTD_PROJECT_GENERIC_NAME} ${ZSTD_PROJECT_GENERIC_NAMESPACE} ${ZSTD_ARTIFACT_NAME}
+ make_third_party_configuration(${PIC_ENABLED} ${ZSTD_PROJECT_GENERIC_NAME} ${ZSTD_PROJECT_GENERIC_NAMESPACE}
project_name
target_name
extra_compile_flags
- archive_name
pic_namespace
pic_lib_specifier
)
@@ -21,7 +20,7 @@ function(build_zstd PIC_ENABLED)
set(install_dir ${CMAKE_BINARY_DIR}/third-party/${project_name}/install)
set(binary_dir ${build_dir}/lib)
set(include_dirs ${install_dir}/include)
- set(libraries ${install_dir}/lib/${archive_name})
+ set(libraries ${install_dir}/lib/${ZSTD_ARTIFACT_NAME}.a)
set(patch_dir ${build_dir}/debian/patches/)
set(patch_series ${build_dir}/debian/patches/series)
# Ensure the build, installation and "include" directories exists
@@ -72,8 +71,6 @@ function(build_zstd PIC_ENABLED)
COMMAND ${CMAKE_COMMAND} -E env ${make_args} make libzstd.a -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} -E env ${make_install_args} make install-static install-includes
- COMMAND ${CMAKE_COMMAND} -E copy ${install_dir}/lib/${ZSTD_ARTIFACT_NAME}.a ${libraries}
- COMMAND ${CMAKE_COMMAND} -E copy ${libraries} ${LIB_DIR}
COMMAND ${CMAKE_COMMAND} -E copy_directory ${include_dirs} ${INCLUDE_DIR}
BUILD_IN_SOURCE 0
)
From 4be82e5f02ae8bcdd7054f085f88aa148bfdb568 Mon Sep 17 00:00:00 2001
From: Petr Shumilov
Date: Sun, 2 Mar 2025 13:40:32 +0300
Subject: [PATCH 18/20] Add re2 vendoring
Signed-off-by: Petr Shumilov
---
.github/workflows/Build.yml | 4 +-
.github/workflows/Dockerfile.buster | 2 +-
.github/workflows/Dockerfile.focal | 2 +-
.github/workflows/Dockerfile.jammy | 2 +-
.github/workflows/macos.yml | 4 +-
.gitmodules | 3 +
CMakeLists.txt | 4 +-
cmake/init-global-vars.cmake | 3 +-
common/common.cmake | 4 +-
common/unicode/raw_data/download.sh | 1 +
common/unicode/raw_data/unicode-data.tgz | Bin 336565 -> 375156 bytes
common/unicode/unicode.cmake | 1 +
compiler/compiler-settings.cpp | 2 +-
compiler/compiler.cmake | 7 +-
.../pipes/register-kphp-configuration.cpp | 2 +-
.../compiling-kphp-from-sources.md | 2 +-
runtime/confdata-keys.h | 2 +-
runtime/regexp.cpp | 2 +-
runtime/runtime.cmake | 13 +-
server/confdata-binlog-replay.h | 2 +-
server/php-engine.cpp | 2 +-
server/server.cmake | 6 +
tests/python/requirements.txt | 1 +
third-party/re2 | 1 +
.../patches/kphp-unicode-data.patch.template | 20 +++
third-party/re2-cmake/patches/series | 1 +
third-party/re2-cmake/re2.cmake | 118 ++++++++++++++++++
27 files changed, 185 insertions(+), 26 deletions(-)
create mode 160000 third-party/re2
create mode 100644 third-party/re2-cmake/patches/kphp-unicode-data.patch.template
create mode 100644 third-party/re2-cmake/patches/series
create mode 100644 third-party/re2-cmake/re2.cmake
diff --git a/.github/workflows/Build.yml b/.github/workflows/Build.yml
index 3a951e68ad..703748e150 100644
--- a/.github/workflows/Build.yml
+++ b/.github/workflows/Build.yml
@@ -146,9 +146,9 @@ jobs:
run: |
brew tap shivammathur/php
brew update
- brew install python@3.13 re2c cmake coreutils libiconv re2 pcre yaml-cpp googletest shivammathur/php/php@7.4
+ brew install python@3.13 re2c cmake coreutils libiconv pcre yaml-cpp googletest shivammathur/php/php@7.4
brew link --overwrite --force shivammathur/php/php@7.4
- /opt/homebrew/opt/python@3.13/libexec/bin/python -m pip install --upgrade pip --break-system-packages && /opt/homebrew/opt/python@3.13/libexec/bin/pip install --break-system-packages jsonschema
+ /opt/homebrew/opt/python@3.13/libexec/bin/python -m pip install --upgrade pip --break-system-packages && /opt/homebrew/opt/python@3.13/libexec/bin/pip install --break-system-packages jsonschema six
- name: Run cmake
run: cmake -DCMAKE_CXX_COMPILER=${{matrix.compiler}} -DCMAKE_CXX_STANDARD=${{matrix.cpp}} -DDOWNLOAD_MISSING_LIBRARIES=On -S $GITHUB_WORKSPACE -B ${{runner.workspace}}/build
diff --git a/.github/workflows/Dockerfile.buster b/.github/workflows/Dockerfile.buster
index ea9f60b15e..3816b6c1fd 100644
--- a/.github/workflows/Dockerfile.buster
+++ b/.github/workflows/Dockerfile.buster
@@ -22,7 +22,7 @@ RUN apt-get update && \
git cmake-data=3.18* cmake=3.18* make g++ gperf netcat patch \
python3.7 python3-dev libpython3-dev python3-pip python3-setuptools python3-wheel mysql-server libmysqlclient-dev && \
pip3 install -r /tmp/requirements.txt && \
- apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
+ apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libpcre3-dev \
libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
libpq5=14.* postgresql-14 postgresql-server-dev-14 libpq-dev=14.* libnuma-dev composer && \
rm -rf /var/lib/apt/lists/* && \
diff --git a/.github/workflows/Dockerfile.focal b/.github/workflows/Dockerfile.focal
index 8f40b66b3b..fba676f9c8 100644
--- a/.github/workflows/Dockerfile.focal
+++ b/.github/workflows/Dockerfile.focal
@@ -15,7 +15,7 @@ RUN apt-get update && \
git cmake make clang g++ g++-10 gperf netcat patch \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools mysql-server libmysqlclient-dev && \
python3.7 -m pip install pip && python3.7 -m pip install -r /tmp/requirements.txt && \
- apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
+ apt-get install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libpcre3-dev \
libyaml-cpp-dev zlib1g-dev php7.4-dev libldap-dev libkrb5-dev \
libpq5=14.* postgresql-14 postgresql-server-dev-14 libpq-dev=14.* libnuma-dev composer unzip && \
rm -rf /var/lib/apt/lists/*
diff --git a/.github/workflows/Dockerfile.jammy b/.github/workflows/Dockerfile.jammy
index 5b2667424b..982eeb426d 100644
--- a/.github/workflows/Dockerfile.jammy
+++ b/.github/workflows/Dockerfile.jammy
@@ -18,7 +18,7 @@ RUN apt update && \
apt install -y --no-install-recommends \
build-essential devscripts fakeroot git cmake make g++ lld gperf netcat patch \
python3.7 python3-pip python3.7-distutils python3.7-dev libpython3.7-dev python3-jsonschema python3-setuptools && \
- apt install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libre2-dev libpcre3-dev \
+ apt install -y --no-install-recommends kphp-timelib libuber-h3-dev libfmt-dev libgtest-dev libgmock-dev libpcre3-dev \
libyaml-cpp-dev zlib1g-dev php7.4-dev libnuma-dev unzip && \
# Install MySQL-related and PostgreSQL-related libraries from the Ubuntu 20.04 (Focal Fossa) repository.
# Ubuntu 22.04 has moved to OpenSSL 3.0; however, KPHP relies on OpenSSL 1.1.1.
diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml
index 12ca64606c..e670fa0ad3 100644
--- a/.github/workflows/macos.yml
+++ b/.github/workflows/macos.yml
@@ -33,9 +33,9 @@ jobs:
run: |
brew tap shivammathur/php
brew update
- brew install python@3.13 re2c cmake coreutils libiconv re2 pcre yaml-cpp googletest shivammathur/php/php@7.4
+ brew install python@3.13 re2c cmake coreutils libiconv pcre yaml-cpp googletest shivammathur/php/php@7.4
brew link --overwrite --force shivammathur/php/php@7.4
- /opt/homebrew/opt/python@3.13/libexec/bin/python -m pip install --upgrade pip --break-system-packages && /opt/homebrew/opt/python@3.13/libexec/bin/pip install --break-system-packages jsonschema
+ /opt/homebrew/opt/python@3.13/libexec/bin/python -m pip install --upgrade pip --break-system-packages && /opt/homebrew/opt/python@3.13/libexec/bin/pip install --break-system-packages jsonschema six
- name: Run cmake
run: cmake -DCMAKE_CXX_COMPILER=${{matrix.compiler}} -DCMAKE_CXX_STANDARD=${{matrix.cpp}} -DDOWNLOAD_MISSING_LIBRARIES=On -S $GITHUB_WORKSPACE -B ${{runner.workspace}}/build
diff --git a/.gitmodules b/.gitmodules
index 2db392968b..83496f9e87 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -23,3 +23,6 @@
path = third-party/zstd
url = https://github.com/VKCOM/libzstd.git
branch = master
+[submodule "third-party/re2"]
+ path = third-party/re2
+ url = https://github.com/VKCOM/re2.git
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 2bc5f4998f..ad510cd5a8 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,6 +34,9 @@ include(cmake/popular-common.cmake)
include(${THIRD_PARTY_DIR}/zlib-cmake/zlib.cmake)
include(${THIRD_PARTY_DIR}/openssl-cmake/openssl.cmake)
include(${THIRD_PARTY_DIR}/zstd-cmake/zstd.cmake)
+include(${COMMON_DIR}/unicode/unicode.cmake)
+# RE2 depends on unicode
+include(${THIRD_PARTY_DIR}/re2-cmake/re2.cmake)
# TODO: use FetchContent_Declare instead of include_directories
include_directories(.)
@@ -47,7 +50,6 @@ include(${BASE_DIR}/vkext/vkext.cmake)
include(${COMMON_DIR}/binlog/binlog.cmake)
include(${COMMON_DIR}/common.cmake)
include(${COMMON_DIR}/tl/tl.cmake)
-include(${COMMON_DIR}/unicode/unicode.cmake)
include(${RUNTIME_COMMON_DIR}/runtime-common.cmake)
diff --git a/cmake/init-global-vars.cmake b/cmake/init-global-vars.cmake
index 06ee6a0cac..2c52d145ba 100644
--- a/cmake/init-global-vars.cmake
+++ b/cmake/init-global-vars.cmake
@@ -29,7 +29,8 @@ else()
endif()
find_package(Git REQUIRED)
-find_package (Python3 COMPONENTS Interpreter REQUIRED)
+find_package(Python3 COMPONENTS Interpreter REQUIRED)
+find_package(Perl REQUIRED)
find_program(CCACHE_FOUND ccache)
if(CCACHE_FOUND)
diff --git a/common/common.cmake b/common/common.cmake
index 3ce9857ebf..4f68b1b391 100644
--- a/common/common.cmake
+++ b/common/common.cmake
@@ -65,8 +65,8 @@ endif()
vk_add_library_no_pic(common-src-no-pic OBJECT ${COMMON_ALL_SOURCES})
add_dependencies(common-src-no-pic OpenSSL::no-pic::Crypto ZLIB::no-pic::zlib ZSTD::no-pic::zstd)
-target_include_directories(common-src-no-pic PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
+target_include_directories(common-src-no-pic PUBLIC ${ZLIB_NO_PIC_INCLUDE_DIRS} ${ZSTD_NO_PIC_INCLUDE_DIRS})
vk_add_library_pic(common-src-pic OBJECT ${COMMON_ALL_SOURCES})
add_dependencies(common-src-pic OpenSSL::pic::Crypto ZLIB::pic::zlib ZSTD::pic::zstd)
-target_include_directories(common-src-pic PUBLIC ${ZLIB_PIC_INCLUDE_DIRS} ${ZSTD_INCLUDE_DIRS})
+target_include_directories(common-src-pic PUBLIC ${ZLIB_PIC_INCLUDE_DIRS} ${ZSTD_PIC_INCLUDE_DIRS})
diff --git a/common/unicode/raw_data/download.sh b/common/unicode/raw_data/download.sh
index 8e8fc7278f..b5a64e84e9 100755
--- a/common/unicode/raw_data/download.sh
+++ b/common/unicode/raw_data/download.sh
@@ -7,6 +7,7 @@ rm -rf *.txt
wget ${host}/CaseFolding.txt -O CaseFolding.txt
wget ${host}/extracted/DerivedGeneralCategory.txt -O GeneralCategory.txt
wget ${host}/UnicodeData.txt -O UnicodeData.txt
+wget ${host}/Scripts.txt -O Scripts.txt # for RE2
touch *.txt
diff --git a/common/unicode/raw_data/unicode-data.tgz b/common/unicode/raw_data/unicode-data.tgz
index 38580d1b03714a93374a01b51a0c968300312d39..c35c5b619e3a46d29ecfc53cadf749b069069e99 100644
GIT binary patch
literal 375156
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