221 lines
8.3 KiB
Bash
Executable File
221 lines
8.3 KiB
Bash
Executable File
#!/bin/sh
|
|
set -eu
|
|
|
|
source_url=${SHEPHERD_SOURCE_URL:-"https://ftp.gnu.org/gnu/shepherd/shepherd-1.0.9.tar.gz"}
|
|
version=${SHEPHERD_VERSION:-1.0.9}
|
|
expected_nix_base32=${SHEPHERD_NIX_BASE32:-1mh080060lnycys8yq6kkiy363wif8dsip3nyklgd3a1r22wb274}
|
|
install_prefix=${INSTALL_PREFIX:-/tmp/shepherd-freebsd-validate-install}
|
|
guile_bin=${GUILE_BIN:-/tmp/guile-freebsd-validate-install/bin/guile}
|
|
guile_extra_prefix=${GUILE_EXTRA_PREFIX:-/tmp/guile-gnutls-freebsd-validate-install}
|
|
guix_source_dir=${GUIX_SOURCE_DIR:-"$HOME/repos/guix"}
|
|
make_bin=${MAKE_BIN:-gmake}
|
|
gsed_bin=${GSED_BIN:-/usr/local/bin/gsed}
|
|
|
|
if [ ! -x "$guile_bin" ]; then
|
|
echo "Guile binary is not executable: $guile_bin" >&2
|
|
exit 1
|
|
fi
|
|
if [ ! -d "$guix_source_dir/guix" ]; then
|
|
echo "Guix source tree not found at $guix_source_dir" >&2
|
|
exit 1
|
|
fi
|
|
for tool in fetch sha256 bsdtar "$make_bin" "$gsed_bin"; 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-shepherd-build.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
|
|
|
|
guile_bindir=$(CDPATH= cd -- "$(dirname "$guile_bin")" && pwd)
|
|
guile_prefix=$(CDPATH= cd -- "$guile_bindir/.." && pwd)
|
|
guile_lib_dir=$guile_prefix/lib
|
|
guile_version=$(LD_LIBRARY_PATH="$guile_lib_dir${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" "$guile_bin" -c '(display (effective-version))')
|
|
guile_extra_site_dir=$guile_extra_prefix/share/guile/site/$guile_version
|
|
guile_extra_site_ccache_dir=$guile_extra_prefix/lib/guile/$guile_version/site-ccache
|
|
guile_extra_extensions_dir=$guile_extra_prefix/lib/guile/$guile_version/extensions
|
|
|
|
tool_bindir=$workdir/guile-tools-bin
|
|
mkdir -p "$tool_bindir"
|
|
ln -sf "$guile_bin" "$tool_bindir/guile-3.0"
|
|
ln -sf "$guile_bin" "$tool_bindir/guile"
|
|
ln -sf "$guile_bindir/guild" "$tool_bindir/guild-3.0"
|
|
ln -sf "$guile_bindir/guild" "$tool_bindir/guild"
|
|
ln -sf "$guile_bindir/guile-config" "$tool_bindir/guile-config-3.0"
|
|
ln -sf "$guile_bindir/guile-config" "$tool_bindir/guile-config"
|
|
ln -sf "$guile_bindir/guile-snarf" "$tool_bindir/guile-snarf"
|
|
export PATH="$tool_bindir:$guile_bindir:/usr/local/bin:$PATH"
|
|
export ACLOCAL_PATH=/usr/local/share/aclocal${ACLOCAL_PATH:+:$ACLOCAL_PATH}
|
|
export PKG_CONFIG_PATH=$guile_extra_prefix/lib/pkgconfig:$guile_extra_prefix/libdata/pkgconfig:$guile_prefix/lib/pkgconfig:/usr/local/libdata/pkgconfig:/usr/local/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}
|
|
export CPPFLAGS="-I$guile_prefix/include -I$guile_extra_prefix/include -I/usr/local/include"
|
|
export LDFLAGS="-L$guile_lib_dir -L$guile_extra_prefix/lib -L/usr/local/lib -Wl,-rpath,$guile_lib_dir -Wl,-rpath,$guile_extra_prefix/lib -Wl,-rpath,/usr/local/lib"
|
|
if [ -n "${LD_LIBRARY_PATH:-}" ]; then
|
|
export LD_LIBRARY_PATH="$guile_extra_prefix/lib:$guile_lib_dir:/usr/local/lib:$LD_LIBRARY_PATH"
|
|
else
|
|
export LD_LIBRARY_PATH="$guile_extra_prefix/lib:$guile_lib_dir:/usr/local/lib"
|
|
fi
|
|
if [ -d "$guile_extra_site_dir" ]; then
|
|
export GUILE_LOAD_PATH="$guile_extra_site_dir${GUILE_LOAD_PATH:+:$GUILE_LOAD_PATH}"
|
|
fi
|
|
if [ -d "$guile_extra_site_ccache_dir" ]; then
|
|
export GUILE_LOAD_COMPILED_PATH="$guile_extra_site_ccache_dir${GUILE_LOAD_COMPILED_PATH:+:$GUILE_LOAD_COMPILED_PATH}"
|
|
fi
|
|
if [ -d "$guile_extra_extensions_dir" ]; then
|
|
export GUILE_EXTENSIONS_PATH="$guile_extra_extensions_dir${GUILE_EXTENSIONS_PATH:+:$GUILE_EXTENSIONS_PATH}"
|
|
fi
|
|
|
|
metadata_file=$workdir/shepherd-build-metadata.txt
|
|
env_file=$workdir/shepherd-env.sh
|
|
src_tarball=$workdir/shepherd-$version.tar.gz
|
|
src_dir=$workdir/shepherd-$version
|
|
build_dir=$workdir/build
|
|
configure_log=$workdir/configure.log
|
|
build_log=$workdir/build.log
|
|
install_log=$workdir/install.log
|
|
version_log=$workdir/version.log
|
|
|
|
expected_sha256_hex=$(GUILE_AUTO_COMPILE=0 \
|
|
GUILE_LOAD_PATH="$guix_source_dir${GUILE_LOAD_PATH:+:$GUILE_LOAD_PATH}" \
|
|
"$guile_bin" -c "(use-modules (guix base32) (rnrs bytevectors) (ice-9 format)) (for-each (lambda (b) (format #t \"~2,'0x\" b)) (bytevector->u8-list (nix-base32-string->bytevector (cadr (command-line))))) (newline)" \
|
|
"$expected_nix_base32")
|
|
|
|
printf 'Using Guile: %s\n' "$guile_bin"
|
|
printf 'Installing to: %s\n' "$install_prefix"
|
|
printf 'Working directory: %s\n' "$workdir"
|
|
printf 'Fetching: %s\n' "$source_url"
|
|
fetch -o "$src_tarball" "$source_url"
|
|
|
|
actual_sha256_hex=$(sha256 -q "$src_tarball")
|
|
if [ "$actual_sha256_hex" != "$expected_sha256_hex" ]; then
|
|
echo "sha256 mismatch for $src_tarball" >&2
|
|
echo "expected: $expected_sha256_hex" >&2
|
|
echo "actual: $actual_sha256_hex" >&2
|
|
exit 1
|
|
fi
|
|
|
|
rm -rf "$src_dir" "$build_dir" "$install_prefix"
|
|
mkdir -p "$src_dir" "$build_dir"
|
|
bsdtar -xf "$src_tarball" -C "$src_dir" --strip-components=1
|
|
|
|
(
|
|
cd "$build_dir"
|
|
"$src_dir/configure" \
|
|
--prefix="$install_prefix" \
|
|
--localstatedir="$install_prefix/var" \
|
|
SED="$gsed_bin" \
|
|
GUILE="$guile_bin" \
|
|
GUILD="$guile_bindir/guild" \
|
|
GUILE_SNARF="$guile_bindir/guile-snarf"
|
|
) >"$configure_log" 2>&1
|
|
|
|
(
|
|
cd "$build_dir"
|
|
"$make_bin" GUILE_AUTO_COMPILE=0 -j"${JOBS:-$(sysctl -n hw.ncpu 2>/dev/null || echo 1)}"
|
|
) >"$build_log" 2>&1
|
|
|
|
(
|
|
cd "$build_dir"
|
|
"$make_bin" GUILE_AUTO_COMPILE=0 install
|
|
) >"$install_log" 2>&1
|
|
|
|
shepherd_version_output=$(GUILE_LOAD_PATH="$guile_extra_site_dir${GUILE_LOAD_PATH:+:$GUILE_LOAD_PATH}" \
|
|
GUILE_LOAD_COMPILED_PATH="$guile_extra_site_ccache_dir${GUILE_LOAD_COMPILED_PATH:+:$GUILE_LOAD_COMPILED_PATH}" \
|
|
GUILE_EXTENSIONS_PATH="$guile_extra_extensions_dir${GUILE_EXTENSIONS_PATH:+:$GUILE_EXTENSIONS_PATH}" \
|
|
LD_LIBRARY_PATH="$guile_extra_prefix/lib:$guile_lib_dir:/usr/local/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
|
|
"$install_prefix/bin/shepherd" --version 2>&1 | tee "$version_log")
|
|
herd_version_output=$(GUILE_LOAD_PATH="$guile_extra_site_dir${GUILE_LOAD_PATH:+:$GUILE_LOAD_PATH}" \
|
|
GUILE_LOAD_COMPILED_PATH="$guile_extra_site_ccache_dir${GUILE_LOAD_COMPILED_PATH:+:$GUILE_LOAD_COMPILED_PATH}" \
|
|
GUILE_EXTENSIONS_PATH="$guile_extra_extensions_dir${GUILE_EXTENSIONS_PATH:+:$GUILE_EXTENSIONS_PATH}" \
|
|
LD_LIBRARY_PATH="$guile_extra_prefix/lib:$guile_lib_dir:/usr/local/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}" \
|
|
"$install_prefix/bin/herd" --version 2>&1 | tail -n 1)
|
|
|
|
case "$shepherd_version_output" in
|
|
*"shepherd (GNU Shepherd) $version"*) : ;;
|
|
*)
|
|
echo "shepherd version validation failed" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
case "$shepherd_version_output" in
|
|
*"System lacks support for 'signalfd'; using fallback mechanism."*)
|
|
signalfd_fallback=yes
|
|
;;
|
|
*)
|
|
signalfd_fallback=no
|
|
;;
|
|
esac
|
|
|
|
cat >"$env_file" <<EOF
|
|
export SHEPHERD_PREFIX='$install_prefix'
|
|
export SHEPHERD_BIN='$install_prefix/bin/shepherd'
|
|
export HERD_BIN='$install_prefix/bin/herd'
|
|
export GUILE_EXTRA_PREFIX='$guile_extra_prefix'
|
|
export GUILE_LOAD_PATH='$guile_extra_site_dir'
|
|
export GUILE_LOAD_COMPILED_PATH='$guile_extra_site_ccache_dir'
|
|
export GUILE_EXTENSIONS_PATH='$guile_extra_extensions_dir'
|
|
export LD_LIBRARY_PATH='$guile_extra_prefix/lib:$guile_lib_dir:/usr/local/lib'
|
|
EOF
|
|
|
|
cat >"$metadata_file" <<EOF
|
|
version=$version
|
|
source_url=$source_url
|
|
expected_nix_base32=$expected_nix_base32
|
|
expected_sha256_hex=$expected_sha256_hex
|
|
actual_sha256_hex=$actual_sha256_hex
|
|
guile_bin=$guile_bin
|
|
guile_version=$guile_version
|
|
guile_extra_prefix=$guile_extra_prefix
|
|
install_prefix=$install_prefix
|
|
configure_log=$configure_log
|
|
build_log=$build_log
|
|
install_log=$install_log
|
|
version_log=$version_log
|
|
gsed_bin=$gsed_bin
|
|
signalfd_fallback=$signalfd_fallback
|
|
shepherd_version_output=$(printf '%s' "$shepherd_version_output" | tr '\n' ' ')
|
|
herd_version_output=$(printf '%s' "$herd_version_output" | tr '\n' ' ')
|
|
env_file=$env_file
|
|
EOF
|
|
|
|
if [ -n "${METADATA_OUT:-}" ]; then
|
|
mkdir -p "$(dirname "$METADATA_OUT")"
|
|
cp "$metadata_file" "$METADATA_OUT"
|
|
fi
|
|
if [ -n "${ENV_OUT:-}" ]; then
|
|
mkdir -p "$(dirname "$ENV_OUT")"
|
|
cp "$env_file" "$ENV_OUT"
|
|
fi
|
|
|
|
printf 'PASS local-shepherd-build\n'
|
|
printf 'Version output validated for GNU Shepherd %s\n' "$version"
|
|
printf 'Environment file: %s\n' "$env_file"
|
|
printf 'Metadata file: %s\n' "$metadata_file"
|
|
if [ -n "${ENV_OUT:-}" ]; then
|
|
printf 'Copied environment file to: %s\n' "$ENV_OUT"
|
|
fi
|
|
if [ -n "${METADATA_OUT:-}" ]; then
|
|
printf 'Copied metadata file to: %s\n' "$METADATA_OUT"
|
|
fi
|
|
printf '%s\n' '--- metadata ---'
|
|
cat "$metadata_file"
|