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!
- utpKabel blogja
- A hozzászóláshoz be kell jelentkezni
- 2455 megtekintés
Hozzászólások
A 'lof...nal kicsit jobban' erdekel a wikibe tetelre vonatkozo otlet?
- A hozzászóláshoz be kell jelentkezni
Hát én nem vagyok egyáltalán ellene, de én nem vagyok regisztrálva a hupwikire.
- A hozzászóláshoz be kell jelentkezni
openssl: --mandir?
--
()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
A /tools-ban úgy sem fogok man-t olvasgatni (nincs telepítve az olvasó), és a végén úgyis eltávolításra kerül az egész /tools. Szóval itt még ez egyáltalán nem számít.
- A hozzászóláshoz be kell jelentkezni