LFS7.4编译笔记(2)

上一篇我们已经搭建好了临时系统,这一篇我们就开始正式构建我们的最终LFS系统。

首先切换到root,准备虚拟内核文件系统并挂载:

 1 su -
 2 export LFS=/mnt/lfs
 3 mkdir -pv $LFS/{dev,proc,sys}
 4 mknod -m 600 $LFS/dev/console c 5 1
 5 mknod -m 666 $LFS/dev/null c 1 3
 6 mount -v --bind /dev $LFS/dev
 7 mount -vt devpts devpts $LFS/dev/pts -o gid=5,mode=620
 8 mount -vt proc proc $LFS/proc
 9 mount -vt sysfs sysfs $LFS/sys
10 
11 if [ -h $LFS/dev/shm ]; then
12     link=$(readlink $LFS/dev/shm)
13     mkdir -p $LFS/$link
14     mount -vt tmpfs shm $LFS/$link
15     unset link
16 else
17     mount -vt tmpfs shm $LFS/dev/shm
18 fi

接着进入chroot环境编译最终的LFS系统:

chroot $LFS /tools/bin/env -i HOME=$HOME TERM=$TERM \
    PS1="\$? \u:\w\$ " PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin \
    /tools/bin/bash --login +h

此后LFS变量就不需要了。此时如果重启的话,再次进入chroot环境前必须挂载上面提到的虚拟内核文件系统。

 

创建目录:

 1 mkdir -pv /{bin,etc/{opt,sysconfig},home,lib,mnt,opt,run}
 2 mkdir -pv /{media/{floppy,cdrom},sbin,srv,var}
 3 install -dv -m 0750 /root
 4 install -dv -m 1777 /tmp /var/tmp
 5 mkdir -pv /usr/{,local/}{bin,include,lib,sbin,src}
 6 mkdir -pv /usr/{,local/}share/{doc,info,locale,man}
 7 mkdir -v /usr/{,local/}share/{misc,terminfo,zoneinfo}
 8 mkdir -pv /usr/{,local/}share/man/man{1..8}
 9 for dir in /usr /usr/local; do
10     ln -sv share/{man,doc,info} $dir
11 done
12 case $(uname -m) in
13     x86_64) ln -sv lib /lib64 && ln -sv lib /usr/lib64 && ln -sv lib /usr/local/lib64 ;;
14 esac
15 mkdir -v /var/{log,mail,spool}
16 ln -sv /run /var/run
17 ln -sv /run/lock /var/lock
18 mkdir -pv /var/{opt,cache,lib/{misc,locate},local}

创建必要的文件和符号链接:

1 ln -sv /tools/bin/{bash,cat,echo,pwd,stty} /bin
2 ln -sv /tools/bin/perl /usr/bin
3 ln -sv /tools/lib/libgcc_s.so{,.1} /usr/lib
4 ln -sv /tools/lib/libstdc++.so{,.6} /usr/lib
5 sed 's/tools/usr/' /tools/lib/libstdc++.la > /usr/lib/libstdc++.la
6 ln -sv bash /bin/sh

创建mtab文件:

ln -sv /proc/self/mounts /etc/mtab

创建passwd和group文件以便我们可以登录:

 1 cat > /etc/passwd <<EOF
 2 root:x:0:0:root:/root:/bin/bash
 3 bin:x:1:1:bin:/dev/null:/bin/false
 4 nobody:x:99:99:Unprivileged User:/dev/null:/bin/false
 5 EOF
 6 cat > /etc/group <<EOF
 7 root:x:0:
 8 bin:x:1:
 9 sys:x:2:
10 kmem:x:3:
11 tape:x:4:
12 tty:x:5:
13 daemon:x:6:
14 floppy:x:7:
15 disk:x:8:
16 lp:x:9:
17 dialout:x:10:
18 audio:x:11:
19 video:x:12:
20 utmp:x:13:
21 usb:x:14:
22 cdrom:x:15:
23 mail:x:34:
24 nogroup:x:99:
25 EOF

重新加载bash,就可以识别我们的用户名了(如果是用脚本自动执行的话,就不要执行下面的这句代码了):

exec /tools/bin/bash --login +h

创建日志文件并给出权限:

touch /var/log/{btmp,lastlog,wtmp}
chgrp -v utmp /var/log/lastlog
chmod -v 664 /var/log/lastlog
chmod -v 600 /var/log/btmp

下面开始编译:

Linux-3.10.10 API Headers

