Compare commits

..

2 Commits

Author SHA1 Message Date
ad3819c9c9 wip 2026-03-20 11:21:20 +01:00
0d041913be wip 2026-03-20 11:18:42 +01:00
6 changed files with 252 additions and 74 deletions

View File

@@ -2,6 +2,70 @@
---
## V37 2026-03-20 22:30:00
**Use Danish GNU mirror and add loopback disk setup script**
### Changes:
- Updated `toolchain/scripts/000a-download-sources.sh`:
- Switched all GNU package URLs to use `http://ftp.klid.dk/ftp/gnu` mirror
(faster from Denmark than ftp.gnu.org)
- Added `GNU_MIRROR` variable at top for easy mirror switching
- Non-GNU packages (kernel, mpfr, gmp, xz, zstd, perl, python, etc.) still
use their canonical upstream URLs
- Added `toolchain/scripts/000-setup-disk.sh`:
- Creates a 50GB loopback ext4 filesystem at /opt/darkforge.img
- Mounts it at /mnt/darkforge — acts exactly like a real partition
- Uses fallocate for instant allocation (no slow dd)
- Includes remount instructions and fstab entry
- Safe: no repartitioning needed, uses free space on root
- Updated `toolchain/scripts/000-env-setup.sh`:
- Improved error message to point users to 000-setup-disk.sh
### Plan deviation/changes:
- Using loopback file instead of a dedicated partition (user has no spare
partition but has 1.5TB free on root)
### What is missing/needs polish:
- None
---
## V36 2026-03-20 22:00:00
**Fix Phase 0 download script — 10+ version/filename mismatches with build scripts**
### Changes:
- Rewrote `toolchain/scripts/000a-download-sources.sh`:
- Fixed binutils URL (was 2.46.0, build expects 2.46)
- Fixed m4 version (was 1.4.21 on mirror but build expected 1.4.20 — updated build to 1.4.21)
- Fixed ncurses URL (was generic `ncurses.tar.gz`, now versioned `ncurses-6.5.tar.gz`)
- Fixed coreutils URL (was 9.10, build expects 9.6)
- Fixed diffutils URL (was 3.12, build expects 3.10)
- Fixed grep URL (was 3.12, build expects 3.14)
- Fixed make URL (was 4.4, build expects 4.4.1)
- Fixed tar URL (was `tar-latest.tar.xz`, now `tar-1.35.tar.xz`)
- Fixed gettext URL (was 1.0, build expects 0.23.1)
- Fixed zlib URL (was generic `zlib.tar.gz`, now `zlib-1.3.1.tar.xz`)
- Fixed util-linux URL (was GitHub archive v2.41.3, now kernel.org v2.40.4)
- Replaced all Danish mirror URLs (ftp.klid.dk) with canonical ftp.gnu.org URLs
- Fixed glibc FHS patch URL to match LFS 13.0 naming convention
- Added second argument to download() for renaming files on download
- Every download URL now exactly matches the tarball name expected by its build script
- Updated `toolchain/scripts/006-m4.sh`: VERSION 1.4.20 → 1.4.21 (latest stable)
- Updated `toolchain/VERSION_MANIFEST.md`: synced all versions and tarball names
### Plan deviation/changes:
- None — this is a bugfix. Without these fixes, Phase 0 would fail immediately
on the first `tar -xf` command because the downloaded filenames wouldn't match.
### What is missing/needs polish:
- Download URLs not verified to be reachable (some GNU mirrors may be down)
- Some packages may have newer versions available (per CLAUDE.md Rule 3) but we're
matching LFS 13.0 versions for proven compatibility during initial bootstrap
---
## V35 2026-03-20 21:00:00
**Harden dpack repo loading and fix search command failure**

View File

