|
楼主 |
发表于 2003-3-24 06:47:51
|
显示全部楼层
编译考虑
--------------------
本文中,我们有一些假设,你可能需要根据环境来决定。例如,在几个地方的编译命令中你会看到对"i686-pc-linux-gnu"的硬编码引用。如果你的平台不是 i686-pc-linux-gnu (如 "i586-pc-linux-gnu" 或 "powerpc-unknown-linux-gnu") 那就要作相应的改动。
我们还使用 "*" 通配符,如果你有几个版本的源码包放在一起,就要注意了。
核心工具链软件包都是在它们的 build 目录里编译的(glibc 是一个例外,它会在 manual 子目录里生成一些文件,不过我们会做相应调整以允许它这样做的)。因此可以多次使用同一个源码(而不用重新解压)。如果你这样做的话,就要注意取消对下一个阶段不合适的补丁。我们将在需要的地方提醒你。
在本文的最后部份,你能找到独立的一节,是讨论一个老生常谈的问题:到底用哪个发布的 binutils (FSF 还是 HJL).现在,只需要知道你可以有一个选择。
最后,NLS(本地语言支持) 在整个编译过程中都是打开的。只有两个地方我们使用了 "--disable-nls",是静态的 "pass 1" 编译 binutils 和 gcc 时。这是因为在某些情况下,"--enable-nls"与静态编译相结合会造成符号冲突的编译错误。请注意你完全可以在余下的所有编译中使用"--disable-nls",如果你不需要 NLS 和/或你想节省硬盘空间。
运行测试套件 - 简述
------------------------------------------
多数软件包都提供了测试套件。运行测试套件是个好主意,因为它提供了很好的"sanity check"(检查环境的合理性)并证实了新编译的软件包大致具备开发者预想的功能。但它并不保证软件包没有 bug,因为这基本上是不可能的。
gcc 和 binutils 的测试套件依赖于三个额外的软件包:tcl, expect 和 dejagnu. 如果你想在最开始的阶段运行测试套件,你必须保证主系统里安装了这三个包。本文假设主系统没有安装它们,因此在静态"pass 1"的 binutils 和 gcc 时不运行测试套件。"pass 1" 编译很快就会被"pass 2"编译所覆盖,所以我们认为省掉"pass 1"的测试不是什么大问题。
警告,gcc 和 glibc 的测试套件要花很长的时间,如果你编译时间很紧张,就省掉第五章的测试套件,但我们并不推荐这样做。如果你选择了这个捷径,至少不要省掉第六章里 glibc, binutils 和 gcc 的测试套件。但记住,如果你在第六章里发现了本应是第五章里测试套件就能找出的问题,那你肯定会后悔当时的选择。
第五章 - 创建 /stage1 目录
------------------------------------------
我们假设你已经到了 LFS book的第五章,也就是已经创建了分区和文件系统,加载了分区,创建了$LFS/static,添加了 lfs 用户并设置了相应的环境。
正如简介中所述,我们将使用"/stage1"而不是"/static",因为我们将编译动态(共享)的第五章。这个名字只是为了与 /static 相区分以避免混淆。请重新回到 LFS book 中"Creating the $LFS/static directory"(创建$LFS/static目录)那一章,但是要用下面的命令:-
mkdir $LFS/stage1
同时,也别忘了执行 chown 操作:-
chown lfs $LFS/stage1
下一步是在主系统里创建 "/stage1" 符号链接。它将指向我们刚刚在 LFS 分区上创建的目录:-
ln -s $LFS/stage1 /
这保证了我们的工具链在第五章和第六章(chroot环境中)里将在相同的位置(如/stage1)查找。这是一个很重要的概念,如果现在还不太明白,没关系,只要进了第六章,就什么都清楚了。
第五章 - 设置环境
--------------------------------------
对环境的设置,也要加以调整。首先,我们不使用:- export CC="gcc -s".我们这里试图正确的做事情,严格说来,"-s" 是一个连接器标志。所以我们将把"-s"放在 LDFLAGS 中,如下:-
export LDFLAGS="-s"
第二,我们需要把"/stage1/bin"添加到 lfs 用户的 `PATH'里:-
export PATH=/stage1/binPATH
由于我们一步步地把第五章软件包安装到"/stage1",我们新编译的工具在`PATH'中排在前面,所以就会结合到下面的编译过程里。
第三,如果使用 bash shell,关掉bash的 "hash"功能是个好主意:-
set +h
Bash 有一个很有用的特性,它使用 hash 表(哈希表)来记住可执行文件的完整路径,以避免多次的 `PATH' 搜索。然而,我们希望立刻就能使用新安装的工具。关掉hash功能,那些交互的命令(make, patch, sed, cp 等等)将总是使用新的程序。
configure 脚本中的 Shell 文件名扩展并不会受 hash 功能的影响,所以这一步不是必需的。
关掉 hash 功能对性能的影响基本可以忽略。为了确认它已经关上了,运行:- hash 。应该会显示类似这样的结果:"su: hash: hashing disabled".如果你在使用其他的 shell,看一下它的文档,是否也有这个 hash 功能。
注意,我们将把上面的命令加到"/home/lfs/.bash_profile"中,以使每次用 "su"来切换到 lfs 用户时,都能恢复设置。因此"设置环境"的命令是:-
cat > ~/.bash_profile << "EOF"
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LDFLAGS="-s"
PATH=/stage1/binPATH
export LFS LC_ALL LDFLAGS PATH
EOF
source ~/.bash_profile
在整个编译过程中,你将注意到,我们会小心的调整 CFLAGS 环境变量. 这不是优化!而是把"-g"标志去掉以节省空间。我们还引入了"-pipe"以得到稍微快一点的程序。我们没有把 CFLAGS 放在 lfs 用户的全局环境中,因为并不是每个包都那么合作的对待CFLAGS.
另一件要注意的事情是,少数几个地方我们在 make 命令中使用了 LDFLAGS="-s"尽管我们已经在环境中设置了它。这是因为这几个包不把环境中的 LDFLAGS 放到顶级的 Makefile 中,因此也就不会把它传递给下面的子make进程。
第五章 - 安装 binutils - Pass 1 (静态)
-------------------------------------------------
这一步和现在的第五章 binutils 安装很相似,不过有一个额外的技巧。
mkdir ../binutils-build &&
cd ../binutils-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 \
--disable-nls &&
make LDFLAGS="-all-static -s" &&
make install
注意 - 如果你碰巧使用的是 HJL binutils 发布 2.13.90.0.18 或更高版本,遇到了"C compiler cannot create executables"编译错误,你需要在 configure 和 make 命令中间插入"make configure-host"命令。这是因为顶级编译系统最近的变化不能处理LDFLAGS中的"-all-static".
重要! - 不要删除 binutils-build 目录,因为我们后面会再用它。以后会解释这样做的原因,不过现在只需要运行:-
cd ld &&
make clean &&
make LIB_PATH=/stage1/lib
现在不要运行 "make install"!我们留下以后用。到时候就什么都清楚了。
主要的区别是我们使用 /stage1 作为安装前缀而不是通常的 $LFS/static.注意没有$LFS.这里值得提到的是,让 binutils 一开始就能使用是很重要的,因为 glibc 和 gcc 都要执行多种针对连接器和汇编器的测试,以决定该打开什么特性。
第五章 - 安装 gcc - Pass 1 (静态)
--------------------------------------------
基本与目前的第五章 gcc 安装相同,不过也有一些变化。首先,我们需要运用"no_fixincludes"补丁来防止fixincludes脚本的运行。我们用一个补丁而不是使用"install-no-fixedincludes",因为这样更干净,并能使编译稍微快一点,如果你碰巧使用了"--enable-version-specific-runtime-libs"配置开关,也不会出错。我们还要使用 "mmap_test" 补丁,它修正了gcc的一个小bug[2],能(并且会)在某些情况下破坏 gcc 编译的完整性。
patch -Np1 -i ../gcc-3*.no_fixincludes.patch &&
patch -Np1 -i ../gcc-3*.mmap_test.patch &&
mkdir ../gcc-build &&
cd ../gcc-build &&
CFLAGS="-O2 -pipe" ../gcc-3*/configure --prefix=/stage1 \
--with-local-prefix=/stage1 --enable-languages=c \
--disable-nls --enable-shared &&
make BOOT_LDFLAGS="-static -s" BOOT_CFLAGS="-O2 -pipe" \
STAGE1_CFLAGS="-pipe" bootstrap &&
make install &&
ln -s gcc /stage1/bin/cc |
|