1 tar xvf linux-3.10.10.tar.xz
2 cd linux-3.10.10
3 make mrproper
4 make headers_check
5 make INSTALL_HDR_PATH=dest headers_install
6 find dest/include \( -name .install -o -name ..install.cmd \) -delete
7 cp -rv dest/include/* /usr/include
8 cd ..
9 rm -rf linux-3.10.10

Man-pages-3.53

1 tar xvf man-pages-3.53.tar.xz
2 cd man-pages-3.53
3 make install
4 cd ..
5 rm -rf man-pages-3.53

Glibc-2.18

 1 tar xvf glibc-2.18.tar.xz
 2 cd glibc-2.18
 3 sed -i -e 's/static __m128i/inline &/' sysdeps/x86_64/multiarch/strstr.c
 4 mkdir -v ../glibc-build
 5 cd ../glibc-build
 6 ../glibc-2.18/configure \
 7     --prefix=/usr \
 8     --disable-profile \
 9     --enable-kernel=2.6.32 \
10     --libexecdir=/usr/lib/glibc
11 make
12 make -k check 2>&1 | tee glibc-check-log
13 grep Error glibc-check-log
14 touch /etc/ld.so.conf
15 make install
16 cp -v ../glibc-2.18/sunrpc/rpc/*.h /usr/include/rpc
17 cp -v ../glibc-2.18/sunrpc/rpcsvc/*.h /usr/include/rpcsvc
18 cp -v ../glibc-2.18/nis/rpcsvc/*.h /usr/include/rpcsvc
19 
20 mkdir -pv /usr/lib/locale
21 localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
22 localedef -i de_DE -f ISO-8859-1 de_DE
23 localedef -i de_DE@euro -f ISO-8859-15 de_DE@euro
24 localedef -i de_DE -f UTF-8 de_DE.UTF-8
25 localedef -i en_GB -f UTF-8 en_GB.UTF-8
26 localedef -i en_HK -f ISO-8859-1 en_HK
27 localedef -i en_PH -f ISO-8859-1 en_PH
28 localedef -i en_US -f ISO-8859-1 en_US
29 localedef -i en_US -f UTF-8 en_US.UTF-8
30 localedef -i es_MX -f ISO-8859-1 es_MX
31 localedef -i fa_IR -f UTF-8 fa_IR
32 localedef -i fr_FR -f ISO-8859-1 fr_FR
33 localedef -i fr_FR@euro -f ISO-8859-1 fr_FR@euro
34 localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
35 localedef -i it_IT -f ISO-8859-1 it_IT
36 localedef -i it_IT -f UTF-8 it_IT.UTF-8
37 localedef -i ja_JP -f EUC-JP ja_JP
38 localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
39 localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
40 localedef -i tr_TR -f UTR-8 tr_TR.UTF-8
41 localedef -i zh_CN -f GB18030 zh_CN.GB18030

 

配置Glibc

 1 cat > /etc/nsswitch.conf <<EOF
 2 # Begin /etc/nsswitch.conf
 3 
 4 passwd: files
 5 group: files
 6 shadow: files
 7 
 8 host: files dns
 9 networks: files
10 
11 protocols: files
12 services: files
13 ethers: files
14 rpc: files
15 
16 # End /etc/nsswitch.conf
17 EOF

安装时区数据:

 1 tar -xf ../tzdata2013d.tar.gz
 2 ZONEINFO=/usr/share/zoneinfo
 3 mkdir -pv $ZONEINFO/{posix,right}
 4 
 5 for tz in etcetera southamerica northamerica europe africa antarctica \
 6             asia australasia backward pacificnew solar87 solar88 solar89 \
 7             systemv; do
 8     zic -L /dev/null -d $ZONEINFO -y "sh yearistype.sh" ${tz}
 9     zic -L /dev/null -d $ZONEINFO/posix -y "sh yearistype.sh" ${tz}
10     zic -L leapseconds -d $ZONEINFO/right -y "sh yearistype.sh" ${tz}
11 done
12 cp -v zone.tab iso3166.tab $ZONEINFO
13 zic -d $ZONEINFO -p America/New_York
14 unset ZONEINFO

创建/etc/localtime文件:

cp -v --remove-destination /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

配置动态加载器:

 1 cat > /etc/ld.so.conf <<EOF
 2 # Begin /etc/ld.so.conf
 3 /usr/local/lib
 4 /opt/lib
 5 EOF
 6 cat >> /etc/ld.so.conf <<EOF
 7 # Add an include directory
 8 include /etc/ld.so.conf.d/*.conf
 9 EOF
10 mkdir -pv /etc/ld.so.conf.d

调整工具链:

1 mv -v /tools/bin/{ld,ld-old}
2 mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
3 mv -v /tools/bin/{ld-new,ld}
4 ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld

修改GCC的specs文件指向新的动态链接器:

gcc -dumpspecs | sed -e 's@/tools@@g'                    \
        -e '/\*startfile_prefix_spec:/{n;s@.*@/usr/lib/ @}' \
        -e '/\*cpp:/{n;s@$@ -isystem /usr/include@}' >    \
        `dirname $(gcc --print-libgcc-file-name)`/specs

下面进行工具链的第一次系列的检查:

 1 echo 'main(){}' > dummy.c
 2 cc dummy.c -v -Wl,--verbose &> dummy.log
 3 readelf -l a.out | grep interpreter
 4 正确输出应该是:
 5 [Requesting program interpreter: /lib/ld-linux.so.2]
 6 
 7 确保设置为使用正确的起始文件:
 8 grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
 9 如果一切工作正常,就不应改出错,最后一条命令的输出应为:
10 /usr/lib/crt1.o succeeded
11 /usr/lib/crti.o succeeded
12 /usr/lib/crtn.o succeeded
13 
14 编译器是否寻找正确的头文件:
15 grep -B1 '^ /usr/include' dummy.log
16 此命令应该成功返回并给出以下输出:
17 #include <...> search starts here:
18 /usr/include
19 
20 检查新的链接器使用正确的搜索路径:
21 grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
22 如果一切工作正常,就不应改出错,最后一条命令的输出
23 SEARCH_DIR("/usr/lib")
24 SEARCH_DIR("/lib");
25 
26 确认我们使用的是正确的 libc:
27 grep "/lib.*/libc.so.6 " dummy.log
28 如果一切工作正常,就不应改出错,最后一条命令的输出
29 attempt to open /lib/libc.so.6 succeeded
30 
31 最后,确保 GCC 使用正确的动态链接器:
32 grep found dummy.log
33 如果一切工作正常,就不应改出错,最后一条命令的输出
34 found ld-linux.so.2 at /lib/ld-linux.so.2
35 
36 如果一切都正常,就可以继续往下做了。否则一定要检查到底哪里出错了
37 rm -v dummy.c a.out dummy.log

 

