5temporary_system

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 prefixGCC搜索本地安装的头文件的地方,缺省为/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++
    只有cc++会被编译,

接下来就简单了

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值