LFS:从零开始构建 Linux 系统

徐小东

2022-06-17

什么是 LFS

LFS 即 Linux From Scratch1 https://www.linuxfromscratch.org 的简称,意为从零开始构建 Linux 系统。它是一份在线手册,将提供亲自设计和构建系统所需的背景知识及操作步骤。该手册提供了一个构建能够正常工作的系统的样板,读者可以自由地调整书中的命令,来满足自己的要求。

为何要 LFS

  1. 它能够帮助你学习 Linux 系统的内部是如何运作的。构建 LFS 系统的过程将展示 Linux 系统的工作原理,以及其各组成部分的协作和依赖关系。有了这些经验,你将能够定制 Linux 系统,使其满足你独一无二的需求。

  2. 它允许你更好地控制你的系统,而不用依赖于其他人的 Linux 实现。

前提要求

LFS 的主要目标架构是 AMD/Intel 的 x86 (32 位) 和 x86_64 (64 位) CPU。有兴趣的同学也可以尝试在 ARM 和 MIPS 架构的 CPU 上构建 LFS。

LFS 目前最新的版本为 11.0,根据所采用的 init 程序不同又分为下列版本:

构建 LFS 系统不是一项简单的任务。它需要你运用足够丰富的 Unix 系统管理知识来解决构建过程中的问题,并正确执行本书给出的命令。建议阅读下列材料:

友情提示

如何构建 LFS 系统

  1. 准备工作:满足构建要求的宿主系统、所用的软件包和补丁、以及基本的环境配置。
  2. 构建 LFS 交叉工具链和临时工具:先构建 GCC 交叉编译工具链,再利用工具链来交叉编译临时工具。
  3. 构建 LFS 系统:安装基本的系统软件,对系统进行配置,使 LFS 系统可引导。

准备工作

准备宿主系统

宿主系统需求

宿主系统必须拥有下列软件,且版本不能低于我们给出的最低版本。

包名 版本 备注
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 选择一个可用的空分区,或者在有充足未划分空间的情况下,创建一个新分区。

  • 10GB 最小的系统需要,这足够保存所有源代码压缩包,并且编译所有软件包。
  • 30GB 如果希望用 LFS 作为日常的 Linux 系统,很可能需要安装额外软件,需要更多空间。

在分区上建立文件系统

LFS 假设根文件系统 (/) 采用 ext4 文件系统:

mkfs -v -t ext4 /dev/<xxx>

设置 $LFS 环境变量

该变量被定义且设置为构建 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 标志

全部软件包(总共 79 个)

包名 版本
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

必要的补丁(总共 7 个)

有些补丁解决了本应由维护者修复的问题,有些则对软件包进行微小的修改。

包名 补丁
Binutils 上游修复补丁
Bzip2 文档补丁
Coreutils 国际化修复补丁
Glibc FHS 补丁
Kbd 退格/删除修复补丁
Perl 上游修复补丁
Systemd 上游修复补丁

可通过 wget-list6 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

最后准备工作

在 LFS 文件系统中创建有限目录布局

使得编译的程序可以被安装到它们的最终位置。

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

添加 LFS 用户

以非特权用户身份编译软件包。

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

构建 LFS 交叉工具链和临时工具

  1. 构建一个交叉编译器(GCC)和与之相关的库(Glibc)。
  2. 使用这个交叉工具链构建一些工具,构建方法保证它们和宿主系统分离。
  3. 进入 chroot 环境,以进一步提高与宿主的隔离度,并构建剩余的,在构建最终的系统时必须的工具。

编译交叉工具链

交叉编译时常用的术语

名称 说明
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

Binutils-2.37 - 第一遍

包含汇编器、链接器以及其他用于处理目标文件的工具。

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 # 构建系统中的一个问题可能导致安装过程失败

GCC-11.2.0 - 第一遍

包含 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 # 创建一个完整版本的内部头文件

Linux-5.13.12 API 头文件

导出内核 API 供 Glibc 使用。

make mrproper # 确保软件包中没有遗留陈旧的文件

