Files

149 lines
3.9 KiB
Bash
Executable File

#!/bin/sh
set -eu
script_dir=$(CDPATH= cd -- "$(dirname "$0")" && pwd)
bootstrap_root=$(CDPATH= cd -- "$script_dir/.." && pwd)
guile_repo=${FRUIX_BOOTSTRAP_GUILE_REPO:-https://codeberg.org/guile/guile.git}
guile_commit=${FRUIX_BOOTSTRAP_GUILE_COMMIT:-bbf2baa10f6cc8dfdd9e4ea14b503d748287a03d}
install_prefix=${INSTALL_PREFIX:-$HOME/.local/opt/fruix-builder/guile}
make_bin=${MAKE_BIN:-gmake}
metadata_target=${METADATA_OUT:-}
env_target=${ENV_OUT:-}
jobs=${JOBS:-$(sysctl -n hw.ncpu 2>/dev/null || echo 4)}
for tool in git gm4 autoconf automake libtoolize autoreconf pkg-config "$make_bin" cc; do
if ! command -v "$tool" >/dev/null 2>&1; then
echo "Required tool not found: $tool" >&2
exit 1
fi
done
cleanup=0
if [ -n "${WORKDIR:-}" ]; then
workdir=$WORKDIR
mkdir -p "$workdir"
else
workdir=$(mktemp -d /tmp/fruix-build-local-guile.XXXXXX)
cleanup=1
fi
if [ "${KEEP_WORKDIR:-0}" -eq 1 ]; then
cleanup=0
fi
cleanup_workdir() {
if [ "$cleanup" -eq 1 ]; then
rm -rf "$workdir"
fi
}
trap cleanup_workdir EXIT INT TERM
src_dir=$workdir/guile-src
build_dir=$workdir/guile-build
metadata_file=$workdir/local-guile-build-metadata.txt
env_file=$workdir/local-guile-env.sh
autogen_log=$workdir/autogen.log
configure_log=$workdir/configure.log
build_log=$workdir/build.log
install_log=$workdir/install.log
validation_log=$workdir/validation.log
rm -rf "$src_dir" "$build_dir"
mkdir -p "$build_dir" "$install_prefix"
printf 'Cloning Guile from: %s\n' "$guile_repo"
printf 'Checking out commit: %s\n' "$guile_commit"
printf 'Install prefix: %s\n' "$install_prefix"
printf 'Work directory: %s\n' "$workdir"
git clone "$guile_repo" "$src_dir" >"$workdir/clone.log" 2>&1
(
cd "$src_dir"
git checkout "$guile_commit"
) >"$workdir/checkout.log" 2>&1
resolved_commit=$(git -C "$src_dir" rev-parse HEAD)
(
cd "$src_dir"
M4=gm4 ./autogen.sh
) >"$autogen_log" 2>&1
(
cd "$build_dir"
env \
M4=gm4 \
MAKE="$make_bin" \
PKG_CONFIG=pkg-config \
PKG_CONFIG_PATH=/usr/local/libdata/pkgconfig:/usr/local/lib/pkgconfig \
CPPFLAGS='-I/usr/local/include' \
LDFLAGS="-L/usr/local/lib -Wl,-rpath,/usr/local/lib -Wl,-rpath,$install_prefix/lib" \
"$src_dir/configure" \
--prefix="$install_prefix" \
--with-bdw-gc=bdw-gc-threaded \
--with-libgmp-prefix=/usr/local \
--with-libunistring-prefix=/usr/local \
--with-libiconv-prefix=/usr/local \
--with-libintl-prefix=/usr/local
) >"$configure_log" 2>&1
(
cd "$build_dir"
"$make_bin" -j"$jobs"
) >"$build_log" 2>&1
(
cd "$build_dir"
"$make_bin" install
) >"$install_log" 2>&1
guile_bin=$install_prefix/bin/guile
[ -x "$guile_bin" ] || {
echo "Built Guile binary missing: $guile_bin" >&2
exit 1
}
guile_version=$(LD_LIBRARY_PATH="$install_prefix/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" "$guile_bin" --version | head -n 1)
(
EXPECT_GUILE_SUBPROCESS_CRASH=0 \
GUILE_BIN="$guile_bin" \
"$bootstrap_root/tests/guile/run-subprocess-diagnostics.sh"
) >"$validation_log" 2>&1
cat >"$env_file" <<EOF
export GUILE_BIN='$guile_bin'
export GUILE_PREFIX='$install_prefix'
export LD_LIBRARY_PATH='$install_prefix/lib:/usr/local/lib'
EOF
cat >"$metadata_file" <<EOF
workdir=$workdir
guile_repo=$guile_repo
requested_commit=$guile_commit
resolved_commit=$resolved_commit
install_prefix=$install_prefix
guile_bin=$guile_bin
guile_version=$guile_version
jobs=$jobs
autogen_log=$autogen_log
configure_log=$configure_log
build_log=$build_log
install_log=$install_log
validation_log=$validation_log
env_file=$env_file
EOF
if [ -n "$metadata_target" ]; then
mkdir -p "$(dirname "$metadata_target")"
cp "$metadata_file" "$metadata_target"
fi
if [ -n "$env_target" ]; then
mkdir -p "$(dirname "$env_target")"
cp "$env_file" "$env_target"
fi
printf 'PASS local-guile-build\n'
printf 'Environment file: %s\n' "$env_file"
printf 'Metadata file: %s\n' "$metadata_file"
printf '%s\n' '--- metadata ---'
cat "$metadata_file"