Zlib-1.2.8

 1 tar xvf zlib-1.2.8.tar.xz
 2 cd zlib-1.2.8
 3 ./configure --prefix=/usr
 4 make
 5 make check
 6 make install
 7 mv -v /usr/lib/lib.so.* /lib
 8 ln -sfv ../../lib/libz.so.1.2.8 /usr/lib/libz.so
 9 cd ..
10 rm -rf zlib-1.2.8

File-5.14

1 tar xvf file-5.14.tar.gz
2 cd file-5.14
3 ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf file-5.14

Binutils-2.23.2

 1 tar xvf binutils-2.23.2.tar.bz2
 2 cd binutils-2.23.2
 3 expect -c "spawn ls"            #输出spawn ls表示正常,可以继续
 4 rm -fv etc/standards.info
 5 sed -i.bak '/^INFO/s/standards.info //' etc/Makefile.in
 6 
 7 sed -i -e 's/@colophon/@@colophon/' \
 8         -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
 9 mkdir -v ../binutils-build
10 cd ../binutils-build
11 ../binutils-2.23.2/configure --prefix=/usr --enable-shared
12 make tooldir=/usr
13 
14 make check
15 make tooldir=/usr install
16 cp -v ../binutils-2.23.2/include/libiberty.h /usr/include
17 cd ..
18 rm -rf binutils-2.23.2 binutils-build

GMP-5.1.2

 1 tar xvf gmp-5.1.2.tar.xz
 2 cd gmp-5.1.2
 3 ./configure --prefix=/usr --enable-cxx 
 4 make
 5 make check 2>&1 | tee gmp-check-log
 6 awk '/tests passed/{total+=$2} ; END{print total}' gmp-check-log
 7 make install
 8 mkdir -v /usr/share/doc/gmp-5.1.2
 9 cp -v doc/{isa_abi_headache,configuration} doc/*.html \
10         /usr/share/doc/gmp-5.1.2
11 cd ..
12 rm -rf gmp-5.1.2

MPFR-3.1.2

 1 tar xvf mpfr-3.1.2.tar.xz
 2 cd mpfr-3.1.2
 3 ./configure --prefix=/usr \
 4     --enable-thread-safe \
 5     --docdir=/usr/share/doc/mpfr-3.1.2
 6 make
 7 make check
 8 make install
 9 make html
10 make install-html
11 cd ..
12 rm -rf mpfr-3.1.2

MPC-1.0.1

1 tar xvf mpc-1.0.1.tar.gz
2 cd mpc-1.0.1
3 ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf mpc-1.0.1

GCC-4.8.1

 1 tar xvf gcc-4.8.1.tar.bz2
 2 cd gcc-4.8.1
 3 case `uname -m` in
 4     i?86) sed -i 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in ;;
 5 esac
 6 sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
 7 sed -i -e /autogen/d -e /check.sh/d fixincludes/Makefile.in
 8 mv -v libmudflap/testsuite/libmudflap.c++/pass41-frag.cxx{,.disable}
 9 mkdir -v ../gcc-build
10 cd ../gcc-build
11 ../gcc-4.8.1/configure --prefix=/usr \
12         --libexecdir=/usr/lib \
13         --enable-shared \
14         --enable-threads=posix \
15         --enable-__cxa_atexit \
16         --enable-clocale=gnu \
17         --enable-languages=c,c++ \
18         --disable-multilib \
19         --disable-bootstrap \
20         --disable-install-libiberty \
21         --with-system-zlib
22 make
23 ulimit -s 32768
24 make -k check
25 make install
26 ln -sv ../usr/bin/cpp /lib
27 ln -sv gcc /usr/bin/cc
28 cd ..
29 rm -rf gcc-build gcc-4.8.1

现在对工具链进行第二次检查,确保器正常工作:

 1 echo 'main(){}' > dummy.c
 2 cc dummy.c -v -Wl,--verbose &> dummy.log
 3 readelf -l a.out | grep interpreter
 4 如果一切正常,应该输出:
 5 [Requesting program interpreter: /lib/ld-linux.so.2]
 6 
 7 确保设置为使用正确的起始文件:
 8 grep -o '/usr/lib.*/crt[1in].*succeeded' dummy.log
 9 如果正常,输出
