LFS7.4編譯筆記(1)

因爲第一次編譯,花了很多時間,也不知道能不能成功,因此就沒有記筆記,如今從新編譯一次,此次不裝U盤而是裝到個人移動硬盤上面。步驟差很少,由於我感受硬盤的速度會比U盤快。linux

至於LFS的優勢,我就很少說了,相信你只要聽過LFS這個詞,就必定會知道它的優勢的。這裏我用的是最新版的LFS7.4,由於最新版的都會修復一些錯誤,或者編譯方法會更合理一些。c++

下面就是個人安裝之路:bootstrap

1.首先就是分區,創建文件系統,掛載文件系統bash

個人分區以下:ide

/dev/sdb是個人移動硬盤,大概有80G大小吧。上圖中的/dev/sdb1是做爲/boot分區的,有100M左右,/dev/sdb2是做爲/分區的,有10G左右,餘下的是我真正存儲檔案的硬盤。至於怎麼分區,查一下fdisk命令的用法,其實很簡單的。不過記得要把/dev/sdb1標記爲可引導的,也就是咱們的/boot分區。工具

分區完了以後,創建文件系統,也就是格式化爲ext4文件系統。測試

mkfs -v -t ext4 /dev/sdb1
mkfs -v -t ext4 /dev/sdb2

這裏我沒有分swap分區,由於個人宿主系統已經有swap分區了,編譯時就可使用。至於新系統,能夠編譯結束後在新系統中再分swap也同樣。ui

接着就是掛載這些文件系統了。atom

export LFS=/mnt/lfs 
mkdir
-pv $LFS mount -v -t ext4 /dev/sdb2 $LFS mkdir -pv $LFS/boot mount -v -t ext4 /dev/sdb1 $LFS/boot

2.準備軟件包和一些補丁。spa

mkdir -v $LFS/sources
chmod -v a+wt $LFS/sources
wget -i wget-list -P $LFS/sources

pushd $LFS/sources
md5sum -c md5sums
popd

3. 最後的準備:

mkdir -v $LFS/tools
ln -sv $LFS/tools /tools    #文檔中用的是 ln -sv $LFS/tools /  (此爲簡寫形式)

添加用戶:

groupadd lfs
useradd -s /bin/bash -g lfs -m -k /dev/null lfs
passwd lfs
chown -v lfs $LFS/sources
chown -v lfs $LFS/tools
su - lfs

設置用戶lfs的環境變量:

cat > ~/.bash_profile <<EOF
exec env -i HOME=$HOME TERM=$TERM /bin/bash
EOF

cat > ~/.bashrc <<EOF
set +h
umask 022
LFS=/mnt/lfs
LC_ALL=POSIX
LFS_TGT=$(uname -m)-lfs-linux-gnu
PATH=/tools/bin:/bin:/usr/bin
PS1="\$? \u@\h \w\$ " export LFS LC_ALL LFS_TGT PATH PS1 EOF

加載剛設置的環境:

source ~/.bash_profile

到此,咱們的環境已經設置好了。export一下應該會是這樣的:

尤爲注意LFS、LFS_TGT、PATH這幾個變量的值。其中,變量PS1咱們使用了一個小技巧,在最前面是$?,這樣咱們執行一個命令的時候,能夠看看前面的值是否是0,若是是0就表示上一步的命令正確執行了,不然的話,就表示上一步出錯了。

若是這些變量正確的話,就繼續。

4. 開始編譯臨時的系統

編譯以前首先肯定LFS變量的值是/mnt/lfs,另外要知足host system的要求

以後,進入$LFS/sources目錄開始編譯。

cd $LFS/sources

Binutils-2.23.2 - Pass 1

tar xvf binutils-2.23.2.tar.bz2
cd binutils-2.23.2
sed -i -e 's/@colophon/@@colophon/' 
       -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
mkdir -v ../binutils-build
cd ../binutils-build
../binutils-2.23.2/configure \
    --prefix=/tools \
    --with-sysroot=$LFS \
    --target=$LFS_TGT \
    --with-lib-path=/tools/lib \
    --disable-nls \
    --disable-werror
make
make install
cd ..
rm -rf binutils-build bintuils-2.23.2

