diff options
-rw-r--r-- | temporary-bootstrap-builder-setup-cortexa8.txt | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/temporary-bootstrap-builder-setup-cortexa8.txt b/temporary-bootstrap-builder-setup-cortexa8.txt new file mode 100644 index 0000000..6e88467 --- /dev/null +++ b/temporary-bootstrap-builder-setup-cortexa8.txt @@ -0,0 +1,381 @@ +ABOUT THIS GUIDE +================ + +This is a guide to building a custom BusyBox/Linux-libre system with the GNU +toolchain. It mostly follows Cross Linux From Scratch Sysroot version +SVN-0.0.1-20090726-x86, except that it uses more recent versions of software +packages and uses a BusyBox-based userspace rather than a GNU-based one. This +guide assumes the use of a GNU/Linux host system with all the necessary +development software (GCC, GNU Binutils, Subversion, etc.) already installed. + +This version of the procedure is designed to build a bootstrap builder system +capable of cross-compiling software for an ARM Cortex-A8 core. + +It is recommended that you read Cross Linux From Scratch Sysroot version +SVN-0.0.1-20090726-x86 to understand the full build process and the rationale +behind various elements of the setup. + + +LEGAL NOTICE +============ + +THIS GUIDE: + + Copyright (C) 2012 Patrick "P. J." McDermott + + This guide may be reproduced, distributed, modified, and otherwise dealt in + under the terms of the Expat/MIT License: + http://www.jclark.com/xml/copying.txt + +CERTAIN COMMAND LINES AND FILE CONTENTS: + + Cross-Compiled Linux From Scratch - Sysroot + Version SVN-0.0.1-20090726-x86 + + Copyright © 2005-2009, Jim Gifford, & Ryan Oliver + + This material may be distributed only subject to the terms and conditions set + forth in the Open Publication License v1.0 or later (the latest version is + presently available at http://www.opencontent.org/openpub/). + + The latest version of the original book may be downloaded from: + http://trac.cross-lfs.org/wiki/download#CLFSSysroot1.xUnderDevelopment + It may also be read online at: + http://cross-lfs.org/view/clfs-sysroot/x86/ + +TRADEMARKS: + + Linux is a Registered Trademark of Linus Torvalds. + + +PROCEDURE +========= + +Make a directory in which all work will be done. Under this directory, make +directories 'src' and sys.cortexa8': + $ mkdir src sys.cortexa8 + +Download all of the necessary source archives and branches. + $ cd src + $ wget http://www.busybox.net/downloads/busybox-1.19.3.tar.bz2 + $ wget http://www.fsfla.org/svnwiki/selibre/linux-libre/download/releases/\ + > 3.2.10-libre/linux-3.2.10-libre.tar.bz2 + $ svn co svn://svn.eglibc.org/branches/eglibc-2_15 eglibc-2.15 + $ wget http://ftp.gnu.org/gnu/gcc/gcc-4.6.2/gcc-4.6.2.tar.bz2 + $ wget http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2 + $ wget http://ftp.gnu.org/gnu/make/make-3.82.tar.bz2 + $ wget ftp://ftp.gmplib.org/pub/gmp-5.0.2/gmp-5.0.2.tar.bz2 + $ wget http://www.mpfr.org/mpfr-current/mpfr-3.1.0.tar.bz2 + $ wget http://www.multiprecision.org/mpc/download/mpc-0.9.tar.gz + $ for file in *.tar.bz2; do tar -xjf ${file}; done + $ for file in *.tar.gz; do tar -xzf ${file}; done + $ cd .. + +Make and mount the filesystem. mkfs and mount must be run as the superuser, but +dd shouldn't need to be. + $ cd sys.cortexa8 + $ dd if=/dev/zero of=fs bs=1024 count=$((3*1024*1024)) + # mkfs -t ext4 fs + $ mkdir fsmnt + # mount -o loop fs fsmnt + +Set up a new user. + # groupadd tbb-cortexa8 + # useradd -s /bin/bash -g tbb-cortexa8 -d /home/tbb-cortexa8 tbb-cortexa8 + # mkdir -pv /home/tbb-cortexa8 + # chown -v tbb-cortexa8:tbb-cortexa8 /home/tbb-cortexa8 + # passwd tbb-cortexa8 + # chown -Rv tbb-cortexa8:tbb-cortexa8 fsmnt + +Set up the toolchain work environment. Be sure to change '<BASE_DIR>' to the +absolute path to the base work directory you made earlier, and adjust the +configuration name in BBL_TARGET if you're building for a different +architecture. We're using GNU Bash as the new user's default shell for +convenience; this has no effect on the target system. + $ su - tbb-cortexa8 + $ cat > ~/.bash_profile <<EOF + > exec env -i HOME="${HOME}" TERM="${TERM}" /bin/bash + > EOF + $ cat > ~/.bashrc <<EOF + > set +h + > umask 022 + > BBL=<BASE_DIR>/sys.cortexa8/fsmnt + > LC_ALL=C + > PATH=<BASE_DIR>/sys.cortexa8/fsmnt/cross-tools/bin:/bin:/usr/bin + > export BBL LC_ALL PATH + > PS1='$ ' + > unset CFLAGS + > unset CXXFLAGS + > export BBL_HOST=$(echo ${MACHTYPE} | \ + > sed "s/$(echo ${MACHTYPE} | cut -d - -f 2)/cross/") + > export BBL_TARGET=arm-none-linux-gnu + > EOF + $ source ~/.bash_profile + +Make system directories. These commands should give you a system that is +compliant with Filesystem Hierarchy Standard version 2.3. Note that the range +syntax in many of these command lines is a non-standard feature of GNU Bash; +this may not work on other shells. + $ mkdir -pv ${BBL}/{bin,boot,dev,etc/opt,home,lib,media,mnt,opt,proc} + $ install -dv -m 0750 ${BBL}/root + $ mkdir -pv ${BBL}/{sbin,srv,sys} + $ install -dv -m 1777 ${BBL}{,/var}/tmp + $ mkdir -pv ${BBL}/usr/{,local/}{bin,include,lib,sbin,share/{man,misc},src} + $ mkdir -pv ${BBL}/usr/local/{etc,games} + $ mkdir -pv ${BBL}/usr/{,local/}share/{doc,info,locale,terminfo,zoneinfo} + $ mkdir -pv ${BBL}/usr/{,local/}share/man/man{1,2,3,4,5,6,7,8} + $ ln -sv share/man ${BBL}/usr/local/man + $ mkdir -pv ${BBL}/var/{cache,lib/misc,local,lock,log,mail,opt,run,spool} + +Write the passwd and group files. + $ cat > ${BBL}/etc/passwd <<EOF + > root::0:0:root:/root:/bin/bash + > EOF + $ cat > ${BBL}/etc/group <<EOF + > root:x:0: + > bin:x:1: + > sys:x:2: + > kmem:x:3: + > tty:x:4: + > tape:x:5: + > daemon:x:6: + > floppy:x:7: + > disk:x:8: + > lp:x:9: + > dialout:x:10: + > audio:x:11: + > video:x:12: + > utmp:x:13: + > usb:x:14: + > cdrom:x:15: + > EOF + +If CONFIG_FEATURE_UTMP and/or CONFIG_FEATURE_WTMP are enabled in BusyBox, +certain BusyBox applets (getty, login, init, etc.) will log user logins to +/var/run/utmp and/or /var/run/wtmp. However, BusyBox's supporting library won't +create /var/run/wtmp if it doesn't exist. So create these files now and set +proper modes for them. + $ touch ${BBL}/var/run/{u,w}tmp + $ chmod -v 664 ${BBL}/var/run/{u,w}tmp +/var/run/utmp is used to track logged-in users. /var/run/wtmp is used to record +when users log into and out of the system. NB: This is an odd location for +wtmp, but that's where an unpatched BusyBox will expect it. + +Make and change to a directory for package source code. + $ mkdir -v ${BBL}/src + $ cd ${BBL}/src + +At this point and after every milestone (maybe after each package installation), +I recommend you create a snapshot of the filesystem. To do so, first exit the +shell environment of user 'tbb-cortexa8'. + $ exit +As the superuser, unmount the filesystem. + # umount fs +Make a copy of the filesystem. Replace '<UNIQUE_NAME>' with something to +identify the milestone (for example, at this point I named my snapshot image +'fs.01-fs-hier' to note that it was the first snapshot and that I just finished +making the filesystem hierarchy). + $ cp -p fs fs.<UNIQUE_NAME> +As the superuser, mount the filesystem again. + # mount -o loop fs fsmnt +Log in as user 'tbb-cortexa8' and return to the src directory in the filesystem. + $ su - tbb-cortexa8 + $ cd ${BBL}/src +Now, if something goes wrong, you can revert to a previous filesystem image by +going through this section and swapping the arguments to 'cp'. + +Install Linux's headers for use by EGLIBC. + $ cp -pR ${BBL}/../../src/linux-3.2.10 . + $ cd linux-3.2.10 + $ make mrproper + $ make ARCH=arm headers_check + $ make ARCH=arm INSTALL_HDR_PATH=${BBL}/usr headers_install + $ find ${BBL}/usr/include/ -name .install -o -name ..install.cmd | \ + > xargs rm -fv + $ cd .. + $ rm -Rf linux-3.2.10 + +Install GMP for use by the cross-compiling GCC build. + $ cp -pR ${BBL}/../../src/gmp-5.0.2 . + $ cd gmp-5.0.2 + $ CPPFLAGS=-fexceptions ./configure --prefix=${BBL}/cross-tools --enable-cxx + $ make + $ make install + $ make check + $ cd .. + $ rm -Rf gmp-5.0.2 + +Install MPFR for use by the cross-compiling GCC build. + $ cp -pR ${BBL}/../../src/mpfr-3.1.0 . + $ cd mpfr-3.1.0 + $ LDFLAGS="-Wl,-rpath,${BBL}/cross-tools/lib" ./configure \ + > --prefix=${BBL}/cross-tools --enable-shared --with-gmp=${BBL}/cross-tools + $ make + $ make install + $ cd .. + $ rm -Rf mpfr-3.1.0 + +Install MPC for use by the cross-compiling GCC build. + $ cp -pR ${BBL}/../../src/mpc-0.9 . + $ cd mpc-0.9 + $ LDFLAGS="-Wl,-rpath,${BBL}/cross-tools/lib" ./configure \ + > --prefix=${BBL}/cross-tools --with-mpfr=${BBL}/cross-tools \ + > --with-gmp=${BBL}/cross-tools + $ make + $ make install + $ cd .. + $ rm -Rf mpc-0.9 + +Configure and build a cross-compiling GNU Binutils. + $ cp -pR ${BBL}/../../src/binutils-2.22 . + $ mkdir -v binutils-build + $ cd binutils-build + $ AR=ar AS=as ../binutils-2.22/configure --prefix=${BBL}/cross-tools \ + > --host=${BBL_HOST} --target=${BBL_TARGET} --with-sysroot=${BBL} \ + > --disable-nls --enable-shared --disable-multilib + $ make configure-host + $ make + $ make install + $ cp -v ../binutils-2.22/include/libiberty.h ${BBL}/usr/include + $ cd .. + $ rm -Rf binutils-2.22 binutils-build + +Configure and build a cross-compiling GCC with a static libgcc and no threads. + $ cp -pR ${BBL}/../../src/gcc-4.6.2 . + $ mkdir -v gcc-build + $ cd gcc-build + $ AR=ar LDFLAGS="-Wl,-rpath,${BBL}/cross-tools/lib" ../gcc-4.6.2/configure \ + > --prefix=${BBL}/cross-tools --build=${BBL_HOST} --host=${BBL_HOST} \ + > --target=${BBL_TARGET} --disable-multilib --with-sysroot=${BBL} \ + > --disable-nls --without-headers --with-newlib --disable-decimal-float \ + > --disable-libgomp --disable-libmudflap --disable-libssp \ + > --with-mpfr=${BBL}/cross-tools --with-gmp=${BBL}/cross-tools \ + > --with-mpc=${BBL}/cross-tools --without-ppl --without-cloog \ + > --disable-shared --disable-threads --enable-languages=c + $ make all-gcc all-target-libgcc + $ make install-gcc install-target-libgcc + $ cd .. + $ rm -Rf gcc-4.6.2 gcc-build + +Configure and build a cross-compiling EGLIBC. Change '<LINUX_VER>' to the lower +of either version 3.1.6 or the version of Linux running on your host system. + $ cp -pR ${BBL}/../../src/eglibc-2.15 . + $ cd eglibc-2.15 + $ find . -depth -name .svn -exec rm -Rf {} \; + $ rm ports/Makefile + $ cp -R ports/* libc + $ cd libc + $ cp -v Makeconfig{,.orig} + $ sed -e 's/-lgcc_eh//g' Makeconfig.orig > Makeconfig + $ cd ../.. + $ mkdir -v eglibc-build + $ cd eglibc-build + $ cat > config.cache <<EOF + > libc_cv_forced_unwind=yes + > libc_cv_c_cleanup=yes + > libc_cv_gnu89_inline=yes + > libc_cv_ssp=no + > EOF + $ cat > configparams <<EOF + > install_root=${BBL} + > EOF + $ BUILD_CC=gcc CC=${BBL_TARGET}-gcc AR=${BBL_TARGET}-ar \ + > RANLIB=${BBL_TARGET}-ranlib \ + > ../eglibc-2.15/libc/configure --prefix=/usr --libexecdir=/usr/lib/eglibc \ + > --host=${BBL_TARGET} --build=${BBL_HOST} --without-fp \ + > --disable-profile --enable-add-ons --with-tls --enable-kernel=<LINUX_VER> \ + > --with-__thread --with-binutils=${BBL}/cross-tools/bin \ + > --with-headers=${BBL}/usr/include --cache-file=config.cache + $ make + $ make install_root=${BBL} install + $ rm -Rf * + +Build EGLIBC's localedef and install locales. + $ CPPFLAGS=-DNOT_IN_libc ../eglibc-2.15/localedef/configure + > --prefix=${BBL}/usr --with-glibc=../eglibc-2.15/libc + $ make + $ make SUPPORTED-LOCALES='\ + > de_DE.UTF-8/UTF-8 de_DE/ISO-8859-1 de_DE@euro/ISO-8859-15 \ + > en_HK.UTF-8/UTF-8 en_HK/ISO-8859-1 \ + > en_PH.UTF-8/UTF-8 en_PH/ISO-8859-1 \ + > en_US.UTF-8/UTF-8 en_US/ISO-8859-1 \ + > es_MX.UTF-8/UTF-8 es_MX/ISO-8859-1 \ + > fa_IR/UTF-8 \ + > fr_FR.UTF-8/UTF-8 fr_FR/ISO-8859-1 fr_FR@euro/ISO-8859-15 \ + > it_IT.UTF-8/UTF-8 it_IT/ISO-8859-1 \ + > ja_JP.EUC-JP/EUC-JP ja_JP.UTF-8/UTF-8' install-locales + $ cd .. + $ rm -Rf eglibc-2.15 eglibc-build + +Write the Name Service Switch configuration file. + $ cat > ${BBL}/etc/nsswitch.conf <<EOF + > # /etc/nsswitch.conf + > + > passwd: files + > group: files + > shadow: files + > + > hosts: files dns + > networks: files + > + > protocols: files + > services: files + > ethers: files + > rpc: files + > EOF + +Set the system's timezone. + $ TZDIR=${BBL}/usr/share/zoneinfo ${BBL}/usr/bin/tzselect +Answer the prompts and the tzselect script will output the name of a time zone. +Substitute '<TZ>' below with this name. + $ ln -sfv ../usr/share/zoneinfo/<TZ> ${BBL}/etc/localtime + +Configure the dynamic loader to search for libraries in /usr/local/lib and +/opt/lib in addition to its default locations /lib and /usr/lib. + $ cat > ${BBL}/etc/ld.so.conf <<EOF + > # /etc/ld.so.conf + > + > /usr/local/lib + > /opt/lib + > EOF + +Configure and build a final cross-compiling GCC. + $ cp -pR ${BBL}/../../src/gcc-4.6.2 . + $ mkdir -v gcc-build + $ cd gcc-build + $ AR=ar LDFLAGS="-Wl,-rpath,${BBL}/cross-tools/lib" ../gcc-4.6.2/configure \ + > --prefix=${BBL}/cross-tools --build=${BBL_HOST} --host=${BBL_HOST} \ + > --target=${BBL_TARGET} --disable-multilib --with-sysroot=${BBL} \ + > --disable-nls --enable-shared --enable-languages=c,c++ \ + > --enable-__cxa_atexit --with-mpfr=${BBL}/cross-tools \ + > --with-gmp=${BBL}/cross-tools --with-mpc=${BBL}/cross-tools --without-ppl \ + > --without-cloog --enable-c99 --enable-long-long --enable-threads=posix + $ make AS_FOR_TARGET="${BBL_TARGET}-as" LD_FOR_TARGET="${BBL_TARGET}-ld" + $ make install + $ cd .. + $ rm -Rf gcc-4.6.2 gcc-build + + + +Set up environment variables to have all further packages built using the cross- +compiling toolchain. + $ cat >> ~/.bashrc <<EOF + > export CC=${BBL_TARGET}-gcc + > export CXX=${BBL_TARGET}-g++ + > export AR=${BBL_TARGET}-ar + > export AS=${BBL_TARGET}-as + > export RANLIB=${BBL_TARGET}-ranlib + > export LD=${BBL_TARGET}-ld + > export STRIP=${BBL_TARGET}-strip + > export READELF=${BBL_TARGET}-readelf + > EOF + $ source ~/.bashrc + + + +Install opkg to /opkgbootstrap with an etc dir under /opkgbootstrap/etc. +Install opkhelper to /opkgbootstrap. +Install fakeroot to /opkgbootstrap. +Write an opkg.conf under /opkgbootstrap/etc. +opkbuild and opkg-install packages. + |