10 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../crt1.o succeeded
11 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../crti.o succeeded
12 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../crtn.o succeeded
13 
14 检查一下编译器是否寻找正确的头文件:
15 grep -B4 '^ /usr/include' dummy.log
16 如果成功,输出
17 #include <...> search starts here:
18 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/include
19 /usr/local/include
20 /usr/lib/gcc/i686-pc-linux-gnu/4.8.1/include-fixed
21 /usr/include
22 
23 下一步检查新的链接器使用正确的搜索路径:
24 grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
25 如果正常,输出
26 SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
27 SEARCH_DIR("/usr/local/lib")
28 SEARCH_DIR("/lib")
29 SEARCH_DIR("/usr/lib");
30 
31 下一步确认我们使用的是正确的 libc:
32 grep "/lib.*/libc.so.6 " dummy.log
33 如果正确,输出
34 attempt to open /lib/libc.so.6 succeeded
35 
36 最后,确保 GCC 使用正确的动态链接器:
37 grep found dummy.log
38 如果正确,输出
39 found ld-linux.so.2 at /lib/ld-linux.so.2
40 
41 如果所有输出都符合要求,则可以继续,否则应该检查。
42 rm -v dummy.c a.out dummy.log
43 
44 最后,移动一个位置不正确的文件:
45 mkdir -pv /usr/share/gdb/auto-load/usr/lib
46 mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib

接下来就是安装各种软件:

Sed-4.2.2

 1 tar xvf sed-4.2.2.tar.bz2
 2 cd sed-4.2.2
 3 ./configure --prefix=/usr --bindir=/bin \
 4     --htmldir=/usr/share/doc/sed-4.2.2
 5 make
 6 make html
 7 make check
 8 make install
 9 make -C doc install-html
10 cd ..
11 rm -rf sed-4.2.2

Bzip2-1.0.6

 1 tar xvf bzip2-1.0.6.tar.gz
 2 cd bzip2-1.0.6
 3 patch -Np1 -i ../bzip2-1.0.6-install_docs-1.patch
 4 sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
 5 sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
 6 make -f Makefile-libbz2_so
 7 make clean
 8 make
 9 make PREFIX=/usr install
10 cp -v bzip2-shared /bin/bzip2
11 cp -av libbz2.so* /lib
12 ln -sv ../../lib/libbz2.so.1.0 /usr/lib/libbz2.so
13 rm -v /usr/bin/{bunzip2,bzcat,bzip2}
14 ln -sv bzip2 /bin/bunzip2
15 ln -sv bzip2 /bin/bzcat
16 cd ..
17 rm -rf bzip2-1.0.6

Pkg-config-0.28

 1 tar xvf pkg-config-0.28.tar.gz
 2 cd pkg-config-0.28
 3 ./configure --prefix=/usr \
 4         --with-internal-glib \
 5         --disable-host-tool \
 6         --docdir=/usr/share/doc/pkg-config-0.28
 7 make
 8 make check
 9 make install
10 cd ..
11 rm -rf pkg-config-0.28

Ncurses-5.9

 1 tar xvf ncurses-5.9.tar.gz
 2 cd ncurses-5.9
 3 ./configure --prefix=/usr \
 4         --mandir=/usr/share/man \
 5         --with-shared \
 6         --without-debug \
 7         --enable-pc-files \
 8         --enable-widec
 9 make
