February 17, 2007
I've been checking out D for quite a while now and I would really like to use it for some embedded stuff I do. We compile for powerpc-linux on x86-linux boxen and so I've been trying to generate a cross compiler. I did the obvious hack of using crosstool and repacking the gcc tarball with the D patches applied and then trying to run that. It gets a long way (all the way to trying to compile the Phobos libs) but then fails with:

checking If /home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/gdc -B/home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/ -B/lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/bin/ -B/lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/lib/ -isystem /lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/include -isystem /lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/sys-include can compile D sources... /home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/cc1d: error while loading shared libraries: /home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/libgcc_s.so.1: ELF file data encoding not little-endian
no
configure: error: can't compile D sources!
make[1]: *** [configure-target-libphobos] Error 1
make[1]: Leaving directory `/home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc'
make: *** [all] Error 2

The cross compiled library ought to be big endian (and seems to be) but cc1d must be trying to load the target libraries instead of the native libraries when it runs the compiler passes. A cross compiler for c, c++, and objc builds fine with the same set of scripts, so this must be something specific to the D makefiles that is getting confused...

I just thought I would ask before I wade into this if the issue has come up before, or if anyone that has a working powerpc compiler running on x86 linux.

Thanks,

Matt

February 17, 2007
Matt Brandt wrote:
> I've been checking out D for quite a while now and I would really like to use it for some embedded stuff I do. We compile for powerpc-linux on x86-linux boxen and so I've been trying to generate a cross compiler. I did the obvious hack of using crosstool and repacking the gcc tarball with the D patches applied and then trying to run that. It gets a long way (all the way to trying to compile the Phobos libs) but then fails with:
> 
> checking If /home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/gdc -B/home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/ -B/lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/bin/ -B/lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/lib/ -isystem /lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/include -isystem /lifesize/tools/cross/gcc-4.1.1-glibc-2.3.6/powerpc-603-linux-gnu/powerpc-603-linux-gnu/sys-include can compile D sources... /home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/cc1d: error while loading shared libraries: /home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc/./gcc/libgcc_s.so.1: ELF file data encoding not little-endian
> no
> configure: error: can't compile D sources!
> make[1]: *** [configure-target-libphobos] Error 1
> make[1]: Leaving directory `/home/mbrandt/Desktop/crosstool-0.43/build/powerpc-603-linux-gnu/gcc-4.1.1-glibc-2.3.6/build-gcc'
> make: *** [all] Error 2
> 
> The cross compiled library ought to be big endian (and seems to be) but cc1d must be trying to load the target libraries instead of the native libraries when it runs the compiler passes. A cross compiler for c, c++, and objc builds fine with the same set of scripts, so this must be something specific to the D makefiles that is getting confused...
> 
> I just thought I would ask before I wade into this if the issue has come up before, or if anyone that has a working powerpc compiler running on x86 linux.
> 
> Thanks,
> 
> Matt
> 

I haven't made a powerpc cross-compiler, but I have successfully made GDC cross compilers.

I've never found it very productive to hack crosstool into doing what I want, so here's what I'd do:

1) Get a standard (C-capable) crosscompiler made with crosstool

2) Add it to your PATH (duh)

3) [standard GDC setup] tar jxf gcc-core-<version>.tar.bz2 ; tar jxf gcc-<anythingelse>-<version>.tar.bz2 ; cd gcc-<version>/gcc ; tar jxf ../../gdc-src-0.22.tar.bz2 ; cd .. ; ./gcc/d/setup-gcc.sh

Now is the complicated part. Building a GDC cross compiler requires that you generate a few files /on the target/. So:

4) cd gcc/d/phobos/config

5) Compile with your target C compiler: gen_config1.c->gen_config1, gen_math.c->gen_math, gen_unix.c->gen_unix

6) ON THE TARGET, run gen_config1, gen_math and gen_unix to generate the files frag-gen, frag-math and frag-unix respectively.

7) Put those files into some directory on your host.

8) cd gcc-<version> ; mkdir build ; cd build

9) ../configure --prefix=<whatever> --build=`../config.guess` --target=powerpc-603-linux-gnu --enable-phobos-config-dir=<directory-with-frag-files>

10) make all install


That ought to give you what you want.

Good luck!

 - Gregor Richards

Disclaimer: This is off the top of my head. I've made several cross-compilers, but all of this is of course subject to memory degradation.