From 8fb25d825d48a6faf551da9af6c231339cec3cdd Mon Sep 17 00:00:00 2001 From: oxmc7769 Date: Mon, 25 May 2026 05:48:54 -0700 Subject: [PATCH] Improve build script --- build.sh | 60 +++++++++++++++++++++++++++++++++----------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/build.sh b/build.sh index ef390e636..424e70f2b 100755 --- a/build.sh +++ b/build.sh @@ -27,14 +27,14 @@ # ============================================================================= set -euo pipefail -# ── Defaults ───────────────────────────────────────────────────────────────── +# ── Defaults ────────────────────────────────────────────────────────────────── PLATFORM="efi-x64" EMBED="" OUTPUT_DIR="$(dirname "$0")/build" JOBS="$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 4)" -SRC_DIR="$(dirname "$0")/src" +SRC_DIR="$(cd "$(dirname "$0")/src" && pwd)" -# ── Colour helpers ──────────────────────────────────────────────────────────── +# ── Colour helpers ───────────────────────────────────────────────────────────── if [ -t 1 ]; then C_BOLD='\033[1m'; C_GREEN='\033[0;32m'; C_CYAN='\033[0;36m' C_YELLOW='\033[0;33m'; C_RED='\033[0;31m'; C_RESET='\033[0m' @@ -47,7 +47,7 @@ ok() { echo -e "${C_GREEN}✔${C_RESET} $*"; } warn() { echo -e "${C_YELLOW}⚠${C_RESET} $*"; } die() { echo -e "${C_RED}✘${C_RESET} $*" >&2; exit 1; } -# ── Argument parsing ────────────────────────────────────────────────────────── +# ── Argument parsing ─────────────────────────────────────────────────────────── usage() { sed -n '3,20p' "$0" | sed 's/^# \{0,1\}//' exit 0 @@ -64,48 +64,58 @@ while [[ $# -gt 0 ]]; do esac done -# ── Platform → make target ──────────────────────────────────────────────────── +# ── Platform → make target ───────────────────────────────────────────────────── case "$PLATFORM" in - efi-x64) MAKE_TARGET="bin-x86_64-efi/ipxe.efi"; OUTPUT_NAME="ipxe-x64.efi" ;; - efi-ia32) MAKE_TARGET="bin-i386-efi/ipxe.efi"; OUTPUT_NAME="ipxe-ia32.efi" ;; - efi-arm64) MAKE_TARGET="bin-arm64-efi/ipxe.efi"; OUTPUT_NAME="ipxe-arm64.efi" ;; - snp-x64) MAKE_TARGET="bin-x86_64-efi/snponly.efi"; OUTPUT_NAME="snponly-x64.efi";; - bios) MAKE_TARGET="bin/undionly.kpxe"; OUTPUT_NAME="undionly.kpxe" ;; + efi-x64) MAKE_TARGET="bin-x86_64-efi/ipxe.efi"; OUTPUT_NAME="ipxe-x64.efi" ;; + efi-ia32) MAKE_TARGET="bin-i386-efi/ipxe.efi"; OUTPUT_NAME="ipxe-ia32.efi" ;; + efi-arm64) MAKE_TARGET="bin-arm64-efi/ipxe.efi"; OUTPUT_NAME="ipxe-arm64.efi" ;; + snp-x64) MAKE_TARGET="bin-x86_64-efi/snponly.efi"; OUTPUT_NAME="snponly-x64.efi" ;; + bios) MAKE_TARGET="bin/undionly.kpxe"; OUTPUT_NAME="undionly.kpxe" ;; *) die "Unknown platform: '$PLATFORM'. Run with --help for valid platforms." ;; esac -# ── Validate inputs ─────────────────────────────────────────────────────────── -[[ -d "$SRC_DIR" ]] || die "src/ directory not found at $SRC_DIR" +# ── Validate inputs ──────────────────────────────────────────────────────────── +[[ -d "$SRC_DIR" ]] || die "src/ not found at $SRC_DIR" -EMBED_ARG="" +EMBED_ABS="" if [[ -n "$EMBED" ]]; then - # Resolve relative to repo root, not src/ EMBED_ABS="$(realpath "$EMBED" 2>/dev/null)" || die "Embed script not found: $EMBED" [[ -f "$EMBED_ABS" ]] || die "Embed script not found: $EMBED" - EMBED_ARG="EMBED=$EMBED_ABS" - info "Embed script: $EMBED_ABS" fi -# ── Build ───────────────────────────────────────────────────────────────────── +# ── Summary ──────────────────────────────────────────────────────────────────── mkdir -p "$OUTPUT_DIR" - echo -e "${C_BOLD}Platform:${C_RESET} $PLATFORM → $MAKE_TARGET" echo -e "${C_BOLD}Jobs:${C_RESET} $JOBS" +echo -e "${C_BOLD}Embed:${C_RESET} ${EMBED_ABS:-none}" echo -e "${C_BOLD}Output:${C_RESET} $OUTPUT_DIR/$OUTPUT_NAME" echo "" -info "Starting build…" +# ── Build ────────────────────────────────────────────────────────────────────── +info "Building…" -make -C "$SRC_DIR" \ - "$MAKE_TARGET" \ - $EMBED_ARG \ - -j "$JOBS" +if [[ -n "$EMBED_ABS" ]]; then + make -C "$SRC_DIR" "$MAKE_TARGET" "EMBED=$EMBED_ABS" -j "$JOBS" +else + make -C "$SRC_DIR" "$MAKE_TARGET" -j "$JOBS" +fi -# ── Copy output ─────────────────────────────────────────────────────────────── +# ── Copy output ──────────────────────────────────────────────────────────────── BUILT_BIN="$SRC_DIR/$MAKE_TARGET" -[[ -f "$BUILT_BIN" ]] || die "Build succeeded but output not found: $BUILT_BIN" +[[ -f "$BUILT_BIN" ]] || die "Build finished but output not found: $BUILT_BIN" cp "$BUILT_BIN" "$OUTPUT_DIR/$OUTPUT_NAME" +# ── Verify embedded script made it in ───────────────────────────────────────── +if [[ -n "$EMBED_ABS" ]]; then + # Pull first line of the script and look for it in the binary + FIRST_LINE="$(head -1 "$EMBED_ABS")" + if strings "$OUTPUT_DIR/$OUTPUT_NAME" | grep -qF "$FIRST_LINE" 2>/dev/null; then + ok "Embed verified: script found in binary" + else + warn "Could not verify embed — 'strings' may not be installed, or check manually" + fi +fi + echo "" ok "Built: $OUTPUT_DIR/$OUTPUT_NAME"