Files
trellis2-ROCm/scripts/fetch_print_remesh_deps.sh
2026-08-16 18:33:03 +07:00

147 lines
4.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# Fetch the exact header-only dependency set used for CGAL print remeshing.
# Keep the four pins below together: the scheduled dependency workflow updates
# versions and upstream-published SHA-256 digests atomically.
set -euo pipefail
CGAL_VERSION=6.1.1
CGAL_SHA256=6c5d68be1d28cbee3c3e05003746ec4791d0018c770b4276b9e6d69c3a0a355a
BOOST_VERSION=1.88.0
BOOST_SHA256=3621533e820dcab1e8012afd583c0c73cf0f77694952b81352bf38c1488f9cb4
FETCH_FORMAT=2
ROOT=$(cd "$(dirname "$0")/.." && pwd)
DEST=${1:-"$ROOT/.deps/print-remesh"}
MARKER="$DEST/.trellis2-print-remesh-deps"
EXPECTED=$(printf 'CGAL_VERSION=%s\nCGAL_SHA256=%s\nBOOST_VERSION=%s\nBOOST_SHA256=%s\nFETCH_FORMAT=%s' \
"$CGAL_VERSION" "$CGAL_SHA256" "$BOOST_VERSION" "$BOOST_SHA256" "$FETCH_FORMAT")
is_current() {
[[ -f "$MARKER" && "$(<"$MARKER")" == "$EXPECTED" ]]
}
if is_current; then
echo "Print-remesh dependencies already current in $DEST"
exit 0
fi
mkdir -p "$(dirname "$DEST")"
LOCK="${DEST}.lock"
attempt=0
until mkdir "$LOCK" 2>/dev/null; do
if is_current; then
echo "Print-remesh dependencies already current in $DEST"
exit 0
fi
((attempt += 1))
if ((attempt >= 300)); then
echo "Timed out waiting for dependency lock $LOCK" >&2
exit 1
fi
sleep 0.2
done
TMP=
cleanup() {
rm -rf "$LOCK"
if [[ -n "${TMP:-}" ]]; then
rm -rf "$TMP"
fi
}
trap cleanup EXIT
TMP=$(mktemp -d "${DEST}.tmp.XXXXXX")
verify_sha256() {
local file=$1 expected=$2 actual
if command -v sha256sum >/dev/null 2>&1; then
actual=$(sha256sum "$file")
elif command -v shasum >/dev/null 2>&1; then
actual=$(shasum -a 256 "$file")
else
echo "No SHA-256 tool found (need sha256sum or shasum)" >&2
exit 127
fi
actual=${actual%% *}
if [[ "$actual" != "$expected" ]]; then
echo "SHA-256 mismatch for $file: expected $expected, got $actual" >&2
exit 1
fi
}
CGAL_ARCHIVE="$TMP/cgal.zip"
curl -fL --retry 3 \
"https://github.com/CGAL/cgal/releases/download/v${CGAL_VERSION}/CGAL-${CGAL_VERSION}-library.zip" \
-o "$CGAL_ARCHIVE"
verify_sha256 "$CGAL_ARCHIVE" "$CGAL_SHA256"
mkdir "$TMP/cgal-unpack"
unzip -q "$CGAL_ARCHIVE" -d "$TMP/cgal-unpack"
shopt -s nullglob
cgal_roots=("$TMP/cgal-unpack"/*)
shopt -u nullglob
if [[ ${#cgal_roots[@]} -ne 1 || ! -d "${cgal_roots[0]}" ]]; then
echo "Expected one root directory in the CGAL archive" >&2
exit 1
fi
mv "${cgal_roots[0]}" "$TMP/cgal"
BOOST_UNDERSCORE=${BOOST_VERSION//./_}
BOOST_ARCHIVE="$TMP/boost.tgz"
curl -fL --retry 3 \
"https://archives.boost.io/release/${BOOST_VERSION}/source/boost_${BOOST_UNDERSCORE}.tar.gz" \
-o "$BOOST_ARCHIVE"
verify_sha256 "$BOOST_ARCHIVE" "$BOOST_SHA256"
mkdir "$TMP/boost"
tar -xzf "$BOOST_ARCHIVE" -C "$TMP/boost" --strip-components=1 \
"boost_${BOOST_UNDERSCORE}/boost"
# Raw Boost release archives intentionally have no installed CMake package.
# Supply the header-only targets CGAL consumes so config-mode find_package
# works on CMake 3.30+, where the legacy FindBoost module was removed.
mkdir "$TMP/boost-cmake"
cat > "$TMP/boost-cmake/BoostConfig.cmake" <<EOF
set(Boost_FOUND TRUE)
set(Boost_VERSION "$BOOST_VERSION")
set(Boost_VERSION_STRING "$BOOST_VERSION")
set(Boost_INCLUDE_DIR "\${CMAKE_CURRENT_LIST_DIR}/../boost")
set(Boost_INCLUDE_DIRS "\${Boost_INCLUDE_DIR}")
set(Boost_LIBRARIES "")
if(NOT TARGET Boost::headers)
add_library(Boost::headers INTERFACE IMPORTED GLOBAL)
set_target_properties(Boost::headers PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "\${Boost_INCLUDE_DIR}")
endif()
if(NOT TARGET Boost::boost)
add_library(Boost::boost ALIAS Boost::headers)
endif()
EOF
cat > "$TMP/boost-cmake/BoostConfigVersion.cmake" <<EOF
set(PACKAGE_VERSION "$BOOST_VERSION")
if(PACKAGE_FIND_VERSION VERSION_GREATER PACKAGE_VERSION)
set(PACKAGE_VERSION_COMPATIBLE FALSE)
else()
set(PACKAGE_VERSION_COMPATIBLE TRUE)
if(PACKAGE_FIND_VERSION VERSION_EQUAL PACKAGE_VERSION)
set(PACKAGE_VERSION_EXACT TRUE)
endif()
endif()
EOF
rm -rf "$CGAL_ARCHIVE" "$BOOST_ARCHIVE" "$TMP/cgal-unpack"
printf '%s\n' "$EXPECTED" > "$TMP/.trellis2-print-remesh-deps"
OLD="${DEST}.old.$$"
if [[ -e "$DEST" ]]; then
mv "$DEST" "$OLD"
fi
if mv "$TMP" "$DEST"; then
TMP=
rm -rf "$OLD"
else
if [[ -e "$OLD" ]]; then
mv "$OLD" "$DEST"
fi
exit 1
fi
echo "Fetched CGAL $CGAL_VERSION and Boost $BOOST_VERSION into $DEST"