lfs/build.sh
2025-01-22 22:42:16 +01:00

1680 lines
No EOL
50 KiB
Bash
Executable file

#!/bin/bash
export LINUX_VERSION="6.12.1"
# Backup the native environment
export BUILD_CC="$BUILD_CC"
export CC_native="$CC"
export CPP_native="$CPP"
export CXX_native="$CXX"
export AS_native="$AS"
export LD_native="$LD"
export AR_native="$AR"
export NM_native="$NM"
export RANLIB_native="$RANLIB"
export STRIP_native="$STRIP"
export OBJDUMP_native="$OBJDUMP"
export READELF_native="$READELF"
export CFLAGS_native="$CFLAGS_native"
export CPPFLAGS_native="$CPPFLAGS"
export CXXFLAGS_native="$CXXFLAGS"
export LDFLAGS_native="$LDFLAGS"
export LD_LIBRARY_PATH_native="$LD_LIBRARY_PATH"
export PKG_CONFIG_LIBDIR_native="$PKG_CONFIG_LIBDIR"
# Function to handle errors
error_handler() {
local exit_code=$?
local line_number=$1
local file_name=$2
echo "Error in file: $file_name, line: $line_number, reason: Command exited with status $exit_code"
}
# Set the trap to catch errors
trap 'error_handler $LINENO $0' ERR
set -eo pipefail
if [ ! -d "./sources" ]; then
echo "Run this script from the right directory"
exit 1
fi
export BASE_DIR=$(pwd)
if [ -z "$KERNEL_ARCH" ]; then
echo "You must set a kernel target architecture among supported ones:"
echo "i386"
echo "x86_64"
echo "arm"
exit 1
fi
if [ -z "$TARGET_TRIPLET_ARCH" ] || [ -z "$TARGET_TRIPLET_VENDOR" ] || [ -z "$TARGET_TRIPLET_OS" ] || [ -z "$TARGET_TRIPLET_GNUEABI" ]; then
echo "You MUST define TARGET_TRIPLET_ARCH, TARGET_TRIPLET_VENDOR, TARGET_TRIPLET_OS and TARGET_TRIPLET_GNUEABI"
exit 1
fi
export TARGET_MACHINE_TRIPLET="$TARGET_TRIPLET_ARCH-$TARGET_TRIPLET_VENDOR-$TARGET_TRIPLET_OS-$TARGET_TRIPLET_GNUEABI"
export LFS="$(pwd)/out/$TARGET_MACHINE_TRIPLET/rootfs"
bash version-check.sh
export BUILD_MACHINE_TRIPLET=$(gcc -dumpmachine)
# Create the target directory
export STEPS_DIR="$LFS/../steps/"
export TMP_BUILD_DIR="$LFS/../build/"
export CROSS_TOOLS_DIR="$LFS/tools"
mkdir -p "$LFS"
mkdir -vp "$STEPS_DIR"
mkdir -vp "$CROSS_TOOLS_DIR"
mkdir -vp "$TMP_BUILD_DIR"
export PATH="$CROSS_TOOLS_DIR/bin/:$PATH"
unset CFLAGS
unset LDFLAGS
setup_toolchain() {
export BUILD_CC=gcc
export CC="$TARGET_MACHINE_TRIPLET-gcc"
export CPP="$TARGET_MACHINE_TRIPLET-cpp"
export CXX="$TARGET_MACHINE_TRIPLET-g++"
export AS="$TARGET_MACHINE_TRIPLET-as"
export LD="$TARGET_MACHINE_TRIPLET-ld"
export AR="$TARGET_MACHINE_TRIPLET-ar"
export NM="$TARGET_MACHINE_TRIPLET-nm"
export RANLIB="$TARGET_MACHINE_TRIPLET-ranlib"
export STRIP="$TARGET_MACHINE_TRIPLET-strip"
export OBJDUMP="$TARGET_MACHINE_TRIPLET-objdump"
export READELF="$TARGET_MACHINE_TRIPLET-readelf"
export CPPFLAGS=""
export CFLAGS=" $TARGET_ADDITIONAL_CFLAGS -U_FORTIFY_SOURCE -O2 -L$CROSS_TOOLS_DIR/lib -L$LFS/usr/lib -I$CROSS_TOOLS_DIR/include -I$CROSS_TOOLS_DIR/$TARGET_MACHINE_TRIPLET/include"
export CXXFLAGS=" $TARGET_ADDITIONAL_CFLAGS -U_FORTIFY_SOURCE -O2 -L$CROSS_TOOLS_DIR/lib -L$LFS/usr/lib -I$CROSS_TOOLS_DIR/include -I$CROSS_TOOLS_DIR/$TARGET_MACHINE_TRIPLET/include -I$CROSS_TOOLS_DIR/$TARGET_MACHINE_TRIPLET/include/c++/14.2.0/ -I$CROSS_TOOLS_DIR/$TARGET_MACHINE_TRIPLET/include/c++/14.2.0/$TARGET_MACHINE_TRIPLET"
export LDFLAGS=" -L$LFS/usr/lib -L$CROSS_TOOLS_DIR/lib"
export LD_LIBRARY_PATH_old="$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="$CROSS_TOOLS_DIR/lib $LFS/usr/lib"
export PKG_CONFIG_LIBDIR="$CROSS_TOOLS_DIR/lib $LFS/usr/lib"
export SYSROOT="$LFS"
#unset LD_LIBRARY_PATH
echo "[binaries]" > "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "c = '$CC'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "cpp = '$CPP'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "ar = '$AR'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
#echo "windres = 'x86_64-w64-mingw32-windres'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "strip = '$STRIP'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "exe_wrapper = 'wine64'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "[host_machine]" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "system = 'linux'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "cpu_family = '$CPU_FAMILY'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "cpu = '$CPU'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
echo "endian = '$TARGET_ENDIANNESS'" >> "$CROSS_TOOLS_DIR/meson_cross.txt"
}
host_toolchain() {
export BUILD_CC="$BUILD_CC_native"
export CC="$CC_native"
export CXX="$CXX_native"
export CPP="$CPP_native"
export AS="$AS_native"
export LD="$LD_native"
export AR="$AR_native"
export NM="$NM_native"
export RANLIB="$RANLIB_native"
export STRIP="$STRIP_native"
export OBJDUMP="$OBJDUMP_native"
export READELF="$READELF_native"
export CFLAGS="$CFLAGS_native"
export CPPFLAGS="$CPPFLAGS_native"
export CXXFLAGS="$CXXFLAGS_native"
export LDFLAGS="$LDFLAGS_native"
export PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR_native"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH_native"
}
# Create a directory layout
if [ ! -d "$LFS/etc" ]; then
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,share}
mkdir -pv $LFS/{dev,proc,sys,run,tmp}
# like archlinux sbin->/usr/bin
ln -sv usr/bin $LFS/sbin
ln -sv bin $LFS/usr/sbin
for i in bin lib; do
ln -sv usr/$i $LFS/$i
done
fi
# Build binutils
if [ ! -f "$STEPS_DIR/binutils" ]; then
if [ ! -d "$TMP_BUILD_DIR/binutils" ]; then
tar -xf "$BASE_DIR/sources/binutils-2.43.tar.zst"
mv "binutils-2.43" "$TMP_BUILD_DIR/binutils"
fi
cd "$TMP_BUILD_DIR/binutils"
mkdir -vp build
cd build
"../configure" \
--prefix=$CROSS_TOOLS_DIR \
--with-sysroot=$LFS \
--target=$TARGET_MACHINE_TRIPLET \
--with-gnu-as \
--with-gnu-ld \
--enable-ld=default \
--enable-shared \
--disable-nls \
--enable-gprofng=no \
--disable-werror \
--enable-new-dtags \
--disable-multilib \
--disable-libquadmath \
--disable-libquadmath-support \
--enable-plugins \
--enable-deterministic-archives \
--enable-default-hash-style=gnu
make -j 32
make -j 32 install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/binutils"
touch "$STEPS_DIR/binutils"
fi
# Install kernel headers
if [ ! -f "$STEPS_DIR/linux-headers" ]; then
if [ ! -d "$TMP_BUILD_DIR/linux" ]; then
tar -xzf "$BASE_DIR/sources/linux-$LINUX_VERSION.tar.gz"
mv "linux-$LINUX_VERSION" "$TMP_BUILD_DIR/linux"
fi
cd "$TMP_BUILD_DIR/linux"
make mrproper
make headers_install ARCH="$KERNEL_ARCH" INSTALL_HDR_PATH="$LFS/usr"
cd "$BASE_DIR"
#rm -rf "$TMP_BUILD_DIR/linux"
touch "$STEPS_DIR/linux-headers"
fi
export CFLAGS="$CFLAGS -static "
export LDFLAGS="$LDFLAGS -Bstatic "
# Build gcc
if [ ! -f "$STEPS_DIR/gcc-step1" ]; then
bash unpack-gcc.sh "$TMP_BUILD_DIR/"
cd "$TMP_BUILD_DIR/gcc/"
mkdir -vp build-step1
cd build-step1
"../configure" \
--target=$TARGET_MACHINE_TRIPLET \
--host=${BUILD_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=$CROSS_TOOLS_DIR \
--with-glibc-version=2.40 \
--with-sysroot=$LFS \
--with-newlib \
--disable-gdbtk \
--disable-shared \
--without-headers \
--enable-default-pie \
--enable-default-ssp \
--disable-nls \
--disable-multilib \
--disable-threads \
--disable-libatomic \
--disable-libmudflap \
--disable-libgomp \
--disable-libquadmath \
--disable-libquadmath-support \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--disable-decimal-float \
--disable-libsanitizer \
--enable-languages=c
make -j 32 all-gcc # if build fails add --disable-libsanitizer
make -j 32 install-gcc
make check-gcc RUNTESTFLAGS=--target_board=${TARGET_TRIPLET_ARCH}-sim
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/gcc/build" # Do not remove the whole gcc directory: we need it for libstdc++
touch "$STEPS_DIR/gcc-step1"
fi
# From now on use
export BUILD_CC=gcc
export CC="$TARGET_MACHINE_TRIPLET-gcc"
export CXX="$TARGET_MACHINE_TRIPLET-g++"
export AS="$TARGET_MACHINE_TRIPLET-as"
export LD="$TARGET_MACHINE_TRIPLET-ld"
export AR="$TARGET_MACHINE_TRIPLET-ar"
export RANLIB="$TARGET_MACHINE_TRIPLET-ranlib"
export STRIP="$TARGET_MACHINE_TRIPLET-strip"
export OBJDUMP="$TARGET_MACHINE_TRIPLET-objdump"
export LDFLAGS=" -Bstatic "
# remove hardening options for building libraries
export CFLAGS="-U_FORTIFY_SOURCE -O2 -static"
export CPPFLAGS="-U_FORTIFY_SOURCE -O2 -static"
export LD_LIBRARY_PATH_old="$LD_LIBRARY_PATH"
unset LD_LIBRARY_PATH
# build glibc
if [ ! -f "$STEPS_DIR/glibc" ]; then
if [ ! -d "$TMP_BUILD_DIR/glibc" ]; then
tar -xzf "$BASE_DIR/sources/glibc-2.40.tar.gz"
mv "glibc-2.40" "$TMP_BUILD_DIR/glibc"
fi
cd "$TMP_BUILD_DIR/glibc"
mkdir -vp build
cd build
echo "rootsbindir=/usr/sbin" > configparms
echo 'slibdir=/lib' >> configparms
echo 'rtlddir=/lib' >> configparms
echo 'sbindir=/bin' >> configparms
echo 'build-programs=no' >> configparms
"../configure" \
--prefix=/usr \
--target=$TARGET_MACHINE_TRIPLET \
--host=$TARGET_MACHINE_TRIPLET \
--build=${BUILD_MACHINE_TRIPLET} \
--with-headers=$LFS/usr/include \
--with-binutils=$CROSS_TOOLS_DIR/bin \
--without-cvs \
--disable-nls \
--disable-sanity-checks \
--enable-kernel=4.19 \
--disable-debug \
--disable-profile \
--without-selinux \
--without-gd \
--disable-nscd \
--enable-hacker-mode \
libc_cv_slibdir=/usr/lib \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes
make install-bootstrap-headers=yes install_root=$LFS install-headers
make -j4 csu/subdir_lib
if [ -f "csu/crt1.o" ]; then
install csu/crt1.o $LFS/usr/lib
fi
if [ -f "csu/crti.o" ]; then
install csu/crti.o $LFS/usr/lib
fi
if [ -f "csu/crtn.o" ]; then
install csu/crtn.o $LFS/usr/lib
fi
if [ -f "csu/Scrt1.o" ]; then
install csu/Scrt1.o $LFS/usr/lib
fi
if [ -f "csu/crtbeginS.o" ]; then
install csu/crtbeginS.o $LFS/usr/lib
fi
$TARGET_MACHINE_TRIPLET-gcc \
-nostdlib \
-nostartfiles \
-shared \
-x c /dev/null \
-o $LFS/usr/lib/libc.so
touch $LFS/usr/include/gnu/stubs.h
cd "$BASE_DIR"
#rm -rf "$TMP_BUILD_DIR/glibc"
touch "$STEPS_DIR/glibc"
fi
unset CC
unset CXX
unset LD
unset AS
unset AR
unset RANLIB
unset STRIP
unset OBJDUMP
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH_old"
export CFLAGS="-U_FORTIFY_SOURCE -O2 -static "
export LDFLAGS="-U_FORTIFY_SOURCE -O2 -Bstatic "
if [ ! -f "$STEPS_DIR/gcc-step2" ]; then
bash unpack-gcc.sh "$TMP_BUILD_DIR/"
cd "$TMP_BUILD_DIR/gcc"
mkdir -vp build-step2
cd build-step2
# ../configure is already done
"../configure" \
--target=$TARGET_MACHINE_TRIPLET \
--host=${BUILD_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=$CROSS_TOOLS_DIR \
--with-glibc-version=2.40 \
--with-sysroot=$LFS \
--enable-c99 \
--enable-long-long \
--enable-default-pie \
--enable-default-ssp \
--disable-nls \
--disable-multilib \
--disable-libatomic \
--disable-libmudflap \
--disable-libgomp \
--disable-libquadmath \
--disable-libquadmath-support \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--disable-decimal-float \
--disable-libsanitizer \
--enable-languages=c
make -j 32 # if build fails add --disable-libsanitizer
make -j 32 install
cd "$BASE_DIR"
#rm -rf "$TMP_BUILD_DIR/gcc/build" # Do not remove the whole gcc directory: we need it for libstdc++
touch "$STEPS_DIR/gcc-step2"
fi
unset CFLAGS
unset LDFLAGS
if [ ! -f "$STEPS_DIR/glibc-step2" ]; then
if [ ! -d "$TMP_BUILD_DIR/glibc/build" ]; then
echo "'$TMP_BUILD_DIR/glibc/build' is supposed to exist. Error."
exit 1
fi
cd "$TMP_BUILD_DIR/glibc/build"
# Configuration is done already
# Remove the stub glibc from before
rm $LFS/usr/lib/libc.so
make -j 32
make -j 32 install_root=$LFS install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/glibc"
touch "$STEPS_DIR/glibc-step2"
fi
export CFLAGS="-U_FORTIFY_SOURCE -O2 -static "
export LDFLAGS="-U_FORTIFY_SOURCE -O2 -Bstatic "
# build the rest of gcc
if [ ! -f "$STEPS_DIR/gcc-step3" ]; then
bash unpack-gcc.sh "$TMP_BUILD_DIR/"
cd "$TMP_BUILD_DIR/gcc/"
mkdir -vp build-step3
cd build-step3
"../configure" \
--target=$TARGET_MACHINE_TRIPLET \
--host=${BUILD_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=$CROSS_TOOLS_DIR \
--with-glibc-version=2.40 \
--with-sysroot=$LFS \
--enable-c99 \
--enable-long-long \
--enable-default-pie \
--enable-default-ssp \
--disable-nls \
--disable-multilib \
--disable-libgomp \
--disable-libquadmath \
--disable-libquadmath-support \
--disable-decimal-float \
--enable-languages=c,c++
# Reebuild everything now that we have bootstrapped an initial gcc and glibc
make -j 32 # if build fails add --disable-libsanitizer
make -j 32 install
#make -j 32 DESTDIR="$LFS" install-target-libgcc
cd "$BASE_DIR"
#rm -rf "$TMP_BUILD_DIR/gcc"
touch "$STEPS_DIR/gcc-step3"
fi
if [ ! -f "$STEPS_DIR/gcc-final" ]; then
bash unpack-gcc.sh "$TMP_BUILD_DIR/"
cd "$TMP_BUILD_DIR/gcc"
mkdir -vp build-final
cd build-final
# ../configure is already done
"../configure" \
--target=$TARGET_MACHINE_TRIPLET \
--host=${BUILD_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=$CROSS_TOOLS_DIR \
--with-glibc-version=2.40 \
--with-sysroot=$LFS \
--enable-c99 \
--enable-long-long \
--enable-default-pie \
--enable-default-ssp \
--enable-nls \
--disable-multilib \
--enable-libatomic \
--enable-libmudflap \
--enable-libgomp \
--enable-libquadmath \
--enable-libquadmath-support \
--enable-libssp \
--enable-libvtv \
--enable-libstdcxx \
--enable-decimal-float \
--enable-languages=c,c++,objc,go
make -j 32 # if build fails add --disable-libsanitizer
make -j 32 install
cd "$BASE_DIR"
#rm -rf "$TMP_BUILD_DIR/gcc/build"
touch "$STEPS_DIR/gcc-final"
fi
## finish the host toolchain
#host_toolchain
#bash "build-host-tools.sh"
# From now on use the new toolchain
setup_toolchain
# test the cross toolchain
which -- $TARGET_MACHINE_TRIPLET-as || echo $TARGET_MACHINE_TRIPLET-as is not in the PATH
"$CC" $CFLAGS -std=c11 -xc -latomic testvec.c
"$READELF" -l a.out | grep ld-linux
rm -v a.out
"$CXX" $CPPFLAGS -xc++ test_compiler.cpp
"$TARGET_MACHINE_TRIPLET-readelf" -l a.out
rm -v a.out
# build m4
if [ ! -f "$STEPS_DIR/m4" ]; then
if [ ! -d "$TMP_BUILD_DIR/m4" ]; then
tar -xzf "$BASE_DIR/sources/m4-1.4.19.tar.gz"
mv "m4-1.4.19" "$TMP_BUILD_DIR/m4"
fi
cd "$TMP_BUILD_DIR/m4"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
echo "rootsbindir=/usr/sbin" > configparms
"../configure" \
--prefix=/usr \
--build=${BUILD_MACHINE_TRIPLET} \
--host=$TARGET_MACHINE_TRIPLET
make -j 32
make DESTDIR=$LFS install
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded $LFS/usr/bin/m4
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/m4"
touch "$STEPS_DIR/m4"
fi
# build attr
if [ ! -f "$STEPS_DIR/attr" ]; then
if [ ! -d "$TMP_BUILD_DIR/attr" ]; then
tar -xzf "$BASE_DIR/sources/attr-2.5.2.tar.gz"
mv "attr-2.5.2" "$TMP_BUILD_DIR/attr"
fi
cd "$TMP_BUILD_DIR/attr"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
echo "rootsbindir=/usr/bin" > configparms
"../configure" \
--prefix=/usr \
--with-sysroot=${LFS} \
--disable-static \
--host=$TARGET_MACHINE_TRIPLET
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/attr"
touch "$STEPS_DIR/attr"
fi
# build zlib
if [ ! -f "$STEPS_DIR/zlib" ]; then
if [ ! -d "$TMP_BUILD_DIR/zlib" ]; then
tar -xzf "$BASE_DIR/sources/zlib-1.3.1.tar.gz"
mv "zlib-1.3.1" "$TMP_BUILD_DIR/zlib"
fi
cd "$TMP_BUILD_DIR/zlib"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
export CFLAGS_old="$CFLAGS"
export CFLAGS+=" -ffat-lto-objects"
"../configure" \
--prefix=/usr \
--enable-shared
make -j 32
make -j 32 DESTDIR="$LFS" install
export CFLAGS="$CFLAGS_old"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/zlib"
touch "$STEPS_DIR/zlib"
fi
# build openssl
if [ ! -f "$STEPS_DIR/openssl" ]; then
if [ ! -d "$TMP_BUILD_DIR/openssl" ]; then
tar -xf "$BASE_DIR/sources/openssl-3.4.0.tar.gz"
mv "openssl-3.4.0" "$TMP_BUILD_DIR/openssl"
cd "$TMP_BUILD_DIR/openssl"
cp $BASE_DIR/sources/openssl-ca-dir.patch .
patch -Np1 -i "./openssl-ca-dir.patch"
fi
cd "$TMP_BUILD_DIR/openssl"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
# TODO: # enable-ec_nistp_64_gcc_128
"../Configure" \
--prefix=/usr \
--openssldir=/etc/ssl \
--libdir=/usr/lib \
shared zlib enable-ktls "${OPENSSL_ARCH}"
make -j 32 depend apps/CA.pl
make -j 32 all
make -j 32 DESTDIR="$LFS" MANDIR=/usr/share/man MANSUFFIX=ssl install_sw install_ssldirs install_man_docs
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/openssl"
touch "$STEPS_DIR/openssl"
fi
# build libxcrypt
if [ ! -f "$STEPS_DIR/libxcrypt" ]; then
if [ ! -d "$TMP_BUILD_DIR/libxcrypt" ]; then
tar -xf "$BASE_DIR/sources/libxcrypt-4.4.36.tar.xz"
mv "libxcrypt-4.4.36" "$TMP_BUILD_DIR/libxcrypt"
fi
cd "$TMP_BUILD_DIR/libxcrypt"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--disable-static \
--enable-hashes=strong,glibc \
--with-sysroot=${LFS} \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-obsolete-api=no \
--disable-failure-tokens \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR=$LFS install
#cd ..
#mkdir -vp build-compat-$TARGET_MACHINE_TRIPLET
#cd build-compat-$TARGET_MACHINE_TRIPLET
#"../configure" \
# --prefix=/usr \
# --disable-static \
# --enable-hashes=strong,glibc \
# --with-sysroot=${LFS} \
# --host=${TARGET_MACHINE_TRIPLET} \
# --build=${BUILD_MACHINE_TRIPLET} \
# --enable-obsolete-api=glibc \
# --disable-failure-tokens \
# --cache-file=config.cache
# DO NOT MAKE: check archlinux package!
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/libxcrypt"
touch "$STEPS_DIR/libxcrypt"
fi
# build ncurses
# TODO: fix symlink!!!
if [ ! -f "$STEPS_DIR/ncurses" ]; then
if [ ! -d "$TMP_BUILD_DIR/ncurses" ]; then
tar -xzf "$BASE_DIR/sources/ncurses.tar.gz"
mv "ncurses-6.3" "$TMP_BUILD_DIR/ncurses"
fi
cd "$TMP_BUILD_DIR/ncurses"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
# --with-cxx-binding no c++?
# --with-cxx-shared no c++?
# --disable-stripping does not work for all architectures because the system strip is used
"../configure" \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=/usr/lib \
--sbindir=/usr/bin \
--without-manpages \
--with-shared \
--without-normal \
--disable-stripping \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--without-debug \
--enable-pc-files \
--disable-setuid-environ \
--disable-root-environ \
--disable-root-access \
--with-versioned-syms \
--without-ada \
--enable-overwrite \
--with-build-cc=gcc \
--with-pkg-config-libdir=/usr/lib/pkgconfig
make -j 32
make -j 32 DESTDIR="$LFS" install
cd ..
mkdir -vp build-widec-$TARGET_MACHINE_TRIPLET
cd build-widec-$TARGET_MACHINE_TRIPLET
# --with-cxx-binding no c++?
# --with-cxx-shared no c++?
# --without-normal will make readline error
# --disable-stripping # this must go away
"../configure" \
--prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--libdir=/usr/lib \
--sbindir=/usr/bin \
--mandir=/usr/share/man \
--with-manpage-format=normal \
--with-shared \
--without-normal \
--disable-stripping \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--without-debug \
--enable-pc-files \
--enable-widec \
--disable-setuid-environ \
--disable-root-environ \
--disable-root-access \
--with-versioned-syms \
--without-ada \
--enable-overwrite \
--with-build-cc=gcc \
--with-pkg-config-libdir=/usr/lib/pkgconfig
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/ncurses"
touch "$STEPS_DIR/ncurses"
fi
# build readline (depends on libncurses)
if [ ! -f "$STEPS_DIR/readline" ]; then
if [ ! -d "$TMP_BUILD_DIR/readline" ]; then
tar -xf "$BASE_DIR/sources/readline-8.2.13.tar.gz"
mv "readline-8.2.13" "$TMP_BUILD_DIR/readline"
fi
cd "$TMP_BUILD_DIR/readline"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=/usr \
--with-curses \
--enable-static=no \
--cache-file=config.cache
make -j 32 SHLIB_LIBS=-lncurses
make -j 32 DESTDIR=$LFS install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/readline"
touch "$STEPS_DIR/readline"
fi
# build bash
if [ ! -f "$STEPS_DIR/bash" ]; then
if [ ! -d "$TMP_BUILD_DIR/bash" ]; then
tar -xzf "$BASE_DIR/sources/bash-5.2.tar.gz"
mv "bash-5.2" "$TMP_BUILD_DIR/bash"
fi
cd "$TMP_BUILD_DIR/bash"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
_bashconfig=(-DDEFAULT_PATH_VALUE=\'\"/usr/local/sbin:/usr/local/bin:/usr/bin\"\'
-DSTANDARD_UTILS_PATH=\'\"/usr/bin\"\'
-DSYS_BASHRC=\'\"/etc/bash.bashrc\"\'
-DSYS_BASH_LOGOUT=\'\"/etc/bash.bash_logout\"\'
-DNON_INTERACTIVE_LOGIN_SHELLS)
export CFLAGS_old="$CFLAGS"
export CFLAGS="${CFLAGS} ${_bashconfig[@]}"
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--without-bash-malloc \
--enable-threads \
--enable-readline \
--with-curses
make -j 32
make -j 32 DESTDIR="$LFS" install
export CFLAGS="$CFLAGS_old"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/bash"
touch "$STEPS_DIR/bash"
fi
# build bzip2
if [ ! -f "$STEPS_DIR/bzip2" ]; then
if [ ! -d "$TMP_BUILD_DIR/bzip2" ]; then
tar -xzf "$BASE_DIR/sources/bzip2-1.0.8.tar.gz"
mv "bzip2-1.0.8" "$TMP_BUILD_DIR/bzip2"
fi
cd "$TMP_BUILD_DIR/bzip2"
make CC="${CC} ${CFLAGS}" AR="${AR}" RANLIB="${RANLIB}" LD="${LD} ${LDFLAGS}" -j 32 PREFIX="$LFS/usr" install
if [ -f "$LFS/bin/bzip2" ]; then
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded "$LFS/bin/bzip2"
else
echo "Where is the bzip2 executable? It was there for bash 1.0.8!"
exit 1
fi
# Remove useless doc out of dir
rm -rf "$LFS/man"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/bzip2"
touch "$STEPS_DIR/bzip2"
fi
# build check
if [ ! -f "$STEPS_DIR/check" ]; then
if [ ! -d "$TMP_BUILD_DIR/check" ]; then
tar -xzf "$BASE_DIR/sources/check-0.15.2.tar.gz"
mv "check-0.15.2" "$TMP_BUILD_DIR/check"
fi
cd "$TMP_BUILD_DIR/check"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--libdir=/lib
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/check"
touch "$STEPS_DIR/check"
fi
# build coreutils
if [ ! -f "$STEPS_DIR/coreutils" ]; then
if [ ! -d "$TMP_BUILD_DIR/coreutils" ]; then
tar -xzf "$BASE_DIR/sources/coreutils-9.5.tar.gz"
mv "coreutils-9.5" "$TMP_BUILD_DIR/coreutils"
fi
cd "$TMP_BUILD_DIR/coreutils"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--libexecdir=/usr/lib \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-install-program=hostname \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/coreutils"
touch "$STEPS_DIR/coreutils"
fi
# build diffutils
if [ ! -f "$STEPS_DIR/diffutils" ]; then
if [ ! -d "$TMP_BUILD_DIR/diffutils" ]; then
tar -xf "$BASE_DIR/sources/diffutils-3.10.tar.xz"
mv "diffutils-3.10" "$TMP_BUILD_DIR/diffutils"
fi
cd "$TMP_BUILD_DIR/diffutils"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=$LFS \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-install-program=hostname \
--cache-file=config.cache
make -j 32
make -j 32 install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/diffutils"
touch "$STEPS_DIR/diffutils"
fi
# build libseccomp
if [ ! -f "$STEPS_DIR/libseccomp" ]; then
if [ ! -d "$TMP_BUILD_DIR/libseccomp" ]; then
tar -xf "$BASE_DIR/sources/libseccomp-2.5.5.tar.gz"
mv "libseccomp-2.5.5" "$TMP_BUILD_DIR/libseccomp"
fi
cd "$TMP_BUILD_DIR/libseccomp"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-static=no \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/libseccomp"
touch "$STEPS_DIR/libseccomp"
fi
# build file
if [ ! -f "$STEPS_DIR/file" ]; then
if [ ! -d "$TMP_BUILD_DIR/file" ]; then
tar -xf "$BASE_DIR/sources/file-5.46.tar.gz"
mv "file-5.46" "$TMP_BUILD_DIR/file"
fi
cd "$TMP_BUILD_DIR/file"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--libdir=/usr/lib \
--datadir=/usr/share/file \
--with-sysroot=$LFS \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-libseccomp \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/file"
touch "$STEPS_DIR/file"
fi
# build findutils
if [ ! -f "$STEPS_DIR/findutils" ]; then
if [ ! -d "$TMP_BUILD_DIR/findutils" ]; then
tar -xf "$BASE_DIR/sources/findutils-4.10.0.tar.xz"
mv "findutils-4.10.0" "$TMP_BUILD_DIR/findutils"
fi
cd "$TMP_BUILD_DIR/findutils"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
echo "gl_cv_func_wcwidth_works=yes" > config.cache
echo "ac_cv_func_fnmatch_gnu=yes" >> config.cache
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/findutils"
touch "$STEPS_DIR/findutils"
fi
# build gawk
if [ ! -f "$STEPS_DIR/gawk" ]; then
if [ ! -d "$TMP_BUILD_DIR/gawk" ]; then
tar -xf "$BASE_DIR/sources/gawk-5.3.1.tar.xz"
mv "gawk-5.3.1" "$TMP_BUILD_DIR/gawk"
fi
cd "$TMP_BUILD_DIR/gawk"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--libexecdir=/usr/lib \
--sysconfdir=/etc \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--without-libsigsegv \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
"$STRIP" --strip-unneeded "$LFS/bin/gawk"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/gawk"
touch "$STEPS_DIR/gawk"
fi
# build grep
if [ ! -f "$STEPS_DIR/grep" ]; then
if [ ! -d "$TMP_BUILD_DIR/grep" ]; then
tar -xf "$BASE_DIR/sources/grep-3.11.tar.xz"
mv "grep-3.11" "$TMP_BUILD_DIR/grep"
fi
cd "$TMP_BUILD_DIR/grep"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--without-included-regex \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
"$STRIP" --strip-unneeded "$LFS/bin/grep"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/grep"
touch "$STEPS_DIR/grep"
fi
# build gzip
if [ ! -f "$STEPS_DIR/gzip" ]; then
if [ ! -d "$TMP_BUILD_DIR/gzip" ]; then
tar -xf "$BASE_DIR/sources/gzip-1.13.tar.xz"
mv "gzip-1.13" "$TMP_BUILD_DIR/gzip"
fi
cd "$TMP_BUILD_DIR/gzip"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=$LFS \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--cache-file=config.cache
make -j 32
make -j 32 install
"$STRIP" --strip-unneeded "$LFS/bin/gzip"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/gzip"
touch "$STEPS_DIR/gzip"
fi
# build make
if [ ! -f "$STEPS_DIR/make" ]; then
if [ ! -d "$TMP_BUILD_DIR/make" ]; then
tar -xf "$BASE_DIR/sources/make-4.4.1.tar.gz"
mv "make-4.4.1" "$TMP_BUILD_DIR/make"
fi
cd "$TMP_BUILD_DIR/make"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/make"
touch "$STEPS_DIR/make"
fi
# build libiconv
if [ ! -f "$STEPS_DIR/libiconv" ]; then
if [ ! -d "$TMP_BUILD_DIR/libiconv" ]; then
tar -xf "$BASE_DIR/sources/libiconv-1.17.tar.gz"
mv "libiconv-1.17" "$TMP_BUILD_DIR/libiconv"
fi
cd "$TMP_BUILD_DIR/libiconv"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-extra-encodings \
--cache-file=config.cache
# workaround for insecure rpath
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/libiconv"
touch "$STEPS_DIR/libiconv"
fi
# build patch
if [ ! -f "$STEPS_DIR/patch" ]; then
if [ ! -d "$TMP_BUILD_DIR/patch" ]; then
tar -xf "$BASE_DIR/sources/patch-2.7.6.tar.gz"
mv "patch-2.7.6" "$TMP_BUILD_DIR/patch"
fi
cd "$TMP_BUILD_DIR/patch"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/patch"
touch "$STEPS_DIR/patch"
fi
# build sed
if [ ! -f "$STEPS_DIR/sed" ]; then
if [ ! -d "$TMP_BUILD_DIR/sed" ]; then
tar -xf "$BASE_DIR/sources/sed-4.9.tar.xz"
mv "sed-4.9" "$TMP_BUILD_DIR/sed"
fi
cd "$TMP_BUILD_DIR/sed"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded "$LFS/bin/sed"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/sed"
touch "$STEPS_DIR/sed"
fi
# build tar
if [ ! -f "$STEPS_DIR/tar" ]; then
if [ ! -d "$TMP_BUILD_DIR/tar" ]; then
tar -xf "$BASE_DIR/sources/tar-1.35.tar.xz"
mv "tar-1.35" "$TMP_BUILD_DIR/tar"
fi
cd "$TMP_BUILD_DIR/tar"
export LDFLAGS_old="$LDFLAGS"
export LDFLAGS="$LDFLAGS -liconv"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
# cat > config.cache << EOF
#gl_cv_func_wcwidth_works=yes
#gl_cv_func_btowc_eof=yes
#ac_cv_func_malloc_0_nonnull=yes
#gl_cv_func_mbrtowc_incomplete_state=yes
#gl_cv_func_mbrtowc_nul_retval=yes
#gl_cv_func_mbrtowc_null_arg1=yes
#gl_cv_func_mbrtowc_null_arg2=yes
#gl_cv_func_mbrtowc_retval=yes
#gl_cv_func_wcrtomb_retval=yes
#EOF
"../configure" \
--prefix=/usr \
--sbindir=/usr/bin \
--libexecdir=/usr/lib/tar \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-backup-scripts \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded "$LFS/bin/tar"
export LDFLAGS="$LDFLAGS_old"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/tar"
touch "$STEPS_DIR/tar"
fi
## build the rest of gcc
#if [ ! -f "$STEPS_DIR/gcc-final" ]; then
# bash unpack-gcc.sh "$TMP_BUILD_DIR/"
# cd "$TMP_BUILD_DIR/gcc/"
#
# mkdir -vp build-$TARGET_MACHINE_TRIPLET
# cd build-$TARGET_MACHINE_TRIPLET
#
# "../configure" \
# --target=$TARGET_MACHINE_TRIPLET \
# --host=${BUILD_MACHINE_TRIPLET} \
# --build=${TARGET_MACHINE_TRIPLET} \
# --prefix=$LFS \
# --with-glibc-version=2.40 \
# --with-sysroot=$LFS \
# --enable-c99 \
# --enable-long-long \
# --enable-default-pie \
# --enable-default-ssp \
# --disable-nls \
# --disable-multilib \
# --disable-libgomp \
# --disable-libquadmath \
# --disable-libquadmath-support \
# --disable-decimal-float \
# --enable-languages=c,c++
#
# # Reebuild everything now that we have bootstrapped an initial gcc and glibc
# make -j 32 # if build fails add --disable-libsanitizer
# make -j 32 install
#
# cd "$BASE_DIR"
# rm -rf "$TMP_BUILD_DIR/gcc"
# touch "$STEPS_DIR/gcc-step3"
#fi
#exit 0
# build xz-utils
if [ ! -f "$STEPS_DIR/xz" ]; then
if [ ! -d "$TMP_BUILD_DIR/xz" ]; then
tar -xf "$BASE_DIR/sources/xz-5.6.3.tar.xz"
mv "xz-5.6.3" "$TMP_BUILD_DIR/xz"
fi
cd "$TMP_BUILD_DIR/xz"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--disable-static \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR=$LFS install
# Remove the libtool archive file because it is harmful for cross compilation
#rm -v $LFS/usr/lib/liblzma.la
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded "$LFS/bin/xz"
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded "$LFS/bin/xzdec"
"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded "$LFS/bin/xzcat"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/xz"
touch "$STEPS_DIR/xz"
fi
# build gettext
if [ ! -f "$STEPS_DIR/gettext" ]; then
if [ ! -d "$TMP_BUILD_DIR/gettext" ]; then
tar -xf "$BASE_DIR/sources/gettext-0.23.tar.gz"
mv "gettext-0.23" "$TMP_BUILD_DIR/gettext"
fi
cd "$TMP_BUILD_DIR/gettext"
#EMACS="no" autoreconf -fi
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
EMACS="no" "../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--disable-shared \
--libdir=/usr/lib \
--with-sysroot=$SYSROOT \
--enable-nls \
--enable-curses \
--with-xz \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/gettext"
touch "$STEPS_DIR/gettext"
fi
# build acl
if [ ! -f "$STEPS_DIR/acl" ]; then
if [ ! -d "$TMP_BUILD_DIR/acl" ]; then
tar -xf "$BASE_DIR/sources/acl-2.3.2.tar.xz"
mv "acl-2.3.2" "$TMP_BUILD_DIR/acl"
fi
cd "$TMP_BUILD_DIR/acl"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--prefix=/usr \
--libexecdir=/usr/lib \
--libdir=/usr/lib \
--with-sysroot=${LFS} \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--disable-static \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR=$LFS install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/acl"
touch "$STEPS_DIR/acl"
fi
# build pcre2
if [ ! -f "$STEPS_DIR/pcre2" ]; then
if [ ! -d "$TMP_BUILD_DIR/pcre2" ]; then
tar -xf "$BASE_DIR/sources/pcre2-10.44.tar.bz2"
mv "pcre2-10.44" "$TMP_BUILD_DIR/pcre2"
fi
cd "$TMP_BUILD_DIR/pcre2"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
export CFLAGS_old="$CFLAGS"
export CXXFLAGS_old="$CXXFLAGS"
# use fat LTO objects for static libraries
CFLAGS+=" -ffat-lto-objects"
CXXFLAGS+=" -ffat-lto-objects"
# WARNING: using prefix with LFS is a VERY BIG WORKAROUND!!!
"../configure" \
--with-sysroot=${LFS} \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=${LFS}/usr \
--enable-shared \
--enable-static=no \
--enable-jit \
--enable-pcre2-16 \
--enable-pcre2-32 \
--enable-pcre2grep-libbz2 \
--enable-pcre2grep-libz \
--enable-pcre2test-libreadline \
--cache-file=config.cache
make -j 32
make -j 32 install
export CFLAGS="$CFLAGS_old"
export CXXFLAGS="$CXXFLAGS_old"
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/pcre2"
touch "$STEPS_DIR/pcre2"
fi
# build swig
if [ ! -f "$STEPS_DIR/swig" ]; then
if [ ! -d "$TMP_BUILD_DIR/swig" ]; then
tar -xf "$BASE_DIR/sources/swig-4.3.0.tar.gz"
mv "swig-4.3.0" "$TMP_BUILD_DIR/swig"
fi
cd "$TMP_BUILD_DIR/swig"
"./autogen.sh"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
"../configure" \
--with-sysroot=${LFS} \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=/usr \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/swig"
touch "$STEPS_DIR/swig"
fi
# build libcap-ng (needs swig)
if [ ! -f "$STEPS_DIR/libcap-ng" ]; then
if [ ! -d "$TMP_BUILD_DIR/libcap-ng" ]; then
tar -xf "$BASE_DIR/sources/libcap-ng-0.8.5.tar.gz"
mv "libcap-ng-0.8.5" "$TMP_BUILD_DIR/libcap-ng"
fi
cd "$TMP_BUILD_DIR/libcap-ng"
# this workaround comes straight from archlinux
# make stupid autotools happy -_-
touch NEWS
autoreconf -fiv
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
# --enable-zos-remote requires libldap
"../configure" \
--with-sysroot=${LFS} \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--prefix=/usr \
--without-python \
--without-python3 \
--enable-static=no \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR=$LFS install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/libcap-ng"
touch "$STEPS_DIR/libcap-ng"
fi
# build audit
if [ ! -f "$STEPS_DIR/audit-userspace" ]; then
if [ ! -d "$TMP_BUILD_DIR/audit-userspace" ]; then
tar -xf "$BASE_DIR/sources/audit-userspace-4.0.2.tar.gz"
mv "audit-userspace-4.0.2" "$TMP_BUILD_DIR/audit-userspace"
fi
cd "$TMP_BUILD_DIR/audit-userspace"
autoreconf -fiv
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
# --with-arm
# --enable-zos-remote requires libldap
"../configure" \
--with-sysroot=${LFS} \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-gssapi-krb5=no \
--enable-systemd=no \
--disable-zos-remote \
--libexecdir=/usr/lib/audit \
--prefix=/usr \
--runstatedir=/run \
--sbindir=/usr/bin \
--sysconfdir=/etc \
--with-apparmor=no \
--with-io_uring=yes \
--with-libcap-ng=yes \
--with-python3=no \
--disable-static \
--cache-file=config.cache
make -j 32
make -j 32 DESTDIR=$LFS install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/audit-userspace"
touch "$STEPS_DIR/audit-userspace"
fi
# build libcap2
if [ ! -f "$STEPS_DIR/libcap2" ]; then
if [ ! -d "$TMP_BUILD_DIR/libcap2" ]; then
tar -xzf "$BASE_DIR/sources/libcap-2.73.tar.gz"
mv "libcap-2.73" "$TMP_BUILD_DIR/libcap2"
fi
cd "$TMP_BUILD_DIR/libcap2"
mkdir -vp build
cd build
# NOTE: with CGO_ENABLED we need all relevant make options in build(), check() and package() otherwise the package is not reproducible
_common_make_options=(
CGO_CPPFLAGS="$CPPFLAGS"
CGO_CFLAGS="$CFLAGS"
CGO_CXXFLAGS="$CXXFLAGS"
CGO_LDFLAGS="$LDFLAGS"
CGO_REQUIRED="1"
GOFLAGS="-buildmode=pie -mod=readonly -modcacherw"
GO_BUILD_FLAGS="-ldflags '-compressdwarf=false -linkmode=external'"
)
make_options=(
"${_common_make_options[@]}"
DYNAMIC=yes
KERNEL_HEADERS=/usr/include
lib=lib
prefix=/usr
sbindir=bin
-C ..
)
make "${make_options[@]}"
export GOPATH="$srcdir"
make_options=(
"${_common_make_options[@]}"
DESTDIR="$LFS"
RAISE_SETFCAP=no
lib=lib
prefix=/usr
sbindir=bin
install
-C ..
)
make "${make_options[@]}"
cd "$BASE_DIR"
touch "$STEPS_DIR/libcap2"
fi
# build systemd
if [ ! -f "$STEPS_DIR/systemd" ]; then
if [ ! -d "$TMP_BUILD_DIR/systemd" ]; then
tar -xf "$BASE_DIR/sources/systemd-257.2.tar.gz"
mv "systemd-257.2" "$TMP_BUILD_DIR/systemd"
fi
cd "$TMP_BUILD_DIR/systemd"
LANG=en_US.UTF-8 \
meson --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
-Dblkid=enabled \
-Dbuildtype=release \
-Ddefault-dnssec=no \
-Dfirstboot=false \
-Dinstall-tests=false \
-Dkmod-path=/bin/kmod \
-Dldconfig=false \
-Dmount-path=/bin/mount \
-Drootprefix= \
-Drootlibdir=/lib \
-Dsplit-usr=true \
-Dsulogin-path=/sbin/sulogin \
-Dsysusers=false \
-Dumount-path=/bin/umount \
-Db_lto=false \
-Drpmmacrosdir=no \
. --cross-file "$CROSS_TOOLS_DIR/meson_cross.txt" build-$TARGET_MACHINE_TRIPLET
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/systemd"
#touch "$STEPS_DIR/systemd"
fi
for f in "$LFS"/usr/bin/*; do
if "$READELF" -h $f | grep -Fq "Executable"; then
echo "Stripping $f..."
"$STRIP" -s "$f"
fi
done
# Postpone texinfo
exit 0
# build texinfo
if [ ! -f "$STEPS_DIR/texinfo" ]; then
if [ ! -d "$TMP_BUILD_DIR/texinfo" ]; then
tar -xf "$BASE_DIR/sources/texinfo-7.1.1.tar.xz"
mv "texinfo-7.1.1" "$TMP_BUILD_DIR/texinfo"
fi
cd "$TMP_BUILD_DIR/texinfo"
mkdir -vp build-$TARGET_MACHINE_TRIPLET
cd build-$TARGET_MACHINE_TRIPLET
# cat > config.cache << EOF
#gl_replace_getopt=no
#am_func_iconv=no
#ac_cv_func_calloc_0_nonnull=no
#gl_cv_func_getopt_posix=no
#ac_fn_c_try_run=no
#EOF
PERL=/usr/bin/perl \
"../configure" \
--prefix=/usr \
--host=${TARGET_MACHINE_TRIPLET} \
--build=${BUILD_MACHINE_TRIPLET} \
--enable-cross-guesses=conservative \
--enable-year2038 \
--cache-file=config.cache
#make -j 32
#make -j 32 DESTDIR="$LFS" install
cd "$BASE_DIR"
rm -rf "$TMP_BUILD_DIR/texinfo"
touch "$STEPS_DIR/texinfo"
fi
#"$TARGET_MACHINE_TRIPLET-strip" --strip-unneeded $LFS/bin/*
# Remove man pages: totally useless
rm -rf "$LFS"/usr/share/man
rm -rf "$LFS"/man
# Right now I have no idea if g++ will build crap.