Építsünk saját GNU/Linux rendszert! -- A /tools építése

Ez a blog az Építsünk saját GNU/Linux rendszert! (#1, #2, különkiadás, #3, újraélesztés) című blogsorozatom folytatása. Ez a rész gyakorlatilag a második rész ismétlése, az előző részben említett felülvizsgált célkitűzések és frissített szoftverek mellett. Javaslom a második rész (ismételt) elolvasását, mert az ott leírt összefoglalót nem ismétlem meg, csak az újdonságokat és a változásokat tárgyalom részletesen.

Az első dolog, ami problémát okozott, hogy a LFS könyv is áttért arra, amit a DIY Linux Next Generation Build Method-nak nevez. Ez első menetben Cross-Binutils-t és Cross-GCC-t fordít egyedi nevű targetre (pl. i686-lfs-linux-gnu). Először azt gondoltam, hogy ez számomra felesleges, mivel 32 bites processzoron és 32 bites host rendszeren fordítok egy 32 bites LFS-t, és ha eddig működött enélkül, akkor eztán is fog. Nem így történt. Ugyanis a cross-compiling segít abban, hogy a /tools elszigetelődjön host rendszertől. Ugyanis bár valójában ugyanarra a platformra fordítok, mégis az egyedi target miatt úgy fordít, mint ha egy másik platformra tenné, tehát vigyáz arra, hogy ne linkeljen a host rendszerre. Az cross-toolchain során beállított egyedi target nem befolyásolja az később eredményül kapott rendszeren a CHOST értékét.

Git-et használtam a /tools backupolására. Tetszik. Gyorsabb vele backupolni és visszaállítani, mint ha az egészet menteném tarral, illetve az egészet törölném és állítanám vissza. Vetetszik az LFS Hints-ben található primitív csomagkezelőkkel. Install szkripteket ugyan nem tud, a jogosultságok közül is csak a futtathatósági bitet tárolja, de a /tools-nál ez éppen elég. Lássuk, hogyan is használtam.

Az elején inicializáltam a /tools-ban a git repót:

cd $LFS/tools
git init

Később, miután feltelepíttem valamit a /tools-ba, commit-oltam az új csomagot:

git add -A
git commit -m "<message>"

Egy GNU/Linux rendszer lelkét a GLibC-GCC-Binutils háromság képezi, továbbá valamelyest maga a Linux kernel. Így ezek verzióját gondosan választottam ki, a többi csomagból pedig általában egyszerűen vettem a legfrissebbet.

Binutilsból vettem a legújabb FSF release-t.

GCC-ből úgy döntöttem nem választom a legújabb stabil ágat, hanem az eggyel régebbit. Gondolkodtam, mi a rosszabb: ismert hibák, vagy teszteletlen hibajavítások? Végül aztán vettem a 4.3 ág legújabb .tar.bz2-ben csomagolt snapshotját, mondhatnám úgy is, hogy 4.3.5 prerelease. Nem biztos, hogy jó döntés volt, de hát azért van a testsuite, hogy ezt segítsen eldönteni.

LibC-nek SVN-ből letöltöttem az EGLibC 2.10-es ágát, ami 2.10.2-nek hívja magát. Elvileg forrás és binárisan kompatibilis a GLibC-vel, Debiannak jó, Ubuntunak jó, amúgy sem akartam a legújabbat rakni, talán nekem is jó lesz. Majd a testsuite során kiderül. :)

Kernelből pedig a 2.6.27-es ágat választottam, mivel ez hosszú karbantartású, az adott gépen pedig már nagyon régóta minden hardver támogatott.

Tehát a verziók:

  • Binutils 2.20
  • GCC 4.3 snapshot
  • EGLibC 2.10 SVN
  • Linux 2.6.27.x

Akkor most lássuk milyen lépéseket csináltam végig!

cross-binutils 2.20
cross-gcc 4.3 20100110 (mpfr 2.4.2, gmp 4.3.2) (*)
linux 2.6.27.43 api headers
eglibc 2.10 r9642 (*)
adjusting the toolchain
binutils 2.20
gcc 4.3 20100110 (mpfr 2.4.2, gmp 4.3.2) (*)

tcl 8.5.8
expect 5.43.0
dejagnu 1.4.4
ncurses 5.7
bash 4.1
bzip2 1.0.5 (*)
coreutils 8.3
diffutils 2.8.1
findutils 4.4.2
gawk 3.1.7
gettext 0.17 (*)
grep 2.5.4
gzip 1.3.13
m4 1.4.13
make 3.81
patch 2.6.1
perl 5.10.1
sed 4.2.1

