Big script
This commit is contained in:
153
toolchain/scripts/103-glibc.sh
Executable file
153
toolchain/scripts/103-glibc.sh
Executable file
@@ -0,0 +1,153 @@
|
||||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# DarkForge Linux — Phase 3, Chapter 8.5: Glibc (Final, Native)
|
||||
# ============================================================================
|
||||
# Purpose: Build and install the final glibc for the target system.
|
||||
# This is the CRITICAL step that brings the system from cross-compiled
|
||||
# to fully native. All subsequent packages will link against this glibc.
|
||||
# Includes locale generation, timezone setup, and NSS configuration.
|
||||
# Inputs: /sources/glibc-2.43.tar.xz, /sources/glibc-fhs-1.patch
|
||||
# Outputs: /usr/lib/libc.so.6, /usr/include/c++/, locales, timezone data
|
||||
# Ref: LFS 13.0 §8.5 — CRITICAL SECTION
|
||||
# ============================================================================
|
||||
|
||||
set -euo pipefail
|
||||
source /sources/toolchain-scripts/100-chroot-env.sh
|
||||
|
||||
PACKAGE="glibc"
|
||||
VERSION="2.43"
|
||||
|
||||
echo "=== Building ${PACKAGE}-${VERSION} (Phase 3, CRITICAL) ==="
|
||||
|
||||
pkg_extract "${PACKAGE}-${VERSION}.tar.xz"
|
||||
cd "${PACKAGE}-${VERSION}"
|
||||
|
||||
# Apply FHS (Filesystem Hierarchy Standard) patch
|
||||
# This ensures certain programs install to /usr/sbin instead of /sbin
|
||||
echo ">>> Applying glibc-fhs-1.patch..."
|
||||
patch -Np1 -i ../glibc-fhs-1.patch
|
||||
|
||||
# Create the build directory
|
||||
mkdir -v build
|
||||
cd build
|
||||
|
||||
# Configure glibc for native compilation on the target system
|
||||
# --enable-kernel=5.4: Require kernel 5.4+ (we're running 6.19.8)
|
||||
# --disable-nscd: We don't need the Name Service Cache Daemon
|
||||
# --disable-timezone-tools: We'll set timezone manually
|
||||
# --with-headers: Point to the kernel headers we installed in Phase 0
|
||||
echo ">>> Configuring glibc..."
|
||||
../configure \
|
||||
--prefix=/usr \
|
||||
--disable-werror \
|
||||
--enable-kernel=5.4 \
|
||||
--enable-stack-protector=strong \
|
||||
--with-headers=/usr/include \
|
||||
--disable-nscd \
|
||||
--disable-timezone-tools
|
||||
|
||||
# Build glibc
|
||||
echo ">>> Building glibc (this takes a while)..."
|
||||
make
|
||||
|
||||
# Install glibc
|
||||
echo ">>> Installing glibc..."
|
||||
make DESTDIR=/ install
|
||||
|
||||
# ============================================================================
|
||||
# Locale Generation — CRITICAL for UTF-8 support
|
||||
# ============================================================================
|
||||
echo ""
|
||||
echo ">>> Generating locale data..."
|
||||
|
||||
# Create the en_US.UTF-8 locale (essential for development and user systems)
|
||||
# This step creates binary locale files that programs use for character handling
|
||||
localedef -i en_US -f UTF-8 en_US.UTF-8
|
||||
|
||||
# Verify locale was created
|
||||
if locale -a | grep -q en_US.UTF-8; then
|
||||
echo "PASS: en_US.UTF-8 locale created"
|
||||
else
|
||||
echo "FAIL: Could not create en_US.UTF-8 locale"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ============================================================================
|
||||
# Timezone Setup
|
||||
# ============================================================================
|
||||
echo ""
|
||||
echo ">>> Setting up timezone data..."
|
||||
|
||||
# The timezone database is kept in /usr/share/zoneinfo
|
||||
# Default to UTC (can be overridden during system installation)
|
||||
# Copy the timezone file and create the symlink
|
||||
if [ -f /usr/share/zoneinfo/UTC ]; then
|
||||
ln -sfv ../usr/share/zoneinfo/UTC /etc/localtime
|
||||
echo "PASS: Timezone symlink created (UTC)"
|
||||
else
|
||||
echo "FAIL: /usr/share/zoneinfo/UTC not found"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ============================================================================
|
||||
# Create /etc/nsswitch.conf — Critical for name service resolution
|
||||
# ============================================================================
|
||||
echo ""
|
||||
echo ">>> Creating /etc/nsswitch.conf..."
|
||||
|
||||
cat > /etc/nsswitch.conf << 'NSS_EOF'
|
||||
# Begin /etc/nsswitch.conf
|
||||
# This file is used by the name service switch functionality in glibc
|
||||
# It controls how hostname lookups, user/group lookups, etc. are resolved
|
||||
|
||||
passwd: files
|
||||
group: files
|
||||
shadow: files
|
||||
|
||||
hosts: files dns
|
||||
networks: files
|
||||
protocols: files
|
||||
services: files
|
||||
ethers: files
|
||||
rpc: files
|
||||
|
||||
# End /etc/nsswitch.conf
|
||||
NSS_EOF
|
||||
|
||||
echo "PASS: /etc/nsswitch.conf created"
|
||||
|
||||
# ============================================================================
|
||||
# Verify glibc installation
|
||||
# ============================================================================
|
||||
echo ""
|
||||
echo ">>> Running glibc sanity checks..."
|
||||
|
||||
# Test 1: Verify libc.so.6 is present
|
||||
if [ -f /usr/lib/libc.so.6 ]; then
|
||||
echo "PASS: /usr/lib/libc.so.6 exists"
|
||||
else
|
||||
echo "FAIL: /usr/lib/libc.so.6 NOT FOUND"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test 2: Verify we can call ldd
|
||||
if ldd --version &>/dev/null; then
|
||||
echo "PASS: ldd works"
|
||||
else
|
||||
echo "FAIL: ldd is broken"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Test 3: Run a simple C program to test libc
|
||||
echo "int main() { return 0; }" > /tmp/test.c
|
||||
gcc /tmp/test.c -o /tmp/test
|
||||
/tmp/test
|
||||
echo "PASS: Basic C program execution works"
|
||||
rm -f /tmp/test /tmp/test.c
|
||||
|
||||
cd ..
|
||||
pkg_cleanup "${PACKAGE}-${VERSION}"
|
||||
|
||||
echo ""
|
||||
echo "=== ${PACKAGE}-${VERSION} complete ==="
|
||||
echo "=== CRITICAL: glibc is now native on the target system ==="
|
||||
Reference in New Issue
Block a user