当前位置:Linux教程 - Linux资讯 - Pure lfs 安装手记

Pure lfs 安装手记

所有文档和软件包已经上传到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两个终端,挺正常的。

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 


第五章 - 安装 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 &&

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

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 &&

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

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

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

和脚本里写的一样,正确了。真正关键的应该是下面两个:
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 &&

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

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 &&

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

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)

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

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 \

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页 

--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 \

上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] 下一页