A!die Software Studio Welcome to A!Die Software Studio

第二章 构建临时工具

by adie
May, 2012
   上一章   回目录   下一章   

第二章 构建临时工具

要构建一个操作系统,我们需要有一些工具,其中最重要的就是编译器。但是要构建一个编译器,我们首先得有一个编译器,这似乎进入了一个无限循环了。还好 gcc 支持一种交叉编译的方法,即编译出和当前编译器所在环境不同的环境的目标代码,通过反复编译,我们逐步将构建出的目标代码和宿主系统环境分离开来。在本章中,我们将建立一套脱离宿主系统的工具出来,我们将利用这些工具来构建我们的 LFS 系统,而不是直接利用宿主系统的工具来构建 LFS 系统。

2.1 交叉编译 Binutils

binutils 包含了汇编器,连接器等工具。gcc 依赖于这些工具,在编译的时候就会对这些工具做检测。编译过程如下:

lfs:~$ cd $LFS/sources
lfs:/mnt/lfs/sources$ tar xvf binutils-2.17.tar.bz2
lfs:/mnt/lfs/sources$ mkdir binutils-build
lfs:/mnt/lfs/sources$ cd binutils-build
lfs:/mnt/lfs/sources/binutils-build$ CC="gcc -B/usr/bin/"  ../binutils-2.17/configure --prefix=/tools  --disable-nls  --disable-werror
lfs:/mnt/lfs/sources/binutils-build$ make install
lfs:/mnt/lfs/sources/binutils-build$ make -C ld clean
lfs:/mnt/lfs/sources/binutils-build$ make -C ld LIB_PATH=/tools/lib
lfs:/mnt/lfs/sources/binutils-build$ cp -v ld/ld-new /tools/bin

首先,我们找到源代码包,并解压出来,然后创建了一个用于编译 binutils 的目录 binutils-build,接下来开始配置编译环境:

CC="gcc -B/usr/bin" 强制使用宿主系统的 /usr/bin/gcc 编译器来编译。
--prefix=/tools 设置软件包的安装目录为 /tools
--disable-nls 禁用国际化功能
--disable-werror 防止出现警告时编译被停止。

然后是编译和安装,最后我们做了一些稍后需要的调整工作:

make -C ld clean 清除 ld 目录下刚刚编译的文件。

make -C ld LIB_PATH=/tools/lib 覆盖默认的 LIB_PATH 变量,重新编译 ld 目录。

要点指示 9:如何编译源代码

Linux 源代码通常都是用 tar 来打包的,扩展名使用 file.tar.gz、file.tar.bz2 后面的 .gz 和 .bz2 是包的压缩方式,高版本的 tar 程序可以自动识别压缩格式,并调用相应的加压程序。老版本的 tar 程序对 .bz2 格式需要使用 jxvf 解压,.bz 格式使用 zxvf 解压,对新版本来说,直接使用 xvf 即可。

解开一个软件包后进入源代码目录,通常都可以看到 README 文件、INSTALL文件 或 doc 目录等。这写文件里面会告诉我们如何安装这个软件包。

大多数的软件都支持配置功能,使用 ./configure --help 可以查看配置的选项。其中 --prefix 是比较重要的一个,它用于指明软件的安装目录。运行 ./configure 后通常会在当前目录生成一份 Makefile 文件,然后我们就可以使用 make 命令来编译软件包的源代码了。编译的过程可能会很长,如果出现编译错误会立即终止。编译之后用 make install 命令实现安装,这一步通常是一些文件拷贝操作,把编译出来的文件拷贝到安装位置。

2.2 编译 GCC

为了方便和更加自动化,这次我们先将命令写入脚本,然后直接运行脚本来完成所有的编译。

lfs:~$ cat > build_gcc.sh << "EOF"
> cd $LFS/sources
> tar xvf gcc-4.1.2.tar.bz2
> mkdir gcc-build
> cd gcc-build
> CC="gcc -B/usr/bin/" ../gcc-4.1.2/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --enable-shared --enable-languages=c
> make bootstrap
> make install
> ln -vs gcc /tools/bin/cc
> EOF
lfs:~$ source build_gcc.sh

编译过程和上面类似,其中一些特别的地方如下:

--with-local-prefix=/tools 这个去掉了 gcc 默认搜索的 /usr/local/include 目录;
--enable-shared 生成 libgcc_s.so.1 和 libgcc_eh.a 文件, glibc 会用到;
--enable-languages=c 只编译 C 编译器;
make bootstrap 我们的目标不只是编译 gcc,而是要反复多次编译,使用第一次编译的编译器来编译第二次,然后再使用第二次编译的编译器来编译第三次... 这样最终得到一个没有瑕疵的,能够正确编译的编译器;
ln -vs gcc /tools/bin/cc 建立了一个软连接,因为许多的 UNIX 是使用 cc 作为编译器的。

2.3 Linux 内核头文件

Glibc 安装的时候需要使用内核提供的头文件,所以我们需要先安装它。

lfs:~$ cat > build_linux_header.sh <<  "EOF"
> cd $LFS/sources
> tar xvf linux-2.6.22.5.tar.bz2
> cd linux-2.6.22.5
> make mrproper
> make headers_check
> make INSTALL_HDR_PATH=dest headers_install
> cp -rv dest/include/* /tools/include
> EOF
lfs:~$ source build_linux_header.sh

make mrproper Mr.Proper 是欧洲某保洁产品的品牌,这个命令删除之前的编译的文件和配置文件,使用这个命令可以保证源代码的清洁,不要以为刚刚解压出来的源代码就一定是清洁的; make clean 只删除编译的文件,不删除配置文件;

2.4 安装 Glibc

lfs:~$ cat > build_glibc.sh <<  "EOF"
> cd $LFS/sources
> tar xvf glibc-2.5.1.tar.bz2
> mkdir glibc-build
> cd glibc-build
> ../glibc-2.5.1/configure --prefix=/tools --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-binutils=/tools/bin --without-gd --with-headers=/tools/include --without-selinux
> make
> make check
> mkdir -v /tools/etc
> touch /tools/etc/ld.so.conf
> make install
> EOF
lfs:~$ source build_glibc.sh
--disable-profile 不使用分析的信息来构建库文件,对临时工具来说是必须的;
--enable-add-ons 使用 NPTL 插件作为线程库;
--enable-kernel=2.6.0 支持 2.6.x 的 linux 内核;
--with-binutils=/tools/bin 编译 glibc 时所使用的 binutils 位置;
--without-gd 不编译 memusagestat 程序,它会使用宿主系统的 libgd,libpng,libz等等库文件。
--with-headers=/tools/include 这个参数指示 Glibc 按照前面刚刚安装到 tools 目录中的内核头文件编译自己, 从而准确的 知道内核的特性以根据这些特性对自己进行最佳化编译。
--without-selinux 当宿主系统支持 SELinux 时,Glibc 会编译 SELinux 的支持库,临时工具不需要 SELinux,所以关闭它。
make check 测试编译的结果,对临时工具来说,这不是必须的。
touch /tools/etc/ld.so.conf 创建了一个空的配置文件,否则 glibc 会提示一个警告。

2.5 调整工具链

现在,我们有了连接器,汇编器,GCC 编译器,还有 Glibc 库,一个基本的C编译环境所需要的内容已经齐备了。下面我们要做一些设置,让之后的编译都在我们创建的工具上进行。

首先需要调整的是第一个 Binutils 中的连接器,它需要重命名才能被找到和使用。在进行备份之后,用调整后的连接器替换之前的,并且创建一个连接到 /tools/$(gcc -dumpmachine)/bin 下面:

lfs:~$ mv -v /tools/bin/{ld,ld-old}
`/tools/bin/ld' -> `/tools/bin/ld-old'
lfs:~$ mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
`/tools/i686-pc-linux-gnu/bin/ld' -> `/tools/i686-pc-linux-gnu/bin/ld-old'
lfs:~$ mv -v /tools/bin/{ld-new,ld}
`/tools/bin/ld-new' -> `/tools/bin/ld'
lfs:~$ ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
`/tools/i686-pc-linux-gnu/bin/ld' -> `/tools/bin/ld'

下面通过修改 gcc 的 specs 文件来调整 gcc 所使用的动态连接器。

lfs:~$ gcc -dumpspecs | sed 's@^/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs

gcc -dumpspecs 输出了内建在编译器内部的 specs 文件,这个输出通过管道传递给 sed 命令;sed 都输入内容进行查找替换,把 /lib/ld-linux.so.2 替换成 /tools/lib/ld-linux.so.2;替换后的内容被重定向到一个文件中,这个位于 libgcc 目录下,名为 /specs。

最后,我们要删除一些编译的时候引入的宿主系统的头文件:

lfs:~$ GCC_INCLUDEDIR=`dirname $(gcc -print-libgcc-file-name)`/include && find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; && rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` && unset GCC_INCLUDEDIR
removed `/mnt/lfs/tools/bin/../lib/gcc/i686-pc-linux-gnu/4.1.2/include/X11/Xos.h                                                                                                             '
removed `/mnt/lfs/tools/bin/../lib/gcc/i686-pc-linux-gnu/4.1.2/include/X11/Xw32d                                                                                                             efs.h'
removed `/mnt/lfs/tools/bin/../lib/gcc/i686-pc-linux-gnu/4.1.2/include/X11/Xosde                                                                                                             fs.h'
...

这又是一个相当复杂的命令,首先它定义了一个 GCC_INCLUDEDIR 变量,其值是 libgcc 所在目录的 include 下面;在命令的最后,删除了这个变量。命令的中间部分包含两个命令,第一个 find ${GCC_INCLUDEDIR}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; 删除了 $GCC_INCLUDEDIR 目录下的所有子目录;第二个命令rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_INCLUDEDIR}/*` 删除了文件内容中包含 DO NOT EDIT THIS FILE 文本的文件。

调整完成后我们需要进行一次测试,通过编译一个 .c 文件,然后分析生成的二进制文件来查看它所连接的库是否指向了我们的工具下,如果它仍然指向宿主系统,就需要仔细检查之前的步骤了:

lfs:~$ echo "main(){}" > dummy.c
lfs:~$ cc dummy.c
lfs:~$ readelf -l a.out | grep '/tools'
      [Requesting program interpreter: /tools/lib/ld-linux.so.2]
lfs:~$ rm -v dummy.c a.out
removed `dummy.c'
removed `a.out'

如果没有看到 [Requesting program interpreter: /tools/lib/ld-linux.so.2] 这行输入,就要重新检查上面的步骤了,下一节的 Tcl 能否编译成功也能说明之前的步骤是否正确。

要点指示 10:GCC 的 SPEC 文件

SPEC 文件用于配置供 GCC 调用的子程序和传递给他们的参数。

GCC 是一个驱动式的程序,它依靠调用一系列其他的程序来完成工作。它分析命令行参数,然后判断该调用哪一个程序,使用什么参数进行调用。这些都是由 spec 文件来控制的。编译 GCC 的时候可以使用 -specs= 来强制使用特定的 spec 文件。关于这个文件更详细的信息参考 http://gcc.gnu.org/onlinedocs/gcc/Spec-Files.html中文翻译版本: http://www.adintr.com/mytranslate/gcc_spec_files.html

2.6 编译 Tcl

gcc 和 binutils 的测试需要用到 Tcl,为了之后的测试能够运行我们先要编译它:

lfs:~$ cat > build_tcl.sh <<  "EOF"
> cd $LFS/sources
> tar xvf tcl8.4.15-src.tar.gz
> cd tcl8.4.15/unix
> ./configure --prefix=/tools
> make
> make install
> make install-private-headers
> ln -sv tclsh8.4 /tools/bin/tclsh
> EOF
lfs:~$ source build_tcl.sh

make install-private-headers 安装了 tcl 的头文件,下一节会用到这些头文件。

2.7 编译 Expect

expect 提供了在脚本中和需要交互的程序进行对话的功能。

lfs:~$ cat > build_expect.sh <<  "EOF"
> cd $LFS/sources
> tar xvf  expect-5.43.0.tar.gz
> cd expect-5.43
> patch -Np1 -i ../expect-5.43.0-spawn-1.patch
> cp configure{,.bak}
> sed 's:/usr/local/bin:/bin:' configure.bak > configure
> ./configure --prefix=/tools --with-tcl=/tools/lib --with-tclinclude=/tools/include --with-x=no
> make
> make SCRIPTS="" install
> EOF
lfs:~$ source build_expect.sh

首先,我们使用 patch 命令在源代码上打了一个补丁包,它修正了运行 gcc 测试时返回 false 失败的 BUG。然后我们修改了 configure 文件,把其中的 /usr/local/bin/stty 替换成了 /bin/stty,这样可以保证我们的测试工具对最后的工具链都是有效的。

然后在配置过程中指明了上一节安装的 Tcl 库和头文件位置,--with-x=no 指明不使用图形库。

make SCRIPTS="" install 让安装的时候不安装 Expect 的脚本,我们不需要它。

2.8 编译 DejaGNU

DejaGNU 包含了其他程序的测试框架。

lfs:~$ cat > build_dejagnu.sh <<  "EOF"
> cd $LFS/sources
> tar xvf dejagnu-1.4.4.tar.gz
> cd dejagnu-1.4.4
> ./configure --prefix=/tools
> make install
> make check
> cd
> EOF
lfs:~$ source build_dejagnu.sh

2.9 第二次编译 GCC

现在,测试 GCC 和 Binutils 的工具已经安装好了,我们可以再次编译 gcc,让它使用新的 glibc,并中签当的测试。注意,测试依赖于宿主系统的虚拟终端设备,如果运行如下命令:

lfs:~$ expect -c "spawn ls"

时得到了这样的结果:

The system has no more ptys.
Ask your system administrator to create more.

就表示你的宿主系统没有合适的虚拟终端来运行测试用例了。解决这个问题的方法参见:http://www.linuxfromscratch.org/lfs/faq.html#no-ptys

下面开始再次编译:

lfs:~$ cat > build_gcc2.sh <<  "EOF"
> cd $LFS/sources
> rm gcc-4.1.2 -f -r
> rm gcc-build -f -r
> tar xvf gcc-4.1.2.tar.bz2
> mkdir gcc-build
> cd gcc-4.1.2
> cp -v gcc/Makefile.in{,.orig}
> sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
> cp -v gcc/Makefile.in{,.tmp}
> sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
> patch -Np1 -i ../gcc-4.1.2-specs-1.patch
> cd ../gcc-build
> ../gcc-4.1.2/configure --prefix=/tools --with-local-prefix=/tools --enable-clocale=gnu --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-languages=c,c++ --disable-libstdcxx-pch
> make
> make -k check
> make install
> EOF
lfs:~$ source build_gcc2.sh

首先,我们删除了第一次编译时留下的文件,并重新解压。然后用 sed 命令修改了两次 Makefile.in 文件,第一次的作用是禁用其中的 fixincludes 脚本,它会引入宿主系统额外的头文件,第二次修改增加了 -fomit-frame-pointer 编译选项,这是因为第一次编译 gcc 是的 bootstrap 会默认使用这个选项,这里不再使用 bootstrap 了,为了和之前的一致,所以需要手动添加这个选项。

之后,我们在源代码上打了一个补丁包,这个包让 gcc 不再搜索 /usr/include 下的头文件了。编译器前使用补丁而不是安装完成后再去调整 specs 文件,这样可以保证编译的过程中使用到新的动态连接器。

--enable-clocale=gnu 使用 gnu 作为本地化语言,而不是宿主系统的 'de_DE' 之类的本地化语言。
--enable-threads=posix 启用多线程的 C++ 异常处理机制。
--enable-__cxa_atexit 运行使用 __cxa_atexit 函数。
--enable-languages=c,c++ 安装 C 和 C++ 语言的编译器。
--disable-libstdcxx-pch 不编译 libstdc++ 的预处理头文件,它会占用很大的磁盘空间,对我们也没有用。
make 的时候不要在使用 bootstrap 目标了,因为编译 gcc 的编译器是我们之前从同一个版本的源代码编译出来的。
make -k check 运行测试,-k 选项让遇到测试失败的时候不会立即停下来,gcc 的测试非常的全面,难保中间不会有几个失败的。

编译完成后我们需要再进行验证下:

lfs:~$ echo "main(){}" > dummy.c
lfs:~$ cc dummy.c
lfs:~$ readelf -l a.out | grep ': /tools'
      [Requesting program interpreter: /tools/lib/ld-linux.so.2]
lfs:~$ rm dummy.c a.out

如果没有看到 /tools/lib/ld-linux.so.2 这样的输出,在继续往下之前就需要重新检查上面的步骤了。

2.10 第二次编译 Binutils

lfs:~$ cat > build_binutils2.sh <<  "EOF"
> cd $LFS/sources
> rm -r -f binutils-build
> rm -r -f binutils-2.17
> tar xvf binutils-2.17.tar.bz2
> mkdir binutils-build
> cd binutils-build
> ../binutils-2.17/configure --prefix=/tools --disable-nls --with-lib-path=/tools/lib
> make
> make check
> make install
> make -C ld clean
> make -C ld LIB_PATH=/usr/lib:/lib
> cp ld/ld-new /tools/bin
> cd
> echo -e "\aFinished"
> EOF
lfs:~$ source build_binutils2.sh

一样的,我们先删除了第一次编译时留下的文件,然后重新解压来进行编译。

注意现在开始我们会在脚本的最后加上一句 echo -e "\aFinished",这样脚本编译完成后会发出“咚”的一声,如果编译时间太长,你可以去做其他事情,编译完成后起到提醒的作用。

2.11 编译工具

编译环境完成后我们还需要一系列的工具,这些工具在我们进入临时环境后将方便我们的操作,为了简便,我把 LFS 6.3 中一些简单的工具放到了一起,它们包括:

Ncurses: 独立于终端的字符处理库;
Bash:最常用的 Shell 终端;
Bzip2:Bzip2 包含了对文件进行压缩和解压缩的工具,对于文本文件,bzip2 比传统的 gzip拥有更高压缩比;
Coreutils:软件包包括一整套用于显示和设置基本系统特征的工具;
Diffutils:软件包里的程序可以显示两个文件或目录的差异;
Findutils:软件包包含查找文件的程序。这些程序被用来递归搜索目录树,并会创建,处理和搜索一个数据库 (通常比递归查找快但是在数据库没有及时更新的情况下, 结果并不可靠);
Gawk:软件包包含处理文本文件的程序;
Gettext:包含用于系统的国际化和本地化的工具,这些工具允许用 NLS (本国语言支持)来编译程序,而以用户本国的语言输出消息;
Grep:包含查找文件中内容的程序;
Gzip:软件包包含了压缩和解压文件的程序;
Make:软件包包含一个编译软件包的程序;
Patch:软件包包含一个根据“patch”文件来修改或建立文件的程序。补丁文件通常是用 diff 程序创建的;
Perl:软件包包含实用萃取与报告语言;
Sed:软件包包含一个流编辑器;
Tar:软件包含有一个归档程序;
Texinfo:软件包包含读取、写入和转换成 Info 文档的程序;
Util-linux:包含许多的工具程序,包括文件系统,控制台,分区,消息等等。

安装脚本如下,由于内容较多,最好使用 vi build_tools.sh 来进行编辑:

cd $LFS/sources
tar xvf ncurses-5.6.tar.gz
cd ncurses-5.6
./configure --prefix=/tools --with-shared  --without-debug --without-ada --enabl                                                                                                             e-overwrite
make
make install

cd $LFS/sources
tar xvf bash-3.2.tar.gz
cd bash-3.2
patch -Np1 -i ../bash-3.2-fixes-5.patch
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install
ln -vs bash /tools/bin/sh

cd $LFS/sources
tar xvf  bzip2-1.0.4.tar.gz
cd bzip2-1.0.4
make
make PREFIX=/tools install

cd $LFS/sources
tar xvf coreutils-6.9.tar.bz2
cd coreutils-6.9
./configure --prefix=/tools
make
make RUN_EXPENSIVE_TESTS=yes check
make install
cp -v src/su /tools/bin/su-tools

cd $LFS/sources
tar xvf diffutils-2.8.1.tar.gz
cd diffutils-2.8.1
./configure --prefix=/tools
make
make install

cd $LFS/sources
tar xvf findutils-4.2.31.tar.gz
cd findutils-4.2.31
./configure --prefix=/tools
make
make install

cd $LFS/sources
tar xvf gawk-3.1.5.tar.bz2
cd  gawk-3.1.5
./configure --prefix=/tools
echo -e "\n#define HAVE_LANGINFO_CODESET 1\n#define HAVE_LC_MESSAGES 1\n" >> config.h
make
make check
make install

cd $LFS/sources
tar xvf gettext-0.16.1.tar.gz
cd gettext-0.16.1/gettext-tools
./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp -v src/msgfmt /tools/bin

cd $LFS/sources
tar xvf grep-2.5.1a.tar.bz2
cd grep-2.5.1a
./configure --prefix=/tools --disable-perl-regexp
make
make check
make install

cd $LFS/sources
tar xvf gzip-1.3.12.tar.gz
cd gzip-1.3.12
./configure --prefix=/tools
make
make check
make install

cd $LFS/sources
tar xvf make-3.81.tar.bz2
cd make-3.81
./configure --prefix=/tools
make
make check
make install

cd $LFS/sources
tar xvf patch-2.5.4.tar.gz
cd  patch-2.5.4
./configure --prefix=/tools
make
make install

cd $LFS/sources
tar xvf  perl-5.8.8.tar.bz2
cd  perl-5.8.8
patch -Np1 -i ../perl-5.8.8-libc-2.patch
./configure.gnu --prefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perl utilities
cp -v perl pod/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.8.8
cp -Rv lib/* /tools/lib/perl5/5.8.8

cd $LFS/sources
tar xvf sed-4.1.5.tar.gz
cd sed-4.1.5
./configure --prefix=/tools
make
make check
make install

cd $LFS/sources
tar xvf tar-1.18.tar.bz2
cd tar-1.18
./configure --prefix=/tools
make
make check
make install

cd $LFS/sources
tar xvf texinfo-4.9.tar.bz2
cd texinfo-4.9
./configure --prefix=/tools
make
make check
make install

cd $LFS/sources
tar xvf util-linux-2.12r.tar.bz2
cd util-linux-2.12r
sed -i 's@/usr/include@/tools/include@g' configure
./configure
make -C lib
make -C mount mount umount
make -C text-utils more
cp -v mount/{,u}mount text-utils/more /tools/bin

cd
echo -e "\aFinished"

脚本编辑完成后开始安装:

lfs:~$ source build_tools.sh

同样,安装完成后会收到声音提示的。

下面的脚本用于验证以上的安装是否成功:

#!/bin/bash

function check_tool() {
    local name=$1
    local val=$2

    echo -e -n "check $1...\t"
    if [ "$val" = "" ]; then
       echo -e "\e[1;31m[FAILED]\e[0m"
    else
       echo -e "\e[1;32m[OK]\e[0m"
    fi
}

check_tool "Ncurses" `ls /tools/lib/libncurse* | grep /tools`
check_tool "Bash" `which bash | grep /tools`
check_tool "Bzip2" `which bzip2 | grep /tools`
check_tool "Coreutils" `which chown | grep /tools`
check_tool "Diffutils" `which diff | grep /tools`
check_tool "Findutils" `which find | grep /tools`
check_tool "Gawk" `which awk | grep /tools`
check_tool "Gettext" `which msgfmt | grep /tools`
check_tool "Grep" `which grep | grep /tools`
check_tool "Gzip" `which gzip | grep /tools`
check_tool "Patch" `which patch | grep /tools`
check_tool "Perl" `which perl | grep /tools`
check_tool "Sed" `which sed | grep /tools`
check_tool "Tar" `which tar | grep /tools`
check_tool "Texinfo" `which info | grep /tools`
check_tool "Util-linux" `which mount | grep /tools`

运行后你应该看到:

如果出现了红色的 [FAILED] 你就要检查一些对于的软件包了。

2.12 编译 VIM

LFS 6.3 在编译临时工具的时候并没有包含vim,虽然之后的过程可以不使用vim来完成,但是如果有这个工具在的话会方便很多,所以这里我们先编译一个临时版本来使用。编译过程如下:

lfs:~$ cd $LFS/sources
lfs:/mnt/lfs/sources$ tar xvf vim-7.1.tar.bz2
...
lfs:/mnt/lfs/sources$ cd vim71
lfs:/mnt/lfs/sources/vim71$ patch -Np1 -i ../vim-7.1-fixes-1.patch
...
lfs:/mnt/lfs/sources/vim71$ ./configure --prefix=/tools --enable-gui=no --without-x
...
lfs:/mnt/lfs/sources/vim71$ make
...
lfs:/mnt/lfs/sources/vim71$ make test
...
lfs:/mnt/lfs/sources/vim71$ make install
...
lfs:/mnt/lfs/sources/vim71$ which vim
/tools/bin/vim
lfs:/mnt/lfs/sources/vim71$ ln -sv vim /tools/bin/vi
`/tools/bin/vi' -> `vim'

--enable-gui=no, --without-x 由于当前的 LiveCD 系统安装了 X-Windows,必须使用此选项来禁用 GUI 和连接 x windows。否则会无法编译。

   上一章   回目录   下一章   

▲评论

› 网友 zero () 于 2014-02-27 16:40:28 发表评论说:

mv -v /tools/bin/{ld-new,ld} 有问题

mv: cannot stat `/tools/bin/ld-new': No such file or directory

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com