❏ 站外平台:

重走LFS之路:(五) 工具链编译-2

作者: @郝平睿

| 2015-04-06 10:52   评论: 8 收藏: 2    

(题图来自: techradar.com)

继续来编译工具,接下来编译Glibc

if [ ! -r /usr/include/rpc/types.h ]; then
su -c ‘mkdir -pv /usr/include/rpc’
su -c ‘cp -v sunrpc/rpc/*.h /usr/include/rpc’
fi

tar -xf glibc-2.21.tar.xz
cd glibc-2.21/
mkdir -v ../glibc-build
cd ../glibc-build/

../glibc-2.21/configure \
–prefix=/tools \
–host=$LFS_TGT \
–build=$(../glibc-2.21/scripts/config.guess) \
–disable-profile \
–enable-kernel=2.6.32 \
–with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_ctors_header=yes \
libc_cv_c_cleanup=yes

make
make install

编译安装没什么新鲜的,不同的是需要测试一下

echo ‘main(){}’ > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ‘: /tools’

这时候回显一行

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

最后删除测试文件

rm -v dummy.c a.out

编译Libstdc++有点麻烦,需要先重命名一下gcc-build,免得和上次的编译目录掺和了

回到$LFS/src,然后执行以下命令

mv gcc-build gcc-build.first

新建gcc-build目录

mkdir -pv  gcc-build
cd gcc-build

调整Libstdc++配置

../gcc-4.9.2/libstdc++-v3/configure \
–host=$LFS_TGT \
–prefix=/tools \
–disable-multilib \
–disable-shared \
–disable-nls \
–disable-libstdcxx-threads \
–disable-libstdcxx-pch \
–with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.9.2

然后编译安装就好了

make
make install

进度很快,我们要二次编译binutils了

在此之前,我们需要回到$LFS/src,然后重命名binutils-build,再新建一个

mv binutils-build binutils-build.first
mkdir -v binutils-build
cd binutils-build

CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../binutils-2.25/configure \
–prefix=/tools \
–disable-nls \
–disable-werror \
–with-lib-path=/tools/lib \
–with-sysroot

编译安装

make
make install

第二次编译安装binutils之后,需要调整一下连接器来进行主体编译

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

至此binutils二次编译安装调整完毕,接下来要进行gcc的二次编译

进入gcc源码目录

cd $LFS/src/gcc-4.9.2

我们需要先写一个限制文件

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

然后调整一下编译环境

for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e ‘s@/lib\(64\)\?\(32\)\?/ld@/tools&@g’ \
-e ‘s@/usr@/tools@g’ $file.orig > $file
echo ‘
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 “/tools/lib/”
#define STANDARD_STARTFILE_PREFIX_2 “”‘ >> $file
touch $file.orig
done

加入mpfr,gmp,mpc三个包的支持

tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

重命名libc++编译的目录

mv ../gcc-build ../gcc-build.libc++

新建编译目录

mkdir -v ../gcc-build
cd ../gcc-build

配置编译选项

CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../gcc-4.9.2/configure \
–prefix=/tools \
–with-local-prefix=/tools \
–with-native-system-header-dir=/tools/include \
–enable-languages=c,c++ \
–disable-libstdcxx-pch \
–disable-multilib \
–disable-bootstrap \
–disable-libgomp

编译后安装

make
make install

在这之后我们需要做个软连接

ln -sv gcc /tools/bin/cc

接下来写个文件测试一下

echo ‘main(){}’ > dummy.c
cc dummy.c
readelf -l a.out | grep ‘: /tools’

回显应该还是这个

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

最后清理一下测试文件

rm -v dummy.c a.out

两次编译binutils和gcc之后,进入tcl的编译安装

回到$LFS/src目录,解压tcl源码

tar zxvf tcl8.6.3-src.tar.gz
cd tcl8.6.3
cd unix

配置编译选项

./configure –prefix=/tools

编译并测试

make

TZ=UTC make test

6-tcltest

这个此时结果里面有几个数,Total是一共做了多少项测试,Passed是这些测试中通过了多少项,Skipped是跳过了几项测试,Failed是这些测试中有多少失败了。

从这份结果中,我们可以看到tcl编译完全正常,一共116项测试,全部通过,这就意味着可以安装了

make install

下面给tcl库文件加上属主的写权限

chmod -v u+w /tools/lib/libtcl8.6.so

回显应该是这样

mode of `/tools/lib/libtcl8.6.so’ changed from 0555 (r-xr-xr-x) to 0755 (rwxr-xr-x)

安装tcl的头

make install-private-headers

回显应该是这样

Installing private header files to /tools/include/

做个软连接

ln -sv tclsh8.6 /tools/bin/tclsh

继续进行expect编译,解压并进入expect目录

tar zxvf expect5.45.tar.gz
cd expect5.45

首先得重写configure文件

cp -v configure{,.orig}
sed ‘s:/usr/local/bin:/bin:’ configure.orig > configure

配置编译选项

./configure –prefix=/tools \
–with-tcl=/tools/lib \
–with-tclinclude=/tools/include

编译和测试

make
make test

7-excepttest

本次测试我们发现一共有26个用例,其中通过了15个,有11个失败了。不过在LFS 7.7的官方文档中有这么一句

Note that the Expect test suite is known to experience failures under certain host conditions that are not within our
control. Therefore, test suite failures here are not surprising and are not considered critical.

这就说明测试用例失败不代表主要依据,所以我们继续往下安装,只要安装和使用不出问题,就没关系。

make SCRIPTS=”” install

安装没有报错,所以我们不必担心那近乎一半的测试用例失败。

继续我们回到$LFS/src并解压并配置编译DejaGNU

tar zxvf dejagnu-1.5.2.tar.gz
cd dejagnu-1.5.2
./configure –prefix=/tools

这个配置完编译选项之后可以直接安装并检查编译

make install
make check

8-dejagnutest

测试结果Summary显示有68个测试通过,没有失败信息

接下来是check的编译安装,check有点特殊的是,在配置编译选项的时候,需要将配置结果设置一个变量。回到$LFS/src,解压并进入源码目录

tar zxvf check-0.9.14.tar.gz
cd check-0.9.14

开始配置编译选项

PKG_CONFIG= ./configure –prefix=/tools

除了这个没什么新鲜的,就是configure的最后有个Summary of Check options

9-checkcfgsummary

再就是编译和编译检查

make
make check

10-checktestpass

检查结果显示,7个测试全部通过,安装即可

make install

安装成功后回到$LFS/src,继续解压ncurses并进入源码目录

cd $LFS/src
tar zxvf ncurses-5.9.tar.gz
cd ncurses-5.9

下面的倒是没新鲜的,配置编译选项并且编译安装就可以了

./configure –prefix=/tools \
–with-shared \
–without-debug \
–without-ada \
–enable-widec \
–enable-overwrite

make
make install

回到$LFS/src,解压bash并进入源码目录

cd $LFS/src
tar zxvf bash-4.3.30.tar.gz
cd bash-4.3.30

配置编译选项并且编译

./configure –prefix=/tools –without-bash-malloc

进行编译测试并且安装

make tests
make install

再加个软连接就完成了

ln -sv bash /tools/bin/sh

解压编译安装bzip2

cd $LFS/src
tar zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make PREFIX=/tools install

来进行编译coreutils,还是先回到$LFS/src,再解压并进入coreutils源码目录

cd $LFS/src
tar -xf coreutils-8.23.tar.xz
cd coreutils-8.23

配置coreutils的编译选项

./configure –prefix=/tools –enable-install-program=hostname

编译后测试,这次测试需要加个选项

make
make RUN_EXPENSIVE_TESTS=yes check

11-coreutilstestpass

测试结果显示,共306项测试,通过270项,跳过36项,没有失败和错误,继续安装就可以了

make install

接下来的diffutils没有新鲜的,配置安装路径后编译,检查安装就好了

cd $LFS/src
tar -xf diffutils-3.3.tar.xz
cd diffutils-3.3
./configure –prefix=/tools
make
make check

12-diffutilstestpass

测试结果显示共140项,通过112项,跳过28项,可以正常安装

make install

接下来的file也如是一样

cd $LFS/src
tar zxvf file-5.22.tar.gz
cd file-5.22
./configure –prefix=/tools
make
make check
make install

下一个是findutils,同样的步骤

cd $LFS/src
tar zxvf findutils-4.4.2.tar.gz
cd findutils-4.4.2
./configure –prefix=/tools
make
make check

13-findutilstestpass

测试结果表明,28项测试全部通过,没有失败记录,可以安装

make install

继续下一个软件编译,gawk过程也没新鲜的,老规矩

cd $LFS/src
tar -xf gawk-4.1.1.tar.xz
cd gawk-4.1.1
./configure –prefix=/tools
make
make check

14-gawktestfailed

检查结果认为有6项测试失败,先不去理会,继续安装

make install

下一个软件是gettext,这个稍微有点复杂

首先依旧进入$LFS/src来解压并进入源码目录

cd $LFS/src
tar -xf gettext-0.19.4.tar.xz
cd gettext-0.19.4

先进入gettext-tools目录

cd gettext-tools

配置编译选项

EMACS=”no” ./configure –prefix=/tools –disable-shared

接下来需要分别编译

make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext

之后来手动安装到/tools/bin下面

cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin

继续解压编译安装grep

tar -xf grep-2.21.tar.xz
cd grep-2.21
./configure –prefix=/tools
make
make check

15-greptestpass

测试结果显示共测试138项,通过120项,跳过18项,可以正常安装

make install

接下来的gzip也如是一样

cd $LFS/src
tar -xf gzip-1.6.tar.xz
cd gzip-1.6
./configure –prefix=/tools
make
make check

16-gziptestpass

检测结果显示共15项测试,通过15项,可以正常安装

make install

继续下一个,M4的编译安装

cd $LFS/src
tar -xf m4-1.4.17.tar.xz
cd m4-1.4.17
./configure –prefix=/tools
make
make check

17-m4testpass

检查结果显示,共163项测试,通过142项,跳过21项,可以正常安装

make install

继续来编译make

cd $LFS/src
tar jxvf make-4.1.tar.bz2
./configure –prefix=/tools –without-guile
make
make check

18-maketestpass

检测结果显示,共544项测试,没有失败,可以正常安装

make install

大部分的工具软件都是指定一下prefix参数就可以编译安装了,只有个别的需要做一下其他的调整。随后,还会有一部分工具需要编译安装。



最新评论

[1]
来自 - 上海 的 Firefox/Windows 用户 发表于 2015-04-08 08:44 的评论:
记流水账,没有任何干货,跟着走一趟也是知其然而不知其所以然。
来自上海的 Firefox 70.0|Windows 10 用户 2019-12-13 10:13 1 回复
人家自己记录东西,你自己要看又没收你的钱
[1]
落沙有声 [Firefox 48.0|Windows 7] 发表于 2016-09-18 16:13 的评论:
第二次编译binutils出错。怎么办呢?如下:
checking size of char... 0
checking for type equivalent to int8_t... configure: error: no 8-bit type, please report a bug
make[1]: *** [configure-bfd] Error 1
make[1]: Leaving directory `/mnt/lfs/sources/binutils-build'
make: *** [all] Error 2
[2]
linux [Chrome 53.0|Mac 10.11] 发表于 2016-09-19 12:04 的评论:
不要看这个系列了,已经太监了。建议看我们 LCTT 翻译的 LFS 手册: https://linux.cn/article-4130-1.html#3_11394
[3]
落沙有声 [Firefox 48.0|Windows 7] 发表于 2016-09-19 14:12 的评论:
我就是看你们LCTT翻译的手册,一步步来的,结果总出错。
linux [Chrome 53.0|Mac 10.11] 2016-09-20 19:15 3 回复
一定是前面某个地方出了一点小小的错误,积累到后面就会出现很多错。
来自 - 上海 的 Firefox/Windows 用户 2015-04-08 08:45 2 回复
作者只是在装逼秀优越感
来自 - 湖北武汉 的 Chrome/Windows 用户 2015-04-06 13:53 9 回复
打算跟着走一趟

返回顶部

分享到微信

打开微信,点击顶部的“╋”,
使用“扫一扫”将网页分享至微信。