10 make install
11 mv -v /usr/lib/libncursesw.so.5* /lib
12 ln -sfv ../../lib/libncursesw.so.5 /usr/lib/libncursesw.so
13 
14 for lib in ncurses form panel menu ; do
15         rm -vf /usr/lib/lib${lib}.so
16         echo "INPUT(-l${lib}w)" > /usr/lib/lib${lib}.so
17         ln -sfv lib${lib}w.a /usr/lib/lib${lib}.a
18         ln -sfv ${lib}w.pc /usr/lib/pkgconfig/${lib}.pc
19 done
20 ln -sfv libncurses++w.a /usr/lib/libncurses++.a
21 
22 rm -vf  /usr/lib/libcursesw.so
23 echo "INPUT(-lncursesw)" > /usr/lib/libcursesw.so
24 ln -sfv libncurses.so  /usr/lib/libcurses.so
25 ln -sfv libncursesw.a  /usr/lib/libcursesw.a
26 ln -sfv libncurses.a /usr/lib/libcurses.a
27 
28 mkdir -v /usr/share/doc/ncurses-5.9
29 cp -v -R doc/* /usr/share/doc/ncurses-5.9
30 
31 make distclean
32 ./configure --prefix=/usr \
33         --with-shared \
34         --without-normal \
35         --without-debug \
36         --without-cxx-binding
37 make sources libs
38 cp -av lib/lib*.so.5* /usr/lib
39 cd ..
40 rm -rf ncurses-5.9

Shadow-4.1.5.1

 1 tar xvf shadow-4.1.5.1.tar.bz2
 2 cd shadow-4.1.5.1
 3 sed -i 's/groups$(EXEEXT) //' src/Makefile.in
 4 find man -name Makefile.in -exec sed -i 's/groups\.1 / /' {} \;
 5 sed -i -e 's@#ENCRYPT_METHOD DES@ENCRYPT_METHOD SHA512@' \
 6         -e 's@/var/spool/mail@/var/mail@' etc/login.defs
 7 ./configure --sysconfdir=/etc
 8 make
 9 make install
10 mv -v /usr/bin/passwd /bin
11 passwd root
12 cd ..
13 rm -rf shadow-4.1.5.1

Util-linux-2.23.2

 1 tar xvf util-linux-2.23.2.tar.xz
 2 cd util-linux-2.23.2
 3 sed -i -e 's@etc/adjtime@var/lib/hwclock/adjtime@g' \
 4         $(grep -rl '/etc/adjtime' .)
 5 mkdir -pv /var/lib/hwclock
 6 ./configure --disable-su --disable-sulogin --disable-login
 7 make
 8 make install
 9 cd ..
10 rm -rf util-linux-2.23.2

Psmisc-22.20

1 tar xvf psmisc-22.20.tar.gz
2 cd psmisc-22.20
3 ./configure --prefix=/usr
4 make
5 make install
6 mv -v /usr/bin/fuser /bin
7 mv -v /usr/bin/killall /bin
8 cd ..
9 rm -rf psmisc-22.20

Procps-ng-3.3.8

 1 tar xvf procps-ng-3.3.8.tar.xz
 2 cd procps-ng-3.3.8
 3 ./configure --prefix=/usr \
 4         --exec-prefix= \
 5         --libdir=/usr/lib \
 6         --docdir=/usr/share/doc/procps-ng-3.3.8 \
 7         --disable-static \
 8         --disable-skill \
 9         --disable-kill
10 make
11 make install
12 mv -v /usr/lib/libprocps.so.* /lib
13 ln -sfv ../../lib/libprocps.so.1.1.2 /usr/lib/libprocps.so
14 cd ..
15 rm -rf procps-ng-3.3.8

E2fsprogs-1.42.8

 1 tar xvf e2fsprogs-1.42.8.tar.gz
 2 cd e2fsprogs-1.42.8
 3 mkdir -v build
 4 cd build
 5 ../configure --prefix=/usr \
 6         --with-root-prefix="" \
 7         --enable-elf-shlibs \
 8         --disable-libblkid \
 9         --disable-libuuid \
10         --disable-uuidd \
11         --disable-fsck
12 make
13 make check
14 make install
15 make install-libs
16 chmod -v u+w /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
17 gunzip -v /usr/share/info/libext2fs.info.gz
18 install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
19 makeinfo -o doc/com_err.info ../lib/et/com_err.texinfo
20 install -v -m644 doc/com_err.info /usr/share/info
21 install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
22 cd ../..
23 rm -rf e2fsprogs-1.42.8 build

Coreutils-8.21

 1 tar xvf coreutils-8.21.tar.xz
 2 cd coreutils-8.21
 3 patch -Np1 -i ../coreutils-8.21-i18n-1.patch
 4 FORCE_UNSAFE_CONFIGURE=1 ./configure \
 5     --prefix=/usr \
 6     --libexecdir=/usr/lib \
 7     --enable-no-install-program=kill,uptime
 8 make
 9 make install
10 mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
11 mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
12 mv -v /usr/bin/{rmdir,stty,sync,true,uname,test,[} /bin
13 mv -v /usr/bin/chroot /usr/sbin
14 mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
15 sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8
16 mv -v /usr/bin/{head,sleep,nice} /bin
17 cd ..
18 rm -rf coreutils-8.21

Iana-Etc-2.30

1 tar xvf iana-etc-2.30.tar.bz2
2 cd iana-etc-2.30
3 make
4 make install
5 cd ..
6 rm -rf iana-etc-2.30

M4-1.4.16

1 tar xvf m4-1.4.16.tar.bz2
2 cd m4-1.4.16
3 sed -i -e '/gets is a/d' lib/stdio.in.h
4 ./configure --prefix=/usr
5 make
6 make install
7 cd ..
8 rm -rf m4-1.4.16

Flex-2.5.37

 1 tar xvf flex-2.5.37.tar.bz2
 2 cd flex-2.5.37
 3 sed -i -e '/test-bison/d' tests/Makefile.in
 4 ./configure --prefix=/usr \
 5     --docdir=/usr/share/doc/flex-2.5.37
 6 make
 7 make check
 8 make install
 9 ln -sv libfl.a /usr/lib/libl.a
10 cat > /usr/bin/lex << "EOF"
11 #!/bin/sh
12 # Begin /usr/bin/lex
13 exec /usr/bin/flex -l "$@"
14 # End /usr/bin/lex
15 EOF
16 chmod -v 755 /usr/bin/lex
17 cd ..
18 rm -rf flex-2.5.37

Bison-3.0

1 tar xvf bison-3.0.tar.xz
2 cd bison-3.0
3 ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf bison-3.0

Grep-2.14

1 tar xvf grep-2.14.tar.xz
2 cd grep-2.14
3 ./configure --prefix=/usr --bindir=/bin
4 make
5 make check
6 make install
7 cd ..
8 rm -rf grep-2.14

Readline-6.2

 1 tar xvf readline-6.2.tar.gz
 2 cd readline-6.2
 3 sed -i '/MV.*old/d' Makefile.in
 4 sed -i '/{OLDSUFF}/c:' support/shlib-install
 5 patch -Np1 -i ../readline-6.2-fixes-1.patch
 6 ./configure --prefix=/usr --libdir=/lib
 7 make SHLIB_LIBS=-lncurses
 8 make install
 9 mv -v /lib/lib{readline,history}.a /usr/lib
10 rm -v /lib/lib{readline,history}.so
11 ln -sfv ../../lib/libreadline.so.6 /usr/lib/libreadline.so
12 ln -sfv ../../lib/libhistory.so.6 /usr/lib/libhistory.so
13 mkdir -v /usr/share/doc/readline-6.2
14 install -v -m644 doc/*.{ps,pdf,html,dvi} \
15                 /usr/share/doc/readline-6.2
16 cd ..
17 rm -rf readline-6.2

Bash-4.2

 1 tar xvf bash-4.2.tar.gz
 2 cd bash-4.2
 3 patch -Np1 -i ../bash-4.2-fixes-12.patch
 4 ./configure --prefix=/usr \
 5     --bindir=/bin \
 6     --htmldir=/usr/share/doc/bash-4.2 \
 7     --without-bash-malloc \
 8     --with-installed-readline 
 9 make
10 make install
11 exec /bin/bash --login +h
12 cd ..
13 rm -rf bash-4.2

Bc-1.06.95

1 tar xvf bc-1.06.95.tar.bz2
2 cd bc-1.06.95
3 ./configure --prefix=/usr --with-readline
4 make
5 make install
6 cd ..
7 rm -rf bc-1.06.95

Libtool-2.4.2

1 tar xvf libtool-2.4.2.tar.gz
2 cd libtool-2.4.2
3 ./configure --prefix=/usr
4 make
5 make install
6 cd ..
7 rm -rf libtool-2.4.2

GDBM-1.10

1 tar xvf gdbm-1.10.tar.gz
2 cd gdbm-1.10
3 ./configure --prefix=/usr --enable-libgdbm-compat
4 make
5 make check
6 make install
7 cd ..
8 rm -rf gdbm-1.10

Inetutils-1.9.1

 1 tar xvf inetutils-1.9.1.tar.gz
 2 cd inetutils-1.9.1
 3 sed -i -e '/gets is a/d' lib/stdio.in.h
 4 ./configure --prefix=/usr \
 5     --libexecdir=/usr/sbin \
 6     --localstatedir=/var \
 7     --disable-ifconfig \
 8     --disable-logger \
 9     --disable-syslogd \
10     --disable-whois \
11     --disable-servers
12 make
13 make check
14 make install
15 mv -v /usr/bin/{hostname,ping,ping6,traceroute} /bin
16 cd ..
17 rm -rf inetutils-1.9.1

Perl-5.18.1

 1 tar xvf perl-5.18.1.tar.bz2
 2 cd perl-5.18.1
 3 echo "127.0.0.1 localhost $(hostname)" > /etc/hosts
 4 sed -i -e "s|BUILD_ZLIB\s*= True|BUILD_ZLIB = False|"        \
 5           -e "s|INCLUDE\s*= ./zlib-src|INCLUDE = /usr/include|" \
 6           -e "s|LIB\s*= ./zlib-src|LIB = /usr/lib|"                              \
 7     cpan/Compress-Raw-Zlib/config.in
 8 sh Configure -des -Dprefix=/usr \ 
 9         -Dvendorprefix=/usr \
10         -Dman1dir=/usr/share/man/man1 \
11         -Dman3dir=/usr/share/man/man3 \
12         -Dpager="/usr/bin/less -isR" \
13         -Duseshrplib
14 make
15 make -k test
16 make install
17 cd ..
18 rm -rf perl-5.18.1

Autoconf-2.69

1 tar xvf autoconf-2.69.tar.xz
2 cd autoconf-2.69
3 ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf autoconf-2.69

Automake-1.14

1 tar xvf automake-1.14.tar.xz
2 cd automake-1.14
3 patch -Np1 -i ../automake-1.14-test-1.patch
4 ./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.14
5 make
6 make check
7 make install
8 cd ..
9 rm -rf automake-1.14

Diffutils-3.3

1 tar xvf diffutils-3.3.tar.xz
2 cd diffutils-3.3
3 ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf diffutils-3.3

Gawk-4.1.0

 1 tar xvf gawk-4.1.0.tar.xz
 2 cd gawk-4.1.0
 3 ./configure --prefix=/usr --libexecdir=/usr/lib
 4 make
 5 make check
 6 make install
 7 mkdir -v /usr/share/doc/gawk-4.1.0
 8 cp -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-4.1.0
 9 cd ..
10 rm -rf gawk-4.1.0

Findutils-4.4.2

 1 tar xvf findutils-4.4.2.tar.gz
 2 cd findutils-4.4.2
 3 ./configure --prefix=/usr \
 4         --libexecdir=/usr/lib/findutils  \
 5         --localstatedir=/var/lib/locate
 6 make
 7 make check
 8 make install
 9 mv -v /usr/bin/find /bin
10 sed -i 's/find:=${BINDIR}/find:=\/bin/' /usr/bin/updatedb
11 cd ..
12 rm -rf findutils-4.4.2

Gettext-0.18.3

1 tar xvf gettext-0.18.3.tar.gz
2 cd gettext-0.18.3
3 ./configure --prefix=/usr \
4         --docdir=/usr/share/doc/gettext-0.18.3
5 make
6 make check
7 make install
8 cd ..
9 rm -rf gettext-0.18.3

Groff-1.22.2

 1 tar xvf groff-1.22.2.tar.gz
 2 cd groff-1.22.2
 3 PAGE=A4 ./configure --prefix=/usr
 4 make
 5 mkdir -p /usr/share/doc/groff-1.22/pdf
 6 make install
 7 ln -sv eqn /usr/bin/geqn
 8 ln -sv tbl /usr/bin/gtbl
 9 cd ..
10 rm -rf groff-1.22.2

Xz-5.0.5

1 tar xvf xz-5.0.5.tar.xz
2 cd xz-5.0.5
3 ./configure --prefix=/usr --libdir=/lib --docdir=/usr/share/doc/xz-5.0.5
4 make
5 make check
6 make pkgconfigdir=/usr/lib/pkgconfig install
7 cd ..
8 rm -rf xz-5.0.5

GRUB-2.00

 1 tar xvf grub-2.00.tar.xz
 2 cd grub-2.00
 3 sed -i -e '/gets is a/d' grub-core/gnulib/stdio.in.h
 4 ./configure --prefix=/usr \
 5         --sysconfdir=/etc \
 6         --disable-grub-emu-usb \
 7         --disable-efiemu \
 8         --disable-werror
 9 make
10 make install
11 cd ..
12 rm -rf grub-2.00

Less-458

1 tar xvf less-458.tar.gz
2 cd less-458
3 ./configure --prefix=/usr --sysconfdir=/etc
4 make
5 make install
6 cd ..
7 rm -rf less-458

Gzip-1.6

 1 tar xvf gzip-1.6.tar.xz
 2 cd gzip-1.6
 3 ./configure --prefix=/usr --bindir=/bin
 4 make
 5 make check
 6 make install
 7 mv -v /bin/{gzexe,uncompress,zcmp,zdiff,zegrep} /usr/bin
 8 mv -v /bin/{zfgrep,zforce,zgrep,zless,zmore,znew} /usr/bin
 9 cd ..
10 rm -rf gzip-1.6

IPRoute2-3.10.0

 1 tar xvf iproute2-3.10.0.tar.xz
 2 cd iproute2-3.10.0
 3 sed -i '/^TARGETS/s@arpd@@g' misc/Makefile
 4 sed -i /ARPD/d Makefile
 5 sed -i 's/arpd.8//' man/man8/Makefile
 6 make DESTDIR=
 7 make DESTDIR=             \
 8         MANDIR=/usr/share/man \
 9         DOCDIR=/usr/share/doc/iproute2-3.10.0 install
10 cd ..
11 rm -rf iproute2-3.10.0

Kbd-1.15.5

 1 tar xvf kbd-1.15.5.tar.gz
 2 cd kbd-1.15.5
 3 sed -i -e '326 s/if/while/' src/loadkeys.analyze.l
 4 sed -i 's/\(RESIZECONS_PROGS=\)yes/\1no/g' configure
 5 sed -i 's/resizecons.8 //' man/man8/Makefile.in
 6 ./configure --prefix=/usr --disable-vlock
 7 make
 8 make install
 9 mkdir -v /usr/share/doc/kbd-1.15.5
10 cp -R -v doc/* /usr/share/doc/kbd-1.15.5
11 cd ..
12 rm -rf kbd-1.15.5

Kmod-14

 1 tar xvf kmod-14.tar.xz
 2 cd kmod-14
 3 ./configure --prefix=/usr \
 4     --bindir=/bin \
 5     --libdir=/lib \
 6     --sysconfdir=/etc \
 7     --disable-manpages \
 8     --with-xz \
 9     --with-zlib
10 make
11 make check
12 make pkgconfigdir=/usr/lib/pkgconfig install
13 for target in depmod insmod modinfo modprobe rmmod; do
14     ln -sv ../bin/kmod /sbin/$target
15 done
16 ln -sv kmod /bin/lsmod
17 cd ..
18 rm -rf kmod-14

Libpipeline-1.2.4

1 tar xvf libpipeline-1.2.4.tar.gz
2 cd libpipeline-1.2.4
3 PKG_CONFIG_PATH=/tools/lib/pkgconfig ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf libpipeline-1.2.4

Make-3.82

1 tar xvf make-3.82.tar.bz2
2 cd make-3.82
3 patch -Np1 -i ../make-3.82-upstream_fixes-3.patch
4 ./configure --prefix=/usr
5 make
6 make check
7 make install
8 cd ..
9 rm -rf make-3.82

Man-DB-2.6.5

 1 tar xvf man-db-2.6.5.tar.xz
 2 cd man-db-2.6.5
 3 ./configure --prefix=/usr \
 4     --libexecdir=/usr/lib \
 5     --docdir=/usr/share/doc/man-db-2.6.5 \
 6     --sysconfdir=/etc \
 7     --disable-setuid \
 8     --with-browser=/usr/bin/lynx \
 9     --with-vgrind=/usr/bin/vgrind \
10     --with-grap=/usr/bin/grap
11 make
12 make check
13 make install
14 cd ..
15 rm -rf man-db-2.6.5

Patch-2.7.1

1 tar xvf patch-2.7.1.tar.xz
2 cd patch-2.7.1
3 ./configure --prefix=/usr
4 make
5 make check
6 make install
7 cd ..
8 rm -rf patch-2.7.1

Sysklogd-1.5

 1 tar xvf sysklogd-1.5.tar.gz
 2 cd sysklogd-1.5
 3 make
 4 make BINDIR=/sbin install
 5 配置 Sysklogd
 6 cat > /etc/syslog.conf << "EOF"
 7 # Begin /etc/syslog.conf
 8 auth,authpriv.* -/var/log/auth.log
 9 *.*;auth,authpriv.none -/var/log/sys.log
10 daemon.* -/var/log/daemon.log
11 kern.* -/var/log/kern.log
12 mail.* -/var/log/mail.log
13 user.* -/var/log/user.log
14 *.emerg *
15 # End /etc/syslog.conf
16 EOF
17 cd ..
18 rm -rf sysklogd-1.5

Sysvinit-2.88dsf

1 tar xvf sysvinit-2.88dsf.tar.bz2
2 cd sysvinit-2.88dsf
3 sed -i 's@Sending processes@& configured via /etc/inittab@g' src/init.c
4 sed -i -e '/utmpdump/d' -e '/mountpoint/d' src/Makefile
5 make -C src
6 make -C src install
7 cd ..
8 rm -rf sysvinit-2.88dsf

Tar-1.26

 1 tar xvf tar-1.26.tar.bz2
 2 cd tar-1.26
 3 patch -Np1 -i ../tar-1.26-manpage-1.patch
 4 sed -i -e '/gets is a/d' gnu/stdio.in.h
 5 FORCE_UNSAFE_CONFIGURE=1 \
 6 ./configure --prefix=/usr \
 7         --bindir=/bin \
 8         --libexecdir=/usr/sbin
 9 make
10 make check
11 make install
12 make -C doc install-html docdir=/usr/share/doc/tar-1.26
13 perl tarman > /usr/share/man/man1/tar.1
14 cd ..
15 rm -rf tar-1.26

Texinfo-5.1

 1 tar xvf texinfo-5.1.tar.xz
 2 cd texinfo-5.1
 3 patch -Np1 -i ../texinfo-5.1-test-1.patch
 4 ./configure --prefix=/usr
 5 make
 6 make check
 7 make install
 8 make TEXMF=/usr/share/texmf install-tex
 9 cd /usr/share/info
10 rm -v dir
11 for f in *
12 do install-info $f dir 2>/dev/null
13 done
14 cd /sources
15 rm -rf texinfo-5.1

Udev-206 (Extracted from systemd-206)

1 tar xvf systemd-206.tar.xz
2 cd systemd-206
3 tar xvf ../udev-lfs-206-1.tar.bz2
4 make -f udev-lfs-206-1/Makefile.lfs
5 make -f udev-lfs-206-1/Makefile.lfs install
6 build/udevadm hwdb --update
7 bash udev-lfs-206-1/init-net-rules.sh
8 cd ..
9 rm -rf systemd-206

Vim-7.4

 1 tar xvf vim-7.4.tar.bz2
 2 cd vim74
 3 echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
 4 ./configure --prefix=/usr --enable-multibyte
 5 make
 6 make test
 7 make install
 8 ln -sv vim /usr/bin/vi
 9 for L in /usr/share/man/{,*/}man1/vim.1; do
