#!/bin/bash if [ $(id -u) != 0 ]; then echo "$0 script need to run as root!" exit 1 fi LFS=/mnt/lfs lfs_dirs() { mkdir -pv $LFS/{dev,proc,sys,run} mknod -m 600 $LFS/dev/console c 5 1 mknod -m 666 $LFS/dev/null c 1 3 mkdir -pv $LFS/{bin,boot,etc/{opt,sysconfig},home,lib/firmware,mnt,opt} mkdir -pv $LFS/{media/{floppy,cdrom},sbin,srv,var} install -dv -m 0750 $LFS/root install -dv -m 1777 $LFS/tmp $LFS/var/tmp mkdir -pv $LFS/usr/{,local/}{bin,include,lib,sbin,src} mkdir -pv $LFS/usr/{,local/}share/{color,dict,doc,info,locale,man} mkdir -v $LFS/usr/{,local/}share/{misc,terminfo,zoneinfo} mkdir -v $LFS/usr/libexec mkdir -pv $LFS/usr/{,local/}share/man/man{1..8} case $(uname -m) in x86_64) mkdir -v $LFS/lib64 ;; esac mkdir -v $LFS/var/{log,mail,spool} ln -sv /run $LFS/var/run ln -sv /run/lock $LFS/var/lock mkdir -pv $LFS/var/{opt,cache,lib/{color,misc,locate},local} ln -sv /tools/bin/{bash,cat,dd,echo,ln,pwd,rm,stty} $LFS/bin ln -sv /tools/bin/{env,install,perl} $LFS/usr/bin ln -sv /tools/lib/libgcc_s.so{,.1} $LFS/usr/lib ln -sv /tools/lib/libstdc++.{a,so{,.6}} $LFS/usr/lib for lib in blkid lzma mount uuid do ln -sv /tools/lib/lib$lib.so* $LFS/usr/lib done ln -svf /tools/include/blkid $LFS/usr/include ln -svf /tools/include/libmount $LFS/usr/include ln -svf /tools/include/uuid $LFS/usr/include install -vdm755 $LFS/usr/lib/pkgconfig for pc in blkid mount uuid do sed 's@tools@usr@g' /tools/lib/pkgconfig/${pc}.pc \ > $LFS/usr/lib/pkgconfig/${pc}.pc done ln -sv bash $LFS/bin/sh ln -sv /proc/self/mounts $LFS/etc/mtab cat > $LFS/etc/passwd << "EOF" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/dev/null:/bin/false daemon:x:6:6:Daemon User:/dev/null:/bin/false messagebus:x:18:18:D-Bus Message Daemon User:/var/run/dbus:/bin/false nobody:x:99:99:Unprivileged User:/dev/null:/bin/false EOF cat > $LFS/etc/group << "EOF" root:x:0: bin:x:1:daemon sys:x:2: kmem:x:3: tape:x:4: tty:x:5: daemon:x:6: floppy:x:7: disk:x:8: lp:x:9: dialout:x:10: audio:x:11: video:x:12: utmp:x:13: usb:x:14: cdrom:x:15: adm:x:16: messagebus:x:18: systemd-journal:x:23: input:x:24: mail:x:34: nogroup:x:99: users:x:999: EOF touch $LFS/var/log/{btmp,lastlog,faillog,wtmp} chgrp -v utmp $LFS/var/log/lastlog chmod -v 664 $LFS/var/log/lastlog chmod -v 600 $LFS/var/log/btmp mkdir -p $LFS/etc/pkg $LFS/var/lib/pkg $LFS/var/lib/pkg/sources $LFS/usr/pkgscripts touch $LFS/var/lib/pkg/db [ -d toolchain/src ] && cp -Rv toolchain/src/* $LFS/var/lib/pkg/sources } mount_pseudo() { mount --bind /dev $LFS/dev mount -t devpts devpts $LFS/dev/pts -o gid=5,mode=620 mount -t proc proc $LFS/proc mount -t sysfs sysfs $LFS/sys mount -t tmpfs tmpfs $LFS/run if [ -h $LFS/dev/shm ]; then mkdir -p $LFS/$(readlink $LFS/dev/shm) fi } umount_pseudo() { umount $LFS/dev/pts umount $LFS/dev umount $LFS/run umount $LFS/proc umount $LFS/sys } runchroot() { pushd $LFS &>/dev/null mount_pseudo cp -L /etc/resolv.conf $LFS/etc/ chroot "$LFS" /usr/bin/env -i \ HOME=/root TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin \ /bin/bash $@ retval=$? umount_pseudo popd &>/dev/null return $retval } runinchroot() { pushd $LFS &>/dev/null mount_pseudo cp -L /etc/resolv.conf $LFS/etc/ chroot "$LFS" /tools/bin/env -i \ HOME=/root \ TERM="$TERM" \ PS1='(lfs chroot) \u:\w\$ ' \ PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \ bash $@ retval=$? umount_pseudo popd &>/dev/null return $retval } interrupted() { die "Abort by user." } die() { [ "$@" ] && printerror $@ umount_pseudo exit 1 } printerror() { echo -e "ERROR: $@" } trap "interrupted" SIGHUP SIGINT SIGQUIT SIGTERM PKGS="linux-api-headers man-pages glibc zlib file readline m4 bc binutils gmp mpfr mpc shadow gcc bzip2 pkg-config ncurses attr acl libcap sed psmisc iana-etc bison flex grep bash libtool gdbm gperf expat inetutils perl perl-xml-parser intltool autoconf automake xz kmod gettext libelf libffi openssl python3 ninja meson procps-ng e2fsprogs coreutils check diffutils gawk findutils groff grub less gzip iproute2 kbd libpipeline make patch sysklogd sysvinit eudev util-linux man-db tar texinfo vim cpio mkinitramfs linux lfs-bootscripts lfs-files libtasn1 p11-kit make-ca wget" EXTRA_PKGS="dhcpcd libnl wpa_supplicant" if [ ! -f $LFS/var/lib/pkg/db ]; then lfs_dirs fi mkdir -p $LFS/usr/pkgscripts/ cp lfs/pkgscripts/* $LFS/usr/pkgscripts/ cp lfs/functions $LFS/var/lib/pkg/ cp lfs/pkg.conf $LFS/etc/pkg/ for i in $PKGS; do if [[ $(grep "^$i " $LFS/var/lib/pkg/db) ]]; then echo "--- $i skipped ---" else echo "*** $i ***" runinchroot /usr/pkgscripts/$i || die "$i build error!" fi done for i in $EXTRA_PKGS; do if [[ $(grep "^$i " $LFS/var/lib/pkg/db) ]]; then echo "--- $i skipped ---" else echo "*** $i ***" runchroot /usr/pkgscripts/$i || die "$i build error!" fi done exit 0