make headers
find usr/include -name '.*' -delete
rm usr/include/Makefile
cp -rv usr/include $LFS/usr

Glibc-2.34

包含主要的 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

GCC-11.2.0 中的 Libstdc++,第一遍

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

M4-1.4.19

包含一个宏处理器。

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

make
make DESTDIR=$LFS install

Ncurses-6.2

包含使用时不需考虑终端特性的字符屏幕处理函数库。

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

Bash-5.1.8

./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

Coreutils-8.32

包含用于显示和设定系统基本属性的工具。

./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

Diffutils-3.8

包含显示文件或目录之间差异的程序。

./configure --prefix=/usr --host=$LFS_TGT

make
make DESTDIR=$LFS install

File-5.40

包含用于确定给定文件类型的工具。

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

Findutils-4.8.0

包含用于查找文件的程序。

./configure --prefix=/usr   \
            --localstatedir=/var/lib/locate \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

make
make DESTDIR=$LFS install

Gawk-5.1.0

包含操作文本文件的程序。

sed -i 's/extras//' Makefile.in # 确保不要安装一些没有必要的文件

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(./config.guess)

make
make DESTDIR=$LFS install

Grep-3.7

包含在文件内容中进行搜索的程序。

./configure --prefix=/usr   \
            --host=$LFS_TGT

make
make DESTDIR=$LFS install

Gzip-1.10

包含压缩和解压缩文件的程序。

./configure --prefix=/usr --host=$LFS_TGT

make
make DESTDIR=$LFS install

Make-4.3

./configure --prefix=/usr   \
            --without-guile \ # 防止使用 guile
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

make
make DESTDIR=$LFS install

Patch-2.7.6

./configure --prefix=/usr   \
            --host=$LFS_TGT \
            --build=$(build-aux/config.guess)

make
make DESTDIR=$LFS install

Sed-4.8

./configure --prefix=/usr   \
            --host=$LFS_TGT

make
make DESTDIR=$LFS install

Tar-1.34

提供创建 tar 归档文件。

./configure --prefix=/usr                     \
            --host=$LFS_TGT                   \
            --build=$(build-aux/config.guess)

make
make DESTDIR=$LFS install

Xz-5.2.5

包含文件压缩和解压缩工具,它能够处理 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

Binutils-2.37 - 第二遍

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

GCC-11.2.0 - 第二遍

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

进入 Chroot 并构建其他临时工具

构建临时系统最后缺失的部分。

需要的包,总共 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 环境并完成剩余临时工具的安装。

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-11.2.0 中的 Libstdc++,第二遍

避免编译产生的库被宿主系统组件污染。

# 允许在 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

Gettext-0.21

包含国际化和本地化工具。

./configure --disable-shared

make
cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin

Bison-3.7.6

包含语法分析器生成器。

./configure --prefix=/usr \
            --docdir=/usr/share/doc/bison-3.7.6

make
make install

Perl-5.34.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

make
make install

Python-3.9.6

./configure --prefix=/usr   \
            --enable-shared \   # 防止安装静态库
            --without-ensurepip # 禁止构建 Python 软件包安装器,它在当前阶段没有必要

make
make install

Texinfo-6.8

包含阅读、编写和转换 info 页面的程序。

# 修复在使用 Glibc-2.34 或更新版本的系统上构建该软件包时出现的问题
sed -e 's/__attribute_nonnull__/__nonnull/' \
    -i gnulib/lib/malloc/dynarray-skeleton.c

./configure --prefix=/usr

make
make install

Util-linux-2.37.2

# 作为 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

构建 LFS 系统

安装基本系统软件

需要的包,总共 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

Man-pages-5.13

make prefix=/usr install

Iana-Etc-20210611

包含网络服务和协议的数据。

cp services protocols /etc

Glibc-2.34

# 修复上游开发者发现的一项安全问题
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

Zlib-1.2.11

包含一些程序使用的压缩和解压缩子程序。

./configure --prefix=/usr

make
make check
make install

