288 lines
9.8 KiB
Bash
Executable File
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"
|