LFS的编译就正式开始了
Are you ready??
Binutils
这时第一反应应该是: 文件还是tar.bz或xz
的, 还没解包呢, 切到sources
目录解吧
tar -xvf binutils-2.25.tar.bz2
如果你一目十行的话, 估计已经等不及看到了后面
初看到这里, 也会不解的。
不对,肯定有什么忽略掉了, 注意一下上面的Important 也就不难懂了
- 安装软件时, 首先,要解压它。
- 而后进入解压后的目录。
- 依照指示编译文件
- 编译完成切回
souces
目录- 删除解压得到的文件夹, 和编译所需的
-build
文件夹
有了这些, 理解起来就容易多了
解压binutils
已经做了。
而后就是进入解压得到的文件夹。
cd binutils-2.25
- 注意tab键补全, 要不全输会累死的
这下就和上面的命令衔接起来了
mkdir -v ../binutils-build
cd ../binutils-build
继续照着做吧
../binutils-2.25/configure \
--prefix=/tools \
--with-sysroot=$LFS \
--with-lib-path=/tools/lib \
--target=$LFS_TGT \
--disable-nls \
--disable-werror
这叫编译前准备
--prefix=/tools
告诉配置文件,binutils
安装目录是在/tools
目录下--with-sysroot=$LFS
可能英文比较好懂吧
For cross compilation, this tells the build system to look in $LFS for the target system libraries as needed.
拙劣的翻译下: 对于交叉编译, 这告诉编译系统去$LFS目录下查找系统库
我是一知半解, 还请高手解释--with-lib-path=/tools/lib
这个指定了链接器应该使用的库的地址--target=$LFS_TGT
32位和64位不同,这是为了交叉编译所需的链接器调整binutils的编译系统--disable-nls
This disables internationalization as i18n is not needed for the temporary tools.
英文好听, 不翻译了--disable-werror
This prevents the build from stopping in the event that there are warnings from the host’s compiler.
就是防止因为warnings而导致编译暂停
之后对于64位系统
case $(uname -m) in
x86_64) mkdir -v /tools/lib && ln -sv lib /tools/lib64 ;;
esac
看命令都懂, 建立个lib64的软链接嘛 终于
make intall
别忘了清理残余文件
cd ..
rm -rf binutils-2.25
rm -rf binutils-build
- 每个软件安装之前要先解压, 其实
tar -xf
就可以, 相加-v
也可以, 不过用处不大 - 以后每个软件编译结束之后, 我就不提醒了, 自己建了什么文件, 一个字~ 删
- 编译就正式开始了, 有些小包的安装按照指导书来就可以了, 我就带过好了
GCC
tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc
这个是在解压得到的gcc目录下做的
应该一看就懂的
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done
- 这是改变GCC的缺省链接器, 安装了bintuils了, 就可以改了
sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure
- 防止编译
glibc
出现错误
mkdir -v ../gcc-build
cd ../gcc-build
../gcc-4.9.2/configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libitm \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libvtv \
--disable-libcilkrts \
--disable-libstdc++-v3 \
--enable-languages=c,c++
--with-newlib
C语言库还没有装好,这保证了inhibit_lib
常量在编译之前已经定义without-headers
当编译一个完全的交叉编译器时,GCC
要求目标系统的标准头文件是已知的。
对于我们来说,这些头文件不是必须的--with-local-prefix=/tools
local prefix
是GCC
搜索本地安装的头文件的地方,缺省为/usr/local
--with-native-system-header-dir=/tools/include
缺省为搜索/usr/include
也是保证GCC
搜索的目录不是本机目录--disable-shared
强制GCC
静态链接本地的库, 防止因为宿主系统而导致GCC
编译错误--disable-multilib
在x86_64
架构上 LFS还不支持multilib的配置,这个参数对x86架构是无害的--enable-languages=c,c++
只有c
和c++
会被编译,
接下来就简单了
make
make install
Ok GCC第一次编译结束
Linux-3.19 API Headers
照着来吧
make mrproper
make INSTALL_HDR_PATH=dest headers_install
cp -rv dest/include/* /tools/include
Glibc
if [ ! -r /usr/include/rpc/types.h ]; then
su -c 'mkdir -pv /usr/include/rpc'
su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc'
fi
我是64位系统,所以直接
mkdir -v ../glibc-build
cd ../glibc-build
../glibc-2.21/configure \
--prefix=/tools \
--host=$LFS_TGT \
--build=$(../glibc-2.21/scripts/config.guess) \
--disable-profile \
--enable-kernel=2.6.32 \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_ctors_header=yes \
libc_cv_c_cleanup=yes
make
make install
做完这些, 就该进行第一次测试了。
echo 'main(){}' > dummy.c
$LFS_TGT-gcc dummy.c
readelf -l a.out | grep ': /tools'
测试比较简单, 就是用刚做好的gcc编译一个简单的c文件
如果没错,会输出
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
如果没成功, 注意看看之前的命令是否有输错,很多时候,/
很容易多一个或是
少一个
libstdc++
没有libstdc++ 这个包啊~ 它是GCC
的一部分, 解压GCC
就行了
mkdir -pv ../gcc-build
cd ../gcc-build
../gcc-4.9.2/libstdc++-v3/configure \
--host=$LFS_TGT \
--prefix=/tools \
--disable-multilib \
--disable-shared \
--disable-nls \
--disable-libstdcxx-threads \
--disable-libstdcxx-pch \
--with-gxx-include-dir=/tools/$LFS_TGT/include/c++/4.9.2
顺理成章
make
make install
binutils Pass2
第二次编译binutils开始了,要是前面没做错什么的话, 是不是该来个快照了,
万事小心才行
mkdir -v ../binutils-build
cd ../binutils-build
CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../binutils-2.25/configure \
--prefix=/tools \
--disable-nls \
--disable-werror \
--with-lib-path=/tools/lib \
--with-sysroot
make
make install
第一次调整工具链 之后还会用到的
make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin
GCC Pass2
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done
tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc
mkdir -v ../gcc-build
cd ../gcc-build
CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../gcc-4.9.2/configure \
--prefix=/tools \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
make
make install
ln -sv gcc /tools/bin/cc
而后第二次测试
echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'
所得结果应该是
[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]
TCL和接下来的三个
(Expect,DejaGNU, 和Check)
是要为运行其它软件的test
做准备
TCL
cd unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
chmod -v u+w /tools/lib/libtcl8.6.so
make install-private-headers
ln -sv tclsh8.6 /tools/bin/tclsh
Expect
cp -v configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure
./configure --prefix=/tools \
--with-tcl=/tools/lib \
--with-tclinclude=/tools/include
make
make test
make SCRIPTS="" install
dejagnu
./configure --prefix=/tools
make install
make check
check
PKG_CONFIG= ./configure --prefix=/tools
make
make check
make install
Ncurses
./configure --prefix=/tools \
--with-shared \
--without-debug \
--without-ada \
--enable-widec \
--enable-overwrite
make
make install
Bash
./configure --prefix=/tools --without-bash-malloc
make
make tests
make install
ln -sv bash /tools/bin/sh
Bzip2
make
make PREFIX=/tools install
Coreutils
./configure --prefix=/tools --enable-install-program=hostname
make
make RUN_EXPENSIVE_TESTS=yes check
make install
Diffutils
./configure --prefix=/tools
make
make check
make install
File
./configure --prefix=/tools
make
make check
make install
Findutils
./configure --prefix=/tools
make
make check
make install
Gawk
./configure --prefix=/tools
make
make check
make install
Gettext
cd gettext-tools
EMACS="no" ./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C intl pluralx.c
make -C src msgfmt
make -C src msgmerge
make -C src xgettext
cp -v src/{msgfmt,msgmerge,xgettext} /tools/bin
Grep
./configure --prefix=/tools
make
make check
make install
Gzip
./configure --prefix=/tools
make
make check
make install
M4
./configure --prefix=/tools
make
make check
make install
Patch
./configure --prefix=/tools
make
make check
make install
Perl
sh Configure -des -Dprefix=/tools -Dlibs=-lm
make
cp -v perl cpan/podlators/pod2man /tools/bin
mkdir -pv /tools/lib/perl5/5.20.2
cp -Rv lib/* /tools/lib/perl5/5.20.2
Sed
./configure --prefix=/tools
make
make check
make install
Tar
./configure --prefix=/tools
make
make check
make install
Texinfo
./configure --prefix=/tools
make
make check
make install
Util-linux
./configure --prefix=/tools \
--without-python \
--disable-makeinstall-chown \
--without-systemdsystemunitdir \
PKG_CONFIG=""
make
make install
Xz
./configure --prefix=/tools
make
make check
make install