You've already forked fruix-bootstrap
149 lines
3.9 KiB
Bash
Executable File
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"
|