# 删除无用的静态库
rm -fv /usr/lib/libz.a

Bzip2-1.0.8

包含用于压缩和解压缩文件的程序。

# 应用补丁以安装该软件包的文档
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

Xz-5.2.5

./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/xz-5.2.5

make
make check
make install

Zstd-1.5.0

实时压缩算法,提供了较高的压缩比。

make
make check
make prefix=/usr install

rm -v /usr/lib/libzstd.a

File-5.40

./configure --prefix=/usr

make
make check
make install

Readline-8.1

包含一些提供命令行编辑和历史记录功能的库。

# 防止重新安装 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

M4-1.4.19

./configure --prefix=/usr

make
make check
make install

Bc-5.0.0

包含一个任意精度数值处理语言。

CC=gcc ./configure --prefix=/usr -G -O3

make
make test
make install

Flex-2.6.4

用于生成在文本中识别模式的程序。

./configure --prefix=/usr \
            --docdir=/usr/share/doc/flex-2.6.4 \
            --disable-static

make
make check
make install

ln -sv flex /usr/bin/lex

Tcl-8.6.11

支持 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

Expect-5.45.4

自动化交互应用的工具。

./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

DejaGNU-1.6.3

使用 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

Binutils-2.37

# 确认伪终端 (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

GMP-6.2.1

包含提供任意精度算术函数的数学库。

./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

MPFR-4.1.0

包含多精度数学函数。

./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

MPC-1.2.1

包含一个任意高精度,且舍入正确的复数算术库。

./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/mpc-1.2.1

make
make html

make check

make install
make install-html

Attr-2.5.1

包含管理文件系统对象扩展属性的工具。

./configure --prefix=/usr     \
            --disable-static  \
            --sysconfdir=/etc \
            --docdir=/usr/share/doc/attr-2.5.1

make
make check
make install

Acl-2.3.1

包含管理访问控制列表的工具。

./configure --prefix=/usr         \
            --disable-static      \
            --docdir=/usr/share/doc/acl-2.3.1

make
make install

Libcap-2.53

为 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

Shadow-4.9

包含安全地处理密码的程序。

# 禁止该软件包安装 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

GCC-11.2.0

# 修复在使用 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

Pkg-config-0.29.2

提供一个在软件包安装的配置和编译阶段,向构建工具传递头文件和/或库文件路径的工具。

./configure --prefix=/usr              \
            --with-internal-glib       \
            --disable-host-tool        \
            --docdir=/usr/share/doc/pkg-config-0.29.2

make
make check
make install

Ncurses-6.2

./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

Sed-4.8

./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

Psmisc-23.4

包含显示正在运行的进程信息的程序。

./configure --prefix=/usr

make
make install

Gettext-0.21

./configure --prefix=/usr    \
            --disable-static \
            --docdir=/usr/share/doc/gettext-0.21

make
make install
chmod -v 0755 /usr/lib/preloadable_libintl.so

Bison-3.7.6

./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.7.6

make
make check
make install

Grep-3.7

./configure --prefix=/usr

make
make check
make install

Bash-5.1.8

./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

Libtool-2.4.6

包含 GNU 通用库支持脚本。

./configure --prefix=/usr

make
make check
make install

rm -fv /usr/lib/libltdl.a

GDBM-1.20

包含 GNU 数据库管理器。

./configure --prefix=/usr    \
            --disable-static \
            --enable-libgdbm-compat

make
make -k check
make install

Gperf-3.1

根据一组键值,生成完美散列函数。

./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.1

make
make -j1 check
make install

Expat-2.4.1

包含用于解析 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

Inetutils-2.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

Less-590

./configure --prefix=/usr --sysconfdir=/etc

make
make install

Perl-5.34.0

# 修复该软件包中由较新的 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::Parser-2.46

XML 解析器 Expat 的 Perl 接口。

perl Makefile.PL

make
make test
make install

Intltool-0.51.0

从源代码文件中提取可翻译字符串的国际化工具。

# 修复由 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

Autoconf-2.71

包含生成能自动配置软件包的 shell 脚本程序。

