178 lines
4.9 KiB
Bash
Executable File
178 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# build.sh — build the n-OS-tr live ISO
|
|
set -euo pipefail
|
|
|
|
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
WORKSPACE_ISO_DIR="$REPO_ROOT/iso"
|
|
WORKSPACE_ISO="$WORKSPACE_ISO_DIR/live-image-amd64.hybrid.iso"
|
|
BUILD_LOG="$WORKSPACE_ISO_DIR/build.log"
|
|
ARTIFACTS_DIR="$WORKSPACE_ISO_DIR/config/includes.chroot_before_packages/live-artifacts"
|
|
BUILD_BINARIES_SCRIPT="$REPO_ROOT/scripts/build-binaries.sh"
|
|
|
|
CLEAN_REQUESTED=0
|
|
# Fast iteration defaults:
|
|
# - skip includes/ binary compilation
|
|
# - skip re-config if existing lb config is present
|
|
# - disallow network downloads during lb build
|
|
ISO_ONLY=1
|
|
RECONFIGURE=0
|
|
OFFLINE=1
|
|
|
|
usage() {
|
|
cat >&2 <<'EOF'
|
|
usage: ./build.sh [options]
|
|
|
|
Default (no flags): fastest iteration build
|
|
- no includes/ binary rebuild
|
|
- no lb reconfigure if already configured
|
|
- offline build (no new downloads)
|
|
|
|
options:
|
|
--with-binaries rebuild includes/ artifacts before ISO build
|
|
--reconfigure run lb config before build
|
|
--online allow network downloads during lb build
|
|
--clean remove iso/.build cache, chroot, binary outputs first
|
|
--iso-only compatibility alias (same as default fast mode)
|
|
-h, --help show this help
|
|
EOF
|
|
}
|
|
|
|
while [[ "$#" -gt 0 ]]; do
|
|
case "$1" in
|
|
--clean)
|
|
CLEAN_REQUESTED=1
|
|
shift
|
|
;;
|
|
--iso-only)
|
|
ISO_ONLY=1
|
|
shift
|
|
;;
|
|
--with-binaries)
|
|
ISO_ONLY=0
|
|
shift
|
|
;;
|
|
--reconfigure)
|
|
RECONFIGURE=1
|
|
shift
|
|
;;
|
|
--online)
|
|
OFFLINE=0
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "[build.sh] unsupported arguments: $*" >&2
|
|
usage
|
|
exit 2
|
|
;;
|
|
esac
|
|
done
|
|
|
|
home_opts="$(findmnt -n -o OPTIONS /home 2>/dev/null || true)"
|
|
if [[ "$home_opts" == *nodev* ]]; then
|
|
NEED_BIND=1
|
|
else
|
|
NEED_BIND=0
|
|
fi
|
|
|
|
cleanup_artifacts() {
|
|
echo "[build.sh] cleaning prior build artifacts in $WORKSPACE_ISO_DIR"
|
|
sudo rm -rf \
|
|
"$WORKSPACE_ISO_DIR/.build" \
|
|
"$WORKSPACE_ISO_DIR/cache" \
|
|
"$WORKSPACE_ISO_DIR/chroot" \
|
|
"$WORKSPACE_ISO_DIR/binary"
|
|
|
|
sudo rm -f \
|
|
"$WORKSPACE_ISO_DIR"/live-image-* \
|
|
"$WORKSPACE_ISO_DIR"/chroot.* \
|
|
"$WORKSPACE_ISO_DIR"/binary.modified_timestamps \
|
|
"$WORKSPACE_ISO_DIR"/build.log
|
|
}
|
|
|
|
stage_slice_bc_artifacts() {
|
|
echo "[build.sh] staging artifacts via $BUILD_BINARIES_SCRIPT"
|
|
|
|
if [[ ! -x "$BUILD_BINARIES_SCRIPT" ]]; then
|
|
echo "[build.sh] ERROR: missing or non-executable $BUILD_BINARIES_SCRIPT" >&2
|
|
exit 1
|
|
fi
|
|
|
|
"$BUILD_BINARIES_SCRIPT"
|
|
}
|
|
|
|
if [[ "$CLEAN_REQUESTED" -eq 1 ]]; then
|
|
cleanup_artifacts
|
|
fi
|
|
|
|
SCRATCH=""
|
|
BUILD_DIR=""
|
|
CLEANUP() {
|
|
if [[ -n "$SCRATCH" ]]; then
|
|
if mountpoint -q "$SCRATCH"; then
|
|
sudo umount -R "$SCRATCH" 2>/dev/null || sudo umount -l "$SCRATCH" || true
|
|
fi
|
|
rmdir "$SCRATCH" 2>/dev/null || true
|
|
fi
|
|
}
|
|
trap CLEANUP EXIT
|
|
|
|
if [[ "$NEED_BIND" -eq 1 ]]; then
|
|
echo "[build.sh] /home has nodev mount option; building via bind-mounted scratch workspace"
|
|
SCRATCH="/var/tmp/n-os-tr-build-$$-$(date +%s)"
|
|
mkdir -p "$SCRATCH"
|
|
sudo mount --bind "$REPO_ROOT" "$SCRATCH"
|
|
echo "[build.sh] remounting scratch bind with dev to allow chroot /dev/null usage"
|
|
sudo mount -o remount,bind,dev "$SCRATCH"
|
|
|
|
scratch_opts="$(findmnt -n -o OPTIONS "$SCRATCH" 2>/dev/null || true)"
|
|
if [[ "$scratch_opts" == *nodev* ]]; then
|
|
echo "[build.sh] ERROR: scratch bind still has nodev after remount: $scratch_opts" >&2
|
|
echo "[build.sh] cannot safely run live-build chroot on a nodev mount" >&2
|
|
exit 1
|
|
fi
|
|
|
|
BUILD_DIR="$SCRATCH/iso"
|
|
else
|
|
echo "[build.sh] /home is not nodev; building directly in workspace"
|
|
BUILD_DIR="$WORKSPACE_ISO_DIR"
|
|
fi
|
|
|
|
if [[ ! -d "$BUILD_DIR" ]]; then
|
|
echo "[build.sh] build directory missing: $BUILD_DIR" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ "$ISO_ONLY" -eq 1 ]]; then
|
|
echo "[build.sh] fast mode: skipping includes/ binary rebuild"
|
|
else
|
|
stage_slice_bc_artifacts
|
|
fi
|
|
|
|
cd "$BUILD_DIR"
|
|
|
|
if [[ "$RECONFIGURE" -eq 1 || ! -f "$BUILD_DIR/config/bootstrap" ]]; then
|
|
echo "[build.sh] running lb config"
|
|
sudo "$REPO_ROOT/lb-wrapper.sh" config
|
|
else
|
|
echo "[build.sh] skipping lb config (use --reconfigure to force)"
|
|
fi
|
|
|
|
if [[ "$OFFLINE" -eq 1 ]]; then
|
|
echo "[build.sh] offline mode: network downloads disabled (use --online to allow)"
|
|
sudo env http_proxy=http://127.0.0.1:9 https_proxy=http://127.0.0.1:9 ftp_proxy=http://127.0.0.1:9 no_proxy=localhost,127.0.0.1 "$REPO_ROOT/lb-wrapper.sh" build 2>&1 | tee "$BUILD_LOG"
|
|
else
|
|
echo "[build.sh] online mode: network downloads allowed"
|
|
sudo "$REPO_ROOT/lb-wrapper.sh" build 2>&1 | tee "$BUILD_LOG"
|
|
fi
|
|
|
|
if [[ ! -f "$WORKSPACE_ISO" ]]; then
|
|
echo "[build.sh] build produced no ISO at $WORKSPACE_ISO; see $BUILD_LOG" >&2
|
|
exit 1
|
|
fi
|
|
|
|
ls -lh "$WORKSPACE_ISO"
|