Files
os-build/scripts/check-host-deps.sh
Blake Ridgway 7284b4ec0b fix: ensure the ISO is actually UEFI-bootable
BOOT=efi only changed the GRUB inside the rootfs squashfs — grub-mkrescue
builds the ISO bootloader from the build host's GRUB, so an ISO assembled
on a host without the x86_64-efi modules + mtools shipped with NO UEFI
boot entry. Booting that ISO on a UEFI machine showed:

    "make sure there is a bootable uefi x64 image"

- check-host-deps.sh now verifies the GRUB module dirs it needs for a
  hybrid ISO (/usr/lib/grub/x86_64-efi from grub-efi-amd64-bin,
  /usr/lib/grub/i386-pc from grub-pc-bin) and mtools, not just
  grub-mkrescue.
- build-iso.sh verifies the finished ISO has both EFI and BIOS boot
  entries (xorriso El Torito report) and prints the result; BOOT=efi
  builds FAIL if the EFI entry is missing.
- GitLab CI build image gains grub-pc-bin, grub-efi-amd64-bin, mtools.
- docs/building.md: hybrid-ISO burning instructions (dd) and the
  "bootable uefi x64 image" troubleshooting path.
2026-08-21 18:53:31 -05:00

89 lines
3.2 KiB
Bash
Executable File

#!/usr/bin/env bash
# ─────────────────────────────────────────────────────────────────────────────
# Arcline OS — host build-dependency check
#
# scripts/check-host-deps.sh → report what's missing
# scripts/check-host-deps.sh --install → apt-get install what's missing
#
# Builds run debootstrap (rootfs), copy overlays (standard tools), and produce
# a hybrid ISO via grub-mkrescue + mksquashfs.
# ─────────────────────────────────────────────────────────────────────────────
set -euo pipefail
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
NEEDED=(
"debootstrap|debootstrap"
"grub-mkrescue|grub2-common"
"mksquashfs|squashfs-tools"
"xorriso|xorriso"
"cpio|cpio"
"bash|bash"
# disk images / installer
"sgdisk|gdisk"
"partprobe|parted"
"rsync|rsync"
"mkfs.vfat|dosfstools"
"qemu-img|qemu-utils"
"losetup|util-linux"
# vendor packaging + secure boot
"unzip|unzip"
"dpkg-deb|dpkg"
"openssl|openssl"
"sbsign|sbsigntool"
"sbverify|sbsigntool"
# hybrid ISO: mtools builds the embedded EFI image that grub-mkrescue uses
"mformat|mtools"
)
MISSING=()
for entry in "${NEEDED[@]}"; do
bin="${entry%%|*}"; pkg="${entry##*|}"
if ! command -v "$bin" >/dev/null 2>&1; then
# Distinguish "package not installed" from "installed but not on PATH".
if command -v dpkg-query >/dev/null 2>&1 && \
dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null | grep -q "install ok installed"; then
warn "missing: $bin — package $pkg IS installed but '$bin' is not on PATH (check for /usr/sbin or /sbin in PATH)"
MISSING+=("$pkg") # still require a working resolution before building
else
MISSING+=("$pkg")
warn "missing: $bin (package: $pkg)"
fi
fi
done
# grub-mkrescue assembles the ISO bootloader from the HOST's GRUB modules.
# A missing x86_64-efi module set produces an ISO with no UEFI boot entry —
# the exact cause of "make sure there is a bootable uefi x64 image" on UEFI
# machines. Verify the module dirs directly (they are not binaries).
for spec in "/usr/lib/grub/x86_64-efi:grub-efi-amd64-bin:UEFI" \
"/usr/lib/grub/i386-pc:grub-pc-bin:BIOS"; do
dir="${spec%%:*}"; rest="${spec#*:}"; pkg="${rest%%:*}"; what="${rest##*:}"
if [[ ! -d "$dir" ]]; then
warn "missing: GRUB $what modules in $dir (package: $pkg) — ISO will not boot via $what"
MISSING+=("$pkg")
fi
done
if [[ ${#MISSING[@]} -eq 0 ]]; then
log "all host build dependencies present ✓"
exit 0
fi
if [[ "${1:-}" == "--install" ]]; then
log "installing: ${MISSING[*]}"
if [[ $EUID -ne 0 ]] && command -v sudo >/dev/null; then
sudo apt-get update
sudo apt-get install -y "${MISSING[@]}"
else
apt-get update
apt-get install -y "${MISSING[@]}"
fi
log "dependencies installed ✓"
else
echo
echo "Run the following to install them:"
echo " sudo apt-get install -y ${MISSING[*]}"
echo "or: scripts/check-host-deps.sh --install"
exit 1
fi