Since I've been recently coming up the learning curve, I thought to copy some of my notes here in the hope that they might help some people. This covers building your own foreign toolchain and then install that in scratchbox to build crocodile packages for powerpc.

Here are some notes. I was working on two different toolchains (ppc603 and ppc860), so I refer to both interchangably. There may be some omissions or errors, it's a work in progress. There are two patches that were needed to build the crocodile packages for powerpc, one for procps and one for zlib.

-Jim Heck

**0. Starting with a vanilla Ubuntu 6.10 installation. I tried this because I had problems installing scratchbox 1.0.6 on Debian (turns out Debian was fine, as I was able to install on my laptop running Debian). The installation hung in the stage where it was running the preinstall scripts for the packages. This may have had something to do with autofs, since the installation creates an sbox user. I confirmed that scratchbox installs on Debian if autofs is not used.

**1. Installed scratchbox-core (1.0.7). This pulled in scratchbox-libs (1.0.7). Ultimately I ended up installing the following scratchbox packages.

--------------------------------------
[EMAIL PROTECTED]:/scratchbox/users/jheck/home/jheck/crocodile/patches$ dpkg -l |grep scratchbox ii scratchbox-core 1.0.7 Scratchbox base system ii scratchbox-devkit-cputransp 1.0.1 CPU transparency methods ii scratchbox-devkit-debian 1.0.6 Debian tools for Scratchbox ii scratchbox-devkit-doctools 1.0.5 Doctools for Scratchbox ii scratchbox-devkit-perl 1.0.4 Perl modules for Scratchbox ii scratchbox-libs 1.0.7 Scratchbox libraries ii scratchbox-toolchain-arm-linux-ct401-2.3 1.0.4 arm-linux-ct401-2.3 compiler for Scratchbox ii scratchbox-toolchain-host-gcc 1.0.7 Scratchbox host-gcc toolchain ii scratchbox-toolchain-i686-gcc3.3-glibc2.3 1.0.3 i686-linux-gcc3.3-glibc2.3 compiler for Scra


**2. Decided to start by trying to install a foreign toolchain (see @1). To prepare for this, I built a few toolchains using crosstool 0.42 from Dan Kegel (see @2).

See the following web pages:

@1 http://www.scratchbox.org/wiki/ForeignToolchains
- overview of foreign toolchains for scratchbox

@2 http://kegel.com/crosstool/
- overview of crosstool

@3 http://kegel.com/crosstool/crosstool-0.42/buildlogs/
- summary of working crosstool combinations

@4 http://kegel.com/crosstool/crosstool-0.42/doc/crosstool-howto.html
- crosstool step by step howto


**2.1 Used a supported combination of glibc and gcc under crosstool 0.42 to make a compiler. I built this as user jheck under /home/jheck and targeted /opt/crosstool/ for the built compiler

- gcc-3.4.5
- glibc-2.3.6

**2.2 Here is a cat of the configuration file used /home/jheck/crosstool-0.42/demo-ppc603.sh

--------------------------------------
#!/bin/sh
set -ex
TARBALLS_DIR=$HOME/downloads
RESULT_TOP=/opt/crosstool
export TARBALLS_DIR RESULT_TOP
GCC_LANGUAGES="c,c++"
export GCC_LANGUAGES


# Really, you should do the mkdir before running this,
# and chown /opt/crosstool to yourself so you don't need to run as root.
mkdir -p $RESULT_TOP

# Build the toolchain.  Takes a couple hours and a couple gigabytes.
#eval `cat powerpc-603.dat gcc-3.4.0-glibc-2.3.2.dat` sh all.sh --builduserland --notest
# eval `cat powerpc-603.dat gcc-3.4.1-glibc-2.3.3.dat`  sh all.sh --notest
#eval `cat powerpc-603.dat gcc-3.4.1-glibc-20040827.dat` sh all.sh --notest
eval `cat powerpc-603.dat gcc-3.4.5-glibc-2.3.6.dat`  sh all.sh --notest
#eval `cat powerpc-603.dat gcc-3.4.5-glibc-2.3.6.dat` sh all.sh --nounpack --notest