./configure --prefix=/usr

make
make check
make install

Automake-1.16.4

包含自动生成 Makefile,以便和 Autoconf 一同使用的程序。

./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.16.4

make
make -j4 check
make install

Kmod-29

包含用于加载内核模块的库和工具。

./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

Elfutils-0.185 中的 Libelf

处理 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

Libffi-3.4.2

提供一个可移植的高级编程接口,用于处理不同调用惯例。

./configure --prefix=/usr          \
            --disable-static       \
            --with-gcc-arch=native \
            --disable-exec-static-tramp

make
make check
make install

OpenSSL-1.1.1l

包含密码学相关的管理工具和库。

./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

Python-3.9.6

./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

Ninja-1.10.2

注重速度的小型构建系统。

# 使用环境变量 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

Meson-0.59.1

开放源代码构建系统。

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

Coreutils-8.32

# 修复一些国际化相关的 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

Check-0.15.2

C 语言单元测试框架。

./configure --prefix=/usr --disable-static

make
make check
make docdir=/usr/share/doc/check-0.15.2 install

Diffutils-3.8

./configure --prefix=/usr

make
make check
make install

Gawk-5.1.0

# 不安装某些不需要的文件
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

Findutils-4.8.0

./configure --prefix=/usr --localstatedir=/var/lib/locate

make
chown -Rv tester .
su tester -c "PATH=$PATH make check"
make install

Groff-1.22.4

包含处理和格式化文本的程序。

PAGE=A4 ./configure --prefix=/usr

make -j1
make install

GRUB-2.06

./configure --prefix=/usr          \
            --sysconfdir=/etc      \
            --disable-efiemu       \
            --disable-werror

make
make install
mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions

Gzip-1.10

./configure --prefix=/usr

make
make check
make install

IPRoute2-5.13.0

包含基于 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

Kbd-2.4.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

Libpipeline-1.5.3

包含用于灵活、方便地处理子进程流水线的库。

./configure --prefix=/usr

make
make check
make install

Make-4.3

./configure --prefix=/usr

make
make check
make install

Patch-2.7.6

./configure --prefix=/usr

make
make check
make install

Tar-1.34

FORCE_UNSAFE_CONFIGURE=1  \
./configure --prefix=/usr

make
make check
make install
make -C doc install-html docdir=/usr/share/doc/tar-1.34

Texinfo-6.8

# 修复在使用 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

Vim-8.2.3337

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

MarkupSafe-2.0.1

为 XML/HTML/XHTML 标记语言实现字符串安全处理的 Python 模块。

python3 setup.py build

python3 setup.py install --optimize=1

Jinja2-3.0.1

Python 风格的模板语言。

python3 setup.py install --optimize=1

Systemd-249

包含控制系统引导、运行和关闭的程序。

# 修复一项安全问题
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

D-Bus-1.12.20

消息总线系统。

./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-DB-2.9.4

包含查找和阅读 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

Procps-ng-3.3.17

包含监视进程的程序。

./configure --prefix=/usr                            \
            --docdir=/usr/share/doc/procps-ng-3.3.17 \
            --disable-static                         \
            --disable-kill                           \
            --with-systemd

make
make check
make install

Util-linux-2.37.2

./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

E2fsprogs-1.46.4

文件系统的工具。

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

系统配置

  1. 展示设定网络通常需要的配置文件。
  2. 展示如何配置系统时钟和键盘布局。
  3. 介绍用户登录系统时使用的配置文件。
  4. 配置 Systemd 行为。

网络配置

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 还是本地时间。

配置 Linux 控制台

systemd-vconsole-setup 系统服务负责配置虚拟控制台字体和控制台键盘映射。

cat > /etc/vconsole.conf << "EOF"
KEYMAP=us
FONT=Lat2-Terminus16
EOF

配置系统 Locale

cat > /etc/locale.conf << "EOF"
LANG=en_US.UTF-8
EOF

# 若 Systemd 引导后可设置
localectl set-locale LANG="en_US.UTF-8"

