重走LFS之路:(九) 基礎系統編譯-2

@郝平睿發表於2022-11-27

(題圖來自: techradar.com)

GMP-6.0.0a

GMP編譯有點不同,在編譯選項配置階段需要確定架構

還是先進入/src,解壓並進入GMP原始碼目錄

cd /src
tar xf gmp-6.0.0a.tar.xz
cd gmp-6.0.0

如果是x86 – 32bit,則需要在配置編譯選項時前面加點東西

ABI=32 ./configure …

如果是x86_64就繼續配置編譯選項

./configure –prefix=/usr \
–enable-cxx \
–docdir=/usr/share/doc/gmp-6.0.0a

GMP是有文件需要生成的,所以這一步編譯之後要再生成一下文件

make
make html

進行編譯測試並生成測試日誌

make check 2>&1 | tee gmp-check-log

從測試日誌中找出測試透過的結果總數,共有188項測試

awk ‘/tests passed/{total+=$2} ; END{print total}’ gmp-check-log

2-gmptest

測試全部透過,這時要安裝兩部分,一部分是GMP,還有它的文件

make install
make install-html

MPFR-3.1.2

回到/src目錄,解壓並進入mpfr的原始碼目錄

cd /src
tar xf mpfr-3.1.2.tar.xz
cd mpfr-3.1.2

MPFR是需要先打補丁再配置和編譯的

patch -Np1 -i ../mpfr-3.1.2-upstream_fixes-3.patch

配置編譯選項

./configure –prefix=/usr \
–enable-thread-safe \
–docdir=/usr/share/doc/mpfr-3.1.2

依然是編譯和生成文件

make
make html

檢查編譯

make check

安裝MPFR和它的文件

make install
make install-html

MPC-1.0.2

依然是回到/src目錄來解壓和進入MPC原始碼目錄

cd /src
tar zxvf mpc-1.0.2.tar.gz
cd mpc-1.0.2

配置編譯選項時有點不同,需要指定文件安裝目錄

./configure –prefix=/usr –docdir=/usr/share/doc/mpc-1.0.2

編譯和生成文件

make
make html

編譯檢查

make check

安裝MPC和文件

make install
make install-html

GCC-4.9.2

再次編譯GCC,我們至少應該編譯過兩遍以上了,非常熟悉

依舊是進入/src/gcc-4.9.2,由於以前編譯過,先把gcc-build重新命名,再新建一個空目錄構建

cd /src/gcc-4.9.2
mv ../gcc-build ../gcc-build.tool
mkdir -v ../gcc-build
cd ../gcc-build

定義SED變數為sed的別名,然後配置編譯選項

SED=sed \
../gcc-4.9.2/configure \
–prefix=/usr \
–enable-languages=c,c++ \
–disable-multilib \
–disable-bootstrap \
–with-system-zlib

編譯GCC

make

編譯完成,在測試之前需要修改堆疊限制

ulimit -s 32768

執行編譯測試

make -k check

實測這個測試要做好久好久,如果你不是強迫症患者,可以選擇跳過這一步……

如果你是強迫症患者沒有跳過測試,那麼在測試完成後可以執行一個指令碼來檢視結果

../gcc-4.9.2/contrib/test_summary

沒什麼事就安裝吧

make install

只不過在安裝之後,GCC需要手動去做符號連結

ln -sv ../usr/bin/cpp /lib
ln -sv gcc /usr/bin/cc
install -v -dm755 /usr/lib/bfd-plugins
ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/4.9.2/liblto_plugin.so /usr/lib/bfd-plugins/

下面來進行測試

echo ‘main(){}’ > dummy.c
cc dummy.c -v -Wl,–verbose &> dummy.log
readelf -l a.out | grep ‘: /lib’

我這裡是什麼都沒顯示,文件說要顯示個東西

[Requesting program interpreter: /lib/ld-linux.so.2]

然後要檢視日誌

grep -o ‘/usr/lib.*/crt[1in].*succeeded’ dummy.log
grep -B4 ‘^ /usr/include’ dummy.log
grep ‘SEARCH.*/usr/lib’ dummy.log |sed ‘s|; |\n|g’
grep “/lib.*/libc.so.6 ” dummy.log
grep found dummy.log

這幾個只要有顯示,沒報錯,就應該沒啥問題

清理測試現場

rm -v dummy.c a.out dummy.log

最後安裝一些其他的檔案

mkdir -pv /usr/share/gdb/auto-load/usr/lib
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

據說到這時候GCC就安裝完成了。

Bzip2-1.0.6

這也是個得打補丁的東西,而且還得改兩行Makefile

cd /src
rm -rf /src/bzip2-1.0.6
tar zxvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
sed -i ‘s@\(ln -s -f \)$(PREFIX)/bin/@\1@’ Makefile
sed -i “s@(PREFIX)/man@(PREFIX)/share/man@g” Makefile

這裡有個準備編譯,如果是在上次編譯的那個目錄裡做的話,這一步會報錯

make -f Makefile-libbz2_so
make clean

編譯和安裝

make
make PREFIX=/usr install

還需要手動安裝模組檔案和建立符號連結

cp -v bzip2-shared /bin/bzip2
cp -av libbz2.so* /lib
ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
rm -v /usr/bin/{bunzip2,bzcat,bzip2}
ln -sv bzip2 /bin/bunzip2
ln -sv bzip2 /bin/bzcat

Pkg-config-0.28

回到/src,解壓並進入原始碼目錄

cd /src
tar zxvf pkg-config-0.28.tar.gz
cd pkg-config-0.28

編譯選項配置的時候會有幾個引數調整

./configure –prefix=/usr \
–with-internal-glib \
–disable-host-tool \
–docdir=/usr/share/doc/pkg-config-0.28

然後編譯,測試,安裝一氣呵成

make
make check
make install

Ncurses-5.9

由於以前編譯過,所以需要重新命名後再重新解壓原始碼目錄

cd /src
mv ncurses-5.9 ncurses-5.9.tool
tar zxvf ncurses-5.9.tar.gz
cd ncurses-5.9

調整幾個編譯配置

./configure –prefix=/usr \
–mandir=/usr/share/man \
–with-shared \
–without-debug \
–enable-pc-files \
–enable-widec

編譯安裝

make
make install

還需要手工安裝模組和簡歷符號連結

mv -v /usr/lib/libncursesw.so.5* /lib

ln -sfv ../../lib/$(readlink /usr/lib/libncursesw.so) /usr/lib/libncursesw.so

for lib in ncurses form panel menu ; do
rm -vf /usr/lib/lib${lib}.so
echo “INPUT(-l${lib}w)” > /usr/lib/lib${lib}.so
ln -sfv lib${lib}w.a /usr/lib/lib${lib}.a
ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc
done

ln -sfv libncurses++w.a /usr/lib/libncurses++.a

rm -vf /usr/lib/libcursesw.so
echo “INPUT(-lncursesw)” > /usr/lib/libcursesw.so
ln -sfv libncurses.so /usr/lib/libcurses.so
ln -sfv libncursesw.a /usr/lib/libcursesw.a
ln -sfv libncurses.a /usr/lib/libcurses.a

最後來安裝文件

mkdir -v /usr/share/doc/ncurses-5.9
cp -v -R doc/* /usr/share/doc/ncurses-5.9

但是這時候有個問題,它不支援非寬字符集,我們需要再做點事情

make distclean
./configure –prefix=/usr \
–with-shared \
–without-normal \
–without-debug \
–without-cxx-binding
make sources libs
cp -av lib/lib*.so.5* /usr/lib

 

相關文章