LFS 即 Linux From Scratch1 https://www.linuxfromscratch.org 的简称,意为从零开始构建 Linux 系统。它是一份在线手册,将提供亲自设计和构建系统所需的背景知识及操作步骤。该手册提供了一个构建能够正常工作的系统的样板,读者可以自由地调整书中的命令,来满足自己的要求。
它能够帮助你学习 Linux 系统的内部是如何运作的。构建 LFS 系统的过程将展示 Linux 系统的工作原理,以及其各组成部分的协作和依赖关系。有了这些经验,你将能够定制 Linux 系统,使其满足你独一无二的需求。
它允许你更好地控制你的系统,而不用依赖于其他人的 Linux 实现。
LFS 的主要目标架构是 AMD/Intel 的 x86 (32 位) 和 x86_64 (64 位) CPU。有兴趣的同学也可以尝试在 ARM 和 MIPS 架构的 CPU 上构建 LFS。
LFS 目前最新的版本为 11.0,根据所采用的 init 程序不同又分为下列版本:
构建 LFS 系统不是一项简单的任务。它需要你运用足够丰富的 Unix 系统管理知识来解决构建过程中的问题,并正确执行本书给出的命令。建议阅读下列材料:
宿主系统必须拥有下列软件,且版本不能低于我们给出的最低版本。
包名 | 版本 | 备注 |
---|---|---|
Bash | 3.2 | /bin/sh 必须是到 bash 的符号链接或硬连接 |
Binutils | 2.25 | 比 2.37 更新的版本未经测试,不推荐使用 |
Bison | 2.7 | /usr/bin/yacc 必须是到 bison 的链接,或者是一个执行 bison 的小脚本 |
Bzip2 | 1.0.4 | |
Coreutils | 6.9 | |
Diffutils | 2.8.1 | |
Findutils | 4.2.31 | |
Gawk | 4.0.1 | /usr/bin/awk 必须是到 gawk 的链接 |
GCC | 6.2 | 包括 C++ 编译器 g++ (比 11.2.0 更新的版本未经测试,不推荐使用) |
Glibc | 2.11 | 比 2.34 更新的版本未经测试,不推荐使用 |
Grep | 2.5.1a | |
Gzip | 1.3.12 | |
Linux Kernel | 3.2 | |
M4 | 1.4.10 | |
Make | 4.0 | |
Patch | 2.5.4 | |
Perl | 5.8.8 | |
Python | 3.4 | |
Sed | 4.1.5 | |
Tar | 1.22 | |
Texinfo | 4.7 | |
Xz | 5.0.0 |
推荐你为 LFS 选择一个可用的空分区,或者在有充足未划分空间的情况下,创建一个新分区。
LFS 假设根文件系统 (/) 采用 ext4 文件系统:
mkfs -v -t ext4 /dev/<xxx>
该变量被定义且设置为构建 LFS 使用的目录:
export LFS=/mnt/lfs
输入以下命令以创建挂载点,并挂载 LFS 文件系统:
mkdir -pv $LFS
mount -v -t ext4 /dev/<xxx> $LFS
包含构建基本的 Linux 系统时需要下载的软件包列表。将 $LFS/sources 既用于保存软件包和补丁,又作为工作目录:
mkdir -v $LFS/sources # 创建这个目录
chmod -v a+wt $LFS/sources # 启用写入权限和 sticky 标志
包名 | 版本 |
---|---|
Acl | 2.3.1 |
Attr | 2.5.1 |
Autoconf | 2.71 |
Automake | 1.16.4 |
Bash | 5.1.8 |
Bc | 5.0.0 |
Binutils | 2.37 |
Bison | 3.7.6 |
Bzip2 | 1.0.8 |
Check | 0.15.2 |
Coreutils | 8.32 |
D-Bus | 1.12.20 |
DejaGNU | 1.6.3 |
Diffutils | 3.8 |
E2fsprogs | 1.46.4 |
Elfutils | 0.185 |
Expat | 2.4.1 |
Expect | 5.45.4 |
File | 5.40 |
Findutils | 4.8.0 |
Flex | 2.6.4 |
Gawk | 5.1.0 |
GCC | 11.2.0 |
GDBM | 1.20 |
Gettext | 0.21 |
Glibc | 2.34 |
GMP | 6.2.1 |
Gperf | 3.1 |
Grep | 3.7 |
Groff | 1.22.4 |
GRUB | 2.06 |
Gzip | 1.10 |
Iana-Etc | 20210611 |
Inetutils | 2.1 |
Intltool | 0.51.0 |
IPRoute2 | 5.13.0 |
Jinja2 | 3.0.1 |
Kbd | 2.4.0 |
Kmod | 29 |
Less | 590 |
Libcap | 2.53 |
Libffi | 3.4.2 |
Libpipeline | 1.5.3 |
Libtool | 2.4.6 |
Linux | 5.13.12 |
M4 | 1.4.19 |
Make | 4.3 |
Man-DB | 2.9.4 |
Man-pages | 5.13 |
MarkupSafe | 2.0.1 |
Meson | 0.59.1 |
MPC | 1.2.1 |
MPFR | 4.1.0 |
Ncurses | 6.2 |
Ninja | 1.10.2 |
OpenSSL | 1.1.1l |
Patch | 2.7.6 |
Perl | 5.34.0 |
Pkg-config | 0.29.2 |
Procps-ng | 3.3.17 |
Psmisc | 23.4 |
Python | 3.9.6 |
Python 文档 | 3.9.6 |
Readline | 8.1 |
Sed | 4.8 |
Shadow | 4.9 |
Systemd | 249 |
Systemd Man 手册 | 249 |
Tar | 1.34 |
Tcl | 8.6.11 |
Tcl 文档 | 8.6.11 |
Texinfo | 6.8 |
Time Zone Data | 2021a |
Util-linux | 2.37.2 |
Vim | 8.2.3337 |
XML::Parser | 2.46 |
Xz Utils | 5.2.5 |
Zlib | 1.2.11 |
Zstd | 1.5.0 |
有些补丁解决了本应由维护者修复的问题,有些则对软件包进行微小的修改。
包名 | 补丁 |
---|---|
Binutils | 上游修复补丁 |
Bzip2 | 文档补丁 |
Coreutils | 国际化修复补丁 |
Glibc | FHS 补丁 |
Kbd | 退格/删除修复补丁 |
Perl | 上游修复补丁 |
Systemd | 上游修复补丁 |
可通过 wget-list
6 https://www.linuxfromscratch.org/lfs/view/11.0-systemd/wget-list 下载上述所有软件包及补丁:
wget --input-file=wget-list --continue --directory-prefix=$LFS/sources
下载完毕后验证其 md5sums7 https://www.linuxfromscratch.org/lfs/view/11.0-systemd/md5sums:
pushd $LFS/sources
md5sum -c md5sums
popd
使得编译的程序可以被安装到它们的最终位置。
mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
for i in bin lib sbin; do
ln -sv usr/$i $LFS/$i
done
case $(uname -m) in
x86_64) mkdir -pv $LFS/lib64 ;;
esac
为了将交叉编译器和其他程序分离,它会被安装在一个专门的目录:
mkdir -pv $LFS/tools
以非特权用户身份编译软件包。
groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/{usr{,/*},lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -v lfs $LFS/lib64 ;;
esac
chown -v lfs $LFS/sources
su - lfs
创建一个新的 .bash_profile:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
创建一个 .bashrc 文件:
cat > ~/.bashrc << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/usr/bin
if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
PATH=$LFS/tools/bin:$PATH
CONFIG_SITE=$LFS/usr/share/config.site
export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
EOF
为了完全准备好编译临时工具的环境,指示 shell 读取刚才创建的配置文件:
source ~/.bash_profile
名称 | 说明 |
---|---|
build | 指构建程序时使用的机器 |
host | 指将来会运行被构建程序的机器 |
target | 编译器为目标机器产生代码 |
几乎所有构建系统都使用形如 CPU-供应商-内核-操作系统,称为三元组的名称表示目标机器。通过 LFS_TGT
设置目标机器,即 x86_64-lfs-linux-gnu
。
需要的包,总共 4 个:
包名 | 版本 |
---|---|
Binutils | 2.37 |
GCC | 11.2.0 |
Linux | 5.13.12 |
Glibc | 2.34 |
包含汇编器、链接器以及其他用于处理目标文件的工具。
mkdir -v build
cd build
../configure --prefix=$LFS/tools \ # 安装在 $LFS/tools 目录中
--with-sysroot=$LFS \ # 交叉编译时在 $LFS 中寻找目标系统的库
--target=$LFS_TGT \ # 以构建交叉链接器
--disable-nls \
--disable-werror
make
make install -j1 # 构建系统中的一个问题可能导致安装过程失败
包含 GNU 编译器集合,其中有 C 和 C++ 编译器。
GCC 依赖于 GMP、MPFR 和 MPC 这三个包:
tar -xf ../mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd build
../configure \
--target=$LFS_TGT \
--prefix=$LFS/tools \
--with-glibc-version=2.28 \ # 与宿主的 glibc 版本兼容
--with-sysroot=$LFS \
--with-newlib \ # 防止编译任何需要 libc 支持的代码
--without-headers \ # 防止 GCC 查找标准头文件
--enable-initfini-array \ # 强制启用一些内部数据结构
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
make
make install
cd ..
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h # 创建一个完整版本的内部头文件
导出内核 API 供 Glibc 使用。
make mrproper # 确保软件包中没有遗留陈旧的文件
make headers
find usr/include -name '.*' -delete
rm usr/include/Makefile
cp -rv usr/include $LFS/usr
包含主要的 C 语言库。
创建一个动态链接器正常工作所必须的符号链接:
case $(uname -m) in
i?86) 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
;;
esac
patch -Np1 -i ../glibc-2.34-fhs-1.patch # 应用补丁
mkdir -v build
cd build
# 确保将 ldconfig 和 sln 工具安装到 /usr/sbin
echo "rootsbindir=/usr/sbin" > configparms
../configure \
--prefix=/usr \
--host=$LFS_TGT \ # 使用 $LFS/tools 中的交叉链接器和交叉编译器
--build=$(../scripts/config.guess) \
--enable-kernel=3.2 \ # 编译出支持 3.2 版或者更新的 Linux 内核
--with-headers=$LFS/usr/include \
libc_cv_slibdir=/usr/lib
make
make DESTDIR=$LFS install
sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd # 改正 ldd 脚本中硬编码的可执行文件加载器路径
确认新工具链的各基本功能 (编译和链接) 能如我们所预期的那样工作:
echo 'int main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep '/ld-linux'
rm -v dummy.c a.out
完成 limits.h 头文件的安装:
$LFS/tools/libexec/gcc/$LFS_TGT/11.2.0/install-tools/mkheaders
C++ 标准库。
mkdir -v build
cd build
../libstdc++-v3/configure \
--host=$LFS_TGT \ # 指定使用我们刚刚构建的交叉编译器
--build=$(../config.guess) \
--prefix=/usr \
--disable-multilib \
--disable-nls \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/11.2.0 # 在这个位置搜索标准头文件
make
make DESTDIR=$LFS install
使用刚刚构建的交叉工具链对基本工具进行交叉编译。这些工具会被安装到它们的最终位置,但现在还无法使用。基本操作仍然依赖宿主系统的工具。尽管如此,在链接时会使用刚刚安装的库。
需要的包,总共 17 个:
包名 | 版本 |
---|---|
M4 | 1.4.19 |
Ncurses | 6.2 |
Bash | 5.1.8 |
Coreutils | 8.32 |
Diffutils | 3.8 |
File | 5.40 |
Findutils | 4.8.0 |
Gawk | 5.1.0 |
Grep | 3.7 |
Gzip | 1.10 |
Make | 4.3 |
Patch | 2.7.6 |
Sed | 4.8 |
Tar | 1.34 |
Xz | 5.2.5 |
Binutils | 2.37 |
GCC | 11.2.0 |
包含一个宏处理器。
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
包含使用时不需考虑终端特性的字符屏幕处理函数库。
sed -i s/mawk// configure # 保证在配置时优先查找 gawk 命令
mkdir build
pushd build
../configure
make -C include
make -C progs tic # 构建“tic”程序
popd
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(./config.guess) \
--mandir=/usr/share/man \
--with-manpage-format=normal \
--with-shared \
--without-debug \
--without-ada \
--without-normal \
--enable-widec # 使得宽字符库 (例如 libncursesw.so.6.2) 被构建
make
make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so
./configure --prefix=/usr \
--build=$(support/config.guess) \
--host=$LFS_TGT \
--without-bash-malloc # 禁用 Bash 自己的内存分配 (malloc) 函数,因为已知它会导致段错误
make
make DESTDIR=$LFS install
ln -sv bash $LFS/bin/sh
包含用于显示和设定系统基本属性的工具。
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess) \
--enable-install-program=hostname \
--enable-no-install-program=kill,uptime
make
make DESTDIR=$LFS install
mv -v $LFS/usr/bin/chroot $LFS/usr/sbin
mkdir -pv $LFS/usr/share/man/man8
mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8
包含显示文件或目录之间差异的程序。
./configure --prefix=/usr --host=$LFS_TGT
make
make DESTDIR=$LFS install
包含用于确定给定文件类型的工具。
mkdir build # 宿主系统 file 命令的版本必须和正在构建的软件包相同,
pushd build # 才能在构建过程中创建必要的签名数据文件
../configure --disable-bzlib \
--disable-libseccomp \
--disable-xzlib \
--disable-zlib
make
popd
./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)
make FILE_COMPILE=$(pwd)/build/src/file
make DESTDIR=$LFS install
包含用于查找文件的程序。
./configure --prefix=/usr \
--localstatedir=/var/lib/locate \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
包含操作文本文件的程序。
sed -i 's/extras//' Makefile.in # 确保不要安装一些没有必要的文件
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(./config.guess)
make
make DESTDIR=$LFS install
包含在文件内容中进行搜索的程序。
./configure --prefix=/usr \
--host=$LFS_TGT
make
make DESTDIR=$LFS install
包含压缩和解压缩文件的程序。
./configure --prefix=/usr --host=$LFS_TGT
make
make DESTDIR=$LFS install
./configure --prefix=/usr \
--without-guile \ # 防止使用 guile
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
./configure --prefix=/usr \
--host=$LFS_TGT
make
make DESTDIR=$LFS install
提供创建 tar 归档文件。
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess)
make
make DESTDIR=$LFS install
包含文件压缩和解压缩工具,它能够处理 lzma 和新的 xz 压缩文件格式。
./configure --prefix=/usr \
--host=$LFS_TGT \
--build=$(build-aux/config.guess) \
--disable-static \
--docdir=/usr/share/doc/xz-5.2.5
make
make DESTDIR=$LFS install
mkdir -v build
cd build
../configure \
--prefix=/usr \
--build=$(../config.guess) \
--host=$LFS_TGT \
--disable-nls \
--enable-shared \ # 将 libbfd 构建为共享库
--disable-werror \
--enable-64-bit-bfd # 启用 64 位支持
make
make DESTDIR=$LFS install -j1
install -vm755 libctf/.libs/libctf.so.0.0.0 $LFS/usr/lib # 绕过导致 libctf.so 链接到宿主发行版 zlib
tar -xf ../mpfr-4.1.0.tar.xz
mv -v mpfr-4.1.0 mpfr
tar -xf ../gmp-6.2.1.tar.xz
mv -v gmp-6.2.1 gmp
tar -xf ../mpc-1.2.1.tar.gz
mv -v mpc-1.2.1 mpc
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' -i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd build
# 允许 libgcc 在构建时启用 POSIX 线程支持
mkdir -pv $LFS_TGT/libgcc
ln -s ../../../libgcc/gthr-posix.h $LFS_TGT/libgcc/gthr-default.h
../configure \
--build=$(../config.guess) \
--host=$LFS_TGT \
--prefix=/usr \
CC_FOR_TARGET=$LFS_TGT-gcc \
--with-build-sysroot=$LFS \ # 告诉它们在 $LFS 中查找需要的文件,而不是在宿主系统中查找
--enable-initfini-array \ # 显式启用
--disable-nls \
--disable-multilib \
--disable-decimal-float \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--enable-languages=c,c++
make
make DESTDIR=$LFS install
ln -sv gcc $LFS/usr/bin/cc
构建临时系统最后缺失的部分。
需要的包,总共 7 个:
包名 | 版本 |
---|---|
GCC | 11.2.0 |
Gettext | 0.21 |
Bison | 3.7.6 |
Perl | 5.34.0 |
Python | 3.9.6 |
Texinfo | 6.8 |
Util-linux | 2.37.2 |
将 $LFS/* 目录的所有者改变为 root:
chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
case $(uname -m) in
x86_64) chown -R root:root $LFS/lib64 ;;
esac
和用户空间进行通信。
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
mount -v --bind /dev $LFS/dev
mount -v --bind /dev/pts $LFS/dev/pts
mount -vt proc proc $LFS/proc
mount -vt sysfs sysfs $LFS/sys
mount -vt tmpfs tmpfs $LFS/run
if [ -h $LFS/dev/shm ]; then
mkdir -pv $LFS/$(readlink $LFS/dev/shm)
fi
进入 chroot 环境并完成剩余临时工具的安装。
chroot "$LFS" /usr/bin/env -i \
HOME=/root \
TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login +h
在 LFS 文件系统中创建完整的目录结构。参考 FHS8 https://refspecs.linuxfoundation.org/fhs.shtml。
mkdir -pv /{boot,home,mnt,opt,srv}
mkdir -pv /etc/{opt,sysconfig}
mkdir -pv /lib/firmware
mkdir -pv /media/{floppy,cdrom}
mkdir -pv /usr/{,local/}{include,src}
mkdir -pv /usr/local/{bin,lib,sbin}
mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
mkdir -pv /usr/{,local/}share/man/man{1..8}
mkdir -pv /var/{cache,local,log,mail,opt,spool}
mkdir -pv /var/lib/{color,misc,locate}
ln -sfv /run /var/run
ln -sfv /run/lock /var/lock
install -dv -m 0750 /root
install -dv -m 1777 /tmp /var/tmp
# 已经挂载的文件系统的列表
ln -sv /proc/self/mounts /etc/mtab
# 创建一个基本的 /etc/hosts 文件
cat > /etc/hosts << EOF
127.0.0.1 localhost $(hostname)
::1 localhost
EOF
# 使得 root 能正常登录
cat > /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:/run/dbus:/bin/false
systemd-bus-proxy:x:72:72:systemd Bus Proxy:/:/bin/false
systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/bin/false
systemd-journal-remote:x:74:74:systemd Journal Remote:/:/bin/false
systemd-journal-upload:x:75:75:systemd Journal Upload:/:/bin/false
systemd-network:x:76:76:systemd Network Management:/:/bin/false
systemd-resolve:x:77:77:systemd Resolver:/:/bin/false
systemd-timesync:x:78:78:systemd Time Synchronization:/:/bin/false
systemd-coredump:x:79:79:systemd Core Dumper:/:/bin/false
uuidd:x:80:80:UUID Generation Daemon User:/dev/null:/bin/false
systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/bin/false
nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
EOF
cat > /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:
kvm:x:61:
systemd-bus-proxy:x:72:
systemd-journal-gateway:x:73:
systemd-journal-remote:x:74:
systemd-journal-upload:x:75:
systemd-network:x:76:
systemd-resolve:x:77:
systemd-timesync:x:78:
systemd-coredump:x:79:
uuidd:x:80:
systemd-oom:x:81:81:
wheel:x:97:
nogroup:x:99:
users:x:999:
EOF
# 一些测试需要使用一个普通用户
echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
echo "tester:x:101:" >> /etc/group
install -o tester -d /home/tester
# 为 login、agetty 和 init 初始化日志文件
touch /var/log/{btmp,lastlog,faillog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664 /var/log/lastlog
chmod -v 600 /var/log/btmp
避免编译产生的库被宿主系统组件污染。
# 允许在 GCC 源码树中构建 Libstdc++
ln -s gthr-posix.h libgcc/gthr-default.h
mkdir -v build
cd build
../libstdc++-v3/configure \
CXXFLAGS="-g -O2 -D_GNU_SOURCE" \
--prefix=/usr \
--disable-multilib \
--disable-nls \
--host=$(uname -m)-lfs-linux-gnu \
--disable-libstdcxx-pch
make
make install
包含国际化和本地化工具。
./configure --disable-shared
make
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
包含语法分析器生成器。
./configure --prefix=/usr \
--docdir=/usr/share/doc/bison-3.7.6
make
make install
sh Configure -des \
-Dprefix=/usr \
-Dvendorprefix=/usr \
-Dprivlib=/usr/lib/perl5/5.34/core_perl \
-Darchlib=/usr/lib/perl5/5.34/core_perl \
-Dsitelib=/usr/lib/perl5/5.34/site_perl \
-Dsitearch=/usr/lib/perl5/5.34/site_perl \
-Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.34/vendor_perl
make
make install
./configure --prefix=/usr \
--enable-shared \ # 防止安装静态库
--without-ensurepip # 禁止构建 Python 软件包安装器,它在当前阶段没有必要
make
make install
包含阅读、编写和转换 info 页面的程序。
# 修复在使用 Glibc-2.34 或更新版本的系统上构建该软件包时出现的问题
sed -e 's/__attribute_nonnull__/__nonnull/' \
-i gnulib/lib/malloc/dynarray-skeleton.c
./configure --prefix=/usr
make
make install
# 作为 adjtime 文件的位置
mkdir -pv /var/lib/hwclock
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
--libdir=/usr/lib \
--docdir=/usr/share/doc/util-linux-2.37.2 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python \
runstatedir=/run
make
make install
# 删除临时工具的文档
rm -rf /usr/share/{info,man,doc}/*
# libtool .la 文件仅在链接到静态库时有用
find /usr/{lib,libexec} -name \*.la -delete
# 已经不需要其中的 /tools 目录
rm -rf /tools
# 离开 chroot 环境
exit
# 可以将临时系统备份起来,以便以后重新使用
umount $LFS/dev{/pts,}
umount $LFS/{sys,proc,run}
cd $LFS
tar -cJpf $HOME/lfs-temp-tools-11.0-systemd.tar.xz .
# 还原临时系统
cd $LFS
rm -rf ./*
tar -xpf $HOME/lfs-temp-tools-11.0-systemd.tar.xz
需要的包,总共 74 个:
包名 | 版本 |
---|---|
Man-pages | 5.13 |
Iana-Etc | 20210611 |
Glibc | 2.34 |
Zlib | 1.2.11 |
Bzip2 | 1.0.8 |
Xz | 5.2.5 |
Zstd | 1.5.0 |
File | 5.40 |
Readline | 8.1 |
M4 | 1.4.19 |
Bc | 5.0.0 |
Flex | 2.6.4 |
Tcl | 8.6.11 |
Expect | 5.45.4 |
DejaGNU | 1.6.3 |
Binutils | 2.37 |
GMP | 6.2.1 |
MPFR | 4.1.0 |
MPC | 1.2.1 |
Attr | 2.5.1 |
Acl | 2.3.1 |
Libcap | 2.53 |
Shadow | 4.9 |
GCC | 11.2.0 |
Pkg-config | 0.29.2 |
Ncurses | 6.2 |
Sed | 4.8 |
Psmisc | 23.4 |
Gettext | 0.21 |
Bison | 3.7.6 |
Grep | 3.7 |
Bash | 5.1.8 |
Libtool | 2.4.6 |
GDBM | 1.20 |
Gperf | 3.1 |
Expat | 2.4.1 |
Inetutils | 2.1 |
Less | 590 |
Perl | 5.34.0 |
XML::Parser | 2.46 |
Intltool | 0.51.0 |
Autoconf | 2.71 |
Automake | 1.16.4 |
Kmod | 29 |
Elfutils | 0.185 |
Libffi | 3.4.2 |
OpenSSL | 1.1.1l |
Python | 3.9.6 |
Ninja | 1.10.2 |
Meson | 0.59.1 |
Coreutils | 8.32 |
Check | 0.15.2 |
Diffutils | 3.8 |
Gawk | 5.1.0 |
Findutils | 4.8.0 |
Groff | 1.22.4 |
GRUB | 2.06 |
Gzip | 1.10 |
IPRoute2 | 5.13.0 |
Kbd | 2.4.0 |
Libpipeline | 1.5.3 |
Make | 4.3 |
Patch | 2.7.6 |
Tar | 1.34 |
Texinfo | 6.8 |
Vim | 8.2.3337 |
MarkupSafe | 2.0.1 |
Jinja2 | 3.0.1 |
Systemd | 249 |
D-Bus | 1.12.20 |
Man-DB | 2.9.4 |
Procps-ng | 3.3.17 |
Util-linux | 2.37.2 |
E2fsprogs | 1.46.4 |
make prefix=/usr install
包含网络服务和协议的数据。
cp services protocols /etc
# 修复上游开发者发现的一项安全问题
sed -e '/NOTIFY_REMOVED)/s/)/ \&\& data.attr != NULL)/' \
-i sysdeps/unix/sysv/linux/mq_notify.c
patch -Np1 -i ../glibc-2.34-fhs-1.patch
mkdir -v build
cd build
echo "rootsbindir=/usr/sbin" > configparms
../configure --prefix=/usr \
--disable-werror \ # 禁用 GCC 的 -Werror 选项,这对于运行测试套件来说是必须的
--enable-kernel=3.2 \
--enable-stack-protector=strong \ # 对栈溢出攻击等导致的缓冲区溢出进行检查,以提高系统安全性
--with-headers=/usr/include \
libc_cv_slibdir=/usr/lib
make
make check
# 安装 Glibc 时,它会抱怨文件 /etc/ld.so.conf 不存在
touch /etc/ld.so.conf
# 跳过在 LFS 的不完整环境中会失败的完整性检查
sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
make install
# 改正 ldd 脚本中硬编码的可执行文件加载器路径
sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
# 安装 nscd 的配置文件和运行时目录
cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd
install -v -Dm644 ../nscd/nscd.tmpfiles /usr/lib/tmpfiles.d/nscd.conf
install -v -Dm644 ../nscd/nscd.service /usr/lib/systemd/system/nscd.service
# 安装一些 locale,测试套件需要
mkdir -pv /usr/lib/locale
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f ISO-8859-1 de_DE
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f ISO-8859-1 en_GB
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f ISO-8859-1 en_HK
localedef -i en_PH -f ISO-8859-1 en_PH
localedef -i en_US -f ISO-8859-1 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_ES -f ISO-8859-15 es_ES@euro
localedef -i es_MX -f ISO-8859-1 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f ISO-8859-1 fr_FR
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i is_IS -f ISO-8859-1 is_IS
localedef -i is_IS -f UTF-8 is_IS.UTF-8
localedef -i it_IT -f ISO-8859-1 it_IT
localedef -i it_IT -f ISO-8859-15 it_IT@euro
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SIJS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i nl_NL@euro -f ISO-8859-15 nl_NL@euro
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i se_NO -f UTF-8 se_NO.UTF-8
localedef -i ta_IN -f UTF-8 ta_IN.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS
localedef -i zh_TW -f UTF-8 zh_TW.UTF-8
# 由于 Glibc 的默认值在网络环境下不能很好地工作,需要创建配置文件 /etc/nsswitch.conf
cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf
passwd: files
group: files
shadow: files
hosts: files dns
networks: files
protocols: files
services: files
ethers: files
rpc: files
# End /etc/nsswitch.conf
EOF
# 添加时区数据
tar -xf ../../tzdata2021a.tar.gz
ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}
for tz in etcetera southamerica northamerica europe africa antarctica \
asia australasia backward; do
zic -L /dev/null -d $ZONEINFO ${tz}
zic -L /dev/null -d $ZONEINFO/posix ${tz}
zic -L leapseconds -d $ZONEINFO/right ${tz}
done
cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO
# 确定本地时区
tzselect
# 创建 /etc/localtime
ln -sfv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 配置动态加载器
cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib
EOF
cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf
EOF
mkdir -pv /etc/ld.so.conf.d
包含一些程序使用的压缩和解压缩子程序。
./configure --prefix=/usr
make
make check
make install
# 删除无用的静态库
rm -fv /usr/lib/libz.a
包含用于压缩和解压缩文件的程序。
# 应用补丁以安装该软件包的文档
patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch
# 以下命令保证安装的符号链接是相对的
sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
# 确保 man 页面被安装到正确位置
sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
make -f Makefile-libbz2_so
make clean
make
make PREFIX=/usr install
cp -av libbz2.so.* /usr/lib
ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so
cp -v bzip2-shared /usr/bin/bzip2
for i in /usr/bin/{bzcat,bunzip2}; do
ln -sfv bzip2 $i
done
rm -fv /usr/lib/libbz2.a
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/xz-5.2.5
make
make check
make install
实时压缩算法,提供了较高的压缩比。
make
make check
make prefix=/usr install
rm -v /usr/lib/libzstd.a
./configure --prefix=/usr
make
make check
make install
包含一些提供命令行编辑和历史记录功能的库。
# 防止重新安装 Readline 时旧版本的库被重命名为 <库名称>.old
sed -i '/MV.*old/d' Makefile.in
sed -i '/{OLDSUFF}/c:' support/shlib-install
./configure --prefix=/usr \
--disable-static \
--with-curses \
--docdir=/usr/share/doc/readline-8.1
make SHLIB_LIBS="-lncursesw"
make SHLIB_LIBS="-lncursesw" install
install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.1
./configure --prefix=/usr
make
make check
make install
包含一个任意精度数值处理语言。
CC=gcc ./configure --prefix=/usr -G -O3
make
make test
make install
用于生成在文本中识别模式的程序。
./configure --prefix=/usr \
--docdir=/usr/share/doc/flex-2.6.4 \
--disable-static
make
make check
make install
ln -sv flex /usr/bin/lex
支持 Binutils 和 GCC 等软件包测试套件的运行。
tar -xf ../tcl8.6.11-html.tar.gz --strip-components=1
SRCDIR=$(pwd)
cd unix
./configure --prefix=/usr \
--mandir=/usr/share/man \
$([ "$(uname -m)" = x86_64 ] && echo --enable-64bit)
make
# 从配置文件中删除构建目录,并用安装目录替换
sed -e "s|$SRCDIR/unix|/usr/lib|" \
-e "s|$SRCDIR|/usr/include|" \
-i tclConfig.sh
sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.2|/usr/lib/tdbc1.1.2|" \
-e "s|$SRCDIR/pkgs/tdbc1.1.2/generic|/usr/include|" \
-e "s|$SRCDIR/pkgs/tdbc1.1.2/library|/usr/lib/tcl8.6|" \
-e "s|$SRCDIR/pkgs/tdbc1.1.2|/usr/include|" \
-i pkgs/tdbc1.1.2/tdbcConfig.sh
sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.1|/usr/lib/itcl4.2.1|" \
-e "s|$SRCDIR/pkgs/itcl4.2.1/generic|/usr/include|" \
-e "s|$SRCDIR/pkgs/itcl4.2.1|/usr/include|" \
-i pkgs/itcl4.2.1/itclConfig.sh
unset SRCDIR
make test
make install
chmod -v u+w /usr/lib/libtcl8.6.so
make install-private-headers
ln -sfv tclsh8.6 /usr/bin/tclsh
mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
自动化交互应用的工具。
./configure --prefix=/usr \
--with-tcl=/usr/lib \
--enable-shared \
--mandir=/usr/share/man \
--with-tclinclude=/usr/include
make
make test
make install
ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
使用 GNU 工具运行测试套件的框架。
mkdir -v build
cd build
../configure --prefix=/usr
makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
makeinfo --plaintext -o doc/dejagnu.txt ../doc/dejagnu.texi
make install
install -v -dm755 /usr/share/doc/dejagnu-1.6.3
install -v -m644 doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3
make check
# 确认伪终端 (PTY) 在 chroot 环境中能正常工作
expect -c "spawn ls"
patch -Np1 -i ../binutils-2.37-upstream_fix-1.patch
# 构建系统中的一处错误导致软件包附带的 man 页面为空
sed -i '63d' etc/texi2pod.pl
find -name \*.1 -delete
mkdir -v build
cd build
../configure --prefix=/usr \
--enable-gold \
--enable-ld=default \
--enable-plugins \
--enable-shared \
--disable-werror \
--enable-64-bit-bfd \
--with-system-zlib
make tooldir=/usr
make -k check
make tooldir=/usr install -j1
rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes}.a
包含提供任意精度算术函数的数学库。
./configure --prefix=/usr \
--enable-cxx \
--disable-static \
--docdir=/usr/share/doc/gmp-6.2.1
make
make html
make check 2>&1 | tee gmp-check-log
# 确认测试套件中的 197 个测试全部通过
awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
make install
make install-html
包含多精度数学函数。
./configure --prefix=/usr \
--disable-static \
--enable-thread-safe \
--docdir=/usr/share/doc/mpfr-4.1.0
make
make html
make check
make install
make install-html
包含一个任意高精度,且舍入正确的复数算术库。
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/mpc-1.2.1
make
make html
make check
make install
make install-html
包含管理文件系统对象扩展属性的工具。
./configure --prefix=/usr \
--disable-static \
--sysconfdir=/etc \
--docdir=/usr/share/doc/attr-2.5.1
make
make check
make install
包含管理访问控制列表的工具。
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/acl-2.3.1
make
make install
为 Linux 内核提供的权能实现用户接口。
# 防止静态库的安装
sed -i '/install -m.*STA/d' libcap/Makefile
make prefix=/usr lib=lib
make test
make prefix=/usr lib=lib install
chmod -v 755 /usr/lib/lib{cap,psx}.so.2.53
包含安全地处理密码的程序。
# 禁止该软件包安装 groups 程序和它的 man 页面,因为 Coreutils 会提供更好的版本
sed -i 's/groups$(EXEEXT) //' src/Makefile.in
find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
find man -name Makefile.in -exec sed -i 's/passwd\.5 / /' {} \;
sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD SHA512:' \
-e 's:/var/spool/mail:/var/mail:' \
-e '/PATH=/{s@/sbin:@@;s@/bin:@@}' \
-i etc/login.defs
# 修复程序中的一处低级错误
sed -e "224s/rounds/min_rounds/" -i libmisc/salt.c
# 需要保证 /usr/bin/passwd 存在,因为它的位置会被硬编码到一些程序中
touch /usr/bin/passwd
./configure --sysconfdir=/etc \
--with-group-name-max-length=32
make
make exec_prefix=/usr install
make -C man install-man
mkdir -p /etc/default
useradd -D --gid 999
# 对用户密码启用 Shadow 加密
pwconv
# 对组密码启用 Shadow 加密
grpconv
# 设定 root 密码
passwd root
# 修复在使用 Glibc-2.34 的系统上构建该软件包时导致 libasan.a 无法使用的问题
sed -e '/static.*SIGSTKSZ/d' \
-e 's/return kAltStackSize/return SIGSTKSZ * 4/' \
-i libsanitizer/sanitizer_common/sanitizer_posix_libcdep.cpp
case $(uname -m) in
x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
esac
mkdir -v build
cd build
../configure --prefix=/usr \
LD=ld \
--enable-languages=c,c++ \
--disable-multilib \
--disable-bootstrap \
--with-system-zlib
# 运行测试前要增加栈空间
ulimit -s 32768
chown -Rv tester .
su tester -c "PATH=$PATH make -k check"
../contrib/test_summary
make install
rm -rf /usr/lib/gcc/$(gcc -dumpmachine)/11.2.0/include-fixed/bits/
chown -v -R root:root \
/usr/lib/gcc/*linux-gnu/11.2.0/include{,-fixed}
ln -svr /usr/bin/cpp /usr/lib
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/11.2.0/liblto_plugin.so \
/usr/lib/bfd-plugins/
# 确认编译和链接像我们期望的一样正常工作
echo 'int main(){}' > dummy.c
cc dummy.c -v -Wl,--verbose &> dummy.log
readelf -l a.out | grep ': /lib'
rm -v dummy.c a.out dummy.log
# 移动一个位置不正确的文件
mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
提供一个在软件包安装的配置和编译阶段,向构建工具传递头文件和/或库文件路径的工具。
./configure --prefix=/usr \
--with-internal-glib \
--disable-host-tool \
--docdir=/usr/share/doc/pkg-config-0.29.2
make
make check
make install
./configure --prefix=/usr \
--mandir=/usr/share/man \
--with-shared \
--without-debug \
--without-normal \
--enable-pc-files \
--enable-widec
make
make install
# 链接到宽字符库
for lib in ncurses form panel menu ; do
rm -vf /usr/lib/lib${lib}.so
echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc
done
rm -vf /usr/lib/libcursesw.so
echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
ln -sfv libncurses.so /usr/lib/libcurses.so
rm -fv /usr/lib/libncurses++w.a
mkdir -v /usr/share/doc/ncurses-6.2
cp -v -R doc/* /usr/share/doc/ncurses-6.2
./configure --prefix=/usr
make
make html
chown -Rv tester .
su tester -c "PATH=$PATH make check"
make install
install -d -m755 /usr/share/doc/sed-4.8
install -m644 doc/sed.html /usr/share/doc/sed-4.8
包含显示正在运行的进程信息的程序。
./configure --prefix=/usr
make
make install
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/gettext-0.21
make
make install
chmod -v 0755 /usr/lib/preloadable_libintl.so
./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.7.6
make
make check
make install
./configure --prefix=/usr
make
make check
make install
./configure --prefix=/usr \
--docdir=/usr/share/doc/bash-5.1.8 \
--without-bash-malloc \
--with-installed-readline
make
chown -Rv tester .
su -s /usr/bin/expect tester << EOF
set timeout -1
spawn make tests
expect eof
lassign [wait] _ _ _ value
exit $value
EOF
make install
exec /bin/bash --login +h
包含 GNU 通用库支持脚本。
./configure --prefix=/usr
make
make check
make install
rm -fv /usr/lib/libltdl.a
包含 GNU 数据库管理器。
./configure --prefix=/usr \
--disable-static \
--enable-libgdbm-compat
make
make -k check
make install
根据一组键值,生成完美散列函数。
./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1
make
make -j1 check
make install
包含用于解析 XML 文件的面向流的 C 语言库。
./configure --prefix=/usr \
--disable-static \
--docdir=/usr/share/doc/expat-2.4.1
make
make check
make install
install -v -m644 doc/*.{html,png,css} /usr/share/doc/expat-2.4.1
包含基本网络程序。
./configure --prefix=/usr \
--bindir=/usr/bin \
--localstatedir=/var \
--disable-logger \
--disable-whois \
--disable-rcp \
--disable-rexec \
--disable-rlogin \
--disable-rsh \
--disable-servers
make
make check
make install
mv -v /usr/{,s}bin/ifconfig
./configure --prefix=/usr --sysconfdir=/etc
make
make install
# 修复该软件包中由较新的 gdbm 版本暴露出的问题
patch -Np1 -i ../perl-5.34.0-upstream_fixes-1.patch
# 使用系统中已经安装好的库
export BUILD_ZLIB=False
export BUILD_BZIP2=0
sh Configure -des \
-Dprefix=/usr \
-Dvendorprefix=/usr \
-Dprivlib=/usr/lib/perl5/5.34/core_perl \
-Darchlib=/usr/lib/perl5/5.34/core_perl \
-Dsitelib=/usr/lib/perl5/5.34/site_perl \
-Dsitearch=/usr/lib/perl5/5.34/site_perl \
-Dvendorlib=/usr/lib/perl5/5.34/vendor_perl \
-Dvendorarch=/usr/lib/perl5/5.34/vendor_perl \
-Dman1dir=/usr/share/man/man1 \
-Dman3dir=/usr/share/man/man3 \
-Dpager="/usr/bin/less -isR" \
-Duseshrplib \
-Dusethreads
make
make test
make install
unset BUILD_ZLIB BUILD_BZIP2
XML 解析器 Expat 的 Perl 接口。
perl Makefile.PL
make
make test
make install
从源代码文件中提取可翻译字符串的国际化工具。
# 修复由 perl-5.22 及更新版本导致的警告
sed -i 's:\\\${:\\\$\\{:' intltool-update.in
./configure --prefix=/usr
make
make check
make install
install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
包含生成能自动配置软件包的 shell 脚本程序。
./configure --prefix=/usr
make
make check
make install
包含自动生成 Makefile,以便和 Autoconf 一同使用的程序。
./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.4
make
make -j4 check
make install
包含用于加载内核模块的库和工具。
./configure --prefix=/usr \
--sysconfdir=/etc \
--with-xz \
--with-zstd \
--with-zlib
make
make install
for target in depmod insmod modinfo modprobe rmmod; do
ln -sfv ../bin/kmod /usr/sbin/$target
done
ln -sfv kmod /usr/bin/lsmod
处理 ELF (可执行和可链接格式) 文件的库。
./configure --prefix=/usr \
--disable-debuginfod \
--enable-libdebuginfod=dummy
make
make check
make -C libelf install
install -vm644 config/libelf.pc /usr/lib/pkgconfig
rm /usr/lib/libelf.a
提供一个可移植的高级编程接口,用于处理不同调用惯例。
./configure --prefix=/usr \
--disable-static \
--with-gcc-arch=native \
--disable-exec-static-tramp
make
make check
make install
包含密码学相关的管理工具和库。
./config --prefix=/usr \
--openssldir=/etc/ssl \
--libdir=lib \
shared \
zlib-dynamic
make
make test
sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
make MANSUFFIX=ssl install
mv -v /usr/share/doc/openssl /usr/share/doc/openssl-1.1.1l
cp -vfr doc/* /usr/share/doc/openssl-1.1.1l
./configure --prefix=/usr \
--enable-shared \
--with-system-expat \
--with-system-ffi \
--with-ensurepip=yes \
--enable-optimizations
make
make install
install -v -dm755 /usr/share/doc/python-3.9.6/html
tar --strip-components=1 \
--no-same-owner \
--no-same-permissions \
-C /usr/share/doc/python-3.9.6/html \
-xvf ../python-3.9.6-docs-html.tar.bz2
注重速度的小型构建系统。
# 使用环境变量 NINJAJOBS
sed -i '/int Guess/a \
int j = 0;\
char* jobs = getenv( "NINJAJOBS" );\
if ( jobs != NULL ) j = atoi( jobs );\
if ( j > 0 ) return j;\
' src/ninja.cc
python3 configure.py --bootstrap
./ninja ninja_test
./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
install -vm755 ninja /usr/bin/
install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja
install -vDm644 misc/zsh-completion /usr/share/zsh/site-functions/_ninja
开放源代码构建系统。
python3 setup.py build
python3 setup.py install --root=dest
cp -rv dest/* /
install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson
install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson
# 修复一些国际化相关的 bug
patch -Np1 -i ../coreutils-8.32-i18n-1.patch
autoreconf -fiv
FORCE_UNSAFE_CONFIGURE=1 ./configure \
--prefix=/usr \
--enable-no-install-program=kill,uptime
make
make NON_ROOT_USERNAME=tester check-root
echo "dummy:x:102:tester" >> /etc/group
chown -Rv tester .
su tester -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"
sed -i '/dummy/d' /etc/group
make install
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8
C 语言单元测试框架。
./configure --prefix=/usr --disable-static
make
make check
make docdir=/usr/share/doc/check-0.15.2 install
./configure --prefix=/usr
make
make check
make install
# 不安装某些不需要的文件
sed -i 's/extras//' Makefile.in
./configure --prefix=/usr
make
make check
make install
mkdir -v /usr/share/doc/gawk-5.1.0
cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.1.0
./configure --prefix=/usr --localstatedir=/var/lib/locate
make
chown -Rv tester .
su tester -c "PATH=$PATH make check"
make install
包含处理和格式化文本的程序。
PAGE=A4 ./configure --prefix=/usr
make -j1
make install
./configure --prefix=/usr \
--sysconfdir=/etc \
--disable-efiemu \
--disable-werror
make
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
./configure --prefix=/usr
make
make check
make install
包含基于 IPv4 的基本和高级网络程序。
# 防止安装 arpd
sed -i /ARPD/d Makefile
rm -fv man/man8/arpd.8
# 禁用两个需要 iptables 的模块
sed -i 's/.m_ipt.o//' tc/Makefile
make
make SBINDIR=/usr/sbin install
mkdir -v /usr/share/doc/iproute2-5.13.0
cp -v COPYING README* /usr/share/doc/iproute2-5.13.0
包含按键表文件、控制台字体和键盘工具。
# 修复 i386 按键映射中的这个问题
patch -Np1 -i ../kbd-2.4.0-backspace-1.patch
# 删除多余的 resizecons 程序
sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure
sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
./configure --prefix=/usr --disable-vlock
make
make check
make install
mkdir -v /usr/share/doc/kbd-2.4.0
cp -R -v docs/doc/* /usr/share/doc/kbd-2.4.0
包含用于灵活、方便地处理子进程流水线的库。
./configure --prefix=/usr
make
make check
make install
./configure --prefix=/usr
make
make check
make install
./configure --prefix=/usr
make
make check
make install
FORCE_UNSAFE_CONFIGURE=1 \
./configure --prefix=/usr
make
make check
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.34
# 修复在使用 Glibc-2.34 或更新版本的系统上构建该软件包时出现的问题
sed -e 's/__attribute_nonnull__/__nonnull/' \
-i gnulib/lib/malloc/dynarray-skeleton.c
./configure --prefix=/usr
make
make check
make install
# 可选安装属于 TeX 环境的组件
make TEXMF=/usr/share/texmf install-tex
# 重新创建 /usr/share/info/dir 文件
pushd /usr/share/info
rm -v dir
for f in *
do install-info $f dir 2>/dev/null
done
popd
echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
./configure --prefix=/usr
make
chown -Rv tester .
su tester -c "LANG=en_US.UTF-8 make -j1 test" &> vim-test.log
make install
ln -sv vim /usr/bin/vi
for L in /usr/share/man/{,*/}man1/vim.1; do
ln -sv vim.1 $(dirname $L)/vi.1
done
ln -sv ../vim/vim82/doc /usr/share/doc/vim-8.2.3337
cat > /etc/vimrc << "EOF"
" Begin /etc/vimrc
" Ensure defaults are set before customizing settings, not after
source $VIMRUNTIME/defaults.vim
let skip_defaults_vim=1
set nocompatible
set backspace=2
set mouse=
syntax on
if (&term == "xterm") || (&term == "putty")
set background=dark
endif
" End /etc/vimrc
EOF
为 XML/HTML/XHTML 标记语言实现字符串安全处理的 Python 模块。
python3 setup.py build
python3 setup.py install --optimize=1
Python 风格的模板语言。
python3 setup.py install --optimize=1
包含控制系统引导、运行和关闭的程序。
# 修复一项安全问题
patch -Np1 -i ../systemd-249-upstream_fixes-1.patch
sed -i -e 's/GROUP="render"/GROUP="video"/' \
-e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in
mkdir -p build
cd build
LANG=en_US.UTF-8 \
meson --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--buildtype=release \
-Dblkid=true \
-Ddefault-dnssec=no \
-Dfirstboot=false \
-Dinstall-tests=false \
-Dldconfig=false \
-Dsysusers=false \
-Db_lto=false \
-Drpmmacrosdir=no \
-Dhomed=false \
-Duserdb=false \
-Dman=false \
-Dmode=release \
-Ddocdir=/usr/share/doc/systemd-249 \
..
LANG=en_US.UTF-8 ninja
LANG=en_US.UTF-8 ninja install
tar -xf ../../systemd-man-pages-249.tar.xz --strip-components=1 -C /usr/share/man
rm -rf /usr/lib/pam.d
# 创建 /etc/machine-id 文件,systemd-journald 需要
systemd-machine-id-setup
# 设定启动目标单元的基本结构
systemctl preset-all
systemctl disable systemd-time-wait-sync.service
消息总线系统。
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--disable-static \
--disable-doxygen-docs \
--disable-xml-docs \
--docdir=/usr/share/doc/dbus-1.12.20 \
--with-console-auth-dir=/run/console \
--with-system-pid-file=/run/dbus/pid \
--with-system-socket=/run/dbus/system_bus_socket
make
make install
ln -sfv /etc/machine-id /var/lib/dbus
包含查找和阅读 man 页面的程序。
./configure --prefix=/usr \
--docdir=/usr/share/doc/man-db-2.9.4 \
--sysconfdir=/etc \
--disable-setuid \
--enable-cache-owner=bin \
--with-browser=/usr/bin/lynx \
--with-vgrind=/usr/bin/vgrind \
--with-grap=/usr/bin/grap
make
make check
make install
包含监视进程的程序。
./configure --prefix=/usr \
--docdir=/usr/share/doc/procps-ng-3.3.17 \
--disable-static \
--disable-kill \
--with-systemd
make
make check
make install
./configure ADJTIME_PATH=/var/lib/hwclock/adjtime \
--libdir=/usr/lib \
--docdir=/usr/share/doc/util-linux-2.37.2 \
--disable-chfn-chsh \
--disable-login \
--disable-nologin \
--disable-su \
--disable-setpriv \
--disable-runuser \
--disable-pylibmount \
--disable-static \
--without-python \
runstatedir=/run
make
chown -Rv tester .
su tester -c "make -k check"
make install
文件系统的工具。
mkdir -v build
cd build
../configure --prefix=/usr \
--sysconfdir=/etc \
--enable-elf-shlibs \
--disable-libblkid \
--disable-libuuid \
--disable-uuidd \
--disable-fsck
make
make check
make install
rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
gunzip -v /usr/share/info/libext2fs.info.gz
install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
install -v -m644 doc/com_err.info /usr/share/info
install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
可以通过从二进制程序和库移除调试符号,将系统的体积减小约 2 GB9 https://www.linuxfromscratch.org/lfs/view/11.0-systemd/chapter08/stripping.html。
rm -rf /tmp/*
logout
chroot "$LFS" /usr/bin/env -i \
HOME=/root TERM="$TERM" \
PS1='(lfs chroot) \u:\w\$ ' \
PATH=/usr/bin:/usr/sbin \
/bin/bash --login
find /usr/lib /usr/libexec -name \*.la -delete
find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
userdel -r tester
systemd 提供一个名为 systemd-networkd 的网络配置守护进程,它能够用于基础网络配置。以下命令为 IPv4 DHCP 配置创建基本配置文件:
cat > /etc/systemd/network/10-eth-dhcp.network << "EOF"
[Match]
Name=<网络设备名>
[Network]
DHCP=ipv4
[DHCP]
UseDomains=true
EOF
在使用 systemd-resolved 进行 DNS 配置时,它创建文件 /run/systemd/resolve/resolv.conf。在 /etc 中创建符号链接以使用生成的文件:
ln -sfv /run/systemd/resolve/resolv.conf /etc/resolv.conf
创建 /etc/hostname 文件,并输入一个主机名:
echo "<lfs>" > /etc/hostname
自定义 /etc/hosts 文件:
cat > /etc/hosts << "EOF"
# Begin /etc/hosts
127.0.0.1 localhost.localdomain localhost
127.0.1.1 <FQDN> <HOSTNAME>
<192.168.0.2> <FQDN> <HOSTNAME> [alias1] [alias2] ...
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# End /etc/hosts
EOF
systemd-timedated 读取 /etc/adjtime,并根据其内容将硬件时钟设定为 UTC 或本地时间。
# 若硬件时钟设置为本地时间
cat > /etc/adjtime << "EOF"
0.0 0 0.0
0
LOCAL
EOF
也可以使用 timedatectl 工具告诉 systemd-timedated 硬件时钟是 UTC 还是本地时间。
systemd-vconsole-setup 系统服务负责配置虚拟控制台字体和控制台键盘映射。
cat > /etc/vconsole.conf << "EOF"
KEYMAP=us
FONT=Lat2-Terminus16
EOF
cat > /etc/locale.conf << "EOF"
LANG=en_US.UTF-8
EOF
# 若 Systemd 引导后可设置
localectl set-locale LANG="en_US.UTF-8"
shells 文件包含系统登录 shell 的列表,应用程序使用该文件判断 shell 是否合法。
cat > /etc/shells << "EOF"
# Begin /etc/shells
/bin/sh
/bin/bash
# End /etc/shells
EOF
/etc/systemd/system.conf 文件包含一组控制 systemd 基本功能的选项。默认文件中所有条目都被注释掉,并标明了默认值。可以在这里修改日志级别,以及其他一些基本日志设定。
# 禁用引导时清屏
mkdir -pv /etc/systemd/system/getty@tty1.service.d
cat > /etc/systemd/system/getty@tty1.service.d/noclear.conf << EOF
[Service]
TTYVTDisallocate=no
EOF
参考以下命令,创建一个新的文件系统表:
cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# 文件系统 挂载点 类型 选项 转储 检查
# 顺序
/dev/<xxx> / <fff> defaults 1 1
/dev/<yyy> swap swap pri=1 0 0
# End /etc/fstab
EOF
参阅 man 5 fstab 了解该文件中 6 个域的详细信息。
# 确保内核源代码树绝对干净
make mrproper
# 配置内核选项,初始内核配置可以通过运行 make defconfig 获得
make menuconfig
make
make modules_install
# 假定机器是 x86
cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.13.12-lfs-11.0-systemd
# System.map 是内核符号文件
cp -iv System.map /boot/System.map-5.13.12
cp -iv .config /boot/config-5.13.12
install -d /usr/share/doc/linux-5.13.12
cp -r Documentation/* /usr/share/doc/linux-5.13.12
将 GRUB 文件安装到 /boot/grub 并设定引导磁道:
grub-install /dev/sda
创建 GRUB 配置文件:
cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,2)
menuentry "GNU/Linux, Linux 5.13.12-lfs-11.0-systemd" {
linux /boot/vmlinuz-5.13.12-lfs-11.0-systemd root=/dev/sda2 ro
}
EOF
UEFI 引导方式参考 BLFS10 https://www.linuxfromscratch.org/blfs/view/11.0-systemd/postlfs/grub-setup.html。
# 创建一个 /etc/lfs-release 文件
echo 11.0-systemd > /etc/lfs-release
# 显示系统状态
cat > /etc/lsb-release << "EOF"
DISTRIB_ID="Linux From Scratch"
DISTRIB_RELEASE="11.0-systemd"
DISTRIB_CODENAME="<your name here>"
DISTRIB_DESCRIPTION="Linux From Scratch"
EOF
cat > /etc/os-release << "EOF"
NAME="Linux From Scratch"
VERSION="11.0-systemd"
ID=lfs
PRETTY_NAME="Linux From Scratch 11.0-systemd"
VERSION_CODENAME="<your name here>"
EOF
现在已经安装好了所有软件,可以重新启动进入 LFS 了。
Linux 提供两种图形化的用户组件:Xorg 和 Wayland。此处以 Xorg 为例说明。
Xorg 需要基础库支持,先构建。
需要的包:
包名 | 版本 |
---|---|
FreeType | 2.11.1 |
HarfBuzz | 3.4.0 |
Fontconfig | 2.13.1 |
libpng | 1.6.37 |
Pixman | 0.40.0 |
允许应用程序正常渲染 TrueType 字体的库。
下载11 https://downloads.sourceforge.net/freetype/freetype-2.11.1.tar.xz
安装(没有 harfbuzz 支持):
# 启用 GX/AAT、OpenType 表验证
sed -ri "s:.*(AUX_MODULES.*valid):\1:" modules.cfg &&
# 启用次像素渲染
sed -r "s:.*(#.*SUBPIXEL_RENDERING) .*:\1:" \
-i include/freetype/config/ftoption.h &&
./configure --prefix=/usr --enable-freetype-config --without-harfbuzz --disable-static &&
make
make install
OpenType 文本塑形引擎。
下载12 https://github.com/harfbuzz/harfbuzz/releases/download/3.4.0/harfbuzz-3.4.0.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr \
--buildtype=release \
-Dgraphite2=enabled \
-Ddocs=false &&
ninja
ninja install
安装(包含 harfbuzz 支持):
./configure --prefix=/usr --enable-freetype-config --disable-static &&
make
make install
用于配置及定制字体访问的库和程序。
下载13 https://www.freedesktop.org/software/fontconfig/release/fontconfig-2.13.1.tar.bz2
安装:
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--disable-docs \
--docdir=/usr/share/doc/fontconfig-2.13.1 &&
make
make install
读写 PNG 文件的库。
下载14 https://downloads.sourceforge.net/libpng/libpng-1.6.37.tar.xz
补丁15 https://downloads.sourceforge.net/sourceforge/libpng-apng/libpng-1.6.37-apng.patch.gz
安装:
gzip -cd ../libpng-1.6.37-apng.patch.gz | patch -p1
./configure --prefix=/usr --disable-static &&
make
make install &&
mkdir -v /usr/share/doc/libpng-1.6.37 &&
cp -v README libpng-manual.txt /usr/share/doc/libpng-1.6.37
提供低级像素处理的库。
下载16 https://www.cairographics.org/releases/pixman-0.40.0.tar.gz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release &&
ninja
ninja install
Xorg 是 X Window System 的开源实现,它提供介于显示硬件和桌面环境之间的客户端/服务器接口。
需要的包:
包名 | 版本 |
---|---|
util-macros | 1.19.3 |
xorgproto | 2021.5 |
libXau | 1.0.9 |
libXdmcp | 1.1.3 |
xcb-proto | 1.14.1 |
libxcb | 1.14 |
Xorg 库 | |
libxcvt | 0.1.1 |
xcb-util | 0.4.0 |
xcb-util-image | 0.4.0 |
xcb-util-keysyms | 0.4.0 |
xcb-util-renderutil | 0.3.9 |
xcb-util-wm | 0.4.1 |
xcb-util-cursor | 0.1.3 |
Mesa | 21.3.6 |
xbitmaps | 1.1.2 |
Xorg 应用 | |
xcursor-themes | 1.0.6 |
Xorg 字体 | |
XKeyboardConfig | 2.35.1 |
Xorg-Server | 21.1.3 |
Xorg 驱动 | |
xterm | 370 |
xinit | 1.4.1 |
# 选择安装前缀
export XORG_PREFIX="/usr"
# 设置配置选项
export XORG_CONFIG="--prefix=$XORG_PREFIX --sysconfdir=/etc \
--localstatedir=/var --disable-static"
cat > /etc/profile.d/xorg.sh << EOF
XORG_PREFIX="$XORG_PREFIX"
XORG_CONFIG="--prefix=\$XORG_PREFIX --sysconfdir=/etc --localstatedir=/var --disable-static"
export XORG_PREFIX XORG_CONFIG
EOF
chmod 644 /etc/profile.d/xorg.sh
用于 Xorg 包的 m4 宏。
下载17 https://www.x.org/pub/individual/util/util-macros-1.19.3.tar.bz2
安装:
./configure $XORG_CONFIG
make install
提供构建 Xorg 的头文件。
下载18 https://xorg.freedesktop.org/archive/individual/proto/xorgproto-2021.5.tar.bz2
安装:
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX -Dlegacy=true .. &&
ninja
ninja install &&
mv -v $XORG_PREFIX/share/doc/xorgproto{,-2021.5}
实现 X11 授权协议的库,用于限制客户端访问显示资源。
下载19 https://www.x.org/pub/individual/lib/libXau-1.0.9.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
实现 X 显现管理器控制协议的库,用于允许客户端与 X 显示管理器交互。
下载20 https://www.x.org/pub/individual/lib/libXdmcp-1.1.3.tar.bz2
安装:
./configure $XORG_CONFIG --docdir=/usr/share/doc/libXdmcp-1.1.3 &&
make
make install
提供 XML-XCB 协议描述,libxcb 用于生成代码及 API。
下载21 https://xorg.freedesktop.org/archive/individual/proto/xcb-proto-1.14.1.tar.xz
安装:
PYTHON=python3 ./configure $XORG_CONFIG
make install
提供 Xorg 的接口,用于替换 Xlib 接口。
下载22 https://xorg.freedesktop.org/archive/individual/lib/libxcb-1.14.tar.xz
安装:
CFLAGS="${CFLAGS:--O2 -g} -Wno-error=format-extra-args" \
PYTHON=python3 \
./configure $XORG_CONFIG \
--without-doxygen \
--docdir='${datadir}'/doc/libxcb-1.14 &&
make
make install
提供用于 X Window 应用的库。
下载23 https://www.x.org/pub/individual/lib/
# 创建下载列表
cat > lib-7.md5 << "EOF"
ce2fb8100c6647ee81451ebe388b17ad xtrans-1.4.0.tar.bz2
28021759f3cf9ef64eb1465c3b6effc5 libX11-1.7.3.1.tar.xz
f5b48bb76ba327cd2a8dc7a383532a95 libXext-1.3.4.tar.bz2
4e1196275aa743d6ebd3d3d5ec1dff9c libFS-1.0.8.tar.bz2
76d77499ee7120a56566891ca2c0dbcf libICE-1.0.10.tar.bz2
87c7fad1c1813517979184c8ccd76628 libSM-1.2.3.tar.bz2
eeea9d5af3e6c143d0ea1721d27a5e49 libXScrnSaver-1.2.3.tar.bz2
b122ff9a7ec70c94dbbfd814899fffa5 libXt-1.2.1.tar.bz2
ac774cff8b493f566088a255dbf91201 libXmu-1.1.3.tar.bz2
6f0ecf8d103d528cfc803aa475137afa libXpm-3.5.13.tar.bz2
c1ce21c296bbf3da3e30cf651649563e libXaw-1.0.14.tar.bz2
86f182f487f4f54684ef6b142096bb0f libXfixes-6.0.0.tar.bz2
3fa0841ea89024719b20cd702a9b54e0 libXcomposite-0.4.5.tar.bz2
802179a76bded0b658f4e9ec5e1830a4 libXrender-0.9.10.tar.bz2
9b9be0e289130fb820aedf67705fc549 libXcursor-1.2.0.tar.bz2
e3f554267a7a04b042dc1f6352bd6d99 libXdamage-1.1.5.tar.bz2
6447db6a689fb530c218f0f8328c3abc libfontenc-1.1.4.tar.bz2
bdf528f1d337603c7431043824408668 libXfont2-2.0.5.tar.bz2
5004d8e21cdddfe53266b7293c1dfb1b libXft-2.3.4.tar.bz2
74055672a111a98ce2841d2ec4057b05 libXi-1.8.tar.bz2
0d5f826a197dae74da67af4a9ef35885 libXinerama-1.1.4.tar.bz2
18f3b20d522f45e4dadd34afb5bea048 libXrandr-1.5.2.tar.bz2
e142ef0ed0366ae89c771c27cfc2ccd1 libXres-1.2.1.tar.bz2
ef8c2c1d16a00bd95b9fdcef63b8a2ca libXtst-1.2.3.tar.bz2
210b6ef30dda2256d54763136faa37b9 libXv-1.0.11.tar.bz2
3569ff7f3e26864d986d6a21147eaa58 libXvMC-1.0.12.tar.bz2
0ddeafc13b33086357cfa96fae41ee8e libXxf86dga-1.1.5.tar.bz2
298b8fff82df17304dfdb5fe4066fe3a libXxf86vm-1.1.4.tar.bz2
d2f1f0ec68ac3932dd7f1d9aa0a7a11c libdmx-1.1.4.tar.bz2
b34e2cbdd6aa8f9cc3fa613fd401a6d6 libpciaccess-0.16.tar.bz2
dd7e1e946def674e78c0efbc5c7d5b3b libxkbfile-1.1.0.tar.bz2
42dda8016943dc12aff2c03a036e0937 libxshmfence-1.3.tar.bz2
EOF
# 下载
mkdir lib &&
cd lib &&
grep -v '^#' ../lib-7.md5 | awk '{print $2}' | wget -i- -c \
-B https://www.x.org/pub/individual/lib/ &&
md5sum -c ../lib-7.md5
安装:
# 启动子 shell,错误时将退出
bash -e
for package in $(grep -v '^#' ../lib-7.md5 | awk '{print $2}')
do
packagedir=${package%.tar.?z*}
tar -xf $package
pushd $packagedir
docdir="--docdir=$XORG_PREFIX/share/doc/$packagedir"
case $packagedir in
libICE* )
./configure $XORG_CONFIG $docdir ICE_LIBS=-lpthread
;;
libXfont2-[0-9]* )
./configure $XORG_CONFIG $docdir --disable-devel-docs
;;
libXt-[0-9]* )
./configure $XORG_CONFIG $docdir \
--with-appdefaultdir=/etc/X11/app-defaults
;;
* )
./configure $XORG_CONFIG $docdir
;;
esac
make
make install
popd
rm -rf $packagedir
/sbin/ldconfig
done
exit
用于生成 VESA CVT 标准模式行的库。
下载24 https://www.x.org/pub/individual/lib/libxcvt-0.1.1.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr .. &&
ninja
ninja install
对 XCB 库提供额外的扩展。
下载25 https://xcb.freedesktop.org/dist/xcb-util-0.4.0.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
对 XCB 库提供额外的扩展。
下载26 https://xcb.freedesktop.org/dist/xcb-util-image-0.4.0.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
用于处理 X 键常量及转换键码的库。
下载27 https://xcb.freedesktop.org/dist/xcb-util-keysyms-0.4.0.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
对 XCB 库提供额外的扩展。
下载28 https://xcb.freedesktop.org/dist/xcb-util-renderutil-0.3.9.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
针对 EWMH 和 ICCCM 提供客户端及窗口管理器辅助例程。
下载29 https://xcb.freedesktop.org/dist/xcb-util-wm-0.4.1.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
提供 XCB 光标库的实现,用于替代 libXcursor。
下载30 https://xcb.freedesktop.org/dist/xcb-util-cursor-0.1.3.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
为访问 DRM 提供用户空间的库,用于图形驱动,如:Mesa DRI 驱动、X 驱动、libva 等。
下载31 https://dri.freedesktop.org/libdrm/libdrm-2.4.110.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX \
--buildtype=release \
-Dudev=true \
-Dvalgrind=false &&
ninja
ninja install
实现 XML/HTML/XHTML 标记安全字符串的 Python 模块。
下载32 https://files.pythonhosted.org/packages/source/M/MarkupSafe/MarkupSafe-2.0.1.tar.gz
安装:
python3 setup.py build
python3 setup.py install --optimize=1
实现超快及轻量级模板的 Python 模块。
依赖:MarkupSafe
下载33 https://files.pythonhosted.org/packages/source/M/Mako/Mako-1.1.6.tar.gz
安装:
python3 setup.py install --optimize=1
异步 I/O 的多平台支持库。
下载34 https://dist.libuv.org/dist/v1.43.0/libuv-v1.43.0.tar.gz
安装:
sh autogen.sh &&
./configure --prefix=/usr --disable-static &&
make
make install
生成 Makefile 的工具集。
依赖:libuv
下载35 https://cmake.org/files/v3.22/cmake-3.22.2.tar.gz
安装:
sed -i '/"lib64"/s/64//' Modules/GNUInstallDirs.cmake &&
./bootstrap --prefix=/usr \
--system-libs \
--mandir=/share/man \
--no-system-jsoncpp \
--no-system-librhash \
--docdir=/share/doc/cmake-3.22.2 &&
make
make install
模块化及可重用的编译器及工具链技术。LLVM 核心库提供源代码及目标无关的优化器,包含代码生成支持。Clang 针对 LLVM 提供 C、C++、Objective C、Objective C++ 前端。Compiler RT 提供运行时 sanitizer 及剖析库。
下载:
LLVM36 https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/llvm-13.0.1.src.tar.xz
Clang37 https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/clang-13.0.1.src.tar.xz
Compiler RT38 https://github.com/llvm/llvm-project/releases/download/llvmorg-13.0.1/compiler-rt-13.0.1.src.tar.xz
安装:
# 把 clang 放到源码树
tar -xf ../clang-13.0.1.src.tar.xz -C tools &&
mv tools/clang-13.0.1.src tools/clang
# 把 compiler-rt 放到源码树
tar -xf ../compiler-rt-13.0.1.src.tar.xz -C projects &&
mv projects/compiler-rt-13.0.1.src projects/compiler-rt
# 修复 Python 脚本
grep -rl '#!.*python' | xargs sed -i '1s/python$/python3/'
mkdir -v build &&
cd build &&
CC=gcc CXX=g++ \
cmake -DCMAKE_INSTALL_PREFIX=/usr \
-DLLVM_ENABLE_FFI=ON \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_BUILD_LLVM_DYLIB=ON \
-DLLVM_LINK_LLVM_DYLIB=ON \
-DLLVM_ENABLE_RTTI=ON \
-DLLVM_TARGETS_TO_BUILD="host;AMDGPU;BPF" \
-DLLVM_BINUTILS_INCDIR=/usr/include \
-Wno-dev -G Ninja .. &&
ninja
ninja install
兼容 OpenGL 的 3D 图形库。
依赖:libdrm、Mako、LLVM
下载39 https://mesa.freedesktop.org/archive/mesa-21.3.6.tar.xz
NVIDIA GPU 补丁40 https://www.linuxfromscratch.org/patches/blfs/11.1/mesa-21.3.6-nouveau_fixes-1.patch
安装:
# 应用补丁
patch -Np1 -i ../mesa-21.3.6-nouveau_fixes-1.patch
# 驱动列表
GALLIUM_DRV="crocus,i915,iris,nouveau,r600,radeonsi,svga,swrast,virgl"
DRI_DRIVERS="i965,nouveau"
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX \
--buildtype=release \
-Ddri-drivers=$DRI_DRIVERS \
-Dgallium-drivers=$GALLIUM_DRV \
-Dgallium-nine=false \
-Dglx=dri \
-Dvalgrind=disabled \
-Dlibunwind=disabled \
.. &&
unset GALLIUM_DRV DRI_DRIVERS &&
ninja
ninja install
Xorg 应用所需的点阵图。
下载41 https://www.x.org/pub/individual/data/xbitmaps-1.1.2.tar.bz2
安装:
./configure $XORG_CONFIG
make install
下载42 https://www.x.org/pub/individual/app/
# 创建下载列表
cat > app-7.md5 << "EOF"
3b9b79fa0f9928161f4bad94273de7ae iceauth-1.0.8.tar.bz2
c4a3664e08e5a47c120ff9263ee2f20c luit-1.1.1.tar.bz2
215940de158b1a3d8b3f8b442c606e2f mkfontscale-1.2.1.tar.bz2
92be564d4be7d8aa7b5024057b715210 sessreg-1.1.2.tar.bz2
93e736c98fb75856ee8227a0c49a128d setxkbmap-1.3.2.tar.bz2
3a93d9f0859de5d8b65a68a125d48f6a smproxy-1.0.6.tar.bz2
e96b56756990c56c24d2d02c2964456b x11perf-1.6.1.tar.bz2
325c2321d159d5b93490700960005037 xauth-1.1.1.tar.bz2
5b6405973db69c0443be2fba8e1a8ab7 xbacklight-1.2.3.tar.bz2
9956d751ea3ae4538c3ebd07f70736a0 xcmsdb-1.0.5.tar.bz2
25cc7ca1ce5dcbb61c2b471c55e686b5 xcursorgen-1.0.7.tar.bz2
8809037bd48599af55dad81c508b6b39 xdpyinfo-1.3.2.tar.bz2
480e63cd365f03eb2515a6527d5f4ca6 xdriinfo-1.0.6.tar.bz2
e1d7dc1afd3ddb8fab16d6a76f21a258 xev-1.2.4.tar.bz2
90b4305157c2b966d5180e2ee61262be xgamma-1.0.6.tar.bz2
a48c72954ae6665e0616f6653636da8c xhost-1.0.8.tar.bz2
ac6b7432726008b2f50eba82b0e2dbe4 xinput-1.6.3.tar.bz2
c45e9f7971a58b8f0faf10f6d8f298c0 xkbcomp-1.4.5.tar.bz2
c747faf1f78f5a5962419f8bdd066501 xkbevd-1.1.4.tar.bz2
502b14843f610af977dffc6cbf2102d5 xkbutils-1.0.4.tar.bz2
938177e4472c346cf031c1aefd8934fc xkill-1.0.5.tar.bz2
61671fee12535347db24ec3a715032a7 xlsatoms-1.1.3.tar.bz2
4fa92377e0ddc137cd226a7a87b6b29a xlsclients-1.1.4.tar.bz2
e50ffae17eeb3943079620cb78f5ce0b xmessage-1.0.5.tar.bz2
51f1d30a525e9903280ffeea2744b1f6 xmodmap-1.0.10.tar.bz2
eaac255076ea351fd08d76025788d9f9 xpr-1.0.5.tar.bz2
2358e29133d183ff67d4ef8afd70b9d2 xprop-1.2.5.tar.bz2
fe40f7a4fd39dd3a02248d3e0b1972e4 xrandr-1.5.1.tar.xz
85f04a810e2fb6b41ab872b421dce1b1 xrdb-1.2.1.tar.bz2
c56fa4adbeed1ee5173f464a4c4a61a6 xrefresh-1.0.6.tar.bz2
70ea7bc7bacf1a124b1692605883f620 xset-1.2.4.tar.bz2
5fe769c8777a6e873ed1305e4ce2c353 xsetroot-1.1.2.tar.bz2
b13afec137b9b331814a9824ab03ec80 xvinfo-1.1.4.tar.bz2
f783a209f2e3fa13253cedb65eaf9cdb xwd-1.0.8.tar.bz2
26d46f7ef0588d3392da3ad5802be420 xwininfo-1.1.5.tar.bz2
79972093bb0766fcd0223b2bd6d11932 xwud-1.0.5.tar.bz2
EOF
# 下载
mkdir app &&
cd app &&
grep -v '^#' ../app-7.md5 | awk '{print $2}' | wget -i- -c \
-B https://www.x.org/pub/individual/app/ &&
md5sum -c ../app-7.md5
安装:
bash -e
for package in $(grep -v '^#' ../app-7.md5 | awk '{print $2}')
do
packagedir=${package%.tar.?z*}
tar -xf $package
pushd $packagedir
case $packagedir in
luit-[0-9]* )
sed -i -e "/D_XOPEN/s/5/6/" configure
;;
esac
./configure $XORG_CONFIG
make
make install
popd
rm -rf $packagedir
done
exit
# 移除损坏的脚本
rm -f $XORG_PREFIX/bin/xkeystone
光标主题。
下载43 https://www.x.org/pub/individual/data/xcursor-themes-1.0.6.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
用于 Xorg 应用的字体。
下载44 https://www.x.org/pub/individual/font/
# 创建下载列表
cat > font-7.md5 << "EOF"
3d6adb76fdd072db8c8fae41b40855e8 font-util-1.3.2.tar.bz2
bbae4f247b88ccde0e85ed6a403da22a encodings-1.0.5.tar.bz2
0497de0176a0dfa5fac2b0552a4cf380 font-alias-1.0.4.tar.bz2
fcf24554c348df3c689b91596d7f9971 font-adobe-utopia-type1-1.0.4.tar.bz2
e8ca58ea0d3726b94fe9f2c17344be60 font-bh-ttf-1.0.3.tar.bz2
53ed9a42388b7ebb689bdfc374f96a22 font-bh-type1-1.0.3.tar.bz2
bfb2593d2102585f45daa960f43cb3c4 font-ibm-type1-1.0.3.tar.bz2
4ee18ab6c1edf636b8e75b73e6037371 font-misc-ethiopic-1.0.4.tar.bz2
3eeb3fb44690b477d510bbd8f86cf5aa font-xfree86-type1-1.0.4.tar.bz2
EOF
mkdir font &&
cd font &&
grep -v '^#' ../font-7.md5 | awk '{print $2}' | wget -i- -c \
-B https://www.x.org/pub/individual/font/ &&
md5sum -c ../font-7.md5
安装:
bash -e
for package in $(grep -v '^#' ../font-7.md5 | awk '{print $2}')
do
packagedir=${package%.tar.bz2}
tar -xf $package
pushd $packagedir
./configure $XORG_CONFIG
make
make install
popd
rm -rf $packagedir
done
exit
install -v -d -m755 /usr/share/fonts &&
ln -svfn $XORG_PREFIX/share/fonts/X11/OTF /usr/share/fonts/X11-OTF &&
ln -svfn $XORG_PREFIX/share/fonts/X11/TTF /usr/share/fonts/X11-TTF
适用于 X Window System 的键盘配置数据库。
下载45 https://www.x.org/pub/individual/data/xkeyboard-config/xkeyboard-config-2.35.1.tar.xz
安装:
sed -i -E 's/(ln -s)/\1f/' rules/meson.build &&
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX --buildtype=release .. &&
ninja
ninja install
用于处理 OpenGL 函数指针管理。
下载46 https://github.com/anholt/libepoxy/releases/download/1.5.9/libepoxy-1.5.9.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release .. &&
ninja
ninja install
X Window System 的核心。
下载47 https://www.x.org/pub/individual/xserver/xorg-server-21.1.3.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX \
-Dsuid_wrapper=true \
-Dxkb_output_dir=/var/lib/xkb &&
ninja
ninja install &&
mkdir -pv /etc/X11/xorg.conf.d
Xorg 输入驱动的公共函数。
下载48 https://www.freedesktop.org/software/libevdev/libevdev-1.12.0.tar.xz
内核配置:
Device Drivers --->
Input device support --->
<*> Generic input layer (needed for keyboard, mouse, ...) [CONFIG_INPUT]
<*> Event interface [CONFIG_INPUT_EVDEV]
[*] Miscellaneous devices ---> [CONFIG_INPUT_MISC]
<*/m> User level driver support [CONFIG_INPUT_UINPUT]
安装:
./configure $XORG_CONFIG &&
make
make install
多点触摸协议翻译库。
下载49 https://bitmath.org/code/mtdev/mtdev-1.1.6.tar.bz2
安装:
./configure --prefix=/usr --disable-static &&
make
make install
处理输入设备的库。
下载50 https://www.freedesktop.org/software/libinput/libinput-1.19.3.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX \
--buildtype=release \
-Ddebug-gui=false \
-Dtests=false \
-Dlibwacom=false \
.. &&
ninja
ninja install
允许 libinput 用于 X 下的输入设备。
下载51 https://www.x.org/pub/individual/driver/xf86-input-libinput-1.2.1.tar.xz
安装:
./configure $XORG_CONFIG &&
make
make install
适用于 AMD Radeon 显卡的 Xorg 显示驱动。
下载52 https://www.x.org/pub/individual/driver/xf86-video-amdgpu-21.0.0.tar.bz2
内核配置:
Device Drivers --->
Graphics support --->
<*> Direct Rendering Manager (XFree86 ... support) ---> [CONFIG_DRM]
<*/M> AMD GPU [CONFIG_DRM_AMDGPU]
< /*> Enable amdgpu support for SI parts [CONFIG_DRM_AMDGPU_SI]
< /*> Enable amdgpu support for CIK parts [CONFIG_DRM_AMDGPU_CIK]
安装:
./configure $XORG_CONFIG &&
make
make install
适用于帧缓冲设备的显示驱动。常用于回调。
下载53 https://www.x.org/pub/individual/driver/xf86-video-fbdev-0.5.0.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
用于 NVidia 显卡的 Xorg 显示驱动。
下载54 https://www.x.org/pub/individual/driver/xf86-video-nouveau-1.0.17.tar.bz2
内核配置:
Device Drivers --->
Graphics support --->
<*> Direct Rendering Manager (XFree86 ... support) ---> [CONFIG_DRM]
<*> Nouveau (NVIDIA) cards [CONFIG_DRM_NOUVEAU]
[*] Support for backlight control [CONFIG_DRM_NOUVEAU_BACKLIGHT]
安装:
# 修复构建错误
grep -rl slave | xargs sed -i s/slave/secondary/
./configure $XORG_CONFIG &&
make
make install
提供硬件加速的视频处理库。
下载55 https://github.com/intel/libva/releases/download/2.13.0/libva-2.13.0.tar.bz2
Intel 驱动56 https://github.com/intel/intel-vaapi-driver/releases/download/2.4.1/intel-vaapi-driver-2.4.1.tar.bz2
安装:
./configure $XORG_CONFIG &&
make
make install
tar -xvf ../intel-vaapi-driver-2.4.1.tar.bz2 &&
cd intel-vaapi-driver-2.4.1
./configure $XORG_CONFIG &&
make
make install
实现 VDPAU 的库。
下载57 https://gitlab.freedesktop.org/vdpau/libvdpau/-/archive/1.4/libvdpau-1.4.tar.bz2
安装:
mkdir build &&
cd build &&
meson --prefix=$XORG_PREFIX .. &&
ninja
ninja install
适用于 X Window System 的终端模拟器。
下载58 https://invisible-mirror.net/archives/xterm/xterm-370.tgz
安装:
# 修改终端描述,以便退格键正常工作
sed -i '/v0/{n;s/new:/new:kb=^?:/}' termcap &&
printf '\tkbs=\\177,\n' >> terminfo &&
TERMINFO=/usr/share/terminfo \
./configure $XORG_CONFIG \
--with-app-defaults=/etc/X11/app-defaults &&
make
make install &&
make install-ti &&
mkdir -pv /usr/share/applications &&
cp -v *.desktop /usr/share/applications/
配置:
cat >> /etc/X11/app-defaults/XTerm << "EOF"
*VT100*locale: true
*VT100*faceName: Monospace
*VT100*faceSize: 10
*backarrowKeyIsErase: true
*ptyInitialErase: true
EOF
用于启动 xserver 的脚本。
下载59 https://www.x.org/pub/individual/app/xinit-1.4.1.tar.bz2
安装:
./configure $XORG_CONFIG --with-xinitdir=/etc/X11/app-defaults &&
make
make install &&
ldconfig
启动 Xorg,执行 startx
。
Linux 下常见的桌面环境包括 GNOME、KDE、Xfce、DDE 等。作为桌面环境中最为核心的组件当属窗口管理器。此处以构建 Openbox 为例说明。
需要的包:
包名 | 版本 |
---|---|
FriBidi | 1.0.11 |
GLib | 2.70.4 |
Cairo | 1.17.4 |
Pango | 1.50.4 |
openbox | 3.6.1 |
Unicode Bidirectional 算法实现库。
下载60 https://github.com/fribidi/fribidi/releases/download/v1.0.11/fribidi-1.0.11.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release .. &&
ninja
ninja install
提供事件循环、线程、动态载入、对象系统等接口的低级库。
下载61 https://download.gnome.org/sources/glib/2.70/glib-2.70.4.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr \
--buildtype=release \
-Dman=true \
.. &&
ninja
ninja install &&
mkdir -p /usr/share/doc/glib-2.70.4 &&
cp -r ../docs/reference/{gio,glib,gobject} /usr/share/doc/glib-2.70.4
2D 图形库。
下载62 https://www.cairographics.org/snapshots/cairo-1.17.4.tar.xz
安装:
./configure --prefix=/usr \
--disable-static \
--enable-tee &&
make
make install
用于布局、渲染文本的库。
下载63 https://download.gnome.org/sources/pango/1.50/pango-1.50.4.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release --wrap-mode=nofallback -Dintrospection=false .. &&
ninja
ninja install
高度可配置的桌面窗口管理器。
下载64 http://openbox.org/dist/openbox/openbox-3.6.1.tar.gz
安装:
# 转换为 Python 3
2to3-3.10 -w data/autostart/openbox-xdg-autostart &&
sed 's/python/python3/' -i data/autostart/openbox-xdg-autostart
./configure --prefix=/usr \
--sysconfdir=/etc \
--disable-static \
--docdir=/usr/share/doc/openbox-3.6.1 &&
make
make install
配置:
cp -rf /etc/xdg/openbox ~/.config
自动启动:
echo exec openbox > ~/.xinitrc
本节介绍 GTK、Qt 库的构建,从而为使用这些库的应用程序奠定基础。
提供可访问性接口。
下载65 https://download.gnome.org/sources/atk/2.36/atk-2.36.0.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release .. &&
ninja
ninja install
D-Bus 进程间通信支持。
下载66 https://dbus.freedesktop.org/releases/dbus/dbus-1.12.20.tar.gz
安装:
./configure --prefix=/usr \
--sysconfdir=/etc \
--localstatedir=/var \
--enable-user-session \
--disable-doxygen-docs \
--disable-xml-docs \
--disable-static \
--docdir=/usr/share/doc/dbus-1.12.20 \
--with-console-auth-dir=/run/console \
--with-system-pid-file=/run/dbus/pid \
--with-system-socket=/run/dbus/system_bus_socket &&
make
make install
# 修复 dbus-daemon-launch-helper
chown -v root:messagebus /usr/libexec/dbus-daemon-launch-helper &&
chmod -v 4750 /usr/libexec/dbus-daemon-launch-helper
配置:
# 启动会话 daemon
eval `dbus-launch`
export DBUS_SESSION_BUS_ADDRESS
为 Assistive Technologies 提供服务接口。
下载67 https://download.gnome.org/sources/at-spi2-core/2.42/at-spi2-core-2.42.0.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release .. &&
ninja
ninja install
ATK 到 At-Spi2 的 D-Bus 服务。
下载68 https://download.gnome.org/sources/at-spi2-atk/2.38/at-spi2-atk-2.38.0.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release .. &&
ninja
ninja install
80x86 汇编器。
下载69 https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.xz
安装:
./configure --prefix=/usr &&
make
make install
用于 JPEG 文件格式的库。
依赖:CMake、NASM
下载70 https://downloads.sourceforge.net/libjpeg-turbo/libjpeg-turbo-2.1.2.tar.gz
安装:
mkdir build &&
cd build &&
cmake -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_BUILD_TYPE=RELEASE \
-DENABLE_STATIC=FALSE \
-DCMAKE_INSTALL_DOCDIR=/usr/share/doc/libjpeg-turbo-2.1.2 \
-DCMAKE_INSTALL_DEFAULT_LIBDIR=lib \
.. &&
make
make install
ZIP 提取工具。
下载71 https://downloads.sourceforge.net/infozip/unzip60.tar.gz
补丁72 https://www.linuxfromscratch.org/patches/blfs/11.1/unzip-6.0-consolidated_fixes-1.patch
安装:
patch -Np1 -i ../unzip-6.0-consolidated_fixes-1.patch
make -f unix/Makefile generic
make prefix=/usr MANDIR=/usr/share/man/man1 \
-f unix/Makefile install
用于解析 XML 文件的库和工具。
下载73 https://download.gnome.org/sources/libxml2/2.9/libxml2-2.9.13.tar.xz
安装:
./configure --prefix=/usr \
--disable-static \
--with-history \
--with-python=/usr/bin/python3 \
--docdir=/usr/share/doc/libxml2-2.9.13 &&
make
make install
用于创建及维护 SGML 编目。
下载74 https://sourceware.org/ftp/docbook-tools/new-trials/SOURCES/sgml-common-0.6.3.tgz
补丁75 https://www.linuxfromscratch.org/patches/blfs/11.1/sgml-common-0.6.3-manpage-1.patch
安装:
patch -Np1 -i ../sgml-common-0.6.3-manpage-1.patch &&
autoreconf -f -i
./configure --prefix=/usr --sysconfdir=/etc &&
make
make docdir=/usr/share/doc install &&
install-catalog --add /etc/sgml/sgml-ent.cat \
/usr/share/sgml/sgml-iso-entities-8879.1986/catalog &&
install-catalog --add /etc/sgml/sgml-docbook.cat \
/etc/sgml/sgml-ent.cat
用于 DocBook 的文档类型定义。
依赖:libxml、sgml-common、UnZip
下载76 https://www.docbook.org/xml/4.5/docbook-xml-4.5.zip
安装:
install -v -d -m755 /usr/share/xml/docbook/xml-dtd-4.5 &&
install -v -d -m755 /etc/xml &&
chown -R root:root . &&
cp -v -af docbook.cat *.dtd ent/ *.mod \
/usr/share/xml/docbook/xml-dtd-4.5
if [ ! -e /etc/xml/docbook ]; then
xmlcatalog --noout --create /etc/xml/docbook
fi &&
xmlcatalog --noout --add "public" \
"-//OASIS//DTD DocBook XML V4.5//EN" \
"http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//DTD DocBook XML CALS Table Model V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/calstblx.dtd" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//DTD XML Exchange Table Model 19990315//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/soextblx.dtd" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//ELEMENTS DocBook XML Information Pool V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbpoolx.mod" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbhierx.mod" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//ELEMENTS DocBook XML HTML Tables V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/htmltblx.mod" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//ENTITIES DocBook XML Notations V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbnotnx.mod" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//ENTITIES DocBook XML Character Entities V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbcentx.mod" \
/etc/xml/docbook &&
xmlcatalog --noout --add "public" \
"-//OASIS//ENTITIES DocBook XML Additional General Entities V4.5//EN" \
"file:///usr/share/xml/docbook/xml-dtd-4.5/dbgenent.mod" \
/etc/xml/docbook &&
xmlcatalog --noout --add "rewriteSystem" \
"http://www.oasis-open.org/docbook/xml/4.5" \
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
/etc/xml/docbook &&
xmlcatalog --noout --add "rewriteURI" \
"http://www.oasis-open.org/docbook/xml/4.5" \
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
/etc/xml/docbook
if [ ! -e /etc/xml/catalog ]; then
xmlcatalog --noout --create /etc/xml/catalog
fi &&
xmlcatalog --noout --add "delegatePublic" \
"-//OASIS//ENTITIES DocBook XML" \
"file:///etc/xml/docbook" \
/etc/xml/catalog &&
xmlcatalog --noout --add "delegatePublic" \
"-//OASIS//DTD DocBook XML" \
"file:///etc/xml/docbook" \
/etc/xml/catalog &&
xmlcatalog --noout --add "delegateSystem" \
"http://www.oasis-open.org/docbook/" \
"file:///etc/xml/docbook" \
/etc/xml/catalog &&
xmlcatalog --noout --add "delegateURI" \
"http://www.oasis-open.org/docbook/" \
"file:///etc/xml/docbook" \
/etc/xml/catalog
配置:
for DTDVERSION in 4.1.2 4.2 4.3 4.4
do
xmlcatalog --noout --add "public" \
"-//OASIS//DTD DocBook XML V$DTDVERSION//EN" \
"http://www.oasis-open.org/docbook/xml/$DTDVERSION/docbookx.dtd" \
/etc/xml/docbook
xmlcatalog --noout --add "rewriteSystem" \
"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
/etc/xml/docbook
xmlcatalog --noout --add "rewriteURI" \
"http://www.oasis-open.org/docbook/xml/$DTDVERSION" \
"file:///usr/share/xml/docbook/xml-dtd-4.5" \
/etc/xml/docbook
xmlcatalog --noout --add "delegateSystem" \
"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
"file:///etc/xml/docbook" \
/etc/xml/catalog
xmlcatalog --noout --add "delegateURI" \
"http://www.oasis-open.org/docbook/xml/$DTDVERSION/" \
"file:///etc/xml/docbook" \
/etc/xml/catalog
done
从 XML 提取信息,并输出 PO 模板文件,然后从 MO 文件合并翻译来创建已翻译的 XML 文件。
依赖:docbook-xml
下载77 http://files.itstool.org/itstool/itstool-2.0.7.tar.bz2
安装:
PYTHON=/usr/bin/python3 ./configure --prefix=/usr &&
make
make install
XSL 样式表,用于 XML DocBook 文件转换。
补丁79 https://www.linuxfromscratch.org/patches/blfs/11.1/docbook-xsl-nons-1.79.2-stack_fix-1.patch
安装:
patch -Np1 -i ../docbook-xsl-nons-1.79.2-stack_fix-1.patch
install -v -m755 -d /usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2 &&
cp -v -R VERSION assembly common eclipse epub epub3 extensions fo \
highlighting html htmlhelp images javahelp lib manpages params \
profiling roundtrip slides template tests tools webhelp website \
xhtml xhtml-1_1 xhtml5 \
/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2 &&
ln -s VERSION /usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2/VERSION.xsl &&
install -v -m644 -D README \
/usr/share/doc/docbook-xsl-nons-1.79.2/README.txt &&
install -v -m644 RELEASE-NOTES* NEWS* \
/usr/share/doc/docbook-xsl-nons-1.79.2
配置:
if [ ! -d /etc/xml ]; then install -v -m755 -d /etc/xml; fi &&
if [ ! -f /etc/xml/catalog ]; then
xmlcatalog --noout --create /etc/xml/catalog
fi &&
xmlcatalog --noout --add "rewriteSystem" \
"https://cdn.docbook.org/release/xsl-nons/1.79.2" \
"/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2" \
/etc/xml/catalog &&
xmlcatalog --noout --add "rewriteURI" \
"https://cdn.docbook.org/release/xsl-nons/1.79.2" \
"/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2" \
/etc/xml/catalog &&
xmlcatalog --noout --add "rewriteSystem" \
"https://cdn.docbook.org/release/xsl-nons/current" \
"/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2" \
/etc/xml/catalog &&
xmlcatalog --noout --add "rewriteURI" \
"https://cdn.docbook.org/release/xsl-nons/current" \
"/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2" \
/etc/xml/catalog &&
xmlcatalog --noout --add "rewriteSystem" \
"http://docbook.sourceforge.net/release/xsl/current" \
"/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2" \
/etc/xml/catalog &&
xmlcatalog --noout --add "rewriteURI" \
"http://docbook.sourceforge.net/release/xsl/current" \
"/usr/share/xml/docbook/xsl-stylesheets-nons-1.79.2" \
/etc/xml/catalog
扩展 libxml2 支持 XSLT 文件的库。
下载80 https://download.gnome.org/sources/libxslt/1.1/libxslt-1.1.35.tar.xz
安装:
# 增加递归限制
sed -i s/3000/5000/ libxslt/transform.c doc/xsltproc.{1,xml} &&
./configure --prefix=/usr --disable-static --without-python &&
make
# 修复 date 字段
sed -e 's@\$Date\$@16 February 2022@' -i doc/xsltproc.1
make install
XSL 工具链的前端。
下载81 https://releases.pagure.org/xmlto/xmlto-0.0.28.tar.bz2
安装:
LINKS="/usr/bin/links" \
./configure --prefix=/usr &&
make
make install
用于图像载入及像素缓冲处理的库。
依赖:GLib、libjpeg-turbo、libpng、shared-mime-info
下载84 https://download.gnome.org/sources/gdk-pixbuf/2.42/gdk-pixbuf-2.42.6.tar.xz
安装:
mkdir build &&
cd build &&
meson --prefix=/usr --buildtype=release --wrap-mode=nofallback .. &&
ninja
ninja install
GTK 图形用户界面库。
依赖:at-spi2-atk、gdk-pixbuf、libepoxy、Pango
下载85 https://download.gnome.org/sources/gtk+/3.24/gtk+-3.24.31.tar.xz
安装:
./configure --prefix=/usr \
--sysconfdir=/etc \
--enable-broadway-backend \
--enable-x11-backend \
--disable-wayland-backend &&
make
make install
用于 GTK 应用的图标主题。
下载86 https://download.gnome.org/sources/adwaita-icon-theme/41/adwaita-icon-theme-41.0.tar.xz
安装:
./configure --prefix=/usr &&
make
make install
零配置 SQL 数据库引擎。
下载87 https://sqlite.org/2022/sqlite-autoconf-3370200.tar.gz
安装:
./configure --prefix=/usr \
--disable-static \
--enable-fts5 \
CPPFLAGS="-DSQLITE_ENABLE_FTS3=1 \
-DSQLITE_ENABLE_FTS4=1 \
-DSQLITE_ENABLE_COLUMN_METADATA=1 \
-DSQLITE_ENABLE_UNLOCK_NOTIFY=1 \
-DSQLITE_ENABLE_DBSTAT_VTAB=1 \
-DSQLITE_SECURE_DELETE=1 \
-DSQLITE_ENABLE_FTS3_TOKENIZER=1" &&
make
make install
跨平台应用程序框架。
下载88 https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
补丁89 https://www.linuxfromscratch.org/patches/blfs/11.1/qt-everywhere-src-5.15.2-kf5.15-2.patch
安装:
# 设置安装前缀
export QT5PREFIX=/opt/qt5
patch -Np1 -i ../qt-everywhere-src-5.15.2-kf5.15-2.patch
./configure -prefix $QT5PREFIX \
-sysconfdir /etc/xdg \
-confirm-license \
-opensource \
-dbus-linked \
-openssl-linked \
-system-harfbuzz \
-system-sqlite \
-nomake examples \
-no-rpath \
-journald \
-skip qtwebengine &&
make
make install
# 移除对构建目录的引用
find $QT5PREFIX/ -name \*.prl \
-exec sed -i -e '/^QMAKE_PRL_BUILD_DIR/d' {} \;
# 安装图像及菜单条目
QT5BINDIR=$QT5PREFIX/bin
install -v -dm755 /usr/share/pixmaps/ &&
install -v -Dm644 qttools/src/assistant/assistant/images/assistant-128.png \
/usr/share/pixmaps/assistant-qt5.png &&
install -v -Dm644 qttools/src/designer/src/designer/images/designer.png \
/usr/share/pixmaps/designer-qt5.png &&
install -v -Dm644 qttools/src/linguist/linguist/images/icons/linguist-128-32.png \
/usr/share/pixmaps/linguist-qt5.png &&
install -v -Dm644 qttools/src/qdbus/qdbusviewer/images/qdbusviewer-128.png \
/usr/share/pixmaps/qdbusviewer-qt5.png &&
install -dm755 /usr/share/applications &&
cat > /usr/share/applications/assistant-qt5.desktop << EOF
[Desktop Entry]
Name=Qt5 Assistant
Comment=Shows Qt5 documentation and examples
Exec=$QT5BINDIR/assistant
Icon=assistant-qt5.png
Terminal=false
Encoding=UTF-8
Type=Application
Categories=Qt;Development;Documentation;
EOF
cat > /usr/share/applications/designer-qt5.desktop << EOF
[Desktop Entry]
Name=Qt5 Designer
GenericName=Interface Designer
Comment=Design GUIs for Qt5 applications
Exec=$QT5BINDIR/designer
Icon=designer-qt5.png
MimeType=application/x-designer;
Terminal=false
Encoding=UTF-8
Type=Application
Categories=Qt;Development;
EOF
cat > /usr/share/applications/linguist-qt5.desktop << EOF
[Desktop Entry]
Name=Qt5 Linguist
Comment=Add translations to Qt5 applications
Exec=$QT5BINDIR/linguist
Icon=linguist-qt5.png
MimeType=text/vnd.trolltech.linguist;application/x-linguist;
Terminal=false
Encoding=UTF-8
Type=Application
Categories=Qt;Development;
EOF
cat > /usr/share/applications/qdbusviewer-qt5.desktop << EOF
[Desktop Entry]
Name=Qt5 QDbusViewer
GenericName=D-Bus Debugger
Comment=Debug D-Bus applications
Exec=$QT5BINDIR/qdbusviewer
Icon=qdbusviewer-qt5.png
Terminal=false
Encoding=UTF-8
Type=Application
Categories=Qt;Development;Debugger;
EOF
# 创建必须的符号链接
for file in moc uic rcc qmake lconvert lrelease lupdate; do
ln -sfrvn $QT5BINDIR/$file /usr/bin/$file-qt5
done
配置:
cat >> /etc/ld.so.conf << EOF
# Begin Qt addition
/opt/qt5/lib
# End Qt addition
EOF
ldconfig
cat > /etc/profile.d/qt5.sh << "EOF"
# Begin /etc/profile.d/qt5.sh
QT5DIR=/opt/qt5
PATH=$QT5DIR/bin:$PATH
PKG_CONFIG_PATH=$QT5DIR/lib/pkgconfig:$PKG_CONFIG_PATH
export QT5DIR
export PATH
export PKG_CONFIG_PATH
# End /etc/profile.d/qt5.sh
EOF