Erstellen der Toolchain für den Basis-Build

Aus HaboLinux

Wechseln zu: Navigation, Suche

Großteils kann man sich beim Bau an die Anleitung von LinuxFromScratch halten. Da aber teilweise neuere Programmversionen eingesetzt werden, sind einige Abweichungen notwendig. Außerdem habe ich auf einige der Patches verzichtet. Einerseits, weil neuere Versionen verwendet werden, die diese bereits enthalten, andererseits weil ich sehen will wie sich das System verhält, wenn bestimmte Patches nicht enthalten sind. Sollten sie sich als notwendig erweisen, kann man sie immer noch einbauen.

Ich empfehle den Bau in einer virtuelle Maschine wie VirtualBox o.ä. Je mehr RAM man zur Verfügung stellen kann, umso schneller geht der Build. Als virtuelle Festplatte sollten ca. 10GB zur Verfügung stehen. Als Host-System wird eine LFS-LiveCD eingesetzt, die man unter http://www.habolinux.de/lfslivecd-x86-6.3-r2145.iso downloaden kann. Der Build ist damit natürlich auch auf einem "echten" PC möglich. Der Ablauf ist dann im einzelnen wie folgt:

Zu erstmal die LFS-Live-CD booten und die root-Konsole durch Druck auf "Enter" aktivieren.

Danach die Disk mit 'fdisk' partitionieren:

fdisk /dev/hda # ggf. das Device anpassen, wenn keine VirtualBox verwendet wird

Für den Build brauchen wir 2 Partitionen für / und swap, wobei wir die erste als primäre Partition mit 1GB als swap einrichten (Partitionstyp festlegen nicht vergessen!) und der Rest wird als primäre Linux-Partition angelegt. Das Ganze dann abspeichern ('w') und Formatieren:

mkswap /dev/hda1 # ggf. das Device anpassen, wenn anders partitioniert wurde
mkfs.ext3 /dev/hda2 # ggf. das Device anpassen, wenn anders partitioniert wurde

Die Swap wird erstmal nicht benötigt, daher wird nur die ext3-Partition gemountet:

mkdir /hl
mount -t ext3 /dev/hda2 /hl

Der Build der Toolchain muss (und sollte) nicht als root durchgeführt werden. Daher wird dafür ein extra Benutzer angelegt, den wir 'hl' nennen.

groupadd hl
useradd -g hl -s /bin/bash -m -k /dev/null hl
passwd hl

Die Toolchain wird in /hl/tools landen, während die Sources temporär in /hl/sources abgelegt werden, wo dann auch kompiliert wird. Also sollten diese beiden Ordner angelegt und dem Benutzer 'hl' zugeordnet werden. Damit die Toolchain im Host-System später auch unter /tools verfügbar ist, wird /hl/tools nach / verlinkt:

mkdir /hl/tools /hl/sources
chown -R hl:hl /hl
ln -s /hl/tools /

Dann wechselt man den Benutzer:

su - hl

Alternativ kann man sich auch via SSH einloggen, was das Copy&Paste erleichtert. Augenzwinkern Wie man ein Portforwarding für VirtualBox einrichtet, kann man unter http://mydebian.blogdns.org/?p=148 nachlesen. Der SSH-Server kann bei der LFS-LiveCD mittels '/etc/rc.d/init.d/sshd start' gestartet werden.

Um nicht ständig Umgebungsvariablen ändern zu müssen, werden einige festgelegt. Solange die VM nicht neugestartet wird, bleiben diese auch erhalten. Bei VirtualBox kann man eine VM anhalten und dabei ihren Status speichern, so dass man den Build jederzeit fortsetzen kann, indem man sich einfach wieder als Benutzer 'hl' anmeldet.

cat > ~/.bash_profile << "EOF"
exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
EOF
cat > ~/.bashrc << "EOF"
set +h
umask 022
HL=/hl
LC_ALL=POSIX
PATH=/tools/bin:/bin:/usr/bin
export HL LC_ALL PATH
EOF
source ~/.bash_profile