创建 /etc/shells 文件

shells 文件包含系统登录 shell 的列表,应用程序使用该文件判断 shell 是否合法。

cat > /etc/shells << "EOF"
# Begin /etc/shells

/bin/sh
/bin/bash

# End /etc/shells
EOF

Systemd 使用和配置

/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

使 LFS 系统可引导

创建 /etc/fstab 文件

参考以下命令,创建一个新的文件系统表:

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 个域的详细信息。

Linux-5.13.12

# 确保内核源代码树绝对干净
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 设定引导过程

将 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

FreeType-2.11.1 (第一遍)

允许应用程序正常渲染 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

HarfBuzz-3.4.0

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

FreeType-2.11.1 (第二遍)

安装(包含 harfbuzz 支持):

./configure --prefix=/usr --enable-freetype-config --disable-static &&
make

make install

Fontconfig-2.13.1

用于配置及定制字体访问的库和程序。

下载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

libpng-1.6.37

读写 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

Pixman-0.40.0

提供低级像素处理的库。

下载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

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

util-macros-1.19.3

用于 Xorg 包的 m4 宏。

下载17 https://www.x.org/pub/individual/util/util-macros-1.19.3.tar.bz2

安装:

./configure $XORG_CONFIG
make install

xorgproto-2021.5

提供构建 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}

libXau-1.0.9

实现 X11 授权协议的库,用于限制客户端访问显示资源。

下载19 https://www.x.org/pub/individual/lib/libXau-1.0.9.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

libXdmcp-1.1.3

实现 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

xcb-proto-1.14.1

提供 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

libxcb-1.14

提供 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

Xorg 库

提供用于 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

libxcvt-0.1.1

用于生成 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-util-0.4.0

对 XCB 库提供额外的扩展。

下载25 https://xcb.freedesktop.org/dist/xcb-util-0.4.0.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

xcb-util-image-0.4.0

对 XCB 库提供额外的扩展。

下载26 https://xcb.freedesktop.org/dist/xcb-util-image-0.4.0.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

xcb-util-keysyms-0.4.0

用于处理 X 键常量及转换键码的库。

下载27 https://xcb.freedesktop.org/dist/xcb-util-keysyms-0.4.0.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

xcb-util-renderutil-0.3.9

对 XCB 库提供额外的扩展。

下载28 https://xcb.freedesktop.org/dist/xcb-util-renderutil-0.3.9.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

xcb-util-wm-0.4.1

针对 EWMH 和 ICCCM 提供客户端及窗口管理器辅助例程。

下载29 https://xcb.freedesktop.org/dist/xcb-util-wm-0.4.1.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

xcb-util-cursor-0.1.3

提供 XCB 光标库的实现,用于替代 libXcursor。

下载30 https://xcb.freedesktop.org/dist/xcb-util-cursor-0.1.3.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

libdrm-2.4.110

为访问 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

MarkupSafe-2.0.1

实现 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

Mako-1.1.6

实现超快及轻量级模板的 Python 模块。

依赖:MarkupSafe

下载33 https://files.pythonhosted.org/packages/source/M/Mako/Mako-1.1.6.tar.gz

安装:

python3 setup.py install --optimize=1

libuv-1.43.0

异步 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

CMake-3.22.2

生成 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-13.0.1

模块化及可重用的编译器及工具链技术。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

Mesa-21.3.6

兼容 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

xbitmaps-1.1.2

Xorg 应用所需的点阵图。

下载41 https://www.x.org/pub/individual/data/xbitmaps-1.1.2.tar.bz2

安装:

./configure $XORG_CONFIG

make install

Xorg 应用

下载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

xcursor-themes-1.0.6

光标主题。

下载43 https://www.x.org/pub/individual/data/xcursor-themes-1.0.6.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

Xorg 字体

用于 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

XKeyboardConfig-2.35.1

适用于 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

libepoxy-1.5.9

用于处理 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

Xorg-Server-21.1.3

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 驱动

libevdev 1.12.0

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

mtdev-1.1.6

