Skip to content

Commit

Permalink
Use Rocky Linux 8 and vcpkg to build RPM packages (apache#428)
Browse files Browse the repository at this point in the history
### Motivation

See https://lists.apache.org/thread/7o8hpv1gtoffvzx053wm0ss2s9xt0795, we will discard the support for CentOS 7 and old `std::string` ABI.

### Modifications

- Switch from `centos:7` image and GCC 4.8 to `rockylinux:8` image and GCC 8 to build RPM packages.
- Use vcpkg to install dependencies according to `vcpkg.json` (`dependencies.json` will be deprecated in future)
- Add a new script to build `libpulsarwithdeps.a` for dependencies installed by vcpkg
- Link to `libstdc++` and `libgcc_s` libraries statically

Additional, with vcpkg, OpenSSL will search `/etc/ssl/certs.pem` for the default CA certificate rather than `/usr/local/ssl/ssl/certs.pem`.

(cherry picked from commit 8aab896)
  • Loading branch information
BewareMyPower authored and shibd committed Aug 21, 2024
1 parent f452b7a commit 132ee01
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 81 deletions.
32 changes: 32 additions & 0 deletions build-support/merge_archives_vcpkg.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#

set -e
cd `dirname $0`

if [[ $# -lt 1 ]]; then
echo "Usage: $0 <cmake-build-directory>"
exit 1
fi

CMAKE_BUILD_DIRECTORY=$1
./merge_archives.sh $CMAKE_BUILD_DIRECTORY/libpulsarwithdeps.a \
$CMAKE_BUILD_DIRECTORY/lib/libpulsar.a \
$(find "$CMAKE_BUILD_DIRECTORY/vcpkg_installed" -name "*.a" | grep -v debug)
6 changes: 5 additions & 1 deletion lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,7 @@ target_include_directories(PULSAR_OBJECT_LIB PUBLIC
"${CMAKE_SOURCE_DIR}/include"
"${CMAKE_BINARY_DIR}/include")

include(CheckCXXSymbolExists)
if (BUILD_DYNAMIC_LIB)
add_library(pulsarShared SHARED $<TARGET_OBJECTS:PULSAR_OBJECT_LIB>)
set_property(TARGET pulsarShared PROPERTY OUTPUT_NAME ${LIB_NAME_SHARED})
Expand All @@ -89,9 +90,12 @@ if (BUILD_DYNAMIC_LIB)
target_include_directories(pulsarShared PRIVATE ${dlfcn-win32_INCLUDE_DIRS})
target_link_options(pulsarShared PRIVATE $<$<CONFIG:DEBUG>:/NODEFAULTLIB:MSVCRT>)
endif()
check_cxx_symbol_exists(__GLIBCXX__ iostream GLIBCXX)
if (GLIBCXX)
target_link_libraries(pulsarShared PUBLIC -static-libgcc -static-libstdc++)
endif ()
endif()

include(CheckCXXSymbolExists)
check_cxx_symbol_exists(getauxval sys/auxv.h HAVE_AUXV_GETAUXVAL)
if(HAVE_AUXV_GETAUXVAL)
add_definitions(-DPULSAR_AUXV_GETAUXVAL_PRESENT)
Expand Down
88 changes: 10 additions & 78 deletions pkg/rpm/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

# Build pulsar client library in Centos with tools to build static RPM

FROM centos:7
FROM rockylinux:8

ARG PLATFORM

Expand All @@ -30,87 +30,19 @@ RUN yum update -y && \
rpm-build \
which \
createrepo \
libstdc++-static \
python3
git \
python3 \
python3-pip
RUN dnf --enablerepo=powertools install -y libstdc++-static

RUN pip3 install pyyaml

ADD .build/dependencies.yaml /
ADD .build/dep-version.py /usr/local/bin

# Download and compile boost
# GCC 4.8.2 implementation of std::regex is buggy, so we install boost::regex here
RUN BOOST_VERSION=$(dep-version.py boost) && \
echo "BOOST VERSION: '${BOOST_VERSION}'" && \
curl -O -L /~https://github.com/boostorg/boost/releases/download/boost-${BOOST_VERSION}/boost-${BOOST_VERSION}.tar.gz && \
tar zxf boost-${BOOST_VERSION}.tar.gz && \
cd boost-${BOOST_VERSION} && \
./bootstrap.sh --with-libraries=regex && \
./b2 address-model=64 cxxflags="-fPIC -std=c++11" link=static threading=multi variant=release install && \
rm -rf /boost-${BOOST_VERSION}.tar.gz /boost-${BOOST_VERSION}

RUN CMAKE_VERSION=$(dep-version.py cmake) && \
curl -O -L /~https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${PLATFORM}.tar.gz && \
tar xfz cmake-${CMAKE_VERSION}-linux-${PLATFORM}.tar.gz && \
cp cmake-${CMAKE_VERSION}-linux-${PLATFORM}/bin/* /usr/bin/ && \
cp -r cmake-${CMAKE_VERSION}-linux-${PLATFORM}/share/cmake-* /usr/share/ && \
rm -rf cmake-${CMAKE_VERSION}-linux-${PLATFORM} cmake-${CMAKE_VERSION}-linux-${PLATFORM}.tar.gz

# Download and compile protobuf
RUN PROTOBUF_VERSION=$(dep-version.py protobuf) && \
curl -O -L /~https://github.com/google/protobuf/releases/download/v${PROTOBUF_VERSION}/protobuf-cpp-${PROTOBUF_VERSION}.tar.gz && \
tar xfz protobuf-cpp-${PROTOBUF_VERSION}.tar.gz && \
cd protobuf-${PROTOBUF_VERSION}/ && \
CXXFLAGS=-fPIC ./configure && \
make -j8 && make install && ldconfig && \
rm -rf /protobuf-cpp-${PROTOBUF_VERSION}.tar.gz /protobuf-${PROTOBUF_VERSION}

# ZLib
RUN ZLIB_VERSION=$(dep-version.py zlib) && \
curl -O -L /~https://github.com/madler/zlib/archive/v${ZLIB_VERSION}.tar.gz && \
tar xfz v${ZLIB_VERSION}.tar.gz && \
cd zlib-${ZLIB_VERSION} && \
CFLAGS="-fPIC -O3" ./configure && \
make -j8 && make install && \
rm -rf /v${ZLIB_VERSION}.tar.gz /zlib-${ZLIB_VERSION}

# Zstandard
RUN ZSTD_VERSION=$(dep-version.py zstd) && \
curl -O -L /~https://github.com/facebook/zstd/releases/download/v${ZSTD_VERSION}/zstd-${ZSTD_VERSION}.tar.gz && \
tar xfz zstd-${ZSTD_VERSION}.tar.gz && \
cd zstd-${ZSTD_VERSION} && \
CFLAGS="-fPIC -O3" make -j8 && \
make install && \
rm -rf /zstd-${ZSTD_VERSION} /zstd-${ZSTD_VERSION}.tar.gz

# Snappy
RUN SNAPPY_VERSION=$(dep-version.py snappy) && \
curl -O -L /~https://github.com/google/snappy/archive/refs/tags/${SNAPPY_VERSION}.tar.gz && \
tar xfz ${SNAPPY_VERSION}.tar.gz && \
cd snappy-${SNAPPY_VERSION} && \
CXXFLAGS="-fPIC -O3" cmake . -DSNAPPY_BUILD_TESTS=OFF -DSNAPPY_BUILD_BENCHMARKS=OFF && \
make -j8 && make install && \
rm -rf /snappy-${SNAPPY_VERSION} /${SNAPPY_VERSION}.tar.gz

RUN OPENSSL_VERSION=$(dep-version.py openssl) && \
OPENSSL_VERSION_UNDERSCORE=$(echo $OPENSSL_VERSION | sed 's/\./_/g') && \
curl -O -L /~https://github.com/openssl/openssl/archive/OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz && \
tar xfz OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz && \
cd openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}/ && \
./Configure -fPIC --prefix=/usr/local/ssl/ linux-${PLATFORM} && \
make -j8 && make install && \
rm -rf /OpenSSL_${OPENSSL_VERSION_UNDERSCORE}.tar.gz /openssl-OpenSSL_${OPENSSL_VERSION_UNDERSCORE}

ENV LD_LIBRARY_PATH /usr/local/ssl/lib/:
ENV OPENSSL_ROOT_DIR /usr/local/ssl/

# LibCurl
RUN CURL_VERSION=$(dep-version.py curl) && \
CURL_VERSION_UNDERSCORE=$(echo $CURL_VERSION | sed 's/\./_/g') && \
curl -O -L /~https://github.com/curl/curl/releases/download/curl-${CURL_VERSION_UNDERSCORE}/curl-${CURL_VERSION}.tar.gz && \
tar xfz curl-${CURL_VERSION}.tar.gz && \
cd curl-${CURL_VERSION} && \
CFLAGS=-fPIC ./configure --with-ssl=/usr/local/ssl/ --without-zstd --without-libpsl && \
make -j8 && make install && \
rm -rf /curl-${CURL_VERSION}.tar.gz /curl-${CURL_VERSION}
# Vcpkg does not provide pre-built binaries for Arm architectures so we need to build vcpkg from source
RUN yum install -y cmake
RUN dnf --enablerepo=devel install -y ninja-build

# Dependencies when building OpenSSL
RUN yum install -y perl-IPC-Cmd
12 changes: 10 additions & 2 deletions pkg/rpm/SPECS/pulsar-client.spec
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
%define name apache-pulsar-client
%define release 1
%define buildroot %{_topdir}/%{name}-%{version}-root
%define debug_package %{nil}

BuildRoot: %{buildroot}
Summary: Apache Pulsar client library
Expand Down Expand Up @@ -52,8 +53,15 @@ static library.
%setup -q -n apache-pulsar-client-cpp-%{pom_version}

%build
cmake . -DBUILD_TESTS=OFF -DLINK_STATIC=ON
make -j 3
git clone /~https://github.com/microsoft/vcpkg.git
cmake -B build -DINTEGRATE_VCPKG=ON -DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF -DBUILD_DYNAMIC_LIB=ON -DBUILD_STATIC_LIB=ON
cmake --build build -j8
./build-support/merge_archives_vcpkg.sh $PWD/build

cp build/lib/libpulsar.a lib/libpulsar.a
cp build/lib/libpulsar.so lib/libpulsar.so
cp build/libpulsarwithdeps.a lib/libpulsarwithdeps.a

%install
INCLUDE_DIR=$RPM_BUILD_ROOT/usr/include
Expand Down
4 changes: 4 additions & 0 deletions pkg/rpm/build-rpm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ cd /pulsar-client-cpp
ROOT_DIR=$(pwd)
cd $ROOT_DIR/pkg/rpm

if [[ $PLATFORM == "aarch64" ]]; then
export VCPKG_FORCE_SYSTEM_BINARIES=arm
fi

POM_VERSION=`cat $ROOT_DIR/version.txt | xargs`

# Sanitize VERSION by removing `-incubating` since it's not legal in RPM
Expand Down

0 comments on commit 132ee01

Please sign in to comment.