Nun kann das eigentliche Kompilieren beginnen. Wer einen der folgenden Befehle nicht versteht, sollte im LFS-Handbuch nachschlagen oder die Manpages dazu lesen.

Binutils bauen:

cd /hl/sources
wget http://www.habolinux.de/sources/binutils.tar.gz
tar -xzf binutils.tar.gz
mkdir binutils-build && cd binutils-build
CC="gcc -B/usr/bin/" ../binutils/configure --prefix=/tools --disable-nls --disable-werror
make
make install
make -C ld clean
make -C ld LIB_PATH=/tools/lib
cp ld/ld-new /tools/bin

GCC bauen:

cd $HL/sources
 wget http://www.habolinux.de/sources/gcc.tar.gz
 wget http://www.habolinux.de/sources/gmp.tar.gz
 wget http://www.habolinux.de/sources/mpfr.tar.gz
tar -xzf gcc.tar.gz
tar -xzf gmp.tar.gz
tar -xzf mpfr.tar.gz
mv mpfr gcc
mv gmp gcc
mkdir gcc-build
cd gcc-build
CC="gcc -B/usr/bin/" ../gcc/configure --prefix=/tools --with-local-prefix=/tools --disable-nls --disable-shared --disable-libssp --enable-languages=c
make
make install
ln -s libgcc.a `gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'`
ln -vs gcc /tools/bin/cc


Linux API Headers installieren:

cd $HL/sources

wget http://www.habolinux.de/sources/kernel.tar.gz

