Files
darkforge/toolchain/scripts/100-phase3-build-all.sh
2026-03-20 15:09:30 +01:00

288 lines
9.8 KiB
Bash
Executable File

#!/bin/bash
# ============================================================================
# DarkForge Linux — Phase 3: Build All Base System Packages (Chapter 8)
# ============================================================================
# Purpose: Enters the chroot and runs all Phase 3 build scripts (101-179)
# in sequence. This builds the complete LFS base system with
# native compilation targeting AMD Zen 5.
# Usage: sudo -E bash /mnt/darkforge/sources/toolchain-scripts/100-phase3-build-all.sh
# Inputs: LFS environment variable (default: /mnt/darkforge)
# Phase 0 toolchain must be complete (023a-chroot-build-all.sh)
# Phase 3 sources downloaded (100-download-phase3.sh)
# Outputs: Complete base system installed in the chroot
# ============================================================================
set -euo pipefail
LFS="${LFS:-/mnt/darkforge}"
SCRIPTS="/sources/toolchain-scripts"
# Color output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
ok() { echo -e "${GREEN}>>> $*${NC}"; }
warn() { echo -e "${YELLOW}>>> $*${NC}"; }
fail() { echo -e "${RED}>>> $*${NC}"; exit 1; }
info() { echo -e "${CYAN}>>> $*${NC}"; }
[ "$(id -u)" -eq 0 ] || fail "This script must be run as root."
# Verify chroot is ready (virtual filesystems mounted)
if ! mountpoint -q "${LFS}/proc" 2>/dev/null; then
fail "${LFS}/proc is not mounted. Run 023-chroot-setup.sh first."
fi
# Verify Phase 0 completed (gcc should exist)
if [ ! -f "${LFS}/usr/bin/gcc" ]; then
fail "gcc not found in chroot. Phase 0 must be complete first."
fi
echo "============================================================"
echo " DarkForge Linux — Phase 3: Base System Build (Chapter 8)"
echo "============================================================"
echo ""
info "Target: AMD Ryzen 9 9950X3D (Zen 5) — 32 parallel jobs"
info "This will take a while. Grab some coffee."
echo ""
# Allow resuming from a specific script number
START_FROM="${1:-101}"
info "Starting from script ${START_FROM}"
echo ""
# Build the chroot runner script
cat > "${LFS}/tmp/phase3-runner.sh" << 'CHROOT_EOF'
#!/bin/bash
set -euo pipefail
SCRIPTS="/sources/toolchain-scripts"
LOG_DIR="/sources/logs/phase3"
mkdir -p "${LOG_DIR}"
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'
START_FROM="$1"
TOTAL=0
PASSED=0
FAILED=0
SKIPPED=0
run_script() {
local script="$1"
local name
name=$(basename "${script}" .sh)
local num="${name%%-*}"
local logfile="${LOG_DIR}/${name}.log"
# Skip if before our start point
if [ "${num}" -lt "${START_FROM}" ]; then
echo -e "${CYAN}>>> [$(date '+%H:%M:%S')] SKIP: ${name} (before start point ${START_FROM})${NC}"
SKIPPED=$((SKIPPED + 1))
return 0
fi
TOTAL=$((TOTAL + 1))
echo -e "${YELLOW}>>> [$(date '+%H:%M:%S')] Building: ${name} [${TOTAL}]${NC}"
local start_time
start_time=$(date +%s)
if bash "${script}" 2>&1 | tee "${logfile}"; then
local end_time
end_time=$(date +%s)
local elapsed=$((end_time - start_time))
local mins=$((elapsed / 60))
local secs=$((elapsed % 60))
echo -e "${GREEN}>>> [$(date '+%H:%M:%S')] PASSED: ${name} (${mins}m ${secs}s)${NC}"
echo ""
PASSED=$((PASSED + 1))
else
local end_time
end_time=$(date +%s)
local elapsed=$((end_time - start_time))
echo -e "${RED}>>> [$(date '+%H:%M:%S')] FAILED: ${name} (after ${elapsed}s)${NC}"
echo " Log: ${logfile}"
echo ""
FAILED=$((FAILED + 1))
# Don't exit immediately — log the failure and continue to see what else fails
# For critical packages, we do need to stop though
local critical_packages="103 118 127 103 149"
if echo "${critical_packages}" | grep -qw "${num}"; then
echo -e "${RED}>>> CRITICAL package failed — cannot continue.${NC}"
echo ""
echo "=== PHASE 3 ABORTED ==="
echo " Passed: ${PASSED} Failed: ${FAILED} Skipped: ${SKIPPED}"
exit 1
fi
fi
}
echo "============================================"
echo " Phase 3: Building LFS Base System"
echo " $(date)"
echo "============================================"
echo ""
# ---- Run download script first if needed ----
if [ "${START_FROM}" -le 100 ]; then
echo -e "${YELLOW}>>> Running Phase 3 download script...${NC}"
bash "${SCRIPTS}/100-download-phase3.sh" 2>&1 | tee "${LOG_DIR}/100-download-phase3.log"
echo ""
fi
# ---- Foundation packages (101-113) ----
echo -e "${CYAN}=== Stage 1: Foundation packages ===${NC}"
run_script "${SCRIPTS}/101-man-pages.sh"
run_script "${SCRIPTS}/102-iana-etc.sh"
run_script "${SCRIPTS}/103-glibc.sh"
run_script "${SCRIPTS}/104-zlib.sh"
run_script "${SCRIPTS}/105-bzip2.sh"
run_script "${SCRIPTS}/106-xz.sh"
run_script "${SCRIPTS}/107-lz4.sh"
run_script "${SCRIPTS}/108-zstd.sh"
run_script "${SCRIPTS}/109-file.sh"
run_script "${SCRIPTS}/110-readline.sh"
run_script "${SCRIPTS}/111-m4.sh"
run_script "${SCRIPTS}/112-bc.sh"
run_script "${SCRIPTS}/113-flex.sh"
# ---- Test frameworks & toolchain rebuild (114-127) ----
echo -e "${CYAN}=== Stage 2: Test frameworks & final toolchain ===${NC}"
run_script "${SCRIPTS}/114-tcl.sh"
run_script "${SCRIPTS}/115-expect.sh"
run_script "${SCRIPTS}/116-dejagnu.sh"
run_script "${SCRIPTS}/117-pkgconf.sh"
run_script "${SCRIPTS}/118-binutils.sh"
run_script "${SCRIPTS}/119-gmp.sh"
run_script "${SCRIPTS}/120-mpfr.sh"
run_script "${SCRIPTS}/121-mpc.sh"
run_script "${SCRIPTS}/122-attr.sh"
run_script "${SCRIPTS}/123-acl.sh"
run_script "${SCRIPTS}/124-libcap.sh"
run_script "${SCRIPTS}/125-libxcrypt.sh"
run_script "${SCRIPTS}/126-shadow.sh"
run_script "${SCRIPTS}/127-gcc.sh"
# ---- Core system libraries & tools (128-154) ----
echo -e "${CYAN}=== Stage 3: Core system libraries & tools ===${NC}"
run_script "${SCRIPTS}/128-ncurses.sh"
run_script "${SCRIPTS}/129-sed.sh"
run_script "${SCRIPTS}/130-psmisc.sh"
run_script "${SCRIPTS}/131-gettext.sh"
run_script "${SCRIPTS}/132-bison.sh"
run_script "${SCRIPTS}/133-grep.sh"
run_script "${SCRIPTS}/134-bash.sh"
run_script "${SCRIPTS}/135-libtool.sh"
run_script "${SCRIPTS}/136-gdbm.sh"
run_script "${SCRIPTS}/137-gperf.sh"
run_script "${SCRIPTS}/138-expat.sh"
run_script "${SCRIPTS}/139-inetutils.sh"
run_script "${SCRIPTS}/140-less.sh"
run_script "${SCRIPTS}/141-perl.sh"
run_script "${SCRIPTS}/142-xml-parser.sh"
run_script "${SCRIPTS}/143-intltool.sh"
run_script "${SCRIPTS}/144-autoconf.sh"
run_script "${SCRIPTS}/145-automake.sh"
run_script "${SCRIPTS}/146-openssl.sh"
run_script "${SCRIPTS}/147-libelf.sh"
run_script "${SCRIPTS}/148-libffi.sh"
run_script "${SCRIPTS}/149-python.sh"
run_script "${SCRIPTS}/150-flit-core.sh"
run_script "${SCRIPTS}/151-wheel.sh"
run_script "${SCRIPTS}/152-setuptools.sh"
run_script "${SCRIPTS}/153-ninja.sh"
run_script "${SCRIPTS}/154-meson.sh"
# ---- System utilities & final packages (155-179) ----
echo -e "${CYAN}=== Stage 4: System utilities & final packages ===${NC}"
run_script "${SCRIPTS}/155-kmod.sh"
run_script "${SCRIPTS}/156-coreutils.sh"
run_script "${SCRIPTS}/157-diffutils.sh"
run_script "${SCRIPTS}/158-gawk.sh"
run_script "${SCRIPTS}/159-findutils.sh"
run_script "${SCRIPTS}/160-groff.sh"
run_script "${SCRIPTS}/161-gzip.sh"
run_script "${SCRIPTS}/162-iproute2.sh"
run_script "${SCRIPTS}/163-kbd.sh"
run_script "${SCRIPTS}/164-libpipeline.sh"
run_script "${SCRIPTS}/165-make.sh"
run_script "${SCRIPTS}/166-patch.sh"
run_script "${SCRIPTS}/167-tar.sh"
run_script "${SCRIPTS}/168-texinfo.sh"
run_script "${SCRIPTS}/169-vim.sh"
run_script "${SCRIPTS}/170-markupsafe.sh"
run_script "${SCRIPTS}/171-jinja2.sh"
run_script "${SCRIPTS}/172-eudev.sh"
run_script "${SCRIPTS}/173-man-db.sh"
run_script "${SCRIPTS}/174-procps-ng.sh"
run_script "${SCRIPTS}/175-util-linux.sh"
run_script "${SCRIPTS}/176-e2fsprogs.sh"
run_script "${SCRIPTS}/177-sysklogd.sh"
run_script "${SCRIPTS}/178-sysvinit.sh"
run_script "${SCRIPTS}/179-strip-and-cleanup.sh"
echo ""
echo "============================================================"
echo " Phase 3 Build Summary"
echo "============================================================"
echo " Passed: ${PASSED}"
echo " Failed: ${FAILED}"
echo " Skipped: ${SKIPPED}"
echo ""
if [ "${FAILED}" -gt 0 ]; then
echo -e "${RED}>>> ${FAILED} package(s) failed! Check logs in ${LOG_DIR}/${NC}"
echo ""
echo "Failed package logs:"
for logfile in ${LOG_DIR}/*.log; do
name=$(basename "${logfile}" .log)
if tail -5 "${logfile}" 2>/dev/null | grep -qi "error\|fail"; then
echo " - ${logfile}"
fi
done
exit 1
else
echo -e "${GREEN}>>> ALL ${PASSED} packages built successfully!${NC}"
echo ""
echo "============================================================"
echo " DarkForge Linux: Phase 3 base system build COMPLETE!"
echo "============================================================"
echo ""
echo "The system now has a complete base installation."
echo "Next: Phase 4 (Kernel) or Phase 5 (Init System)."
fi
CHROOT_EOF
chmod +x "${LFS}/tmp/phase3-runner.sh"
# Enter chroot and run the build
# Use hardware-specific Zen 5 flags via the env file sourced by each script
info "Entering chroot to build Phase 3 packages..."
echo ""
chroot "${LFS}" /usr/bin/env -i \
HOME=/root \
TERM="${TERM}" \
PS1='(darkforge chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
MAKEFLAGS="-j32" \
/bin/bash /tmp/phase3-runner.sh "${START_FROM}"
# Clean up
rm -f "${LFS}/tmp/phase3-runner.sh"
echo ""
echo -e "${GREEN}Phase 3 runner exited successfully.${NC}"
echo ""
echo "To resume from a specific script if something failed:"
echo " sudo -E bash ${LFS}/sources/toolchain-scripts/100-phase3-build-all.sh <script-number>"
echo " Example: sudo -E bash ${LFS}/sources/toolchain-scripts/100-phase3-build-all.sh 118"