echo Done.
--------------------------------------

**2.3 Had the following problems compliling the toolchain

- libc6-dev was not installed by Ubuntu by default and had to be added
- /bin/sh was linked to the /bin/dash shell and that caused problems. Solved by changing it to link to /bin/bash.

**2.4 Resulting toolchain was functional, but had a dependence on the host glibc, which was version 2.4 based. This toolchain would not work in scratchbox, since scratchbox only includes a 2.3 based version of glibc for the host crosscompiler to use. The fix for this was to compile the crosstool toolchain under scratchbox (see 3.)

**3. Rebuilt the crosstool 0.42 toolchain under scratchbox. The steps are outlined below. Basically I built in my home directory targeting /opt/crosstool. NOTE: This must NOT be done using the scratchbox HOST sandbox, since doing so will result in a compiler with a ld that does not look for library dependencies in /usr/lib. Instead you must use a scratchbox x86 toolchain. I was not able to find or build one using the latest Apophis r4 version, so I went back and grabbed a toolchain from Apophis r3 (scratchbox-toolchain-i686-gcc3.3-glibc2.3_1.0.3_i386.deb). I made a sandbox using this toolchain and the debian devkit, and compiled the crosstool toolchain.

See the following web pages:
http://scratchbox.org/download/files/sbox-releases/branches/apophis/r3/deb/

--------------------------------------
as user jheck

$ /scratchbox/login
[sbox-ct-compile: ~] >export http_proxy=xxx.xxx.xxx.xxx:xxxx
[sbox-ct-compile: ~] >export ftp_proxy=xxx.xxx.xxx.xxx:xxxx
- to get past the firewall, setup proxies so other tools can work

[sbox-ct-compile: ~] >wget http://kegel.com/crosstool/crosstool-0.42.tar.gz
[sbox-ct-compile: ~] >tar xvzf crosstool-0.42.tar.gz
[sbox-ct-compile: ~] >cd crosstool-0.42
- get the croostool tarball

[sbox-ct-compile: ~] >cp demo-ppc604.sh demo-ppc603.sh
[sbox-ct-compile: ~] >vi demo-ppc603.sh
- setup the master 'demo' script to build glibc-2.3.6/gcc-3.4.5 toolchain
- see 2.2 above for contents of demo-ppc603.sh

[sbox-ct-compile: ~] >unset LD_LIBRARY_PATH
- LD_LIBRARY_PATH cannot be set during compile, and scratchbox has it set, so unset it

[sbox-ct-compile: ~] >ln -sf /scratchbox/tools/bin/bash /bin/sh
- fixinc.sh in /home/jheck/crosstool-0.42/build/powerpc-603-linux-gnu/gcc-3.4.5-glibc-2.3.6/build-gcc-core/gcc needs a link to sh in /bin, so create one

[sbox-ct-compile: ~] >sh demo-ppc603.sh 2>&1 |tee ../ppc603.log
- invoke the crosstool build script, and wait

**4. Built the scratchbox sb-toolchain-extras set of tools, to allow the toolchain to be integrated into the scratchbox environment.

NOTE: One thing to remember here is that the toolchain has compiled into it, absolute paths to find its libraries and includes (/opt/crosstool/gcc-3.4.5-glibc-2.3.6/powerpc-860-linux-gnu/powerpc-860-linux-gnu/lib and .../include). The scratchbox environment installs the toolchain in such a way that the necessary files for the compiler are copied to well known locations under /usr/lib and /usr/include. This is how the compiler will find them. A caveat to note is that this process will work only only for toolchains that don't mess with the structure of the lib and include directories. Notably, I had a problem with the powerpc-860 compiler, which doesn't have a floating point unit. In this case, a few static libraries (e.g. the libstdc++.a) were located in a subdirectory under the /lib directory (/lib/nof). This caused crosstool confusion when building the sb-toolchain-extras. I had to manually copy the static libraries up into the /lib directory of the built compiler tree so that the crosstool build/scripts could find them. Thus the use of the "standard" path metod crosstool employes is a bit scary, since it cannot know exactly how the compiler is setup, and thus we must be certain the compiler is working properly in the scratchbox environment.

