重走LFS之路:(五) 工具鏈編譯-2

@郝平睿發表於2015-04-06

(題圖來自: 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引數就可以編譯安裝了,只有個別的需要做一下其他的調整。隨後,還會有一部分工具需要編譯安裝。

相關文章