LFS 编辑建议使用有四个以上 CPU 核心和至少 8 GB 内存的硬件进行构建。不满足上述条件的老旧系统仍能完成构建,但构建软件包所需的时间可能大大超过本书给出的估计。
您的宿主系统必须拥有下列软件,且版本不能低于我们给出的最低版本。对于大多数现代 Linux
发行版来说这不成问题。要注意的是,很多发行版会把软件的头文件放在单独的软件包中,这些软件包的名称往往是 <软件包名>-devel
或者 <软件包名>-dev
。如果您的发行版为下列软件提供了这类软件包,一定要安装它们。
比下列最低版本更古老的版本可能正常工作,但作者没有进行测试。
Bash-3.2 (/bin/sh 必须是到 bash 的符号链接或硬连接)
Binutils-2.13.1 (比 2.42 更新的版本未经测试,不推荐使用)
Bison-2.7 (/usr/bin/yacc 必须是到 bison 的链接,或者是一个执行 bison 的小脚本)
Coreutils-8.1
Diffutils-2.8.1
Findutils-4.2.31
Gawk-4.0.1 (/usr/bin/awk 必须是到 gawk 的链接)
GCC-5.2,包括 C++ 编译器 g++ (比 13.2.0 更新的版本未经测试,不推荐使用)。C 和 C++ 标准库 (包括头文件) 也必须可用,这样 C++ 编译器才能构建宿主环境的程序
Grep-2.5.1a
Gzip-1.3.12
Linux Kernel-4.19
内核版本的要求是为了符合我们在第 5 章和第 8 章中编译 glibc 时的设置,这样可以禁用为旧版内核设计的变通措施,使得编译得到的 glibc 运行稍快,且占用空间稍小。截至 2024 年 2 月,4.19 是内核开发者仍然提供支持的最老内核版本。一些比 4.19 更老的内核可能被第三方团队支持,但它们不被视为上游正式发布的内核版本;详见 https://kernel.org/category/releases.html。
如果宿主内核比 4.19 更早,您需要将内核升级到较新的版本。升级内核有两种方法,如果您的发行版供应商提供了 4.19 或更新的内核软件包,您可以直接安装它。如果供应商没有提供一个足够新的内核包,或者您不想安装它,您可以自己编译内核。编译内核和配置启动引导器 (假设宿主使用 GRUB) 的步骤在第 10 章中。
我们需要宿主系统支持 UNIX 98 伪终端 (PTY)。这项功能在所有使用 Linux 4.19
或更新内核的桌面或服务器发行版中应该已经启用。如果您要构建自定义的宿主内核,需要确认在内核配置中 CONFIG_UNIX98_PTYS
选项被设为 y
。
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-5.0
Xz-5.0.0
上面要求的符号链接是根据本书构建 LFS 的充分条件,不是必要条件。链接指向其他软件 (如 dash 或 mawk 等) 可能不会引发问题,但 LFS 开发团队没有尝试过这种做法,也无法提供帮助。对于一些软件包来说,您可能需要修改本书中的指令或者使用额外的补丁,才能在这类宿主环境成功构建。
为了确定您的宿主系统拥有每个软件的合适版本,且能够编译程序,请运行下列命令:
cat > version-check.sh << "EOF"
#!/bin/bash
# A script to list version numbers of critical development tools
# If you have tools installed in other directories, adjust PATH here AND
# in ~lfs/.bashrc (section 4.4) as well.
LC_ALL=C
PATH=/usr/bin:/bin
bail() { echo "FATAL: $1"; exit 1; }
grep --version > /dev/null 2> /dev/null || bail "grep does not work"
sed '' /dev/null || bail "sed does not work"
sort /dev/null || bail "sort does not work"
ver_check()
{
if ! type -p $2 &>/dev/null
then
echo "ERROR: Cannot find $2 ($1)"; return 1;
fi
v=$($2 --version 2>&1 | grep -E -o '[0-9]+\.[0-9\.]+[a-z]*' | head -n1)
if printf '%s\n' $3 $v | sort --version-sort --check &>/dev/null
then
printf "OK: %-9s %-6s >= $3\n" "$1" "$v"; return 0;
else
printf "ERROR: %-9s is TOO OLD ($3 or later required)\n" "$1";
return 1;
fi
}
ver_kernel()
{
kver=$(uname -r | grep -E -o '^[0-9\.]+')
if printf '%s\n' $1 $kver | sort --version-sort --check &>/dev/null
then
printf "OK: Linux Kernel $kver >= $1\n"; return 0;
else
printf "ERROR: Linux Kernel ($kver) is TOO OLD ($1 or later required)\n" "$kver";
return 1;
fi
}
# Coreutils first because --version-sort needs Coreutils >= 7.0
ver_check Coreutils sort 8.1 || bail "Coreutils too old, stop"
ver_check Bash bash 3.2
ver_check Binutils ld 2.13.1
ver_check Bison bison 2.7
ver_check Diffutils diff 2.8.1
ver_check Findutils find 4.2.31
ver_check Gawk gawk 4.0.1
ver_check GCC gcc 5.2
ver_check "GCC (C++)" g++ 5.2
ver_check Grep grep 2.5.1a
ver_check Gzip gzip 1.3.12
ver_check M4 m4 1.4.10
ver_check Make make 4.0
ver_check Patch patch 2.5.4
ver_check Perl perl 5.8.8
ver_check Python python3 3.4
ver_check Sed sed 4.1.5
ver_check Tar tar 1.22
ver_check Texinfo texi2any 5.0
ver_check Xz xz 5.0.0
ver_kernel 4.19
if mount | grep -q 'devpts on /dev/pts' && [ -e /dev/ptmx ]
then echo "OK: Linux Kernel supports UNIX 98 PTY";
else echo "ERROR: Linux Kernel does NOT support UNIX 98 PTY"; fi
alias_check() {
if $1 --version 2>&1 | grep -qi $2
then printf "OK: %-4s is $2\n" "$1";
else printf "ERROR: %-4s is NOT $2\n" "$1"; fi
}
echo "Aliases:"
alias_check awk GNU
alias_check yacc Bison
alias_check sh Bash
echo "Compiler check:"
if printf "int main(){}" | g++ -x c++ -
then echo "OK: g++ works";
else echo "ERROR: g++ does NOT work"; fi
rm -f a.out
if [ "$(nproc)" = "" ]; then
echo "ERROR: nproc is not available or it produces empty output"
else
echo "OK: nproc reports $(nproc) logical cores are available"
fi
EOF
bash version-check.sh