@@ -1,51 +1,52 @@
# DarkForge Linux — Phase 0 Toolchain Version Manifest
# Generated: 2026-03-19
# Generated: 2026-03-20 (updated to sync with build scripts)
# Rule: Always use latest stable release (CLAUDE.md §3)
# Base reference: LFS 13.0 (r13.0-4, 2026-03-14)
## Cross-Toolchain (Chapter 5 equivalents)
| Package | Version | Source URL | Note |
|----------------|---------|-------------------------------------------------------------------------|--------------------------------|
| binutils | 2.46 | https://ftp.gnu.org/gnu/binutils/binutils-2.46.tar.xz | LFS uses 2.46.0 (same) |
| gcc | 15.2.0 | https://ftp.gnu.org/pub/gnu/gcc/gcc-15.2.0/gcc-15.2.0.tar.xz | Supports -march=znver5 |
| glibc | 2.43 | https://ftp.gnu.org/gnu/glibc/glibc-2.43.tar.xz | |
| linux | 6.19.8 | https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.19.8.tar.xz | Headers only for Phase 0 |
| mpfr | 4.2.2 | https://www.mpfr.org/mpfr-current/mpfr-4.2.2.tar.xz | GCC dependency |
| gmp | 6.3.0 | https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz | GCC dependency |
| mpc | 1.3.1 | https://ftp.gnu.org/gnu/mpc/mpc-1.3.1.tar.gz | GCC dependency |
| Package | Version | Tarball | Note |
|----------------|---------|---------------------------------------|--------------------------------|
| binutils | 2.46 | binutils-2.46.tar.xz | LFS 13.0 version |
| gcc | 15.2.0 | gcc-15.2.0.tar.xz | Supports -march=znver5 |
| glibc | 2.43 | glibc-2.43.tar.xz | LFS 13.0 version |
| linux | 6.19.8 | linux-6.19.8.tar.xz | Headers only for Phase 0 |
| mpfr | 4.2.2 | mpfr-4.2.2.tar.xz | GCC dependency |
| gmp | 6.3.0 | gmp-6.3.0.tar.xz | GCC dependency |
| mpc | 1.3.1 | mpc-1.3.1.tar.gz | GCC dependency |
## Temporary Tools (Chapter 6 equivalents)
| Package | Version | Source URL | Note |
|----------------|---------|-------------------------------------------------------------------------|--------------------------------|
| m4 | 1.4.20 | https://ftp.gnu.org/gnu/m4/m4-1.4.20.tar.xz | Newer than LFS (1.4.19) |
| ncurses | 6.5 | https://invisible-island.net/datafiles/release/ncurses-6.5.tar.gz | |
| bash | 5.3 | https://ftp.gnu.org/gnu/bash/bash-5.3.tar.gz | |
| coreutils | 9.6 | https://ftp.gnu.org/gnu/coreutils/coreutils-9.6.tar.xz | LFS 13 uses 9.6 |
| diffutils | 3.10 | https://ftp.gnu.org/gnu/diffutils/diffutils-3.10.tar.xz | |
| file | 5.47 | https://astron.com/pub/file/file-5.47.tar.gz | LFS 13 version |
| findutils | 4.10.0 | https://ftp.gnu.org/gnu/findutils/findutils-4.10.0.tar.xz | |
| gawk | 5.4.0 | https://ftp.gnu.org/gnu/gawk/gawk-5.4.0.tar.xz | |
| grep | 3.14 | https://ftp.gnu.org/gnu/grep/grep-3.14.tar.xz | LFS 13 version |
| gzip | 1.14 | https://ftp.gnu.org/gnu/gzip/gzip-1.14.tar.xz | Newer than LFS (1.13) |
| make | 4.4.1 | https://ftp.gnu.org/gnu/make/make-4.4.1.tar.gz | |
| patch | 2.8 | https://ftp.gnu.org/gnu/patch/patch-2.8.tar.xz | Newer than LFS (2.7.6) |
| sed | 4.9 | https://ftp.gnu.org/gnu/sed/sed-4.9.tar.xz | LFS 13 version |
| tar | 1.35 | https://ftp.gnu.org/gnu/tar/tar-1.35.tar.xz | |
| xz | 5.8.1 | https://github.com/tukaani-project/xz/releases/download/v5.8.1/xz-5.8.1.tar.gz | Newer than LFS (5.6.1) |
| zstd | 1.5.7 | https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz | |
| Package | Version | Tarball | Note |
|----------------|---------|---------------------------------------|--------------------------------|
| m4 | 1.4.21 | m4-1.4.21.tar.xz | Latest stable (Feb 2026) |
| ncurses | 6.5 | ncurses-6.5.tar.gz | |
| bash | 5.3 | bash-5.3.tar.gz | |
| coreutils | 9.6 | coreutils-9.6.tar.xz | LFS 13.0 version |
| diffutils | 3.10 | diffutils-3.10.tar.xz | |
| file | 5.47 | file-5.47.tar.gz | LFS 13.0 version |
| findutils | 4.10.0 | findutils-4.10.0.tar.xz | |
| gawk | 5.4.0 | gawk-5.4.0.tar.xz | |
| grep | 3.14 | grep-3.14.tar.xz | |
| gzip | 1.14 | gzip-1.14.tar.xz | |
| make | 4.4.1 | make-4.4.1.tar.gz | |
| patch | 2.8 | patch-2.8.tar.xz | |
| sed | 4.9 | sed-4.9.tar.xz | LFS 13.0 version |
| tar | 1.35 | tar-1.35.tar.xz | |
| xz | 5.8.1 | xz-5.8.1.tar.gz | |
| zstd | 1.5.7 | zstd-1.5.7.tar.gz | Not in LFS; needed for kernel |
## Chroot Packages (Chapter 7 equivalents)
| Package | Version | Source URL | Note |
|----------------|---------|-------------------------------------------------------------------------|--------------------------------|
| gettext | 0.23.1 | https://ftp.gnu.org/gnu/gettext/gettext-0.23.1.tar.xz | Latest stable |
| bison | 3.8.2 | https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz | |
| perl | 5.40.2 | https://www.cpan.org/src/5.0/perl-5.40.2.tar.xz | Latest stable 5.40.x |
| python | 3.13.3 | https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz | Latest stable 3.13.x |
| texinfo | 7.3 | https://ftp.gnu.org/gnu/texinfo/texinfo-7.3.tar.xz | |
| zlib | 1.3.1 | https://zlib.net/zlib-1.3.1.tar.xz | |
| Package | Version | Tarball | Note |
|----------------|---------|---------------------------------------|--------------------------------|
| gettext | 0.23.1 | gettext-0.23.1.tar.xz | |
| bison | 3.8.2 | bison-3.8.2.tar.xz | |
| perl | 5.40.2 | perl-5.40.2.tar.xz | Latest stable 5.40.x |
| python | 3.13.3 | Python-3.13.3.tar.xz | |
| texinfo | 7.3 | texinfo-7.3.tar.xz | |
| zlib | 1.3.1 | zlib-1.3.1.tar.xz | |
| util-linux | 2.40.4 | util-linux-2.40.4.tar.xz | LFS 13.0 version |
## Compiler Flags (Global Defaults)
@@ -62,6 +63,6 @@ only take effect once we have a native compiler targeting our hardware.
## Patches Required
| Patch | Source | Used For |
|------------------------|------------------------------------------------|-----------------|
| glibc-fhs-1.patch | https://www.linuxfromscratch.org/patches/lfs/ | Glibc FHS dirs |
| Patch | Source | Used For |
|---------------------------|-------------------------------------------------------------------|-----------------|
| glibc-2.43-fhs-1.patch | https://www.linuxfromscratch.org/patches/lfs/13.0/ | Glibc FHS dirs |

