所有文檔和軟件包已經上傳到fdl兄的FTP:
ftp://Linuxsir:
[email protected] 現在在upload的pure lfs目錄裡。
我使用的文檔:
Pure lfs 1.0 (http://lfs.cosoft.org.cn/plfs)
lfs-20030219 (http://lfs.cosoft.org.cn)
01-buildscripts-2.2.6(http://www.linuxsir.com/bbs/attachm...p?postid=165148)
先是按照build-init-2.2.6.sh腳本裡所使用的軟件包版本號下載,下載的地址可以到freshmeat.net上搜。由於我將使用coreutils,所以就沒有下載 fileutils, sh-utils 和 textutils.又到http://www.linuxfromscratch.org/~greg
那裡下載了所有補丁。
詳細的版本:
BINUTILS_VER=2.13.2.1(還下了2.13.90.0.18和2.13.2)
GCC_VER=3.2.2(還下了一個2.95.3的)
KERNEL_VER=2.4.20
GLIBC_VER=2.3.2(以及配套的linux-threads)
ZLIB_VER=1.1.4
GAWK_VER=3.1.1
COREUTILS_VER=4.5.9
BZIP2_VER=1.0.2
GZIP_VER=1.3.3
DIFFUTILS_VER=2.8.1
FINDUTILS_VER=4.1.7(如果是4.1版,還需要findutils-4.1.patch,在http://downloads.linuxfromscratch.org/)
BISON_VER=1.875
FLEX_VER=2.5.27
M4_VER=1.4
MAKE_VER=3.80
GREP_VER=2.5.1
SED_VER=4.0.5
GETTEXT_VER=0.11.5
NCURSES_VER=5.3
PATCH_VER=2.5.4
TAR_VER=1.13(還需要一個補丁,tar-1.13.patch,在http://downloads.linuxfromscratch.org/)
TEXINFO_VER=4.5(腳本裡是用的4.3,我沒找到,又懶得patch -R,就用了4.5的)
BASH_VER=2.05b
UTILLINUX_VER=2.11z
PERL_VER=5.8.0
TCL_VER=8.4.2
EXPECT_VER=5.38
DEJAGNU_VER=1.4.3
MAKEDEV_VER=1.7
然後是創建分區,創建文件系統(reiserfs),分區加載到/mnt/plfs。創建文件系統的命令可以參考blfs文檔章 5. 文件系統的安裝reiserfsprogs的內容(應該都裝了吧),安裝了以後:
mkreiserfs /dev/hdx
添加lfs用戶後,按照pure lfs文檔裡的內容來創建$LFS/stage1:
mkdir $LFS/stage1
chown lfs $LFS/stage1
ln -s $LFS/stage1 /
我建立了$LFS/stage1目錄,把源碼和補丁都拷貝進去,又把源碼的所有者改成lfs用戶:
chown -R lfs /mnt/plfs/stage1/
然後就切換到lfs用戶:
su - lfs
又設置lfs用戶的環境變量:
cat > ~/.bash_profile << "EOF"
set +h
umask 022
LFS=/mnt/plfs
LC_ALL=POSIX
LDFLAGS="-s"
PATH=/stage1/bin:$PATH
unset LANG CFLAGS CXXFLAGS CC
export LFS LC_ALL LDFLAGS PATH
EOF
source ~/.bash_profile
上面的內容裡,我加了一行unset命令,主要是用來去掉我系統裡的影響,因為我在系統裡是設置了這幾個變量的,如果不unset,有可能影響到pure lfs的編譯。這裡不用優化的,因為沒有這個必要,現在編譯的包,只有binutils,gcc和glibc在最後的系統裡用到,而這幾個包最好不要用優化。在腳本裡有兩個設置:
unset LD_LIBRARY_PATH
unset LD_PRELOAD
我在lfs用戶下echo了一下,這兩個變量並沒有值,所以就沒加上。
腳本裡還有關於時區和locale的設置,我都沒有設。
下面就開始安裝了。
在主系統裡安裝tcl,expect和dejagnu。這是為了測試靜態的binutils和gcc,並且,在裝了這三個包以後,第五章所有的測試都可以用它們來完成。
這三個包的安裝很簡單,都是:
./configure --prefix=/usr &&
make &&
make install
其中expect要先打一個補丁。在文檔裡說:額外的注意事項 - 你必須加載了/dev/pts(或使用devfs)才能讓dejagnu測試套件工作正常。
所以我進/dev/pts裡看了一下,有0,1兩個終端,挺正常的。
第五章 - 安裝 binutils - Pass 1 (靜態)
這一步有一些周折,看完了再裝。
我首先看了一下腳本(init)裡的check-binutils函數。它主要是測試三個變量是否應該設置上,還可能做一處修改(下面的第三處)。
然後嘗試安裝2.13.90.0.18:
手動做check-binutils裡面的測試:
grep configure-host Makefile.in > /dev/null 2>&1 &&
export BINUTILS_CONF_HOST=Y
export BINUTILS_CONF_HOST=N
echo -e " o Requires 'make configure-host' ........... ${BINUTILS_CONF_HOST}"
grep with-lib-path ld/configure > /dev/null 2>&1 &&
export BINUTILS_WITH_LIB_PATH=Y
export BINUTILS_WITH_LIB_PATH=N
echo -e " o Has '--with-lib-path=' configure option .. ${BINUTILS_WITH_LIB_PATH}\n"
grep "GENSCRIPTS = LIB_PATH" ld/Makefile.in > /dev/null 2>&1
{
echo " o adding 'LIB_PATH = \$(LIB_PATH)' to GENSCRIPTS definition"
echo " in ld/Makefile.in"
echo " ( Passes value of LIB_PATH to genscripts.sh environment"
echo -e " for ldscript creation. )\n"
}
前兩步測試的結果都把變量設置成Y了,記住這兩個變量的值,以後會用到。第三步測試的結果是不用修改。 如果要修改,命令應該是:
test -f ld/Makefile.in-ORIG
cp ld/Makefile.in ld/Makefile.in-ORIG
cd ld
sed 's@GENSCRIPTS = \$\(SHELL\)@GENSCRIPTS = LIB_PATH=\$\(LIB_PATH\) @g' Makefile.in-ORIG > Makefile.in
然後開始編譯:
mkdir ../binutils-static-build &&
cd ../binutils-static-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 \
--disable-nls tee mybinutils.log
注意上面的命令裡有通配符。如果有兩個目錄都符合,就麻煩了。
這時候出錯了:
checking for i686-pc-linux-gnu-ar... no
後面一串都是no
換版本。換了2.13.2.1,重復上面的測試,前兩個是N,後一個要修改。可是我的LIB_PATH變量是空的啊!不管,先做了再說。用了修改命令後,查看一下ld/Makefile.in,發現沒有改過來,只好手動來改,找到:
GENSCRIPTS = $(SHELL)
只有一處,改成:
@GENSCRIPTS = LIB_PATH=$(LIB_PATH)
再編譯:
mkdir ../binutils-static-build &&
cd ../binutils-static-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 \
--disable-nls tee mybinutils.log &&
make LDFLAGS="-all-static -s" &&
make check &&
make install
因為BINUTILS_CONF_HOST=N,就不用make configure-host了。make check也順利通過。
下面是為了以後做准備:
cd ld &&
make clean &&
make LIB_PATH=/stage1/lib
第五章 - 安裝 gcc - Pass 1 (靜態)
我用的是完整的大包,而不是gcc-core。
運用gcc-3.2.2.mmap_test補丁,但不運用nofixincludes補丁,而是用命令來代替:
cd gcc
test -f Makefile.in-ORIG
cp Makefile.in Makefile.in-ORIG
grep -Ev '(README ./fixinc.sh )' Makefile.in-ORIG \
sed 's@LIBGCC2_DEBUG_CFLAGS = -g@LIBGCC2_DEBUG_CFLAGS =@g' \
> Makefile.in
用diff命令看了一下,修改的確做了。
我又用了gcc-3.2.2.libgcc_no_debug.patch補丁,沒用上,說是已經改過了,看了一下,的確在上面的sed命令裡改的就是這個,所以沒有必要用它了。
編譯:
mkdir ../gcc-static-build &&
cd ../gcc-static-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 -k check tee mygcccheck.log
make install &&
ln -sf gcc /stage1/bin/cc
上面make -k check的結果是:
# of expected passes 18919
# of expected failures 68
# of unsupported tests 44
算是通過了吧。
閒話:
看了一下config.cache,裡面有:
gcc_cv_as_hidden="yes"
應該不會有那個gcc不能認大於三位版本號的binutils的bug了。
又仔細看了一下gcc目錄下configure文件,和以前的相比,多了一項,也就是能認四位版本號的了,但是5位的怎麼辦呢?下面兩個命令,第一個是gcc-3.2.2裡面的,沒錯,第二個是gcc-3.2.1裡面的,不行。
ld_vers=`echo $ld_ver sed -n 's,^.*[ ]\([0-9][0-9]*\.[0-9][0-9]*\(\\.[0-9][0-9]*\(\\.[0-9][0-9]*\)\)\)\([ ].*\\)$,\1,p'`
d_vers=`echo $ld_ver sed -n 's,^.*[ ]\([0-9][0-9]*\.[0-9][0-9]*\(\\.[0-9][0-9]*\)\)\([ ].*\\)$,\1,p'`
ld_date=`echo $ld_ver sed -n 's,^.*\([2-9][0-9][0-9][0-9]\)[-]*\([01][0-9]\)[-]*\([0-3][0-9]\).*$,\1\2\3,p'`
第五章 - 安裝內核頭文件
這裡同時安裝第五章和第六章的內核頭文件,在第六章就不用再安裝了。
make mrproper &&
make include/linux/version.h &&
make symlinks &&
for destdir in /stage1 ${LFS}/usr; do
mkdir -p ${destdir}/include/asm
yes cp include/asm/* ${destdir}/include/asm
yes cp -R include/asm-generic ${destdir}/include
yes cp -R include/linux ${destdir}/include
toUCh ${destdir}/include/linux/autoconf.h
done
這裡要注意一下,就是我是用lfs用戶來安裝的,而腳本裡是用root,所以這裡就要把$LFS的所有者改成lfs,要不然不能創建$LFS/usr目錄。
第五章 - 安裝 glibc
PLFS最大的包。要進到glibc-2.3.2目錄裡,再解壓linuxthreads:
cd glibc-2.3.2 &&
tar jxvf ../glibc-linuxthreads-2.3.2.tar.bz2
編譯:
mkdir -p /stage1/etc &&
touch /stage1/etc/ld.so.conf &&
mkdir ../glibc-init-build &&
cd ../glibc-init-build &&
CFLAGS="-O2 -pipe" ../glibc-2*/configure --prefix=/stage1 \
--enable-add-ons --disable-profile \
--with-binutils=/stage1/bin --with-headers=/stage1/include \
--without-gd &&
make &&
make check
在這裡出錯了,是文檔裡說過的libio/tst-atime錯誤,我用的是reiserfs分區,用的是defaults參數加載,後來用了defaults,atime參數加載,過了這一步。
又出了一個錯誤,是grp/testgrp.out,先用-k,看看全部結果再說:
make -k check tee mytest.log
同時查看了一下glibc-init-build/grp/testgrp.out,發現出錯的原因是我的lfs用戶沒有用戶組,100用戶組沒定義,於是在/etc/group裡面加了lfs組的定義,在/etc/passwd裡把lfs用戶的組改成這個,又把$LFS分給lfs.lfs,然後繼續測試。
這一次測試通過,順利進入下一步,安裝!
make install &&
mkdir -p /stage1/lib/locale &&
localedef -i de_DE -f ISO-8859-1 de_DE &&
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro &&
localedef -i en_HK -f ISO-8859-1 en_HK &&
localedef -i en_PH -f ISO-8859-1 en_PH &&
localedef -i en_US -f ISO-8859-1 en_US &&
localedef -i es_MX -f ISO-8859-1 es_MX &&
localedef -i fr_FR -f ISO-8859-1 fr_FR &&
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro &&
localedef -i it_IT -f ISO-8859-1 it_IT &&
localedef -i ja_JP -f EUC-JP ja_JP &&
localedef -i zh_CN -f GB2312 zh_CN.GB2312 &&
localedef -i zh_CN -f GB2312 zh_CN &&
localedef -i zh_CN -f GBK zh_CN.GBK &&
localedef -i zh_TW -f BIG5 zh_TW.Big5 &&
localedef -i zh_CN -f GB18030 zh_CN.GB18030 &&
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
第五章 5 - "鎖定" 我們的新glibc
這裡應該就是pure lfs的精髓了。
ldscripts:
cd ld && make install-data-local
specs:
export SPECFILE=/stage1/lib/gcc-lib/i686-pc-linux-gnu/*/specs &&
cp ${SPECFILE} ./XX &&
sed -e 's@/lib/ld-linux.so.2@/stage1/lib/ld-linux.so.2@g' \
-e 's@/lib/ld.so.1@/stage1/lib/ld.so.1@g' \
-e 's@/lib64/ld-linux.so.2@/stage1/lib64/ld-linux.so.2@g' \
-e 's@/lib64/ld.so.1@/stage1/lib64/ld.so.1@g' ./XX > ${SPECFILE} &&
unset SPECFILE &&
rm -f ./XX
注意上面的sed命令是腳本裡的,比文檔裡的多了三個東東。在我的機子上,後三個命令並沒有作用,我想可能是給其他架構的計算機准備的。
下面的命令是為了gcc做准備:
export ARCH=i386
第五章 - 安裝 tcl, expect 和 dejagnu
由於我在主系統裡安裝了這三個包,所以這裡就先不裝了,而是放在第五章的最後來裝。
第五章 - 安裝 gcc - Pass 2 (共享)
首先我刪除了上次解壓的gcc-3.2.2目錄。
與上一次安裝gcc前的准備差不多,運用gcc-3.2.2.mmap_test補丁,但不運用nofixincludes補丁,而是用命令來代替:
cd gcc
test -f Makefile.in-ORIG
cp Makefile.in Makefile.in-ORIG
grep -Ev '(README ./fixinc.sh )' Makefile.in-ORIG \
sed 's@LIBGCC2_DEBUG_CFLAGS = -g@LIBGCC2_DEBUG_CFLAGS =@g' \
> Makefile.in
上面的sed命令裡包含了gcc-3.2.2.libgcc_no_debug.patch的內容,所以就只用gcc-3.2.2.libstdc++_no_debug.patch就行了。其實腳本裡也有一個sed命令是干這個的,是:
cd libstdc++-v3
test -f configure-ORIG
cp configure configure-ORIG
sed s@DEBUG_FLAGS='-g'@DEBUG_FLAGS=''@g configure-ORIG > configure
不過我用的是補丁。兩種方法是一樣的。
下面就到文檔裡說的使用gcc-3*.specs.patch了,腳本裡的命令如下:
cd gcc/config/${ARCH}
for hfile in linux.h linux64.h; do
if [ -f ${hfile} ]; then
if [ ! -f ${hfile}-ORIG ]; then
cp ${hfile} ${hfile}-ORIG
fi
sed -e 's@-dynamic-linker /lib/ld-linux.so.2@-dynamic-linker /stage1/lib/ld-linux.so.2@g' \
-e 's@-dynamic-linker /lib/ld.so.1@-dynamic-linker /stage1/lib/ld.so.1@g' \
-e 's@-dynamic-linker /lib64/ld-linux.so.2@-dynamic-linker /stage1/lib64/ld-linux.so.2@g' \
-e 's@-dynamic-linker /lib64/ld.so.1@-dynamic-linker /stage1/lib64/ld.so.1@g' ${hfile}-ORIG > ${hfile}
fi
done
這裡要注意了,因為在網站上只找到gcc-3.2.1.specs.patch,沒有gcc-3.2.2的,所以就只有用命令來做。使用了上面的命令後,最好看一下linux.h文件有沒有變。linux64.h我用不到,就沒看它了。
編譯:
mkdir ../gcc-init-build &&
cd ../gcc-init-build &&
CFLAGS="-O2 -pipe" CXXFLAGS="-O2 -pipe" \
../gcc-3*/configure --prefix=/stage1 --with-local-prefix=/stage1 \
--enable-languages=c,c++ --enable-shared --enable-threads=posix \
--enable-__cxa_atexit \
--enable-version-specific-runtime-libs &&
make LDFLAGS="-s"
上面是腳本裡的設置參數,與文檔裡的有兩個不同,一個是少了--enable-clocale=gnu,另外還多了--enable-version-specific-runtime-libs
設置時有了checking assembler hidden support... yes,就放心了。
測試:
make -k check tee mygccpass2test.log
libstdc++的測試結果:
=== libstdc++-v3 Summary ===
# of expected passes 432
# of unexpected failures 1
# of unexpected successes 26
和腳本裡寫的一樣,正確了。真正關鍵的應該是下面兩個:
gcc的測試結果:
=== gcc Summary ===
# of expected passes 18919
# of expected failures 68
# of unsupported tests 44
沒有unexpected passes或failures,也正確了。
g++的測試結果:
XPASS: g++.other/init5.C Execution test
=== g++ Summary ===
# of expected passes 7368
# of unexpected successes 1
# of expected failures 88
# of untested testcases 9
# of unsupported tests 3
有一個unexpected successes,也是和腳本裡說的一樣的,OK!
安裝:
make install
test -L /stage1/bin/cc ln -s gcc /stage1/bin/cc
由於上面使用了--enable-version-specific-runtime-libs,下面還要做一步:
echo "/stage1/lib/gcc-lib/i686-pc-linux-gnu/3.2.2" >> /stage1/etc/ld.so.conf
/stage1/sbin/ldconfig
Chapter 5 - Installing binutils - Pass 2 (Shared)
首先刪除了上次解壓的binutils-2.13.2.1目錄。這裡要用到前面測試過的BINUTILS_WITH_LIB_PATH了,因為上面是N(如果記不住了,可以再做一次測試命令,看看這幾個變量的值應該是多少),所以configure參數裡不能用--with-lib-path,要麻煩一點,在configure後手動來修改ld/Makefile並手動設置LIB_PATH,總算明白上面的用意了。這裡是和文檔裡說的不一樣的地方。
配置:
mkdir ../binutils-init-build &&
cd ../binutils-init-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/stage1 \
--enable-shared
用來修改Makefile的命令:
test ! -f ld/Makefile-ORIG &&
mv ld/Makefile ld/Makefile-ORIG
# Set LIB_PATH
sed 's@^LIB_PATH = @LIB_PATH = /stage1/lib@g' ld/Makefile-ORIG \
> ld/Makefile
make LDFLAGS="-s"
make -k check
make install
為第六章做准備:
cd ld &&
make clean &&
make LIB_PATH=/lib:/usr/lib
上面兩個目錄的次序和文檔裡不一樣,覺得沒什麼關系。
下面是為了第五章剩下的包做准備:
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export PATH=/stage1/bin:/stage1/sbin:${OLDPATH}
ldconfig
上面那個OLDPATH是沒有/stage1/bin和/stage1/sbin的主系統路徑。
對工具鏈的總結:一個是ldscripts,一個是gcc的specs,這兩個是關鍵,還有就是路徑的控制。在出了問題的時候,多看一下,是不是正確的應用了補丁,是不是正確改變了腳本或Makefile,這都是容易出問題的地方。
安裝第五章剩下的軟件包:
### ZLIB ###
打了zlib-${ZLIB_VER}-2-vsnprintf補丁。
CFLAGS="-O2 -pipe" CPPFLAGS="-DHAS_vsnprintf" ./configure --prefix=/stage1 &&
LDFLAGS='' make &&
make test &&
make install &&
mkdir -p /stage1/share/man/man3 &&
cp zlib.3 /stage1/share/man/man3 &&
ldconfig
### GAWK ###
下面的這個編譯命令是以下包缺省的編譯命令。
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 &&
make LDFLAGS="-s" &&
make check &&
make install
### COREUTILS ###
### BZIP2 ###
make -f Makefile-libbz2_so &&
make LDFLAGS="-s" &&
make check &&
make PREFIX=/stage1 install &&
yes cp bzip2-shared /stage1/bin/bzip2 &&
ln -s libbz2.so.1.0 libbz2.so &&
cp -a libbz2.so* /stage1/lib &&
rm -f /stage1/bin/{bunzip2,bzcat} &&
ln -s bzip2 /stage1/bin/bunzip2 &&
ln -s bzip2 /stage1/bin/bzcat &&
ldconfig
### GZIP ###
安裝後還要移動一下二進制文件的位置。
rm -f /stage1/bin/{gunzip,zcat} &&
ln -s gzip /stage1/bin/gunzip &&
ln -s gzip /stage1/bin/zcat &&
ln -s gunzip /stage1/bin/uncompress
### DIFFUTILS ###
### FINDUTILS ###
我的版本是4.1.7,不用補丁。如果是4.1,就要用。
### M4 ###
### BISON ###
要做yacc的文件。
test -f /stage1/bin/yacc
cat > /stage1/bin/yacc << "EOF"
#!/bin/sh
# Begin /stage1/bin/yacc
exec /stage1/bin/bison -y "$@"
# End /stage1/bin/yacc
EOF
chmod 755 /stage1/bin/yacc
### FLEX ###
還要做lex文件。
cat > /stage1/bin/lex << "EOF"
#!/bin/sh
# Begin /stage1/bin/lex
exec /stage1/bin/flex -l "$@"
# End /stage1/bin/lex
EOF
chmod 755 /stage1/bin/lex
### MAKE ###
下面兩個是腳本裡的,第一個不執行,第二個執行。
#chgrp root /usr/bin/make &&
chmod 755 /stage1/bin/make
### GREP ###
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 --disable-perl-regexp \
--with-included-regex &&
make LDFLAGS="-s" &&
chmod 750 ./tests/*
make check
make install
### SED ###
### GETTEXT ###
可選:
rm -f /stage1/lib/gettext/gnu.gettext.*
因為我的機子上沒有Java編譯器,所以也就不用執行這一步。
### NCURSES ###
cd c++
if [ ! -f ./cursesw.h-ORIG ]; then
mv ./cursesw.h ./cursesw.h-ORIG
fi
sed 's/include <strstream.h>/include <sstream>/g' ./cursesw.h-ORIG > ./cursesw.h
cd ..
./configure --prefix=/stage1 --with-shared \
--without-debug &&
make &&
make install
chmod 755 /stage1/lib/*.${NCURSES_VER} &&
ln -s libncurses.a /stage1/lib/libcurses.a
ln -sf /stage1/lib/libncurses.so.5 /stage1/lib/libcurses.so
ldconfig
### PATCH ###
CPPFLAGS=-D_GNU_SOURCE \
CFLAGS="-O2 -pipe" \
./configure --prefix=/stage1 &&
make LDFLAGS="-s" &&
make check &&
make install
### TAR ###
因為是1.13版的,用了一個patch
### TEXINFO ###
make TEXMF=/stage1/share/texmf install-tex
## BASH ###
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 --with-curses &&
make LDFLAGS="-s" &&
make tests &&
make install
cd /stage1/bin
ln -s /stage1/bin/bash /stage1/bin/sh
### UTIL-LINUX ###
CFLAGS="-O2 -pipe" ./configure &&
make -C lib &&
make -C mount LDFLAGS=-static mount umount &&
cp mount/{mount,umount} /stage1/bin
### Perl ###
cd hints
if [ ! -f linux.sh-ORIG ]; then
cp linux.sh linux.sh-ORIG
fi
chmod u+w linux.sh # For those not running as a root user
sed 's@/lib/libc.so.6@/stage1/lib/libc.so.6@g' linux.sh-ORIG \
sed 's@libc=/lib/\$libc@libc=/stage1/lib/\$libc@g' > linux.sh
echo "locincpth=""
loclibpth=""
glibpth="/stage1/lib"
static_ext="IO re Fcntl"" >> linux.sh
編譯和安裝:
./configure.gnu --prefix=/stage1 -Doptimize='-O2 -pipe' &&
make perl &&
make utilities &&
cp perl /stage1/bin/perl &&
cp pod/pod2man /stage1/bin &&
mkdir -p /stage1/lib/perl5/5.8.0 &&
cp -R lib/* /stage1/lib/perl5/5.8.0
#
# Optional ancillary test packages
#
tcl:
cd unix &&
CFLAGS="-O2 -pipe" ./configure --prefix=/stage1 &&
make LDFLAGS="-s" &&
make test &&
make install
安裝後,要創建一個符號鏈接:
TCLSH=$(basename $(find /stage1/bin -type f -name tclsh\*))
test "tclsh" != "${TCLSH}" &&
ln -s ./${TCLSH} /stage1/bin/tclsh
expect:
打補丁。
CFLAGS="-O2 -pipe" \
./configure --prefix=/stage1 --with-tcl=/stage1/lib \
--with-x=no --disable-symbols \
--cache-file=/dev/null &&
make LDFLAGS="-s" &&
make test &&
make install
dejagnu:
./configure --prefix=/stage1 &&
make &&
make install
後面的內容,應該屬於第六章了,不過在第五章的腳本裡。
切換用戶為root,看一下$LFS對不對:
echo $LFS
為chroot做准備:
改變$LFS的所有者:
chown -R root:root ${LFS}
創建目錄:
mkdir -p ${LFS}/{bin,boot,dev/pts,etc/opt,home,lib,mnt,proc}
mkdir -p ${LFS}/{root,sbin,tmp,usr/local,var,opt}
for dirname in ${LFS}/usr ${LFS}/usr/local
do
# Apparently not FHS compliant but without these LFS breaks (RO)
mkdir -p $dirname/{bin,etc,include,lib,sbin,share,src}
ln -sf share/{man,doc,info} $dirname
# More FHS compliant but breaks LFS builds
#mkdir -p $dirname/{bin,include,lib,sbin,share,src}
mkdir -p $dirname/share/{dict,doc,info,locale,man}
mkdir -p $dirname/share/{nls,misc,terminfo,zoneinfo}
mkdir -p $dirname/share/man/man{1,2,3,4,5,6,7,8}
done
mkdir ${LFS}/usr/local/games
ln -sf share/man ${LFS}/usr/local
mkdir -p ${LFS}/var/{lock,log,mail,run,spool} &&
mkdir -p ${LFS}/var/{tmp,opt,cache,lib/misc,local} &&
mkdir -p ${LFS}/opt/{bin,doc,include,info} &&
mkdir -p ${LFS}/opt/{lib,man/man{1,2,3,4,5,6,7,8}} &&
創建幾個空文件:
touch ${LFS}/var/run/utmp ${LFS}/var/log/{BTmp,lastlog,wtmp} &&
chmod 644 ${LFS}/var/run/utmp ${LFS}/var/log/{btmp,lastlog,wtmp}
設置目錄屬性:
chmod 0750 ${LFS}/root &&
chmod 1777 ${LFS}/tmp ${LFS}/var/tmp
創建無數的符號鏈接:
# setup bash symlinks
ln -sf ../stage1/bin/bash ${LFS}/bin
ln -s bash ${LFS}/bin/sh
# Required for glibc build
# Add pwd symlink
ln -sf ../stage1/bin/pwd ${LFS}/bin
# Add perl symlink
ln -sf ../../stage1/bin/perl ${LFS}/usr/bin
# added for glibc make check
ln -sf ../stage1/bin/cat ${LFS}/bin
# added for binutils ar test
# stty
ln -sf ../stage1/bin/stty ${LFS}/bin
# gettext symlinks
ln -sf ../../stage1/bin/msgfmt ${LFS}/usr/bin
ln -sf ../../stage1/bin/xgettext ${LFS}/usr/bin
ln -sf ../../stage1/bin/msgmerge ${LFS}/usr/bin
# install
ln -sf ../../stage1/bin/install ${LFS}/usr/bin
ln -sf ../usr/bin/install ${LFS}/bin
# Added for ch6 findutils locate tests
# (May have missed some, may be extras)
ln -sf ../stage1/bin/echo ${LFS}/bin
ln -sf ../stage1/bin/sed ${LFS}/bin
ln -sf ../stage1/bin/awk ${LFS}/bin
ln -sf ../stage1/bin/rm ${LFS}/bin
ln -sf ../stage1/bin/mv ${LFS}/bin
ln -sf ../stage1/bin/chmod ${LFS}/bin
ln -sf ../stage1/bin/chgrp ${LFS}/bin
root用戶名和密碼:
if [ ! -f ${LFS}/etc/passwd ]; then
# Our new root user will be called "root".
echo "root:x:0:0:root:/root:/bin/bash" > ${LFS}/etc/passwd
echo "nobody:x:65534:65534:nobody:/home:/bin/true" >> ${LFS}/etc/passwd
fi
test `id -u` = 0 && grep "^${ROOTUSER}:" /etc/shadow \
head -n1 sed "s:^${ROOTUSER}\::root\::g" > ${LFS}/etc/shadow
創建$LFS//etc/group:
if [ ! -f ${LFS}/etc/group ]; then
cat > ${LFS}/etc/group << "EOF"
root:x:0:
bin:x:1:
sys:x:2:
kmem:x:3:
tty:x:4:
tape:x:5:
floppy:x:6:
disk:x:7:
lp:x:8:
dialout:x:9:
audio:x:10:
wheel:x:11:
users:x:100:
nogroup:x:65534:
EOF
fi
創建nsswitch.conf文件:
cat > ${LFS}/etc/nsswitch.conf << "EOF"
#
# /etc/nsswitch.conf
#
passwd: files
shadow: files
group: files
hosts: files dns
EOF
拷貝為NSS服務的文件:
test -f /etc/resolv.conf &&
{
cp /etc/resolv.conf ${LFS}/etc &&
chmod 644 ${LFS}/etc/resolv.conf
}
NSSFILES="ethers netmasks networks protocols rpc services netgroup automount aliases"
for nssfile in ${NSSFILES}; do
test -e /etc/${nssfile} && \
cp /etc/${nssfile} ${LFS}/etc &&
# fix permissions, if executable bit was set before copying:
chmod 644 ${LFS}/etc/${nssfile} &&
echo "${nssfile}: files" >> ${LFS}/etc/nsswitch.conf
done
如果是devfs,還要做一步,我不是,就不看它了。
chroot命令:
chroot ${LFS} /stage1/bin/env -i \
HOME=/root TERM=$TERM PS1='[\u@\h \W]\$ ' \
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/stage1/sbin:/stage1/bin \
LDFLAGS="-s" \
/bin/bash --login
經過了一番煩瑣的工作,順利進入第六章。
在這裡,我基本上按照腳本來做,為了方便以後再進入chroot環境,我在另外的shell裡建立了一個$LFS/etc/chrootsettings文件(主要是因為在chroot下還沒有vi可以用),以後進了chroot,就source一下這個文件,設置就都有了。文件內容如下:
set +h
umask 022
export LC_ALL=POSIX
unset LD_LIBRARY_PATH
unset LD_PRELOAD
export LDFLAGS="-s"
mount proc /proc -t proc
cp -f /proc/mounts /etc/mtab && chmod 644 /etc/mtab
DEVPTS=`cat /proc/mounts cut -d\ -f3 grep "^devpts$"`
test -z "${DEVPTS}" && DEVPTS=N DEVPTS=Y
export DEVPTS # for later usage
test Y = "${DEVPTS}" && mount devpts /dev/pts -t devpts
下面是用MAKEDEV創建設備:
cd /dev &&
cp /stage1/src/MAKEDEV* ./ &&
bunzip2 MAKEDEV* &&
chmod 754 MAKEDEV* &&
./MAKEDEV* -v generic-nopty
第六章 - 安裝 glibc
刪除上次用過的源碼,再解壓。別忘了linuxthreads
touch /etc/ld.so.conf &&
mkdir ../glibc-final-build &&
cd ../glibc-final-build &&
CFLAGS="-O2 -pipe" ../glibc-2*/configure --prefix=/usr \
--enable-add-ons --disable-profile --libexecdir=/usr/bin \
--with-headers=/usr/include \
--mandir=/usr/share/man --infodir=/usr/share/info &&
make &&
make check &&
make install &&
mkdir -p /usr/lib/locale &&
localedef -i de_DE -f ISO-8859-1 de_DE &&
localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro &&
localedef -i en_HK -f ISO-8859-1 en_HK &&
localedef -i en_PH -f ISO-8859-1 en_PH &&
localedef -i en_US -f ISO-8859-1 en_US &&
localedef -i es_MX -f ISO-8859-1 es_MX &&
localedef -i fr_FR -f ISO-8859-1 fr_FR &&
localedef -i fr_FR@euro -f ISO-8859-15 fr_FR@euro &&
localedef -i it_IT -f ISO-8859-1 it_IT &&
localedef -i ja_JP -f EUC-JP ja_JP &&
localedef -i zh_CN -f GB2312 zh_CN.GB2312 &&
localedef -i zh_CN -f GB2312 zh_CN &&
localedef -i zh_CN -f GBK zh_CN.GBK &&
localedef -i zh_TW -f BIG5 zh_TW.Big5 &&
localedef -i zh_CN -f GB18030 zh_CN.GB18030 &&
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
上面最好一步一步來執行,因為每一步都挺長的,錯了就比較麻煩。我這裡make check是全部通過的。
創建glibc的配置文件(/etc/nsswitch.conf, /etc/localtime 符號鏈接和 /etc/ld.so.conf,按照LFS裡面的方法。我選的時區是Asia/Shanghai
第六章 - 調整我們的工具鏈
cd ld &&
make INSTALL=/stage1/bin/install install-data-local
TGT_TRIPLE=`/stage1/bin/gcc -dumpmachine`
SPECFILE=/stage1/lib/gcc-lib/i686-pc-linux-gnu/3.2.2/specs
grep /stage1/lib ${SPECFILE} > /dev/null 2>&1 &&
{
cp ${SPECFILE} ./XX
sed -e 's@/stage1/lib/ld-linux.so.2@/lib/ld-linux.so.2@g' \
-e 's@/stage1/lib/ld.so.1@/lib/ld.so.1@g' \
-e 's@/stage1/lib64/ld-linux.so.2@/lib64/ld-linux.so.2@g' \
-e 's@/stage1/lib64/ld.so.1@/lib64/ld.so.1@g' ./XX > ${SPECFILE}
rm -f ./XX
}
上面改過以後,最好確認一下的確改好了。
第六章 - 安裝 binutils
我刪除了上次的源碼目錄。
mkdir ../binutils-final-build &&
cd ../binutils-final-build &&
CFLAGS="-O2 -pipe" ../binutils-2*/configure --prefix=/usr --enable-shared --mandir=/usr/share/man --infodir=/usr/share/info &&
make LDFLAGS="-s" &&
make check &&
make install &&
rm /usr/lib/libiberty.a
上面make check也全部通過了。只要沒有unexpected的就好了。
第六章 - 安裝 gcc
刪除源碼目錄,再解壓,運用gcc-3.2.2.mmap_test補丁,然後用下面的兩組命令來模擬nofixincludes補丁和去掉-g參數:
cd gcc
test -f Makefile.in-ORIG
cp Makefile.in Makefile.in-ORIG
# Following mimics the nofixincludes patch
# Also avoid debug symbols in gcc
grep -Ev '(README ./fixinc.sh )' Makefile.in-ORIG \
sed 's@LIBGCC2_DEBUG_CFLAGS = -g@LIBGCC2_DEBUG_CFLAGS =@g' \
> Makefile.in
cd ..
# Avoid debug symbols in libstc++
cd libstdc++-v3
test -f configure-ORIG
cp configure configure-ORIG
sed s@DEBUG_FLAGS='-g'@DEBUG_FLAGS=''@g configure-ORIG > configure
cd ..
創建編譯目錄:
mkdir ../gcc-final-build &&
cd ../gcc-final-build
配置:
CFLAGS="-O2 -pipe" \
../gcc-3.2.2/configure --prefix=/usr \
--enable-languages=c,c++ --enable-shared --enable-threads=posix \