#!/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" <"$metadata_file" <