Files
triangles_v5/scripts/ci/build-rocksdb.sh
T
Krystie 91453deb46 ci: build RocksDB 8.9.1 from source (Ubuntu 22.04 ships 6.11.4)
PR #10 added a configure-time FATAL_ERROR for RocksDB < 7.4.0 because
the v5.9.24 daemon on DNS2 was built against librocksdb 6.11 and can't
read smsgDB SST files written by newer RocksDB (XXH3 per-block
checksum). The check worked — but it immediately failed CI, because
GitHub's ubuntu-22.04 runners also ship librocksdb-dev 6.11.4.

This is the same drift class the original patch was meant to prevent.

Fix: build RocksDB from source in CI, pinned to 8.9.1 (matching DNS2's
system version). Add scripts/ci/build-rocksdb.sh as a reusable helper
and call it from each of the four Linux jobs (test-linux-unit,
test-linux-sanitizers, build-linux-daemon, build-linux-qt). Drop
librocksdb-dev from the apt-get install (otherwise find_library would
pick up /usr/lib/librocksdb.so.6.11.4 first) and add libsnappy-dev /
libzstd-dev / liblz4-dev (compression libs RocksDB optionally links
against).

MacOS was already passing — Homebrew's rocksdb is current. Windows
was already passing — MSYS2's mingw-w64-rocksdb is at 9.x.

Also fix a cosmetic CMake bug: the version-detect function was setting
RocksDB_VERSION with PARENT_SCOPE only, so the 'Detected RocksDB
version from version.h:' message printed an empty value. Set the local
variable too so the STATUS message reflects the real value.
2026-06-27 16:02:43 -07:00

56 lines
2.1 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# build-rocksdb.sh — Build and install a pinned RocksDB version for CI.
#
# Ubuntu 22.04's librocksdb-dev is 6.11.4 (the same version that bit
# DNS2 — see PR #10). Triangles requires RocksDB >= 7.4.0 for the XXH3
# per-block checksum used in modern smsgDB SST files; src/smessage.cpp's
# SecMsgDB::Open has a runtime quarantine fallback, but the build-time
# check in CMakeLists.txt refuses to configure against < 7.4.
#
# This script clones RocksDB at a pinned tag, builds only the shared
# library (fast), installs to /usr/local, and refreshes ldconfig.
# Triangles' CMake find_library probes /usr/local before /usr/lib so
# the just-built copy is picked up first.
#
# Pinned version matches DNS2's system librocksdb (8.9.1) so test
# coverage matches production.
#
# Usage: sudo ./scripts/ci/build-rocksdb.sh
set -euo pipefail
ROCKSDB_VERSION="${ROCKSDB_VERSION:-8.9.1}"
ROCKSDB_TAG="v${ROCKSDB_VERSION}"
INSTALL_PREFIX="${INSTALL_PREFIX:-/usr/local}"
JOBS="${JOBS:-$(nproc)}"
WORKDIR="$(mktemp -d)"
trap 'rm -rf "$WORKDIR"' EXIT
echo ">>> Building RocksDB ${ROCKSDB_TAG} (${JOBS} jobs) into ${INSTALL_PREFIX}"
git clone --depth 1 --branch "${ROCKSDB_TAG}" \
https://github.com/facebook/rocksdb.git "${WORKDIR}/rocksdb"
cd "${WORKDIR}/rocksdb"
# Shared library only — Triangles links dynamically. Statically linking
# rocksdb.a would also work but balloons the daemon binary by ~50 MB.
make -j"${JOBS}" shared_lib PORTABLE=1 USE_RTTI=1 \
EXTRA_CXXFLAGS="-Wno-error=deprecated-declarations"
make install-shared PREFIX="${INSTALL_PREFIX}"
ldconfig
# Sanity: installed library should be loadable and export the version
# macros we look for at configure time.
if ! ldconfig -p | grep -q "librocksdb.so.${ROCKSDB_VERSION}"; then
echo "!!! ldconfig did not pick up librocksdb.so.${ROCKSDB_VERSION}" >&2
exit 1
fi
echo ">>> RocksDB ${ROCKSDB_TAG} installed to ${INSTALL_PREFIX}"
echo ">>> - library: ${INSTALL_PREFIX}/lib/librocksdb.so.${ROCKSDB_VERSION}"
echo ">>> - headers: ${INSTALL_PREFIX}/include/rocksdb/version.h"
ls -l "${INSTALL_PREFIX}/lib/librocksdb.so"* "${INSTALL_PREFIX}/include/rocksdb/version.h"