View File

@@ -27,7 +27,8 @@ DF_LDFLAGS="-Wl,-O1,--as-needed"
# --- Verify mount point ------------------------------------------------------
if ! mountpoint -q "${LFS}" 2>/dev/null; then
echo "ERROR: ${LFS} is not a mount point."
echo "Mount the target partition first: mount /dev/<partition> ${LFS}"
echo "Run 000-setup-disk.sh first to create and mount the LFS filesystem,"
echo "or mount a partition manually: mount /dev/<partition> ${LFS}"
exit 1
fi

View File

@@ -0,0 +1,97 @@
#!/bin/bash
# ============================================================================
# DarkForge Linux — Phase 0: Create LFS Build Partition (Loopback)
# ============================================================================
# Purpose: Create a loopback ext4 filesystem for the LFS build environment.
# This avoids repartitioning and uses free space on your root drive.
# The loopback file acts exactly like a real partition.
# Inputs: None (uses defaults below, override via environment)
# Outputs: 50GB ext4 filesystem mounted at /mnt/darkforge
# Assumes: Running as root, ~50GB free on root filesystem
# ============================================================================
set -euo pipefail
# --- Configuration -----------------------------------------------------------
LFS="${LFS:-/mnt/darkforge}"
LFS_IMAGE="${LFS_IMAGE:-/opt/darkforge.img}"
LFS_SIZE="${LFS_SIZE:-50G}"
# Color output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'
ok() { echo -e "${GREEN}>>> $*${NC}"; }
warn() { echo -e "${YELLOW}>>> $*${NC}"; }
fail() { echo -e "${RED}>>> $*${NC}"; exit 1; }
# --- Verify running as root --------------------------------------------------
[ "$(id -u)" -eq 0 ] || fail "This script must be run as root."
echo "============================================================"
echo " DarkForge Linux — LFS Build Partition Setup"
echo "============================================================"
echo ""
echo " Image file: ${LFS_IMAGE}"
echo " Image size: ${LFS_SIZE}"
echo " Mount point: ${LFS}"
echo ""
# --- Check if already mounted ------------------------------------------------
if mountpoint -q "${LFS}" 2>/dev/null; then
ok "${LFS} is already mounted:"
df -h "${LFS}"
echo ""
echo "To start over: umount ${LFS} && rm ${LFS_IMAGE}"
exit 0
fi
# --- Check free space ---------------------------------------------------------
AVAIL_KB=$(df --output=avail / | tail -1 | tr -d ' ')
AVAIL_GB=$((AVAIL_KB / 1024 / 1024))
NEED_GB=$(echo "${LFS_SIZE}" | sed 's/G//')
if [ "${AVAIL_GB}" -lt "${NEED_GB}" ]; then
fail "Not enough free space: ${AVAIL_GB}GB available, need ${NEED_GB}GB"
fi
ok "Free space check: ${AVAIL_GB}GB available, need ${NEED_GB}GB"
# --- Create the loopback image -----------------------------------------------
if [ -f "${LFS_IMAGE}" ]; then
warn "Image file already exists: ${LFS_IMAGE}"
echo " Reusing existing image."
else
echo ">>> Creating ${LFS_SIZE} image file (this takes a moment)..."
# Use fallocate for instant allocation (no slow dd)
fallocate -l "${LFS_SIZE}" "${LFS_IMAGE}" || {
warn "fallocate failed, falling back to truncate..."
truncate -s "${LFS_SIZE}" "${LFS_IMAGE}"
}
ok "Image created: ${LFS_IMAGE}"
echo ">>> Formatting as ext4..."
mkfs.ext4 -q -L darkforge "${LFS_IMAGE}"
ok "Formatted as ext4"
fi
# --- Mount it -----------------------------------------------------------------
mkdir -p "${LFS}"
mount -o loop "${LFS_IMAGE}" "${LFS}"
ok "Mounted ${LFS_IMAGE} at ${LFS}"
echo ""
df -h "${LFS}"
echo ""
ok "LFS build partition is ready."
echo ""
echo "Next steps:"
echo " export LFS=${LFS}"
echo " bash toolchain/scripts/000-env-setup.sh"
echo ""
echo "To remount after reboot:"
echo " sudo mount -o loop ${LFS_IMAGE} ${LFS}"
echo ""
echo "To add to /etc/fstab (auto-mount on boot):"
echo " ${LFS_IMAGE} ${LFS} ext4 loop 0 0"

