Skip to content

Commit

Permalink
Add nghttp2 vendoring
Browse files Browse the repository at this point in the history
Signed-off-by: Petr Shumilov <p.shumilov@vkteam.ru>
  • Loading branch information
PetrShumilov committed Feb 19, 2025
1 parent 5554d0b commit 46a7abe
Show file tree
Hide file tree
Showing 12 changed files with 115 additions and 21 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/Dockerfile.buster
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Dockerfile.focal
Original file line number Diff line number Diff line change
Expand Up @@ -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/*

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/Dockerfile.jammy
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
3 changes: 2 additions & 1 deletion compiler/compiler-settings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<vk::string_view> system_installed_static_libs{"pcre", "re2", "yaml-cpp", "h3", "zstd", "nghttp2", "kphp-timelib"};
std::vector<vk::string_view> 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;
Expand Down Expand Up @@ -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";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
```

Expand All @@ -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
```

Expand Down
7 changes: 4 additions & 3 deletions runtime/runtime.cmake
Original file line number Diff line number Diff line change
@@ -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/
Expand Down Expand Up @@ -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)
Expand Down
21 changes: 12 additions & 9 deletions third-party/curl-cmake/curl.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -23,8 +25,11 @@ 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_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.
Expand All @@ -44,13 +49,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}
Expand All @@ -66,10 +73,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
Expand Down
1 change: 1 addition & 0 deletions third-party/nghttp2
Submodule nghttp2 added at b6618c
81 changes: 81 additions & 0 deletions third-party/nghttp2-cmake/nghttp2.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
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()

set(NGHTTP2_CMAKE_ARGS
-DCMAKE_C_FLAGS=${NGHTTP2_COMPILE_FLAGS}
#-DCMAKE_C_COMPILER=${CMAKE_C_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_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 $<CONFIG> -j
INSTALL_COMMAND
COMMAND ${CMAKE_COMMAND} --install ${NGHTTP2_BUILD_DIR} --prefix ${NGHTTP2_INSTALL_DIR} --config $<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)
5 changes: 4 additions & 1 deletion third-party/zlib-cmake/zlib.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 46a7abe

Please sign in to comment.