tar -xzf kernel.tar.gz
cd kernel
make mrproper
make headers_check
make INSTALL_HDR_PATH=dest headers_install
cp -r dest/include/* /tools/include


Glibc bauen: $HL/sources

wget http://www.habolinux.de/sources/glibc.tar.gz
tar -xzf glibc.tar.gz
cd glibc
sed -i 's@/etc/ld.so.preload@/tools/etc/ld.so.preload@' elf/rtld.c
cd ..
mkdir glibc-build
cd glibc-build
echo "CFLAGS += -march=i486 -mtune=native" > configparms
../glibc/configure --prefix=/tools --disable-profile --enable-add-ons --enable-kernel=2.6.0 --with-binutils=/tools/bin --without-gd --with-headers=/tools/include --without-selinux
make
mkdir /tools/etc
touch /tools/etc/ld.so.conf
make install


Linker einstellen:


mv /tools/bin/{ld,ld-old}
mv /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
mv /tools/bin/{ld-new,ld}
ln -s /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
gcc -dumpspecs | sed 's@/lib/ld-linux.so.2@/tools&@g' > `dirname $(gcc -print-libgcc-file-name)`/specs
GCC_FIXED=`dirname $(gcc -print-libgcc-file-name)`/include-fixed &&
find ${GCC_FIXED}/* -maxdepth 0 -xtype d -exec rm -rvf '{}' \; &&
rm -vf `grep -l "DO NOT EDIT THIS FILE" ${GCC_FIXED}/*` &&
unset GCC_FIXED


TCL bauen:

cd $HL/sources
wget http://www.habolinux.de/sources/tcl.tar.gz
tar -xzf tcl.tar.gz
cd tcl/unix
./configure --prefix=/tools
make
TZ=UTC make test
make install
chmod u+w /tools/lib/libtcl8.5.so
make install-private-headers
ln -s tclsh8.5 /tools/bin/tclsh


Expect bauen:

cd $HL/sources
wget http://www.habolinux.de/sources/expect.tar.gz
tar -xzf expect.tar.gz
cd expect
patch -Np1 -i patches/expect-5.43.0-spawn-2.patch
patch -Np1 -i patches/expect-5.43.0-tcl_8.5.5_fix-1.patch
cp configure{,.orig}
sed 's:/usr/local/bin:/bin:' configure.orig > configure
./configure --prefix=/tools --with-tcl=/tools/lib --with-tclinclude=/tools/include --with-x=no
make
make test
make SCRIPTS="" install


Dejagnu bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/dejagnu.tar.gz
tar -xzf dejagnu.tar.gz
cd dejagnu
./configure --prefix=/tools
make install


2. Durchlauf für GCC:

cd $HL/sources
rm -rf gcc*
wget http://www.habolinux.de/sources/gcc.tar.gz
tar -xzf gcc.tar.gz
cd gcc
cp gcc/Makefile.in{,.orig}
sed 's@\./fixinc\.sh@-c true@' gcc/Makefile.in.orig > gcc/Makefile.in
cp 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)
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" >> $file
  touch $file.orig
done
cd ..
tar -xzf gmp.tar.gz
tar -xzf mpfr.tar.gz
mv gmp gcc
mv mpfr gcc
mkdir gcc-build
cd gcc-build
../gcc/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-bootstrap
make
make -k check
make install


2. Durchlauf für Binutils:


cd $HL/sources
rm -rf binutils*
wget http://www.habolinux.de/sources/binutils.tar.gz
tar -xzf binutils.tar.gz
mkdir binutils-build
cd binutils-build
../binutils/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 ld/ld-new /tools/bin


Ncurses bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/ncurses.tar.gz
tar -xzf ncurses.tar.gz
cd ncurses
./configure --prefix=/tools --with-shared --without-debug --without-ada --enable-overwrite
make
make install


Bash bauen (sollten diese Sources nicht fehlerfrei bauen, dann http://www.habolinux.de/sources/bash-3.2.48.tar.gz verwenden):


cd $HL/sources
wget http://www.habolinux.de/sources/bash.tar.gz
tar -xzf bash.tar.gz
cd bash
./configure --prefix=/tools --without-bash-malloc ac_cv_func_working_mktime=yes
make
make install
ln -s bash /tools/bin/sh
<code>

Bash v.3.2.48 falls obiges nicht funktioniert:

<code>
cd $HL/sources
wget http://www.habolinux.de/sources/bash-3.2.48.tar.gz
tar -xzf bash-3.2.48.tar.gz
cd bash-3.2
./configure --prefix=/tools --without-bash-malloc ac_cv_func_working_mktime=yes
make
make install
ln -s bash /tools/bin/sh
<code>


Bzip2 bauen:

<code>
cd $HL/sources
wget http://www.habolinux.de/sources/bzip2.tar.gz
tar -xzf bzip2.tar.gz
cd bzip2
make
make PREFIX=/tools install


GPerf bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/gperf.tar.gz
tar -xzf gperf.tar.gz
cd gperf
./configure --prefix=/tools
make
make install


Coreutils bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/coreutils.tar.gz
tar -xzf coreutils.tar.gz
cd coreutils
./configure --prefix=/tools --enable-install-program=hostname
make
make install
cp src/su /tools/bin/su-tools


Diffutils bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/diffutils.tar.gz
tar -xzf diffutils.tar.gz
cd diffutils
./configure --prefix=/tools
make
make install


e2fsprogs bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/e2fsprogs.tar.gz
tar -xzf e2fsprogs.tar.gz
cd e2fsprogs
mkdir build
cd build
../configure --prefix=/tools
make
make install-libs
chmod u+w /tools/lib/{libblkid,libcom_err,libe2p,libext2fs,libss,libuuid}.a
<code>


Findutils bauen:

<code>cd $HL/sources
wget http://www.habolinux.de/sources/findutils.tar.gz
tar -xzf findutils.tar.gz
cd findutils
./configure --prefix=/tools
make
make install

GAwk bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/gawk.tar.gz
tar -xzf gawk.tar.gz
cd gawk
./configure --prefix=/tools ac_cv_func_working_mktime=yes
make
make install


Gettext bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/gettext.tar.gz
tar -xzf gettext.tar.gz
cd gettext/gettext-tools
./configure --prefix=/tools --disable-shared
make -C gnulib-lib
make -C src msgfmt
cp src/msgfmt /tools/bin


Grep bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/grep.tar.gz
tar -xzf grep.tar.gz
cd grep
./configure --prefix=/tools --disable-perl-regexp --without-included-regex
make
make install


GZip bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/gzip.tar.gz
tar -xzf gzip.tar.gz
cd gzip
for file in gzip.c lib/utimens.{c,h} ; do \
  cp -v $file{,.orig}
  sed 's/futimens/gl_&/' $file.orig > $file
done
./configure --prefix=/tools
make
make install
<code>

M4 bauen:

<code>
cd $HL/sources
wget http://www.habolinux.de/sources/m4.tar.gz
tar -xzf m4.tar.gz
cd m4
./configure --prefix=/tools
make
make install
<code>


Make bauen:

<code>
cd $HL/sources
wget http://www.habolinux.de/sources/make.tar.gz
tar -xzf make.tar.gz
cd make
./configure --prefix=/tools
make
make install

Patch bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/patch.tar.gz
tar -xzf patch.tar.gz
cd patch
./configure --prefix=/tools
make
make install


Perl bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/perl.tar.gz
tar -xzf perl.tar.gz
cd perl
patch -Np1 -i patches/perl-5.10.0-consolidated-1.patch
sh Configure -des -Dprefix=/tools -Dstatic_ext='Data/Dumper Fcntl IO POSIX'
make perl utilities ext/Errno/pm_to_blib
cp -v perl pod/pod2man /tools/bin
mkdir -p /tools/lib/perl5/5.10.0
cp -R lib/* /tools/lib/perl5/5.10.0


Sed bauen:

cd $HL/sources
wget http://www.habolinux.de/sources/sed.tar.gz
tar -xzf sed.tar.gz
cd sed
./configure --prefix=/tools
make
make install


Tar bauen:


cd $HL/sources
wget http://www.habolinux.de/sources.tar.gz
tar -xzf tar.tar.gz
cd tar
./configure --prefix=/tools
make
make install


help2man - Sollte dieses Programm nicht korrekt bauen, muss noch das Perl-Module Locale::gettext installiert werden. Dies kann man tun, indem man 'cpan' als root im Host-System aufruft und 'install Locale::gettext' verwendet.


cd $HL/sources
wget http://www.habolinux.de/sources/help2man.tar.gz
tar -xzf help2man.tar.gz
cd help2man
PATH=/usr/bin:/bin:/tools/bin ./configure --prefix=/tools
make
make install


Texinfo bauen:


cd $HL/sources
wget http://www.habolinux.de/sources/texinfo.tar.gz
tar -xzf texinfo.tar.gz
cd texinfo
./configure --prefix=/tools
make
make install
<code>


Util-Linux-NG bauen:

<code>
cd $HL/sources
wget http://www.habolinux.de/sources/util-linux-ng.tar.gz
tar -xzf util-linux-ng.tar.gz
cd util-linux-ng
./configure --prefix=/tools --with-fsprobe=builtin
make 
cp mount/{,u}mount text-utils/more /tools/bin


Zum Schluss müssen noch einige "Nacharbeiten" gemacht werden.


strip --strip-debug /tools/lib/*
strip --strip-unneeded /tools/{,s}bin/*
rm -rf /tools/{info,man}


Und nun noch als root im Hostsystem den Eigentümer für die Toolchain auf root setzen:


chown -R root:root /hl/tools


Jetzt kann das chrooten vorbereitet werden, indem Pseudo-Dateisysteme gemountet werden u.ä.:


mkdir -p /hl/{dev,proc,sys}
mknod -m 600 /hl/dev/console c 5 1
mknod -m 666 /hl/dev/null c 1 3
mount --bind /dev /hl/dev
mount -t devpts devpts /hl/dev/pts
mount -t tmpfs shm /hl/dev/shm
mount -t proc proc /hl/proc
mount -t sysfs sysfs /hl/sys

Um den eigentlichen Bau des Systems zu beginnen, kann man nun in die Umgebung der Toolchain chrooten: code:


chroot "/hl" /tools/bin/env -i HOME=/root TERM="$TERM" PS1='\u:\w\$ ' PATH=/bin:/usr/bin:/sbin:/usr/sbin:/tools/bin /tools/bin/bash --login +h


An dieser Stelle beginnt nun der Bau des eigentlichen Systems. Die dafür notwendigen Pakete packe ich im Laufe der kommenden Woche auf den Server. Genug Zeit um

Persönliche Werkzeuge