--------------------------------------
as user jheck logged into scratchbox

[sbox-HOST: ~] >cd /opt/crosstool/gcc-3.4.5-glibc-2.3.6
[sbox-HOST: ~] >tar cvpzf powerpc-603-linux-gnu.gz powerpc-603-linux-gnu
[sbox-HOST: ~] >cp powerpc-603-linux-gnu.gz /scratchbox/compilers/.
[sbox-HOST: ~] >cd /scratchbox/compilers/
[sbox-HOST: /scratchbox/compilers] >tar xvzf powerpc-603-linux-gnu.gz
[sbox-HOST: /scratchbox/compilers] >cd
- tar up the toolchain and untar it in the /scratchbox/compilers directory

[sbox-HOST: ~] >cd /scratchbox/compilers/powerpc-860-linux-gnu
[sbox-HOST: /scratchbox/compilers/powerpc-860-linux-gnu] >rm -rf distributed
- get rid of the distributed gcc compiler because it confuses the python script for the toolchain-extras

[sbox-HOST: /scratchbox/compilers/powerpc-860-linux-gnu] >cd powerpc-860-linux-gnu/lib/nof [sbox-HOST: /scratchbox/compilers/powerpc-860-linux-gnu/powerpc-860-linux-gnu/lib/nof] >cp *.a ../. [sbox-HOST: /scratchbox/compilers/powerpc-860-linux-gnu/powerpc-860-linux-gnu/lib/nof] >cd - copy the static .a libraries up to the lib directory so they can be found when building toolchain-extras

[sbox-HOST: ~] >darcs get --set-scripts-executable http://scratchbox.org/repos/1.0/sb-toolchain-extras
- get the darcs repository with the scratchbox toolchain extras

[sbox-HOST: ~] >cd /scratchbox/compilers/powerpc-860-linux-gnu
[sbox-HOST: /scratchbox/compilers/powerpc-860-linux-gnu] >~/sb-toolchain-extras/confhelper/create_toolchain_conf.py > ~/sb-toolchain-extras/meta/alien-tc/powerpc-860-linux-gnu.conf
- create the conf file to build the alien toolchain

[sbox-HOST: /scratchbox/compilers/powerpc-860-linux-gnu] >cd ~/sb-toolchain-extras/ [sbox-HOST: ~/sb-toolchain-extras] >make CONFIG=meta/alien-tc/powerpc-860-linux-gnu.conf -C meta/alien-tc all-sums [sbox-HOST: ~/sb-toolchain-extras] >make CONFIG=meta/alien-tc/powerpc-860-linux-gnu.conf -C meta/alien-tc - make the alien toolchain (first the checksums and then the toolchain itself)

[sbox-HOST: ~/sb-toolchain-extras] >cd
[sbox-HOST: ~] >sb-menu
- make a sandbox using the new foreign toolchain

**5. Build the crocodile set of packages. These are debian sarge packages necessary to bootstrap a system.

NOTE: Crocodile is based off the sarge debian distribution. For the most part, it builds all the libraries that the build-essential set of packages depends on. It does leverage a bunch of tools from the scratchbox environment, such as those associated with the compiler, and some such as autoconf, debmake, flex, etc. It proceeds in a brute force fashion making multiple passes trying to compile all source packages in a repository until no progress has been made over two passes.

See the following web pages:
@ http://www.scratchbox.org/wiki/Crocodile
@ http://www.scratchbox.org/wiki/Apophis-r4
@ http://www.scratchbox.org/wiki/EnvironmentVariables

