#!/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 " echo " Example: sudo -E bash ${LFS}/sources/toolchain-scripts/100-phase3-build-all.sh 118"