194 lines
4.8 KiB
Bash
Executable file
194 lines
4.8 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
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 \
|
|
/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
|
|
|
|
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
|