--------------------------------------
as user jheck

**5.1. From Scratchbox 1.0.7 on, flex is not regarded as a provided package when checking debian build deps. This is fixed with the following, performed inside scratchbox.

# mkdir /scratchbox/users/${USER}/targets/`sb-conf cu`_deb_list
# cat > /scratchbox/users/${USER}/targets/`sb-conf cu`_deb_list/flex << EOF
Source: flex
Version: 2.5.31
Binary: flex
EOF

**5.2. For powerpc, the value scratchbox returns for 'uname -m' is 'powerpc'. This causes problems when building packages, since the scripts/makefiles generally expect 'ppc'. This is fixed by setting the 'SBOX_UNAME_MACHINE' environment variable to 'ppc'

[sbox-ppc603-croc: ~] > export SBOX_UNAME_MACHINE=ppc


**5.3. Two packages required patches over and above the ones scratchbox had already provided. These were procps and zlib. The patches go in crocodile/patches

- procps required a patch to remove dependence on a header file /include/asm/page.h. The use of a macro for PAGE_SIZE resolved to a function and was being improperly used in a variable declaration. I took code from the latest version of the package to patch it in the sarge version.

cat of procps.patch
--------------------------------------
diff -Naur procps-3.2.1/proc/devname.c procps-3.2.1-patched/proc/devname.c
--- procps-3.2.1/proc/devname.c 2004-03-17 13:43:50.000000000 -0500
+++ procps-3.2.1-patched/proc/devname.c 2006-12-13 11:38:10.366938000 -0500
@@ -19,10 +19,10 @@
#include "version.h"
#include "devname.h"

-#include <asm/page.h>
-#ifndef PAGE_SIZE
-#define PAGE_SIZE (sizeof(long)*1024)
-#endif
+// This is the buffer size for a tty name. Any path is legal,
+// which makes PAGE_SIZE appropriate (see kernel source), but
+// that is only 99% portable and utmp only holds 32 anyway.
+#define TTY_NAME_SIZE 128

/* Who uses what:
 *
@@ -216,7 +216,7 @@
  char path[32];
  int count;
  sprintf(path, "/proc/%d/%s", pid, name);  /* often permission denied */
-  count = readlink(path,buf,PAGE_SIZE-1);
+  count = readlink(path,buf,TTY_NAME_SIZE-1);
  if(count == -1) return 0;
  buf[count] = '\0';
  if(stat(buf, &sbuf) < 0) return 0;
@@ -227,7 +227,7 @@