多点触摸协议翻译库。

下载49 https://bitmath.org/code/mtdev/mtdev-1.1.6.tar.bz2

安装:

./configure --prefix=/usr --disable-static &&
make

make install

libinput-1.19.3

处理输入设备的库。

下载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

Xorg Libinput Driver-1.2.1

允许 libinput 用于 X 下的输入设备。

下载51 https://www.x.org/pub/individual/driver/xf86-input-libinput-1.2.1.tar.xz

安装:

./configure $XORG_CONFIG &&
make

make install

Xorg AMDGPU Driver-21.0.0

适用于 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

Xorg Fbdev Driver-0.5.0

适用于帧缓冲设备的显示驱动。常用于回调。

下载53 https://www.x.org/pub/individual/driver/xf86-video-fbdev-0.5.0.tar.bz2

安装:

./configure $XORG_CONFIG &&
make

make install

Xorg Nouveau Driver-1.0.17

用于 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

libva-2.13.0

提供硬件加速的视频处理库。

下载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

libvdpau-1.4

实现 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

xterm-370

适用于 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

xinit-1.4.1

用于启动 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

FriBidi-1.0.11

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

GLib-2.70.4

提供事件循环、线程、动态载入、对象系统等接口的低级库。

下载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

Cairo-1.17.4

2D 图形库。

下载62 https://www.cairographics.org/snapshots/cairo-1.17.4.tar.xz

安装:

./configure --prefix=/usr    \
            --disable-static \
            --enable-tee &&
make

make install

Pango-1.50.4

用于布局、渲染文本的库。

下载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

openbox-3.6.1

高度可配置的桌面窗口管理器。

下载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 库的构建,从而为使用这些库的应用程序奠定基础。

ATK-2.36.0

提供可访问性接口。

下载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

dbus-1.12.20

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

at-spi2-core-2.42.0

为 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

at-spi2-atk-2.38.0

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

NASM-2.15.05

80x86 汇编器。

下载69 https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/nasm-2.15.05.tar.xz

安装:

./configure --prefix=/usr &&
make

make install

libjpeg-turbo-2.1.2

用于 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

UnZip-6.0

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

libxml2-2.9.13

用于解析 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-common-0.6.3

用于创建及维护 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-xml-4.5

用于 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

itstool-2.0.7

从 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

docbook-xsl-nons-1.79.2

XSL 样式表,用于 XML DocBook 文件转换。

下载78 https://github.com/docbook/xslt10-stylesheets/releases/download/release/1.79.2/docbook-xsl-nons-1.79.2.tar.bz2

补丁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

libxslt-1.1.35

扩展 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

xmlto-0.0.28

XSL 工具链的前端。

下载81 https://releases.pagure.org/xmlto/xmlto-0.0.28.tar.bz2

安装:

LINKS="/usr/bin/links" \
./configure --prefix=/usr &&

make

make install

shared-mime-info-2.1

MIME 数据库。

依赖:GLib、itstool、libxml2、xmlto

下载82 https://gitlab.freedesktop.org/xdg/shared-mime-info/-/archive/2.1/shared-mime-info-2.1.tar.gz

补丁83 https://www.linuxfromscratch.org/patches/blfs/11.1/shared-mime-info-2.1-meson_0.60_fix-1.patch

安装:

patch -p1 -i ../shared-mime-info-2.1-meson_0.60_fix-1.patch

mkdir build &&
cd    build &&

meson --prefix=/usr --buildtype=release -Dupdate-mimedb=true .. &&
ninja

ninja install

gdk-pixbuf-2.42.6

用于图像载入及像素缓冲处理的库。

依赖: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+-3.24.31

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

adwaita-icon-theme-41.0

用于 GTK 应用的图标主题。

下载86 https://download.gnome.org/sources/adwaita-icon-theme/41/adwaita-icon-theme-41.0.tar.xz

安装:

./configure --prefix=/usr &&
make

make install

SQLite-3.37.2

零配置 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

Qt-5.15.2

跨平台应用程序框架。

下载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

参考