diff --git a/clean_img.sh b/clean_img.sh index d9c2149..9ad747a 100755 --- a/clean_img.sh +++ b/clean_img.sh @@ -3,7 +3,9 @@ # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ set -e -source ./config.sh +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" + +source $SCRIPT_DIR/config/global.sh echo "Cleaning LFS image..." @@ -12,7 +14,6 @@ if [ -n "$(mount | grep $LFS)" ] then echo "Unmounting ${LFS}..." umount $LFS - echo "Done." fi # detach loop device @@ -20,15 +21,16 @@ if [ -n "$(losetup | grep $LFS_IMG)" ] then echo "Detaching ${LFS_IMG}..." losetup -d $(echo "$(losetup | grep $LFS_IMG)" | cut -d" " -f1) - echo "Done." fi # delete img if [ -f $LFS_IMG ] then + read -p "WARNING: This will delete ${LFS_IMG}. Continue? (Y/N): " CONFIRM + [[ $CONFIRM == [yY] || $CONFIRM == [yY][eE][sS] ]] || exit echo "Deleting ${LFS_IMG}..." rm $LFS_IMG - echo "Done." fi echo "Done." + diff --git a/config.sh b/config/global.sh old mode 100755 new mode 100644 similarity index 56% rename from config.sh rename to config/global.sh index bd6123f..1303fba --- a/config.sh +++ b/config/global.sh @@ -1,19 +1,29 @@ -#!/usr/bin/bash # LFS Build Configuration # ~~~~~~~~~~~~~~~~~~~~~~~ # This file should be sourced by the other scripts # that need these variables. -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +function get_script_dir { + SOURCE=$1 + if [ -z "$SOURCE" ] + then + echo "ERROR: get_script_dir missing BASH_SOURCE parameter." + exit -1 + fi + + echo "$(cd -- "$(dirname -- "$SOURCE")" &> /dev/null && pwd)" +} + +export -f get_script_dir +export PACKAGE_LIST=$(get_script_dir $BASH_SOURCE)/pkgs.sh export LFS=/mnt/lfs export LFS_TGT=$(uname -m)-lfs-linux-gnu export LFS_FS=ext4 -export LFS_IMG=$SCRIPT_DIR/lfs.img +export LFS_IMG=$(get_script_dir $BASH_SOURCE)/lfs.img export LFS_IMG_SIZE=$((10*1024*1024*1024)) # 10 GiB export LFS_USER=lfs - KEYS="LFS LFS_TGT LFS_FS LFS_IMG LFS_IMG_SIZE LFS_USER" for KEY in $KEYS diff --git a/config/pkgs.sh b/config/pkgs.sh new file mode 100644 index 0000000..2cd1212 --- /dev/null +++ b/config/pkgs.sh @@ -0,0 +1,87 @@ +PKG_ACL=https://download.savannah.gnu.org/releases/acl/acl-2.3.1.tar.xz +PKG_ATTR=https://download.savannah.gnu.org/releases/attr/attr-2.5.1.tar.gz +PKG_AUTOCONF=https://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.xz +PKG_AUTOMAKE=https://ftp.gnu.org/gnu/automake/automake-1.16.5.tar.xz +PKG_BASH=https://ftp.gnu.org/gnu/bash/bash-5.1.16.tar.gz +PKG_BC=https://github.com/gavinhoward/bc/releases/download/5.2.2/bc-5.2.2.tar.xz +PKG_BINUTILS=https://ftp.gnu.org/gnu/binutils/binutils-2.38.tar.xz +PKG_BISON=https://ftp.gnu.org/gnu/bison/bison-3.8.2.tar.xz +PKG_BZIP2=https://www.sourceware.org/pub/bzip2/bzip2-1.0.8.tar.gz +PKG_CHECK=https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz +PKG_COREUTILS=https://ftp.gnu.org/gnu/coreutils/coreutils-9.0.tar.xz +PKG_DEJAGNU=https://ftp.gnu.org/gnu/dejagnu/dejagnu-1.6.3.tar.gz +PKG_DIFFUTILS=https://ftp.gnu.org/gnu/diffutils/diffutils-3.8.tar.xz +PKG_E2FSPROGS=https://downloads.sourceforge.net/project/e2fsprogs/e2fsprogs/v1.46.5/e2fsprogs-1.46.5.tar.gz +PKG_ELFUTILS=https://sourceware.org/ftp/elfutils/0.186/elfutils-0.186.tar.bz2 +PKG_EUDEV=https://github.com/eudev-project/eudev/releases/download/v3.2.11/eudev-3.2.11.tar.gz +PKG_EXPAT=https://prdownloads.sourceforge.net/expat/expat-2.4.6.tar.xz +PKG_EXPECT5=https://prdownloads.sourceforge.net/expect/expect5.45.4.tar.gz +PKG_FILE=https://astron.com/pub/file/file-5.41.tar.gz +PKG_FINDUTILS=https://ftp.gnu.org/gnu/findutils/findutils-4.9.0.tar.xz +PKG_FLEX=https://github.com/westes/flex/releases/download/v2.6.4/flex-2.6.4.tar.gz +PKG_GAWK=https://ftp.gnu.org/gnu/gawk/gawk-5.1.1.tar.xz +PKG_GCC=https://ftp.gnu.org/gnu/gcc/gcc-11.2.0/gcc-11.2.0.tar.xz +PKG_GDBM=https://ftp.gnu.org/gnu/gdbm/gdbm-1.23.tar.gz +PKG_GETTEXT=https://ftp.gnu.org/gnu/gettext/gettext-0.21.tar.xz +PKG_GLIBC=https://ftp.gnu.org/gnu/glibc/glibc-2.35.tar.xz +PKG_GMP=https://ftp.gnu.org/gnu/gmp/gmp-6.2.1.tar.xz +PKG_GPERF=https://ftp.gnu.org/gnu/gperf/gperf-3.1.tar.gz +PKG_GREP=https://ftp.gnu.org/gnu/grep/grep-3.7.tar.xz +PKG_GROFF=https://ftp.gnu.org/gnu/groff/groff-1.22.4.tar.gz +PKG_GRUB=https://ftp.gnu.org/gnu/grub/grub-2.06.tar.xz +PKG_GZIP=https://ftp.gnu.org/gnu/gzip/gzip-1.11.tar.xz +PKG_IANAETC=https://github.com/Mic92/iana-etc/releases/download/20220207/iana-etc-20220207.tar.gz +PKG_INETUTILS=https://ftp.gnu.org/gnu/inetutils/inetutils-2.2.tar.xz +PKG_INTLTOOL=https://launchpad.net/intltool/trunk/0.51.0/+download/intltool-0.51.0.tar.gz +PKG_IPROUTE2=https://www.kernel.org/pub/linux/utils/net/iproute2/iproute2-5.16.0.tar.xz +PKG_KBD=https://www.kernel.org/pub/linux/utils/kbd/kbd-2.4.0.tar.xz +PKG_KMOD=https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-29.tar.xz +PKG_LESS=https://www.greenwoodsoftware.com/less/less-590.tar.gz +PKG_LFSBOOTSCRIPTS=https://www.linuxfromscratch.org/lfs/downloads/11.1/lfs-bootscripts-20210608.tar.xz +PKG_LIBCAP2=https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.63.tar.xz +PKG_LIBFFI=https://github.com/libffi/libffi/releases/download/v3.4.2/libffi-3.4.2.tar.gz +PKG_LIBPIPELINE=https://download.savannah.gnu.org/releases/libpipeline/libpipeline-1.5.5.tar.gz +PKG_LIBTOOL=https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.xz +PKG_LINUX=https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.16.9.tar.xz +PKG_M4=https://ftp.gnu.org/gnu/m4/m4-1.4.19.tar.xz +PKG_MAKE=https://ftp.gnu.org/gnu/make/make-4.3.tar.gz +PKG_MANDB=https://download.savannah.gnu.org/releases/man-db/man-db-2.10.1.tar.xz +PKG_MANPAGES=https://www.kernel.org/pub/linux/docs/man-pages/man-pages-5.13.tar.xz +PKG_MESON=https://github.com/mesonbuild/meson/releases/download/0.61.1/meson-0.61.1.tar.gz +PKG_MPC=https://ftp.gnu.org/gnu/mpc/mpc-1.2.1.tar.gz +PKG_MPFR=https://www.mpfr.org/mpfr-4.1.0/mpfr-4.1.0.tar.xz +PKG_NCURSES=https://invisible-mirror.net/archives/ncurses/ncurses-6.3.tar.gz +PKG_NINJA=https://github.com/ninja-build/ninja/archive/v1.10.2/ninja-1.10.2.tar.gz +PKG_OPENSSL=https://www.openssl.org/source/openssl-3.0.1.tar.gz +PKG_PATCH=https://ftp.gnu.org/gnu/patch/patch-2.7.6.tar.xz +PKG_PERL=https://www.cpan.org/src/5.0/perl-5.34.0.tar.xz +PKG_PKGCONFIG=https://pkg-config.freedesktop.org/releases/pkg-config-0.29.2.tar.gz +PKG_PROCPS=https://sourceforge.net/projects/procps-ng/files/Production/procps-ng-3.3.17.tar.xz +PKG_PSMISC=https://sourceforge.net/projects/psmisc/files/psmisc/psmisc-23.4.tar.xz +PKG_PYTHON3=https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tar.xz +PKG_PYTHON3DOCS=https://www.python.org/ftp/python/doc/3.10.2/python-3.10.2-docs-html.tar.bz2 +PKG_READLINE=https://ftp.gnu.org/gnu/readline/readline-8.1.2.tar.gz +PKG_SED=https://ftp.gnu.org/gnu/sed/sed-4.8.tar.xz +PKG_SHADOW=https://github.com/shadow-maint/shadow/releases/download/v4.11.1/shadow-4.11.1.tar.xz +PKG_SYSKLOGD=https://www.infodrom.org/projects/sysklogd/download/sysklogd-1.5.1.tar.gz +PKG_SYSVINIT=https://download.savannah.gnu.org/releases/sysvinit/sysvinit-3.01.tar.xz +PKG_TAR=https://ftp.gnu.org/gnu/tar/tar-1.34.tar.xz +PKG_TCL=https://downloads.sourceforge.net/tcl/tcl8.6.12-src.tar.gz +PKG_TCLDOCS=https://downloads.sourceforge.net/tcl/tcl8.6.12-html.tar.gz +PKG_TEXINFO=https://ftp.gnu.org/gnu/texinfo/texinfo-6.8.tar.xz +PKG_TZDATA=https://www.iana.org/time-zones/repository/releases/tzdata2021e.tar.gz +PKG_UDEVLFS=https://anduin.linuxfromscratch.org/LFS/udev-lfs-20171102.tar.xz +PKG_UTILLINUX=https://www.kernel.org/pub/linux/utils/util-linux/v2.37/util-linux-2.37.4.tar.xz +PKG_VIM=https://anduin.linuxfromscratch.org/LFS/vim-8.2.4383.tar.gz +PKG_XMLPARSER=https://cpan.metacpan.org/authors/id/T/TO/TODDR/XML-Parser-2.46.tar.gz +PKG_XZ=https://tukaani.org/xz/xz-5.2.5.tar.xz +PKG_ZLIB=https://zlib.net/zlib-1.2.11.tar.xz +PKG_ZSTD=https://github.com/facebook/zstd/releases/download/v1.5.2/zstd-1.5.2.tar.gz +PATCH_BINUTILS=https://www.linuxfromscratch.org/patches/lfs/11.1/binutils-2.38-lto_fix-1.patch +PATCH_BZIP2=https://www.linuxfromscratch.org/patches/lfs/11.1/bzip2-1.0.8-install_docs-1.patch +PATCH_COREUTILS=https://www.linuxfromscratch.org/patches/lfs/11.1/coreutils-9.0-i18n-1.patch +PATCH_COREUTILS_CHMOD=https://www.linuxfromscratch.org/patches/lfs/11.1/coreutils-9.0-chmod_fix-1.patch +PATCH_GLIBC=https://www.linuxfromscratch.org/patches/lfs/11.1/glibc-2.35-fhs-1.patch +PATCH_KBD=https://www.linuxfromscratch.org/patches/lfs/11.1/kbd-2.4.0-backspace-1.patch +PATCH_PERL=https://www.linuxfromscratch.org/patches/lfs/11.1/perl-5.34.0-upstream_fixes-1.patch +PATCH_SYSVINIT=https://www.linuxfromscratch.org/patches/lfs/11.1/sysvinit-3.01-consolidated-1.patch diff --git a/user_config.sh b/config/user.sh old mode 100755 new mode 100644 similarity index 100% rename from user_config.sh rename to config/user.sh diff --git a/main.sh b/main.sh index 4e93167..44a0da2 100755 --- a/main.sh +++ b/main.sh @@ -1,4 +1,7 @@ #!/usr/bin/bash +# main.sh +# ~~~~~~~ +# This is the main entry point for this project. set -e if [ "$UID" != "0" ] @@ -7,22 +10,32 @@ then exit -1 fi -source ./config.sh +SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)" -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +source $SCRIPT_DIR/config/global.sh echo "Starting Stage 1..." -stage1/main.sh +if ! $SCRIPT_DIR/stage1/main.sh +then + echo "Stage 1 failed." + exit -1 +fi echo "Completed Stage 1." echo "Starting Stage 2..." -stage2/main.sh +if ! $SCRIPT_DIR/stage2/main.sh +then + echo "Stage 2 failed." + exit -1 +fi echo "Completed Stage 2." echo "Starting Stage 3..." -set -x -su $LFS_USER --shell=/usr/bin/bash --command\ - "source $SCRIPT_DIR/config.sh && source $SCRIPT_DIR/user_config.sh && $SCRIPT_DIR/stage3/main.sh" -set +x +if ! su $LFS_USER --shell=/usr/bin/bash --command\ + "source $SCRIPT_DIR/config/global.sh && source $SCRIPT_DIR/config/user.sh && $SCRIPT_DIR/stage3/main.sh" +then + echo "Stage 3 failed." + exit -1 +fi echo "Completed Stage 3." diff --git a/stage1/build_img.sh b/stage1/build_img.sh index f211f2f..58558b2 100755 --- a/stage1/build_img.sh +++ b/stage1/build_img.sh @@ -1,15 +1,7 @@ -#!/usr/bin/bash +#!/usr/bin/env bash # Script to create OS image file # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# This script might be considered a little bit -# dangerous since it needs to be run as root, -# and involves partitioning, creating new filesystems, -# mounting, etc. I tried to make it somewhat safer -# by operating only image files that are mounted as -# loop devices. So ideally, it won't touch any actual -# block devices. - -set -e # exit if any command fails +set -e # create image file echo -n "Creating disk image... " @@ -69,3 +61,4 @@ then fi mount $LOOP_P2 $LFS echo "done." + diff --git a/stage1/check_dep_versions.sh b/stage1/check_dep_versions.sh index 120aba3..2b2b377 100755 --- a/stage1/check_dep_versions.sh +++ b/stage1/check_dep_versions.sh @@ -1,10 +1,6 @@ -#!/usr/bin/bash +#!/usr/bin/env bash # Script to check build dependencies # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -# This is likely to break on many machines. -# If it does, just manually check that you have -# the right dependencies and versions according -# to the listing in LFS 11.0, Chapter 2.2. EXIT_STATUS=0 diff --git a/stage1/main.sh b/stage1/main.sh index 7c0a2ef..6064ccf 100755 --- a/stage1/main.sh +++ b/stage1/main.sh @@ -1,4 +1,6 @@ -#!/usr/bin/bash +#!/usr/bin/env bash +# Stage 1 +# ~~~~~~~ set -e if [ "$UID" != "0" ] @@ -13,13 +15,13 @@ then exit -1 fi -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +SCRIPT_DIR=$(get_script_dir $BASH_SOURCE) echo "Checking dependency versions..." $SCRIPT_DIR/check_dep_versions.sh -echo "Done." +echo "Finished checking dependencies." echo "Building image..." $SCRIPT_DIR/build_img.sh -echo "Done." +echo "Finished building image." diff --git a/stage2/main.sh b/stage2/main.sh index 85c3ac0..20986b9 100755 --- a/stage2/main.sh +++ b/stage2/main.sh @@ -1,4 +1,6 @@ -#!/usr/bin/bash +#!/usr/bin/env bash +# Stage 2 +# ~~~~~~~ set -e if [ "$UID" != "0" ] diff --git a/stage3/binutils.sh b/stage3/binutils.sh index ade1229..6c9a7f8 100755 --- a/stage3/binutils.sh +++ b/stage3/binutils.sh @@ -1,25 +1,40 @@ -#/usr/bin/env bash -set -ex +#!/usr/bin/env bash +# Binutils pass 1 +# ~~~~~~~~~~~~~~~ +set -e cd $LFS/sources -# Binutils-2.37 pass 1 -tar -xf binutils-2.37.tar.xz -cd binutils-2.37 -patch -p1 < ../binutils-2.37-upstream_fix-1.patch +eval "$(grep "PKG_BINUTILS\|PATCH_BINUTILS" $PACKAGE_LIST)" +curl -LO $PKG_BINUTILS -LO $PATCH_BINUTILS + +PKG_BINUTILS=$(basename $PKG_BINUTILS) +PATCH_BINUTILS=$(basename $PATCH_BINUTILS) + +tar -xf $PKG_BINUTILS +cd ${PKG_BINUTILS%.tar*} + +patch -p1 < ../$PATCH_BINUTILS mkdir -v build cd build -../configure \ - --prefix=$LFS/tools \ - --with-sysroot=$LFS \ - --target=$LFS_TGT \ - --disable-nls \ - --disable-werror +D1=$(date +%s) -make +../configure \ + --prefix=$LFS/tools \ + --with-sysroot=$LFS \ + --target=$LFS_TGT \ + --disable-nls \ + --disable-werror + +# use one thread to ensure consistent SBU calculation +make -j1 make install -j1 +D2=$(date +%s) +echo "1 SBU == $((D2-D1)) seconds." + cd $LFS/sources -rm -rf binutils-2.37 +rm -rf ${PKG_BINUTILS%.tar*} $PKG_BINUTILS $PATCH_BINUTILS + diff --git a/stage3/gcc.sh b/stage3/gcc.sh index e0b4bd7..e2b7a8e 100755 --- a/stage3/gcc.sh +++ b/stage3/gcc.sh @@ -1,17 +1,30 @@ #/usr/bin/env bash -set -ex +# GCC pass 1 +# ~~~~~~~~~~ +set -e cd $LFS/sources -# GCC-11.2.0 pass 1 -tar -xf gcc-11.2.0.tar.xz -cd gcc-11.2.0 -tar -xf ../mpfr-4.1.0.tar.xz -mv -fv mpfr-4.1.0 mpfr -tar -xf ../gmp-6.2.1.tar.xz -mv -fv gmp-6.2.1 gmp -tar -xf ../mpc-1.2.1.tar.gz -mv mpc-1.2.1 mpc +eval "$(grep "PKG_GCC\|PKG_MPFR\|PKG_GMP\|PKG_MPC" $PACKAGE_LIST)" +curl -LO $PKG_GCC -LO $PKG_MPFR -LO $PKG_GMP -LO $PKG_MPC + +PKG_GCC=$(basename $PKG_GCC) +PKG_MPFR=$(basename $PKG_MPFR) +PKG_GMP=$(basename $PKG_GMP) +PKG_MPC=$(basename $PKG_MPC) + +tar -xf $PKG_GCC +cd ${PKG_GCC%.tar*} + +tar -xf ../$PKG_MPFR +mv ${PKG_MPFR%.tar*} mpfr + +tar -xf ../$PKG_GMP +mv ${PKG_GMP%.tar*} gmp + +tar -xf ../$PKG_MPC +mv ${PKG_MPC%.tar*} mpc + case $(uname -m) in x86_64) sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64 @@ -24,7 +37,7 @@ cd build ../configure \ --target=$LFS_TGT \ --prefix=$LFS/tools \ - --with-glibc-version=2.11 \ + --with-glibc-version=2.35 \ --with-sysroot=$LFS \ --with-newlib \ --without-headers \ @@ -50,4 +63,5 @@ cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h cd $LFS/sources -rm -rf gcc-11.2.0 +rm -rf ${PKG_GCC%.tar*} $PKG_GCC $PKG_MPFR $PKG_MPC $PKG_GMP + diff --git a/stage3/glibc.sh b/stage3/glibc.sh index 2e36b6a..f5081e6 100755 --- a/stage3/glibc.sh +++ b/stage3/glibc.sh @@ -1,25 +1,32 @@ -#/usr/bin/env bash -set -ex +#!/usr/bin/env bash +# Glibc pass 1 +# ~~~~~~~~~~~~ +set -e cd $LFS/sources -# glibc -tar -xf glibc-2.34.tar.xz -cd glibc-2.34 +eval "$(grep "PKG_GLIBC\|PATCH_GLIBC" $PACKAGE_LIST)" +curl -LO $PKG_GLIBC -LO $PATCH_GLIBC + +PKG_GLIBC=$(basename $PKG_GLIBC) +PATCH_GLIBC=$(basename $PATCH_GLIBC) + +tar -xf $PKG_GLIBC +cd ${PKG_GLIBC%.tar*} case $(uname -m) in i?86) - ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 + ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3 ;; x86_64) - ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 - ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 + ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64 + ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3 ;; esac -patch -Np1 -i ../glibc-2.34-fhs-1.patch +patch -Np1 -i ../$PATCH_GLIBC -mkdir -v build +mkdir build cd build echo "rootsbindir=/usr/sbin" > configparms @@ -41,10 +48,18 @@ sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd echo 'int main(){}' > dummy.c $LFS_TGT-gcc dummy.c OUTPUT=$(readelf -l a.out | grep '/ld-linux') -[ "$OUTPUT" != '[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]' ] -rm -v dummy.c a.out +EXPECTED='[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]' +if [[ "$OUTPUT" != *"${EXPECTED}"* ]] +then + echo "ERROR: OUTPUT does not contain expected value.\n" \ + "OUTPUT=$OUTPUT\n" \ + "EXPECTED=$EXPECTED" + exit -1 +fi +rm dummy.c a.out $LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders cd $LFS/sources -rm -rf glibc-2.34 +rm -rf ${PKG_GLIBC%.tar*} $PKG_GLIBC $PATCH_GLIBC + diff --git a/stage3/libstdcpp.sh b/stage3/libstdcpp.sh index 474f673..d3785c9 100755 --- a/stage3/libstdcpp.sh +++ b/stage3/libstdcpp.sh @@ -1,13 +1,19 @@ -#/usr/bin/env bash -set -ex +#!/usr/bin/env bash +# Libstdc++ pass 1 +# ~~~~~~~~~~~~~~~~ +set -e cd $LFS/sources -# libstdc++ -tar -xf gcc-11.2.0.tar.xz -cd gcc-11.2.0 +eval "$(grep PKG_GCC $PACKAGE_LIST)" +curl -LO $PKG_GCC -mkdir -v build +PKG_GCC=$(basename $PKG_GCC) + +tar -xf $PKG_GCC +cd ${PKG_GCC%.tar**} + +mkdir build cd build ../libstdc++-v3/configure \ @@ -23,4 +29,5 @@ make make DESTDIR=$LFS install cd $LFS/sources -rm -rf gcc-11.2.0 +rm -rf ${PKG_GCC%.tar*} $PKG_GCC + diff --git a/stage3/linux_headers.sh b/stage3/linux_headers.sh index e22d34a..9021d55 100755 --- a/stage3/linux_headers.sh +++ b/stage3/linux_headers.sh @@ -1,16 +1,25 @@ #!/usr/bin/env bash -set -ex +# Linux API headers +# ~~~~~~~~~~~~~~~~~ +set -e cd $LFS/sources -# linux api headers -tar -xf linux-5.13.12.tar.xz -cd linux-5.13.12 +eval "$(grep PKG_LINUX $PACKAGE_LIST)" +curl -LO $PKG_LINUX +PKG_LINUX=$(basename $PKG_LINUX) + +tar -xf $PKG_LINUX +cd ${PKG_LINUX%.tar*} + +make mrproper make headers + find usr/include -name '.*' -delete rm usr/include/Makefile cp -rv usr/include $LFS/usr cd $LFS/sources -rm -rf linux-5.13.12 +rm -rf ${PKG_LINUX%.tar*} $PKG_LINUX + diff --git a/stage3/main.sh b/stage3/main.sh index 8ee5db4..cea11eb 100755 --- a/stage3/main.sh +++ b/stage3/main.sh @@ -1,7 +1,9 @@ -#/usr/bin/env bash +#!/usr/bin/env bash +# Stage 3 +# ~~~~~~~ set -e -if [ -z "$LFS_USER" -o -z "$LFS_USER" ] +if [ -z "$LFS" -o -z "$LFS_USER" ] then echo "ERROR: Missing config vars. Be sure to source config.sh before running this script." exit -1 @@ -13,13 +15,24 @@ then exit -1 fi -SCRIPT_DIR="$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )" +function build_package { + PACKAGE_NAME=$1 + BUILD_SCRIPT=$2 + BUILD_LOG=$3 -$SCRIPT_DIR/binutils.sh -$SCRIPT_DIR/gcc.sh -$SCRIPT_DIR/linux_headers.sh -$SCRIPT_DIR/glibc.sh -$SCRIPT_DIR/libstdcpp.sh + echo -n "Building ${PACKAGE_NAME}... " + if ! { $BUILD_SCRIPT &> $BUILD_LOG && rm $BUILD_LOG && echo "done."; } + then + echo "failed. Check $BUILD_LOG for more information." + exit -1 + fi +} -echo "Done." +SCRIPT_DIR=$(get_script_dir $BASH_SOURCE) + +build_package "Binutils pass 1" $SCRIPT_DIR/binutils.sh $LFS/sources/binutils_pass1.log +build_package "GCC pass 1" $SCRIPT_DIR/gcc.sh $LFS/sources/gcc_pass1.log +build_package "Linux headers" $SCRIPT_DIR/linux_headers.sh $LFS/sources/linux_headers.log +build_package "Glibc pass1" $SCRIPT_DIR/glibc.sh $LFS/sources/glibc_pass1.log +build_package "libstdcpp" $SCRIPT_DIR/libstdcpp.sh $LFS/sources/libstdcpp.log diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..3a828e9 --- /dev/null +++ b/test.sh @@ -0,0 +1,10 @@ +#!/usr/bin/bash +EXPECTED='[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]' +OUTPUT=" $EXPECTED " + +if [[ "$OUTPUT" == *"${EXPECTED}"* ]] +then + echo all good +else + echo shit +fi