GCC-4.8.1 - Pass 1

 1 tar xvf gcc-4.8.1.tar.bz2
 2 cd gcc-4.8.1
 3 tar -Jxf ../mpfr-3.1.2.tar.xz
 4 mv -v mpfr-3.1.2 mpfr
 5 tar -Jxf ../gmp-5.1.2.tar.xz
 6 mv -v gmp-5.1.2 gmp
 7 tar -zxf ../mpc-1.0.1.tar.gz
 8 mv -v mpc-1.0.1 mpc
 9 
10 for file in \
11     $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
12 do
13     cp -uv $file{,.orig}
14     sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
15           -e 's@/usr@/tools@g' $file.orig > $file
16     echo '
17 #undef STANDARD_STARTFILE_PREFIX_1
18 #undef STANDARD_STARTFILE_PREFIX_2
19 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
20 #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
21     touch $file.orig
22 done
23 
24 sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
25 mkdir -v ../gcc-build
26 cd ../gcc-build
27 ../gcc-4.8.1/configure \
28     --prefix=/tools \
29     --with-sysroot=$LFS \
30     --target=$LFS_TGT \
31     --with-newlib \
32     --without-headers \
33     --with-local-prefix=/tools \
34     --with-native-system-header-dir=/tools/include \
35     --disable-nls \
36     --disable-shared \
37     --disable-multilib \
38     --disable-decimal-float \
39     --disable-threads \
40     --disable-libatomic \
41     --disable-libgomp \
42     --disable-libitm \
43     --disable-libmudflap \
44     --disable-libquadmath \
45     --disable-libsanitizer \
46     --disable-libssp \
47     --disable-libstdc++-v3 \
48     --enable-languages=c,c++ \
49     --with-mpfr-include=$(pwd)/../gcc-4.8.1/mpfr/src \
50     --with-mpfr-lib=$(pwd)/mpfr/src/.libs
51 make
52 make install
53 ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
54 
55 cd ..
56 rm -rf gcc-build gcc-4.8.1

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 cp -rv dest/include/* /tools/include
7 cd ..
8 rm -rf linux-3.10.10

Glibc-2.18

 1 tar xvf glibc-2.18.tar.xz
 2 cd glibc-2.18
 3 if [ ! -r /usr/include/rpc/types.h ]; then
 4     su -c 'mkdir -p /usr/include/rpc'
 5     su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
 6 fi
 7 sed -i -e 's/static __m128i/inline &/' sysdeps/x86_64/multiarch/strstr.c
 8 mkdir -v ../glibc-build
 9 cd ../glibc-build
10 ../glibc-2.18/configure \
11     --prefix=/tools \
12     --host=$LFS_TGT \
13     --build=$(../glibc-2.18/scripts/config.guess) \
14     --disable-profile \
15     --enable-kernel=2.6.32 \
16     --with-headers=/tools/include \
17     libc_cv_forced_unwind=yes \
18     libc_cv_ctors_header=yes \
19     libc_cv_c_cleanup=yes
20 make
21 make install
22 cd ..
23 rm -rf glibc-2.18 glibc-build

到這裏須要測試一下:

echo 'main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep interpreter

若是輸出是

[Requesting program interpreter: /tools/lib/ld-linux.so.2]
就能夠繼續了。不然必定要查看是哪裏出了問題並在繼續以前糾正。

rm -v dummy.c a.out

Libstdc++-4.8.1

 1 tar xvf gcc-4.8.1.tar.bz2
 2 cd gcc-4.8.1
 3 mkdir -pv ../gcc-build
 4 cd ../gcc-build
 5 ../gcc-4.8.1/libstdc++-v3/configure \
 6     --prefix=/tools \
 7     --host=$LFS_TGT \
 8     --disable-multilib \
 9     --disable-shared \
10     --disable-nls \
11     --disable-libstdcxx-threads \
12     --disable-libstdcxx-pch \
13     --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.8.1
14 make
15 make install
16 cd ..
17 rm -rf gcc-4.8.1 gcc-build

Binutils-2.23.2 - Pass 2

 1 tar xvf binutils-2.23.2.tar.bz2
 2 cd binutils-2.23.2
 3 sed -i -e 's/@colophon/@@colophon/' \
 4         -e 's/doc@cygnus.com/doc@@cygnus.com/' bfd/doc/bfd.texinfo
 5 mkdir -v ../binutils-build
 6 cd ../binutils-build
 7 CC=$LFS_TGT-gcc \
 8 AR=$LFS_TGT-ar \
 9 RANLIB=$LFS_TGT-ranlib \
10 ../binutils-2.23.2/configure \
11     --prefix=/tools \
12     --disable-nls \
13     --with-lib-path=/tools/lib \
14     --with-sysroot
15 make
16 make install
17 make -C ld clean
18 make -C ld LIB_PATH=/usr/lib:/lib
19 cp -v ld/ld-new /tools/bin
20 cd ..
21 rm -rf binutils-2.23.2 binutils-build

GCC-4.8.1 - Pass 2

 1 tar xvf gcc-4.8.1.tar.bz2
 2 cd gcc-4.8.1
 3 cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
 4     `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
 5 cp -v gcc/Makefile.in{,.tmp}
 6 sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
 7 for file in \
 8     $(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
 9 do
10     cp -uv $file{,.orig}
11     sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
12             -e 's@/usr@/tools@g' $file.orig > $file
13     echo '
14 #undef STANDARD_STARTFILE_PREFIX_1
15 #undef STANDARD_STARTFILE_PREFIX_2
16 #define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
17 #define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
18     touch $file.orig
19 done
20 
21 tar -Jxf ../mpfr-3.1.2.tar.xz
22 mv -v mpfr-3.1.2 mpfr
23 tar -Jxf ../gmp-5.1.2.tar.xz
24 mv -v gmp-5.1.2 gmp
25 tar -zxf ../mpc-1.0.1.tar.gz
26 mv -v mpc-1.0.1 mpc
27 mkdir -v ../gcc-build
28 cd ../gcc-build
29 
30 CC=$LFS_TGT-gcc \
31 CXX=$LFS_TGT-g++ \
32 AR=$LFS_TGT-ar \
33 RANLIB=$LFS_TGT-ranlib \
34 ../gcc-4.8.1/configure \
35     --prefix=/tools \
36     --with-local-prefix=/tools
37     --with-native-system-header-dir=/tools/include \
38     --enable-clocale-gnu \
39     --enable-shared \
40     --enable-threads=posix \
41     --enable-__cxa_atexit \
42     --enable-languages=c,c++ \
43     --disable-libstdcxx-pch \
44     --disable-multilib \
45     --disable-bootstrap \
46     --disable-libgomp \
47     --with-mpfr-include=$(pwd)/../gcc-4.8.1/mpfr/src \
48     --with-mpfr-lib=$(pwd)/mpfr/src/.libs
49 make
50 make install
51 ln -sv gcc /tools/bin/cc
52 cd ..
53 rm -rf gcc-4.8.1 gcc-build

到此,還得進一步驗證:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep interpreter

[Requesting program interpreter: /tools/lib/ld-linux.so.2]
表示正確。能夠繼續

rm -v dummy.c a.out

Tcl-8.6.0

 1 tar xvf tcl8.6.0-src.tar.gz
 2 cd tcl8.6.0-src
 3 sed -i s/500/5000/ generic/regc_nfa.c
 4 cd unix
 5 ./configure --prefix=/tools
 6 make
 7 TZ=UTC make test
 8 make install
 9 chmod -v u+w /tools/lib/libtcl8.6.so
10 make install-private-headers
11 ln -sv tclsh8.6 /tools/bin/tclsh
12 cd ../..13 rm -rf tcl8.6.0-src

Expect-5.45

 1 tar xvf expect5.45.tar.gz
 2 cd expect5.45
 3 cp -v configure{,.orig}
 4 sed 's:/usr/local/bin:/bin:' configure.orig > configure
 5 ./configure \
 6     --prefix=/tools \
 7     --with-tcl=/tools/lib \
 8     --with-tclinclude=/tools/include
 9 make
10 make test
11 make SCRIPTS="" install
12 cd ..
13 rm -rf expect5.45

DejaGNU-1.5.1

tar xvf dejagnu-1.5.1.tar.gz
cd dejagnu-1.5.1
./configure --prefix=/tools
make install
make check
cd ..
rm -rf dejagnu-1.5.1

Check-0.9.10

tar xvf check-0.9.10.tar.gz
cd check-0.9.10
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf check-0.9.10

Ncurses-5.9

tar xvf ncurses-5.9.tar.gz
cd ncurses-5.9
./configure \
    --prefix=/tools \
    --with-shared \
    --without-debug \
    --without-ada \
    --enable-overwrite
make
make install
cd ..
rm -rf ncurses-5.9

Bash-4.2

tar xvf bash-4.2.tar.gz
cd bash-4.2
patch -Np1 -i ../bash-4.2-fixes-12.patch
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install
ln -sv bash /tools/bin/sh
cd ..
rm -rf bash-4.2

Bzip2-1.0.6

tar xvf bzip2-1.0.6.tar.gz
cd bzip2-1.0.6
make
make PREFIX=/tools install
cd ..
rm -rf bzip2-1.0.6

Coreutils-8.21

tar xvf coreutils-8.21.tar.xz
cd coreutils-8.21
./configure --prefix=/tools --enable-install-program=hostname
make
make RUN_EXPENSIVE_TESTS=yes check
make install
cd ..
rm -rf coreutils-8.21

Diffutils-3.3

tar xvf diffutils-3.3.tar.xz
cd diffutils-3.3
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf diffutils-3.3

File-5.14

tar xvf file-5.14.tar.gz
cd file-5.14
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf file-5.14

Findutils-4.4.2

tar xvf findutils-4.4.2.tar.gz
cd findutils-4.4.2
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf findutils-4.4.2

Gawk-4.1.0

tar xvf gawk-4.1.0.tar.xz
cd gawk-4.1.0
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf gawk-4.1.0

Gettext-0.18.3

tar xvf gettext-0.18.3.tar.gz
cd gettext-0.18.3
cd gettext-tools
EMACS="no"  ./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp -v src/msgfmt /tools/bin
cd ../..
rm -rf gettext-0,18.3

Grep-2.14

tar xvf grep-2.14.tar.xz
cd grep-2.14
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf grep-2.14

Gzip-1.6

tar xvf gzip-1.6.tar.xz
cd gzip-1.6
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf gzip-1.6

M4-1.4.16

tar xvf m4-1.4.16.tar.bz2
cd m4-1.4.16
sed -i -e '/gets is a/d' lib/stdio.in.h
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf m4-1.4.16

Make-3.82

tar xvf make-3.82.tar.bz2
cd make-3.82
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf make-3.82

Patch-2.7.1

tar xvf patch-2.7.1.tar.xz
cd patch-2.7.1
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf patch-2.7.1

Perl-5.18.1

 1 tar xvf perl-5.18.1.tar.bz2
 2 cd perl-5.18.1
 3 patch -Np1 -i ../perl-5.18.1-libc-1.patch
 4 sh Configure -des -Dprefix=/tools
 5 make
 6 cp -v perl cpan/podlators/pod2man /tools/bin
 7 mkdir -pv /tools/lib/perl5/5.18.1
 8 cp -Rv lib/* /tools/lib/perl5/5.18.1  9 cd ..
10 rm -rf perl-5.18.1

Sed-4.2.2

tar xvf sed-4.2.2.tar.bz2
cd sed-4.2.2
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf sed-4.2.2

Tar-1.26

tar xvf tar-1.26.tar.bz2
cd tar-1.26
sed -i -e '/gets is a/d' gnu/stdio.in.h
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf tar-1.26

Texinfo-5.1

tar xvf texinfo-5.1.tar.xz
cd texinfo-5.1
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf texinfo-5.1

Xz-5.0.5

tar xvf xz-5.0.5.tar.xz
cd xz-5.0.5
./configure --prefix=/tools
make
make check
make install
cd ..
rm -rf xz-5.0.5

移除調試符號:

strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{,share}/{info,man,doc}

餘下部分必須是root用戶操做,再也不須要lfs用戶了。

su -
chown -R root:root $LFS/tools

到此,咱們的臨時系統已經搭建完成,工具鏈也能夠在此備份以便未來使用。

相關文章
相關標籤/搜索