zlib 1.2.3 (*)
xz-utils 4.999.9beta (*)
openssl 0.9.8l (*)
libarchive 2.7.1 (*)

util-linux-ng 2.17 (*)
wget 1.12 (*)
fakeroot 1.14.4 (X)
pacman 3.3.3 (*)

texinfo 4.13a
fakeroot 1.14.4 (*)
file 5.03

stripping

Amit nem jelöltem meg, azt pont úgy csináltam, ahogy a könyvben van. Ami csillagozva van, azt nem pont úgy csináltam, ezért a továbbiakban közlöm az utasításokat. Az egyik fakeroot-nál az X azt jelenti, hogy először nem a megfelelő build utasításokkal telepítettem, aztán mielőtt a másodszor telepítettem volna, az előzőt eltávolítottam a

git revert <commit>

paranccsal. Végül lássuk az egyedi build utasításokat!

cross gcc
=========

../gcc-4.3-*/configure --target=$LFS_TGT --prefix=/tools --disable-nls --disable-shared --disable-multilib --disable-decimal-float --disable-threads --disable-libmudflap --disable-libssp --disable-libgomp --enable-languages=c
make
make -j1 install
ln -vs libgcc.a `$LFS_TGT-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`

eglibc
======

mkdir -v ../eglibc-build
cd ../eglibc-build

echo "CFLAGS += -march=i686 -mtune=native" > configparms

../eglibc-2.10/configure --prefix=/tools --host=$LFS_TGT --build=$(../eglibc-2.10/scripts/config.guess) --disable-profile --enable-add-ons --enable-kernel=2.6.18 --with-headers=/tools/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes ac_cv_path_GREP=/bin/grep
make
make -j1 install

gcc
===

tar -xf ../mpfr-*.tar*
mv mpfr-* mpfr
tar -xf ../gmp-*.tar*
mv gmp-* gmp

patch -Np1 -i ../gcc-4.3-branch-startfiles-1.patch

cp -v gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in

cp -v gcc/Makefile.in{,.tmp}
sed 's/^XCFLAGS =$/& -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_INCLUDE_DIR
#define STANDARD_INCLUDE_DIR 0
#define STANDARD_STARTFILE_PREFIX_1 ""
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
  touch $file.orig
done

mkdir -v ../gcc-build
cd ../gcc-build

CC="$LFS_TGT-gcc -B/tools/lib/" AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib ../gcc-4.3-20100110/configure --prefix=/tools --with-local-prefix=/tools --enable-clocale=gnu --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-languages=c,c++ --disable-libstdcxx-pch --disable-multilib --disable-bootstrap
make
make -j1 install
ln -vs gcc /tools/bin/cc

bzip2
=====

sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile

make -f Makefile-libbz2_so
make clean

make
make PREFIX=/tools install

cp -av libbz2.so* /tools/lib
ln -sv libbz2.so.1.0 /tools/lib/libbz2.so

gettext
=======

patch -Np1 -i ../gettext-0.17-upstream_fixes-2.patch

./configure --prefix=/tools --disable-shared
make
make install

zlib
====

./configure --prefix=/tools --shared
make
make install
make clean

./configure --prefix=/tools
make
make install
chmod -v 644 /tools/lib/libz.a

xz-utils
========

./configure --prefix=/tools
make
make install

openssl
=======

./config --prefix=/tools --openssldir=/tools/etc/ssl shared zlib-dynamic
make
make install

libarchive
==========

./configure --prefix=/tools
make
make install
ln -vs bsdtar /tools/bin/tar

util-linux-ng
=============

./configure --prefix=/tools
make -C getopt getopt
cp -v getopt/getopt /tools/bin

wget
====

./configure --prefix=/tools --disable-ipv6 --disable-nls
make
make install

fakeroot
========

./configure --prefix=/tools
make
sed -i.bak 's,^PATHS=,&/lib:/usr/lib:,' scripts/fakeroot
make install

pacman
======

./configure --prefix="" --disable-internal-download --disable-doc --disable-nls --with-root-dir=/
make
make DESTDIR=/tools install

Még néhány megjegyzés, amit felírok magamnak. :)

  • coreutils képes linkelődni a következőkhöz: libselinux, libacl, libattr, libcap, libgmp
  • openssl patch nélkül etc/ssl-be teszi a man oldalakat :)
  • libarchive openssl-hez képes linkelődni!

Hozzászólások

A 'lof...nal kicsit jobban' erdekel a wikibe tetelre vonatkozo otlet?

openssl: --mandir?
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.