blob: 773e835d7efd0a2ef68a0e115a97d73044276d9e [file]
#!/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.
#
# Build client-cpp in manylinux_2_28 and verify max required GLIBC symbol <= 2.28.
set -euxo pipefail
MACHINE=$(uname -m)
case "${MACHINE}" in
x86_64)
CMAKE_PKG_ARCH=linux-x86_64
JDK_API_ARCH=linux/x64
DEFAULT_CLASSIFIER=linux-x86_64-glibc2.28
;;
aarch64)
CMAKE_PKG_ARCH=linux-aarch64
JDK_API_ARCH=linux/aarch64
DEFAULT_CLASSIFIER=linux-aarch64-glibc2.28
;;
*)
echo "Unsupported architecture: ${MACHINE}" >&2
exit 1
;;
esac
PACKAGE_CLASSIFIER="${PACKAGE_CLASSIFIER:-${DEFAULT_CLASSIFIER}}"
CMAKE_VERSION=3.28.4
CMAKE_DIR="/opt/cmake-${CMAKE_VERSION}"
if [[ ! -x "${CMAKE_DIR}/bin/cmake" ]]; then
curl -fsSL -o /tmp/cmake.tar.gz "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-${CMAKE_PKG_ARCH}.tar.gz"
rm -rf "${CMAKE_DIR}"
mkdir -p /opt
tar xf /tmp/cmake.tar.gz -C /opt
mv "/opt/cmake-${CMAKE_VERSION}-${CMAKE_PKG_ARCH}" "${CMAKE_DIR}"
fi
JAVA_HOME=/opt/jdk-17
if [[ ! -x "${JAVA_HOME}/bin/java" ]]; then
curl -fsSL -o /tmp/jdk17.tar.gz "https://api.adoptium.net/v3/binary/latest/17/ga/${JDK_API_ARCH}/jdk/hotspot/normal/eclipse?project=jdk"
rm -rf /opt/jdk-17*
mkdir -p /opt
tar xf /tmp/jdk17.tar.gz -C /opt
JAVA_HOME=$(find /opt -maxdepth 1 -type d -name 'jdk-17*' -print -quit)
ln -sfn "${JAVA_HOME}" /opt/jdk-17
JAVA_HOME=/opt/jdk-17
fi
export PATH="${CMAKE_DIR}/bin:${JAVA_HOME}/bin:${PATH}"
export JAVA_HOME
gcc --version
c++ --version
gcc_major=$(gcc -dumpversion | cut -d. -f1)
if (( gcc_major < 14 )); then
echo "ERROR: GCC >= 14 is required; got $(gcc -dumpversion)"
exit 1
fi
cmake --version
java -version
cd "${GITHUB_WORKSPACE:?GITHUB_WORKSPACE is not set}"
./mvnw clean package -P with-cpp -pl iotdb-client/client-cpp -am -DskipTests \
-Dspotless.skip=true \
-Dclient.cpp.package.classifier="${PACKAGE_CLASSIFIER}"
SO="iotdb-client/client-cpp/target/install/lib/libiotdb_session.so"
test -f "${SO}"
echo "=== Build host glibc ==="
ldd --version 2>&1 | sed -n '1p'
echo "=== Highest GLIBC_* symbols in libiotdb_session.so ==="
objdump -T "${SO}" | grep GLIBC_ | sed "s/.*GLIBC_/GLIBC_/" | sort -Vu | tail -10
max_glibc=$(objdump -T "${SO}" | grep -oE "GLIBC_[0-9.]+" | sed "s/GLIBC_//" | sort -t. -k1,1n -k2,2n -k3,3n | tail -1)
echo "max_glibc=${max_glibc}"
if [[ -z "${max_glibc}" ]]; then
echo "ERROR: could not determine max GLIBC version from ${SO}"
exit 1
fi
if awk -v max="${max_glibc}" "BEGIN { exit !(max > 2.28) }"; then
echo "ERROR: libiotdb_session.so requires glibc > 2.28 (max=${max_glibc})"
exit 1
fi
echo "glibc compatibility check passed (max=${max_glibc} <= 2.28)"
echo "=== Example package build/link/run smoke test ==="
PKG_ZIP=$(find "${GITHUB_WORKSPACE}/iotdb-client/client-cpp/target" -maxdepth 1 -type f -name "iotdb-session-cpp-*-${PACKAGE_CLASSIFIER}.zip" -print -quit)
if [[ -z "${PKG_ZIP}" ]]; then
echo "ERROR: could not find package zip for ${PACKAGE_CLASSIFIER}"
exit 1
fi
PKG_UNPACK="/tmp/client-cpp-package-smoke-glibc228"
rm -rf "${PKG_UNPACK}"
mkdir -p "${PKG_UNPACK}"
unzip -q -o "${PKG_ZIP}" -d "${PKG_UNPACK}"
PKG_ROOT=$(find "${PKG_UNPACK}" -mindepth 1 -maxdepth 1 -type d -name "iotdb-session-cpp-*-${PACKAGE_CLASSIFIER}" -print -quit)
if [[ -z "${PKG_ROOT}" ]]; then
echo "ERROR: could not find unpacked package directory for ${PACKAGE_CLASSIFIER}"
exit 1
fi
EXAMPLE_BUILD="/tmp/client-cpp-example-smoke-glibc228"
rm -rf "${EXAMPLE_BUILD}"
mkdir -p "${EXAMPLE_BUILD}"
unset CC CXX CFLAGS CXXFLAGS
"${CMAKE_DIR}/bin/cmake" -S "${PKG_ROOT}/examples" -B "${EXAMPLE_BUILD}" \
-DCMAKE_BUILD_TYPE=Release \
-DIOTDB_SDK_ROOT="${PKG_ROOT}"
"${CMAKE_DIR}/bin/cmake" --build "${EXAMPLE_BUILD}" -j"$(nproc)"
./mvnw -pl distribution -am -DskipTests -Dspotless.skip=true package
SERVER_ROOT=$(find "${GITHUB_WORKSPACE}/distribution/target" -path '*/apache-iotdb-*-all-bin/sbin/start-standalone.sh' -print -quit | sed 's#/sbin/start-standalone.sh##')
if [[ -z "${SERVER_ROOT}" ]]; then
echo "ERROR: could not find IoTDB distribution under distribution/target"
exit 1
fi
"${SERVER_ROOT}/sbin/start-standalone.sh"
trap '"${SERVER_ROOT}/sbin/stop-standalone.sh" || true' EXIT
sleep 30
for example in SessionExample AlignedTimeseriesSessionExample TableModelSessionExample tree_example table_example; do
test -x "${EXAMPLE_BUILD}/${example}"
"${EXAMPLE_BUILD}/${example}"
done
echo "Example package smoke test passed"