你的宿主机应该安装有以下的软件包,且软件包的版本不能低于标注的版本(译者注:事实上版本低于标注版本也可能通过,所以 Linux 内核版本稍低而无法安装更高版本软件的用户也不必过于担心。例如译者的系统是 Ubuntu 14.04,其中有好多软件版本就低于指定版本,但仍然能成功构建)。对于大部分现代 Linux 来说应该不是什么问题。不少发行版可能会将开发用到的头文件单独打包,并且命名为 “<package-name>-devel” 或是 “<package-name>-dev” 这样的形式。务必保证这样的包都已经装上!
可能某些软件包的版本低于以下标注的版本也可以工作,不过我们不能一一测试。
Bash-3.2 (/bin/sh 应该是到 bash 的符号链接或硬链接)
Binutils-2.17 (不推荐安装 2.25 以上的版本,它们没有经过测试,并不敢保证没有问题)
Bison-2.3 (/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-4.1.2 包括 C++ 编译器、 g++ (不推荐安装 4.9.2 以上的版本,它们没有经过测试,并不敢保证没有问题)
有报告称,部分发行版使用的 gcc 库存在缺失或者是不一致的情况。这一情况可能会干扰到一些 LFS 软件包的构建。请检查 /usr/lib 或是 /usr/lib64 下是否存在 libgmp.la、libmpfr.la 和 libmpc.la。这三个文件应该要么都存在,要么都没有,而不是只有一两个。假如你的系统有这样的问题,要么重命名或删除这些文件(并重新安装 GCC),要么安装缺少的软件包。
Glibc-2.5.1 (不推荐安装 2.21 以上的版本,它们都没有经过测试,并不敢保证没有问题)
Grep-2.5.1a
Gzip-1.3.12
Linux Kernel-2.6.32
之所以指定使用这一版本的内核,是因为在第六章需要编译 glibc,开发人员有此建议。同时,编译 udev 也同样依赖于此版本的内核。
如果当前宿主机的内核版本早于 2.6.32,也许需要先升级到更新的版本。升级方法有两种:假如你的系统维护者有提供更新版本的内核,那么直接升级就可以了;假如你的系统维护者没有提供更新版本的内核,或者你不想安装它,那么你需要自己编译内核。第八章将指导你如何编译内核和设置系统的启动配置(这里假定你使用 GRUB)。
M4-1.4.10
Make-3.81
Patch-2.5.4
Perl-5.8.8
Sed-4.1.5
Tar-1.18
Texinfo-4.7
Xz-5.0.0
需要注意的是,通过学习本文构建 LFS 系统,必须包含上文提及的所有文件链接。那些链接假如指向其它的软件(例如 dash,mawk 等) ,也许依旧可以构建系统,但是开发团队并没有做过系统的测试,而且可能会在执行一些命令或者应用某些补丁的时候出现问题。(译者注:这句话的本义是,本书建议构建 LFS 建议使用的 sh 应该是 bash,但是假如你喜欢 dash,这并不一定不行,但是假如出问题,那也是在情理之中的事情。)
请执行以下命令,查看宿主机的各个软件包的版本以及编译环境是否准备妥当:
cat > version-check.sh << "EOF"
#!/bin/bash
# Simple script to list version numbers of critical development tools
export LC_ALL=C
bash --version | head -n1 | cut -d" " -f2-4
echo "/bin/sh -> `readlink -f /bin/sh`"
echo -n "Binutils: "; ld --version | head -n1 | cut -d" " -f3-
bison --version | head -n1
if [ -h /usr/bin/yacc ]; then
echo "/usr/bin/yacc -> `readlink -f /usr/bin/yacc`";
elif [ -x /usr/bin/yacc ]; then
echo yacc is `/usr/bin/yacc --version | head -n1`
else
echo "yacc not found"
fi
bzip2 --version 2>&1 < /dev/null | head -n1 | cut -d" " -f1,6-
echo -n "Coreutils: "; chown --version | head -n1 | cut -d")" -f2
diff --version | head -n1
find --version | head -n1
gawk --version | head -n1
if [ -h /usr/bin/awk ]; then
echo "/usr/bin/awk -> `readlink -f /usr/bin/awk`";
elif [ -x /usr/bin/awk ]; then
echo yacc is `/usr/bin/awk --version | head -n1`
else
echo "awk not found"
fi
gcc --version | head -n1
g++ --version | head -n1
ldd --version | head -n1 | cut -d" " -f2- # glibc version
grep --version | head -n1
gzip --version | head -n1
cat /proc/version
m4 --version | head -n1
make --version | head -n1
patch --version | head -n1
echo Perl `perl -V:version`
sed --version | head -n1
tar --version | head -n1
makeinfo --version | head -n1
xz --version | head -n1
echo 'main(){}' > dummy.c && g++ -o dummy dummy.c
if [ -x dummy ]
then echo "g++ compilation OK";
else echo "g++ compilation failed"; fi
rm -f dummy.c dummy
EOF
bash version-check.sh
译者注:这里给出一个典型的输出(当前译者使用的系统为:LSB Version:1.4,Distributor ID:Arch,Description:Arch Linux,Release:rolling
Codename:n/a)
bash, version 4.3.33(1)-release
/bin/sh -> /usr/bin/bash # 这里 sh 是到 bash 的硬链接
Binutils: (GNU Binutils) 2.25.0 # 版本正好是 2.25(好险)
bison (GNU Bison) 3.0.4
yacc is bison (GNU Bison) 3.0.4 # yacc 是到 bison 的硬链接
bzip2, Version 1.0.6, 6-Sept-2010.
Coreutils: 8.23
diff (GNU diffutils) 3.3
find (GNU findutils) 4.4.2
GNU Awk 4.1.1, API: 1.1 (GNU MPFR 3.1.2-p11, GNU MP 6.0.0)
/usr/bin/awk -> /usr/bin/gawk # awk 是到 gawk 的硬链接
gcc (GCC) 4.9.2 20150304 (prerelease)
g++ (GCC) 4.9.2 20150304 (prerelease)
(GNU libc) 2.21 # glib 的版本是 2.21
grep (GNU grep) 2.21
gzip 1.6
Linux version 4.0.0-2-ARCH (builduser@tobias) (gcc version 4.9.2 20150304 (prerelease) (GCC) )
m4 (GNU M4) 1.4.17
GNU Make 4.1
GNU patch 2.7.5
Perl version='5.20.2';
sed (GNU sed) 4.2.2
tar (GNU tar) 1.28
makeinfo (GNU texinfo) 5.2
xz (XZ Utils) 5.2.1
g++ compilation OK # 编译器功能正常
同时,还请进行库文件的一致性检查:
cat > library-check.sh << "EOF"
#!/bin/bash
for lib in lib{gmp,mpfr,mpc}.la; do
echo $lib: $(if find /usr/lib* -name $lib|
grep -q $lib;then :;else echo not;fi) found
done
unset lib
EOF
bash library-check.sh
这些文件应该要么都在或者是都缺失,而不应该只有一两个。