vii. 宿主系统需求

你的宿主机应该安装有以下的软件包,且软件包的版本不能低于标注的版本(译者注:事实上版本低于标注版本也可能通过,所以 Linux 内核版本稍低而无法安装更高版本软件的用户也不必过于担心。例如译者的系统是 Ubuntu 14.04,其中有好多软件版本就低于指定版本,但仍然能成功构建)。对于大部分现代 Linux 来说应该不是什么问题。不少发行版可能会将开发用到的头文件单独打包,并且命名为 “<package-name>-devel” 或是 “<package-name>-dev” 这样的形式。务必保证这样的包都已经装上!

可能某些软件包的版本低于以下标注的版本也可以工作,不过我们不能一一测试。

需要注意的是,通过学习本文构建 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

这些文件应该要么都在或者是都缺失,而不应该只有一两个。