====== 임시 시스템 제작 ====== 젠투로 치면 Stage 1에 해당하는 과정. 꽤 복잡하기 때문에 일일이 문서로 작업 과정을 기록하여, 혹여 작업이 중간에 중단된 후 재개되더라도 손쉽게 재추적할 수 있도록 한다. 또한 이전 과정을 반복해야 할 경우를 대비하여 미리 작업 내용은 쉘 스크립트하여 보관한다. 모든 스크립트의 실행 디렉토리는 $LFS/sources 로 간주한다. 64비트 설치라면 /tools/lib에 /tools/lib64 symlink를 걸어둔다. # mkdir /tools/lib # ln -s /tools/lib /tools/lib64 lfs 과정중 $LFS 에 생기는 모든 디렉토리에 대해 사용자 'lfs'가 권한을 가지는지에 대해 확인하라. ===== Binutils Pass 1 ===== tar xjf binutils-2.23.1.tar.bz2 cd binutils-2.23.1 patch -p1 < ../binutils-2.23.1-testsuite_fix-1.patch mkdir ../binutils-build cd ../binutils-build ../binutils-2.23.1/configure \ --prefix=/tools \ --with-sysroot=$LFS \ --with-lib-path=/tools/lib \ --target=$LFS_TGT \ --disable-nls \ --disable-werror make make install cd .. rm -fr binutils-build rm -fr binutils-2.23.1 ===== GCC-4.7.2 - Pass 1 ===== tar xjf gcc-4.7.2.tar.bz2 cd gcc-4.7.2 tar -Jxf ../mpfr-3.1.1.tar.xz tar -Jxf ../gmp-5.1.1.tar.xz tar -zxf ../mpc-1.0.1.tar.gz mv -v mpfr-3.1.1 mpfr mv -v gmp-5.1.1 gmp mv -v mpc-1.0.1 mpc 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 sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure sed -i 's/BUILD_INFO=info/BUILD_INFO=/' gcc/configure mkdir -v ../gcc-build cd ../gcc-build ../gcc-4.7.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-libmudflap \ --disable-libssp \ --disable-libgomp \ --disable-libquadmath \ --enable-languages=c \ --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \ --with-mpfr-lib=$(pwd)/mpfr/src/.libs make make install pushd $(dirname $(find $LFS/tools -type f -name 'libgcc.a')) ln -sv libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'` popd cd .. rm -fr gcc-4.7.2 gcc-build ===== Linux-3.8.1 API Headers ===== tar -Jxf linux-3.8.1.tar.xz cd linux-3.8.1 make mrproper make headers_check make INSTALL_HDR_PATH=dest headers_install cp -rv dest/include/* /tools/include cd .. rm -fr linux-3.8.1 ===== Glibc-2.17 ===== tar -Jxf glibc-2.17.tar.xz cd glibc-2.17 if [ ! -r /usr/include/rpc/types.h ]; then su -c 'mkdir -p /usr/include/rpc' su -c 'cp -v sunrpc/rpc/*.h /usr/include/rpc' fi mkdir ../glibc-build cd ../glibc-build ../glibc-2.17/configure \ --prefix=/tools \ --host=$LFS_TGT \ --build=$(../glibc-2.17/scripts/config.guess) \ --disable-profile \ --enable-kernel=2.6.25 \ --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' # carefully check the output of this command! /tools/lib, or /tools/lib64 for 64-bit machines appears as the prefix of the dynamic linker rm -v dummy.c a.out cd .. rm -fr glibc-2.17 glibc-build ===== Binutils-2.23.1 - Pass 2 ===== tar -xjf binutils-2.23.1.tar.bz2 mkdir binutils-build cd binutils-build CC=$LFS_TGT-gcc \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../binutils-2.23.1/configure \ --prefix=/tools \ --disable-nls \ --with-lib-path=/tools/lib make make install make -C ld clean make -C ld LIB_PATH=/usr/lib:/lib cp -v ld/ld-new /tools/bin cd .. rm -fr binutils-build binutils-2.23.1 ===== GCC-4.7.2 - Pass 2 ===== tar xjf gcc-4.7.2.tar.bz2 cd gcc-4.7.2 cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \ `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h cp -v gcc/Makefile.in{,.tmp} sed 's/^T_CFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp \ > gcc/Makefile.in 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 -Jxf ../mpfr-3.1.1.tar.xz mv -v mpfr-3.1.1 mpfr tar -Jxf ../gmp-5.1.1.tar.xz mv -v gmp-5.1.1 gmp tar -zxf ../mpc-1.0.1.tar.gz mv -v mpc-1.0.1 mpc sed -i 's/BUILD_INFO=info/BUILD_INFO=/' gcc/configure mkdir -v ../gcc-build cd ../gcc-build CC=$LFS_TGT-gcc \ AR=$LFS_TGT-ar \ RANLIB=$LFS_TGT-ranlib \ ../gcc-4.7.2/configure \ --prefix=/tools \ --with-local-prefix=/tools \ --with-native-system-header-dir=/tools/include \ --enable-clocale=gnu \ --enable-shared \ --enable-threads=posix \ --enable-__cxa_atexit \ --enable-languages=c,c++ \ --disable-libstdcxx-pch \ --disable-multilib \ --disable-bootstrap \ --disable-libgomp \ --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src \ --with-mpfr-lib=$(pwd)/mpfr/src/.libs 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/lib/ld-linux.so.2] rm -v dummy.c a.out cd .. rm -fr gcc-4.7.2 gcc-build ===== Tcl-8.6.0 ===== tar -xzf tcl8.6.0-src.tar.gz cd tcl8.6.0/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 cd ../../ rm -fr tcl8.6.0 ===== Expect-5.45 ===== tar -xzf expect5.45.tar.gz cd expect5.45 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 cd .. rm -fr expect5.45 ===== DejaGNU-1.5 ===== tar -xzf dejagnu-1.5.tar.gz cd dejagnu-1.5 ./configure --prefix=/tools make make check make install cd .. rm -fr dejagnu-1.5 ===== Check-0.9.9 ===== tar -xzf check-0.9.9.tar.gz cd check-0.9.9 CFLAGS="-L/tools/lib -lpthread" ./configure --prefix=/tools3 CFLAGS="-L/tools/lib -lpthread" make make check make install cd .. rm -fr check-0.9.9 ===== Ncurses-5.9 ===== tar -xzf 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 -fr ncurses-5.9 ===== Bash-4.2 ===== tar -xzf bash-4.2.tar.gz cd bash-4.2 patch -Np1 -i ../bash-4.2-fixes-11.patch ./configure --prefix=/tools --without-bash-malloc make make tests make install ln -sv bash /tools/bin/sh cd .. rm -fr bash-4.2 ===== Bzip2-1.0.6 ===== tar -xzf bzip2-1.0.6.tar.gz cd bzip2-1.0.6 make make PREFIX=/tools install cd .. rm -fr bzip2-1.0.6 ===== Coreutils-8.21 ===== tar -xJf 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 -fr coreutils-8.21 ===== Diffutils-3.2 ===== tar -xzf diffutils-3.2.tar.gz cd diffutils-3.2 sed -i -e '/gets is a/d' lib/stdio.in.h ./configure --prefix=/tools make make check make install cd .. rm -fr diffutils-3.2 ===== File-5.13 ===== tar -xzf file-5.13.tar.gz cd file-5.13 ./configure --prefix=/tools make && make check && make install cd .. rm -fr file-5.13 ===== Findutils-4.4.2 ===== tar -xzf findutils-4.4.2.tar.gz cd findutils-4.4.2 ./configure --prefix=/tools make && make check && make install cd .. rm -fr findutils-4.4.2 ===== Gawk-4.0.2 ===== tar -xJf gawk-4.0.2.tar.xz cd gawk-4.0.2 ./configure --prefix=/tools make && make check && make install cd .. rm -fr gawk-4.0.2 ===== Gettext-0.18.2 ===== tar -xzf gettext-0.18.2.tar.gz cd gettext-0.18.2 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 -fr gettext-0.18.2 ===== Grep-2.14 ===== tar -xJf grep-2.14.tar.xz cd grep-2.14 ./configure --prefix=/tools make && make check && make install cd .. rm -fr grep-2.14 ===== Gzip-1.5 ===== tar -xJf gzip-1.5.tar.xz cd gzip-1.5 ./configure --prefix=/tools make && make check && make install cd .. rm -fr gzip-1.5 ===== M4-1.4.16 ===== tar -xjf 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 -fr m4-1.4.16 ===== Make-3.82 ===== tar -xjf make-3.82.tar.bz2 cd make-3.82 ./configure --prefix=/tools make && make check && make install cd .. rm -fr make-3.82 ===== Patch-2.7.1 ===== tar -xJf patch-2.7.1.tar.xz cd patch-2.7.1 ./configure --prefix=/tools make && make check && make install cd .. rm -fr patch-2.7.1 ===== Perl-5.16.2 ===== tar -xjf perl-5.16.2.tar.bz2 cd perl-5.16.2 patch -Np1 -i ../perl-5.16.2-libc-1.patch sh Configure -des -Dprefix=/tools make cp -v perl cpan/podlators/pod2man /tools/bin mkdir -pv /tools/lib/perl5/5.16.2 cp -Rv lib/* /tools/lib/perl5/5.16.2 cd .. rm -fr perl-5.16.2 ===== Sed-4.2.2 ===== tar -xjf sed-4.2.2.tar.bz2 cd sed-4.2.2 ./configure --prefix=/tools make && make check && make install cd .. rm -fr sed-4.2.2 ===== Tar-1.26 ===== tar -xjf 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 -fr tar-1.26 ===== Texinfo-5.0 ===== tar -xJf texinfo-5.0.tar.xz cd texinfo-5.0 ./configure --prefix=/tools make && make check && make install cd .. rm -fr texinfo-5.0 ===== Xz-5.0.4 ===== tar -xJf xz-5.0.4.tar.xz cd xz-5.0.4 ./configure --prefix=/tools make && make check && make install cd .. rm -fr xz-5.0.4 ===== 스트리핑 ===== 설치된 패키지 중 불필요한 부분을 찾아 삭제하는 부가적인 과정 strip --strip-debug /tools/lib/* strip --strip-unneeded /tools/{,s}bin/* rm -fr /tools/{,share}/{info,man,doc} ===== 소유권 변경 ===== $FLS/tools 디렉토리에 모든 파일들은 현재 lfs 소유이지만 이것은 부자연스럽다. # chown -R root:root $LFS/tools