/* number --> name */
unsigned dev_to_tty(char *restrict ret, unsigned chop, dev_t dev_t_dev, int pid, unsigned int flags) {
-  static char buf[PAGE_SIZE];
+  static char buf[TTY_NAME_SIZE];
  char *restrict tmp = buf;
  unsigned dev = dev_t_dev;
  unsigned i = 0;
--------------------------------------

- zlib attempted to create the compiler name for the CC environment variable using 'dpkg-architecture -qDEB_HOST_GNU_TYPE'. This resolved the gcc tool name to 'powerpc-linux-gnu-gcc', but scratchbox for some reason has the gcc compiler linked to 'powerpc-linux-gcc'. The fix was to patch the rules file for the sarge package using code from the latest version, which invokes the compiler using the environment variable CC, which make maps to cc, instead of trying to build up the tool name directly.

cat of zlib.patch
--------------------------------------
diff -Naur zlib-1.2.2/debian/rules zlib-1.2.2-patched/debian/rules
--- zlib-1.2.2/debian/rules     2006-12-13 17:13:17.807465000 -0500
+++ zlib-1.2.2-patched/debian/rules     2006-12-13 17:27:35.457286000 -0500
@@ -12,13 +12,20 @@
DEB_BUILD_GNU_SYSTEM := $(shell dpkg-architecture -qDEB_BUILD_GNU_SYSTEM)
DEB_BUILD_GNU_TYPE=$(DEB_BUILD_GNU_CPU)-$(DEB_BUILD_GNU_SYSTEM)
DEB_HOST_ARCH=$(shell dpkg-architecture -qDEB_HOST_ARCH)
-DEB_HOST_GNU_CPU=$(shell dpkg-architecture -qDEB_BUILD_GNU_CPU)
-DEB_HOST_GNU_SYSTEM=$(shell dpkg-architecture -qDEB_BUILD_GNU_SYSTEM)
-DEB_HOST_GNU_TYPE=$(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+DEB_HOST_GNU_CPU=$(shell dpkg-architecture -qDEB_HOST_GNU_CPU)
+DEB_HOST_GNU_SYSTEM=$(shell dpkg-architecture -qDEB_HOST_GNU_SYSTEM)
+DEB_HOST_GNU_TYPE=$(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
DH_OPTIONS=

ifeq ($(DEB_HOST_GNU_TYPE),$(DEB_BUILD_GNU_TYPE))
TESTS=test
+CC=gcc
+CC32=gcc -m32
+CC64=gcc -m64
+else
+CC=$(DEB_HOST_GNU_TYPE)-gcc
+CC32=$(DEB_HOST_GNU_TYPE)-gcc -m32
+CC64=$(DEB_HOST_GNU_TYPE)-gcc -m64
endif

COMPAT-ARCHS=
@@ -58,14 +65,14 @@
build: $(STAMP_DIR)/build
$(STAMP_DIR)/build: $(STAMP_DIR)/source.make $(DOBUILDCOMPAT)
       dh_testdir
- cd $(BUILD_TREE) && CC=$(DEB_HOST_GNU_TYPE)-gcc CFLAGS="-O3 -g -D_REENTRANT -fPIC" ./configure --shared + cd $(BUILD_TREE) && CC=$(CC) CFLAGS="-O3 -g -D_REENTRANT -fPIC" ./configure --shared
       $(MAKE) -C $(BUILD_TREE) all libz.a $(TESTS)
-       $(MAKE) CC=$(DEB_HOST_GNU_TYPE)-gcc -C $(BUILD_TREE)/contrib/minizip
+       $(MAKE) CC=$(CC) -C $(BUILD_TREE)/contrib/minizip
       touch $@

$(STAMP_DIR)/build-64: $(STAMP_DIR)/source.make
       dh_testdir
- cd $(BUILD_TREE) && CC="$(DEB_HOST_GNU_TYPE)-gcc -m64" CFLAGS="-O3 -g -D_REENTRANT -fPIC" ./configure --shared + cd $(BUILD_TREE) && CC="$(CC64)" CFLAGS="-O3 -g -D_REENTRANT -fPIC" ./configure --shared
       $(MAKE) -C $(BUILD_TREE) clean
       $(MAKE) -C $(BUILD_TREE) all libz.a $(TESTS)
       touch $@
@@ -73,7 +80,7 @@
$(STAMP_DIR)/build-nopic: $(STAMP_DIR)/source.make
       dh_testdir
       mkdir -p debian/nopic-tmp
- cd $(BUILD_TREE) && CC=$(DEB_HOST_GNU_TYPE)-gcc CFLAGS="-O3 -D_REENTRANT" ./configure
+       cd $(BUILD_TREE) && CC=$(CC) CFLAGS="-O3 -D_REENTRANT" ./configure
       $(MAKE) -C $(BUILD_TREE) clean
       $(MAKE) -C $(BUILD_TREE) all libz.a $(TESTS)
       $(MAKE) -C $(BUILD_TREE) install prefix=$(CURDIR)/debian/nopic-tmp
@@ -84,7 +91,7 @@
$(STAMP_DIR)/build-64-nopic: $(STAMP_DIR)/source.make
       dh_testdir
       mkdir -p debian/nopic-tmp
- cd $(BUILD_TREE) && CC="$(DEB_HOST_GNU_TYPE)-gcc -m64" CFLAGS="-O3 -D_REENTRANT" ./configure --libdir=\$${prefix}/lib64 + cd $(BUILD_TREE) && CC="$(CC64)" CFLAGS="-O3 -D_REENTRANT" ./configure --libdir=\$${prefix}/lib64
       $(MAKE) -C $(BUILD_TREE) clean
       $(MAKE) -C $(BUILD_TREE) all libz.a $(TESTS)
       $(MAKE) -C $(BUILD_TREE) install prefix=$(CURDIR)/debian/nopic-tmp
--------------------------------------

**5.5. Create a cross compile scratchbox using sb-menu.  C

- choose the powerpc-xxx-linux-gnu compiler.
- add the 'cputransp', 'doctools', 'debian' and 'perl' devkits
- select 'qemu-ppc-0.8.1-sb2' CPU-transparancy emulation
- no rootstrap
- add 'C-library', '/etc', 'Devkits' and 'fakeroot' files to the target
- then patch as described above in 5.1-5.3
- don't forget to set proxies if necessary for http 'export http_proxy=http://xxx.xxx.xxx.xxx:xxxx' - create a sources.list file containing an appropriate sarge mirror for sources. I used 'deb-src http://mirrors.ircam.fr/pub/debian/ sarge main' - follow the instructions described at http://www.scratchbox.org/wiki/Crocodile
Once the new sandbox has been created

[sbox-ppc860-croc: ~] >export ftp_proxy=http://xxx.xxx.xxx.xxx:xxxx
[sbox-ppc860-croc: ~] >export ftp_proxy=http://xxx.xxx.xxx.xxx:xxxx
[sbox-ppc860-croc: ~] >darcs get --set-scripts-executable http://scratchbox.org/repos/crocodile
- get the crocodile files

[sbox-ppc860-croc: ~] >echo 'deb-src http://mirrors.ircam.fr/pub/debian/ sarge main' > /etc/apt/sources.list
[sbox-ppc860-croc: ~] >apt-get update
[sbox-ppc860-croc: ~] >mkdir crocodile-packages
[sbox-ppc860-croc: ~] >cd crocodile-packages
[sbox-ppc860-croc: ~/crocodile-packages] >apt-get source -d acl attr base-files base-passwd bash bc bzip2 chrpath coreutils cpio cracklib2 db1-compat db3 db4.2 debianutils diffutils dpkg e2fsprogs findutils fribidi gdbm grep gzip hostname libcap libselinux libsepol makedev mawk modutils ncurses netbase pam perl procps readline4 sed shadow slang sysvinit tar tcl8.3 tcl8.4 util-linux zlib [sbox-ppc860-croc: ~/crocodile-packages] >dpkg-scansources . /dev/null|gzip>Sources.gz
- get source packages to build

[sbox-ppc860-croc: ~/crocodile] >cd ../crocodile
[sbox-ppc860-croc: ~/crocodile] >echo "deb-src file:/home/${USER}/crocodile-packages ./" > etc/sources.list
- setup sources.list so only the downloaded packages get built

[sbox-ppc860-croc: ~/crocodile] >export SBOX_UNAME_MACHINE=ppc
[sbox-ppc860-croc: ~/crocodile] >mkdir /scratchbox/users/${USER}/targets/`sb-conf cu`_deb_list [sbox-ppc860-croc: ~/crocodile] >cat > /scratchbox/users/${USER}/targets/`sb-conf cu`_deb_list/flex << EOF
Source: flex
Version: 2.5.31
Binary: flex
EOF
- Setup as described in 5.1-5.2 to do the build

[sbox-ppc860-croc: ~/crocodile] >./unplanned-build.sh --clean
- Build the crocodile packages


_______________________________________________
Scratchbox-users mailing list
Scratchbox-users@lists.scratchbox.org
http://lists.scratchbox.org/cgi-bin/mailman/listinfo/scratchbox-users

Reply via email to