View File

@@ -3,26 +3,31 @@
# DarkForge Linux — Phase 0: Download Source Tarballs
# ============================================================================
# Purpose: Download all source tarballs needed for the toolchain bootstrap.
# Every filename is versioned and matches exactly what the build
# scripts expect. No "latest" or unversioned URLs.
# Inputs: LFS environment variable (path to target partition)
# Outputs: Source tarballs in ${LFS}/sources/
# Assumes: Internet access, wget or curl available
# Updated: 2026-03-20 — synced all versions with build scripts
# Mirror: Uses ftp.klid.dk (Denmark) for GNU packages — fast in EU
# ============================================================================
set -euo pipefail
LFS="${LFS:-/mnt/darkforge}"
SRCDIR="${LFS}/sources"
GNU_MIRROR="http://ftp.klid.dk/ftp/gnu"
mkdir -p "${SRCDIR}"
cd "${SRCDIR}"
echo "=== DarkForge: Downloading source tarballs ==="
echo "GNU mirror: ${GNU_MIRROR}"
# --- Helper function ----------------------------------------------------------
download() {
local url="$1"
local filename
filename=$(basename "${url}")
local filename="${2:-$(basename "${url}")}"
if [ -f "${filename}" ]; then
echo " [SKIP] ${filename} already exists"
@@ -39,51 +44,61 @@ download() {
}
}
# --- Cross-Toolchain (Chapter 5) ---------------------------------------------
# ==============================================================================
# Cross-Toolchain (Chapter 5)
# ==============================================================================
echo ">>> Cross-Toolchain packages..."
download "http://ftp.klid.dk/ftp/gnu/binutils/binutils-2.46.0.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/gcc/gcc-15.2.0/gcc-15.2.0.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/glibc/glibc-2.43.tar.xz"
download "${GNU_MIRROR}/binutils/binutils-2.46.tar.xz"
download "${GNU_MIRROR}/gcc/gcc-15.2.0/gcc-15.2.0.tar.xz"
download "${GNU_MIRROR}/glibc/glibc-2.43.tar.xz"
download "https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.19.8.tar.xz"
download "https://www.mpfr.org/mpfr-current/mpfr-4.2.2.tar.xz"
download "https://www.mpfr.org/mpfr-4.2.2/mpfr-4.2.2.tar.xz"
download "https://gmplib.org/download/gmp/gmp-6.3.0.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/mpc/mpc-1.3.1.tar.gz"
download "${GNU_MIRROR}/mpc/mpc-1.3.1.tar.gz"
# --- Temporary Tools (Chapter 6) ---------------------------------------------
# ==============================================================================
# Temporary Tools (Chapter 6)
# ==============================================================================
echo ">>> Temporary tools packages..."
download "http://ftp.klid.dk/ftp/gnu/m4/m4-1.4.21.tar.xz"
download "https://invisible-island.net/datafiles/release/ncurses.tar.gz"
download "http://ftp.klid.dk/ftp/gnu/bash/bash-5.3.tar.gz"
download "http://ftp.klid.dk/ftp/gnu/coreutils/coreutils-9.10.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/diffutils/diffutils-3.12.tar.xz"
download "${GNU_MIRROR}/m4/m4-1.4.21.tar.xz"
download "https://invisible-island.net/datafiles/release/ncurses-6.5.tar.gz"
download "${GNU_MIRROR}/bash/bash-5.3.tar.gz"
download "${GNU_MIRROR}/coreutils/coreutils-9.6.tar.xz"
download "${GNU_MIRROR}/diffutils/diffutils-3.10.tar.xz"
download "https://astron.com/pub/file/file-5.47.tar.gz"
download "http://ftp.klid.dk/ftp/gnu/findutils/findutils-4.10.0.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/gawk/gawk-5.4.0.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/grep/grep-3.12.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/gzip/gzip-1.14.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/make/make-4.4.tar.gz"
download "http://ftp.klid.dk/ftp/gnu/patch/patch-2.8.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/sed/sed-4.9.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/tar/tar-latest.tar.xz"
download "${GNU_MIRROR}/findutils/findutils-4.10.0.tar.xz"
download "${GNU_MIRROR}/gawk/gawk-5.4.0.tar.xz"
download "${GNU_MIRROR}/grep/grep-3.14.tar.xz"
download "${GNU_MIRROR}/gzip/gzip-1.14.tar.xz"
download "${GNU_MIRROR}/make/make-4.4.1.tar.gz"
download "${GNU_MIRROR}/patch/patch-2.8.tar.xz"
download "${GNU_MIRROR}/sed/sed-4.9.tar.xz"
download "${GNU_MIRROR}/tar/tar-1.35.tar.xz"
download "https://github.com/tukaani-project/xz/releases/download/v5.8.1/xz-5.8.1.tar.gz"
download "https://github.com/facebook/zstd/releases/download/v1.5.7/zstd-1.5.7.tar.gz"
# --- Chroot Packages (Chapter 7) ---------------------------------------------
# ==============================================================================
# Chroot Packages (Chapter 7)
# ==============================================================================
echo ">>> Chroot packages..."
download "http://ftp.klid.dk/ftp/gnu/gettext/gettext-1.0.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/bison/bison-3.8.2.tar.xz"
download "${GNU_MIRROR}/gettext/gettext-0.23.1.tar.xz"
download "${GNU_MIRROR}/bison/bison-3.8.2.tar.xz"
download "https://www.cpan.org/src/5.0/perl-5.40.2.tar.xz"
download "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz"
download "http://ftp.klid.dk/ftp/gnu/texinfo/texinfo-7.3.tar.xz"
download "https://zlib.net/current/zlib.tar.gz"
download "https://github.com/util-linux/util-linux/archive/refs/tags/v2.41.3.tar.gz"
download "${GNU_MIRROR}/texinfo/texinfo-7.3.tar.xz"
download "https://zlib.net/zlib-1.3.1.tar.xz"
download "https://www.kernel.org/pub/linux/utils/util-linux/v2.40/util-linux-2.40.4.tar.xz"
# --- Patches ------------------------------------------------------------------
# ==============================================================================
# Patches
# ==============================================================================
echo ">>> Patches..."
download "https://www.linuxfromscratch.org/patches/lfs/13.0/glibc-fhs-1.patch"
download "https://www.linuxfromscratch.org/patches/lfs/13.0/glibc-2.43-fhs-1.patch"
echo ""
echo "=== All downloads complete ==="
echo "Source tarballs are in: ${SRCDIR}/"
ls -lh "${SRCDIR}/" | tail -n +2 | wc -l
echo "files downloaded."
FILECOUNT=$(ls -1 "${SRCDIR}/"*.{tar.*,patch,gz,xz} 2>/dev/null | wc -l)
echo "${FILECOUNT} files downloaded."
echo ""
echo "Verify with: ls -lh ${SRCDIR}/"

View File

@@ -4,7 +4,7 @@
# ============================================================================
# Purpose: Cross-compile the M4 macro processor. Required by Bison and
# other packages that process m4 macros.
# Inputs: ${LFS}/sources/m4-1.4.20.tar.xz
# Inputs: ${LFS}/sources/m4-1.4.21.tar.xz
# Outputs: m4 binary in ${LFS}/usr/
# Assumes: Cross-toolchain (Ch.5) complete
# Ref: LFS 13.0 §6.2
@@ -14,7 +14,7 @@ set -euo pipefail
source "${LFS}/sources/darkforge-env.sh"
PACKAGE="m4"
VERSION="1.4.20"
VERSION="1.4.21"
SRCDIR="${LFS}/sources"
echo "=== Building ${PACKAGE}-${VERSION} (Temporary Tool) ==="