10     ln -sv vim.1 $(dirname $L)/vi.1
11 done
12 ln -sv ../vim/vim74/doc /usr/share/doc/vim-7.4
13 配置vim:
14 cat > /etc/vimrc << "EOF"
15 " Begin /etc/vimrc
16 set nocompatible
17 set backspace=2
18 syntax on
19 if (&term == "iterm") || (&term == "putty")
20     set background=dark
21 endif
22 " End /etc/vimrc
23 EOF
24 cd ..
25 rm -rf vim74

到此,软件基本安装完了。下面就是一些清理工作:

移除软件中的调试符号:

移除之前要确保没有任何二进制正在运行,可以通过logout然后重新进入chroot环境来确保。

1 logout
2 chroot $LFS /tools/bin/env -i \
3         HOME=/root TERM=$TERM PS1="\$? \u:\w\$ " \
4         PATH=/bin:/usr/bin:/sbin:/usr/sbin \
5         /tools/bin/bash --login
6 /tools/bin/find /{,usr/}{bin,lib,sbin} -type f \
7 -exec /tools/bin/strip --strip-debug '{}' ';'

大量文件会因为格式不支持而报错。这些警告可以安全忽略,这些文件都是脚本而不是二进制.
从现在开始,如果要重新进入 chroot 环境,使用以下修改过的命令:

1 chroot "$LFS" /usr/bin/env -i \
2         HOME=/root TERM="$TERM" PS1="\$? \u:\w\$ " \
3         PATH=/bin:/usr/bin:/sbin:/usr/sbin \
4         /bin/bash --login

原因在于 /tools 中的工具不再需要了。所以 /tools 目录可以移除了。(注意:用于测试的Tcl、Expect 和 DejaGNU
也会被移除)

posted @ 2013-12-20 23:48  Champ_Keh  阅读(1186)  评论(1编辑  收藏  举报