Thread overview
Building the arm-linux-gnueabi target
Jul 13, 2014
Johannes Pfau
Jul 13, 2014
Johannes Pfau
Jul 13, 2014
Mike
Jul 13, 2014
Timo Sintonen
Jul 13, 2014
Mike
July 13, 2014
Hello all,

Is there a simple/trivial way to ensure that when I build GDC, I build not only the native target for my machine (x86_64) but also the arm-linux-gnueabi target?

I decided it was time to start pulling out Adam Ruppe's embedded programming guide, and as a decidedly non-embedded programmer, the instructions here:
http://wiki.dlang.org/Bare_Metal_ARM_Cortex-M_GDC_Cross_Compiler

... are not something I'm confident in just following (not least because e.g. certain scripts are provided without much indication of what they should be called, where they should be placed, or how to use them).

What I'd really like is just to have arm-linux-gnueabi as another target built in the normal process of compiling and installing GDC, not something I have to organize separately from my normal GDC build.

Can anyone advise?

Thanks & best wishes,

     -- Joe
July 13, 2014
Am Sun, 13 Jul 2014 12:10:28 +0200
schrieb "Joseph Rushton Wakeling via D.gnu" <d.gnu@puremagic.com>:

> Hello all,
> 
> Is there a simple/trivial way to ensure that when I build GDC, I build not only the native target for my machine (x86_64) but also the arm-linux-gnueabi target?
> 
> I decided it was time to start pulling out Adam Ruppe's embedded programming guide, and as a decidedly non-embedded programmer, the instructions here: http://wiki.dlang.org/Bare_Metal_ARM_Cortex-M_GDC_Cross_Compiler
> 
> ... are not something I'm confident in just following (not least because e.g. certain scripts are provided without much indication of what they should be called, where they should be placed, or how to use them).
> 
> What I'd really like is just to have arm-linux-gnueabi as another target built in the normal process of compiling and installing GDC, not something I have to organize separately from my normal GDC build.
> 
> Can anyone advise?
> 
> Thanks & best wishes,
> 
>       -- Joe

AFAIK that's not possible with GCC right now. One GCC build always targets one main architecture.

Is there any reason why you can't use the binaries from http://gdcproject.org/downloads/ ?


I assume you want a cross compiler? For native compilers on ARM machines you can just use the usual instructions: http://wiki.dlang.org/GDC/Installation/Generic

For cross compilers you must build at least binutils so this is more complicated. The http://wiki.dlang.org/Bare_Metal_ARM_Cortex-M_GDC_Cross_Compiler only apply if you want an embedded compiler, i.e. you don't use linux/glibc.

For linux/glibc things are even more complicated. I'll have to refer you to standard GCC-cross compiler tutorials, compiling cross-gdc is exactly the same as compiling cross-gcc.

The simplest way to build such cross-compilers is with crosstool-NG:
http://wiki.dlang.org/GDC/Cross_Compiler/crosstool-NG
I also build the binaries at http://gdcproject.org/downloads/ with
crosstool-NG.
July 13, 2014
On 13/07/14 12:30, Johannes Pfau via D.gnu wrote:
> AFAIK that's not possible with GCC right now. One GCC build always
> targets one main architecture.
>
> Is there any reason why you can't use the binaries from
> http://gdcproject.org/downloads/ ?

No, none at all.  I just thought, since I build GDC from source anyway, I might as well see if I can just add an extra couple of config options and get what I want.  But it's great to have the ready-made downloads.

Just to know, does the 2.065 version require that I have gcc installed 4.9.0 on my system?  Or is the "GCC" column just an indicator of what GCC sources the build was based on?

> I assume you want a cross compiler? For native compilers on ARM
> machines you can just use the usual instructions:
> http://wiki.dlang.org/GDC/Installation/Generic

Yes, I'm interested principally in cross-compiling, both for linux-on-ARM and bare-metal ARM.

That said, t would be fun to actually have GDC running on an RPi.  I remember compiling C++ code on it and the amusing horror of how terribly long it took, it will be fun to see how D compilation goes by comparison ... :-)

> For cross compilers you must build at least binutils so this is more
> complicated. The
> http://wiki.dlang.org/Bare_Metal_ARM_Cortex-M_GDC_Cross_Compiler only
> apply if you want an embedded compiler, i.e. you don't use linux/glibc.
>
> For linux/glibc things are even more complicated. I'll have to refer
> you to standard GCC-cross compiler tutorials, compiling cross-gdc is
> exactly the same as compiling cross-gcc.
>
> The simplest way to build such cross-compilers is with crosstool-NG:
> http://wiki.dlang.org/GDC/Cross_Compiler/crosstool-NG
> I also build the binaries at http://gdcproject.org/downloads/ with
> crosstool-NG.

Thanks, I'll have a read through these. :-)
July 13, 2014
Am Sun, 13 Jul 2014 13:17:22 +0200
schrieb "Joseph Rushton Wakeling via D.gnu" <d.gnu@puremagic.com>:

> On 13/07/14 12:30, Johannes Pfau via D.gnu wrote:
> > AFAIK that's not possible with GCC right now. One GCC build always targets one main architecture.
> >
> > Is there any reason why you can't use the binaries from http://gdcproject.org/downloads/ ?
> 
> No, none at all.  I just thought, since I build GDC from source anyway, I might as well see if I can just add an extra couple of config options and get what I want.  But it's great to have the ready-made downloads.
> 
> Just to know, does the 2.065 version require that I have gcc installed 4.9.0 on my system?  Or is the "GCC" column just an indicator of what GCC sources the build was based on?

It marks the build gcc version and the system gcc version should not really matter. (After all you can use cross compilers on windows or other systems which don't even have a native gcc compiler)

> 
> > I assume you want a cross compiler? For native compilers on ARM machines you can just use the usual instructions: http://wiki.dlang.org/GDC/Installation/Generic
> 
> Yes, I'm interested principally in cross-compiling, both for linux-on-ARM and bare-metal ARM.
> 
> That said, t would be fun to actually have GDC running on an RPi.  I remember compiling C++ code on it and the amusing horror of how terribly long it took, it will be fun to see how D compilation goes by comparison ... :-)

IIRC building gdc/gcc alone requires 12 hours. And you'll need swap as there's not enough ram ;-)

> 
> > For cross compilers you must build at least binutils so this is more complicated. The http://wiki.dlang.org/Bare_Metal_ARM_Cortex-M_GDC_Cross_Compiler only apply if you want an embedded compiler, i.e. you don't use linux/glibc.
> >
> > For linux/glibc things are even more complicated. I'll have to refer you to standard GCC-cross compiler tutorials, compiling cross-gdc is exactly the same as compiling cross-gcc.
> >
> > The simplest way to build such cross-compilers is with crosstool-NG:
> > http://wiki.dlang.org/GDC/Cross_Compiler/crosstool-NG
> > I also build the binaries at http://gdcproject.org/downloads/ with
> > crosstool-NG.
> 
> Thanks, I'll have a read through these. :-)


July 13, 2014
On 13/07/14 13:31, Johannes Pfau via D.gnu wrote:
> IIRC building gdc/gcc alone requires 12 hours. And you'll need swap
> as there's not enough ram ;-)

Hmmm, I'd like to think I could build gdc-for-arm itself on my regular machine and just copy it over? ;-)
July 13, 2014
On Sunday, 13 July 2014 at 11:17:29 UTC, Joseph Rushton Wakeling via D.gnu wrote:
>> The simplest way to build such cross-compilers is with crosstool-NG:
>> http://wiki.dlang.org/GDC/Cross_Compiler/crosstool-NG
>> I also build the binaries at http://gdcproject.org/downloads/ with
>> crosstool-NG.
>
> Thanks, I'll have a read through these. :-)

I ran into some trouble with crosstools.  If you're going to do bare-metal, have a look at this thread as well to hopefully save yourself some frustration (http://forum.dlang.org/post/ftnzzsekkcepcthrjtdr@forum.dlang.org).

Mike

July 13, 2014
On Sunday, 13 July 2014 at 10:10:34 UTC, Joseph Rushton Wakeling
via D.gnu wrote:
> I decided it was time to start pulling out Adam Ruppe's embedded programming guide, and as a decidedly non-embedded programmer, the instructions here:
> http://wiki.dlang.org/Bare_Metal_ARM_Cortex-M_GDC_Cross_Compiler
>
> ... are not something I'm confident in just following (not least because e.g. certain scripts are provided without much indication of what they should be called, where they should be placed, or how to use them).

Those instructions came from my personal script that I use to
build GDC from time-to-time.  It's all one script.  I broke it up
in the wiki in an effort to explain the process so one could
adapt it to their needs.  Here's the entire script I use.  I run
it from within my ~/gdc folder and it installs to my
~/gdc-arm-none-eabi folder.

###########################################
# gcc.gnu.org/install/configure.html
# http://wiki.dlang.org/GDC/Cross_Compiler/Generic

set -e

export TARGET=arm-none-eabi
export PREFIX=/home/mike/gdc-arm-none-eabi
# export PATH=$PATH:$PREFIX/bin

# Delete existing binutils source archive and download a new one
#-------------------------------------------------------------------
export BINUTILS_NAME=binutils-2.24
export BINUTILS_SOURCE_ARCHIVE=$BINUTILS_NAME.tar.bz2
rm -f $BINUTILS_SOURCE_ARCHIVE
rm -rf $BINUTILS_NAME
wget http://ftpmirror.gnu.org/binutils/$BINUTILS_SOURCE_ARCHIVE

# Extract binutils
#-------------------------------------------------------------------
tar xjfv $BINUTILS_SOURCE_ARCHIVE

# Create binutils build directory
#-------------------------------------------------------------------
export BINUTILS_BUILD_DIR=binutils-build
rm -rf $BINUTILS_BUILD_DIR
mkdir $BINUTILS_BUILD_DIR

# Configure and build binutils
#-------------------------------------------------------------------
cd $BINUTILS_BUILD_DIR
../$BINUTILS_NAME/configure \
   --target=$TARGET   \
   --prefix=$PREFIX   \
   --disable-nls      \
   --disable-multilib \
   --with-gnu-as      \
   --with-gnu-ld      \
   --disable-libssp   \
   --disable-werror   \
   --enable-lto       \
   --enable-gold      \
   --enable-plugins
make -j4 all
make install
cd ..


# Download GDC
#-------------------------------------------------------------------
rm -rf gdc
mkdir gdc
git clone https://github.com/D-Programming-GDC/GDC.git gdc
cd gdc
# cp -r /home/mike/repositories/GDC/* .
git checkout gdc-4.9
cd ..

# Delete existing GCC source archive and download a new one
#-------------------------------------------------------------------
export GCC_NAME=gcc-4.9.0
export GCC_SOURCE_ARCHIVE=$GCC_NAME.tar.bz2
rm -f $GCC_SOURCE_ARCHIVE
rm -rf $GCC_NAME
wget
http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/$GCC_NAME/$GCC_SOURCE_ARCHIVE

# Extract GCC
#-------------------------------------------------------------------
tar xjfv $GCC_SOURCE_ARCHIVE

# Turn GCC into GDC
#-------------------------------------------------------------------
cd gdc
./setup-gcc.sh ../$GCC_NAME
cd ..

# Patch GDC
#-------------------------------------------------------------------
# cd $GCC_NAME
# cp ../issue_108.patch .
# patch -p1 -i issue_108.patch

# cp ../issue_114.patch .
# patch -p1 -i issue_114.patch

# cp ../issue_114-2.patch .
# patch -p1 -i issue_114-2.patch
# cd ..

# Create GDC build directory
#-------------------------------------------------------------------
export GCC_BUILD_DIR=gcc-build
rm -rf $GCC_BUILD_DIR
mkdir $GCC_BUILD_DIR

# Configure and build GDC
#-------------------------------------------------------------------
cd $GCC_BUILD_DIR
../$GCC_NAME/configure --target=$TARGET --prefix=$PREFIX \
   --enable-languages=d     \
   --disable-bootstrap      \
   --disable-libssp         \
   --disable-libgomp        \
   --disable-libmudflap     \
   --disable-multilib       \
   --disable-libphobos      \
   --disable-decimal-float  \
   --disable-libffi         \
   --disable-libmudflap     \
   --disable-libquadmath    \
   --disable-libssp         \
   --disable-libstdcxx-pch  \
   --disable-nls            \
   --disable-shared         \
   --disable-threads        \
   --disable-tls            \
   --with-gnu-as            \
   --with-gnu-ld            \
   --with-cpu=cortex-m4     \
   --with-tune=cortex-m4    \
   --with-mode=thumb        \
   --without-headers        \
   --enable-lto             \
   --enable-gold            \
   --enable-plugins

make -j4 all-gcc
make -j4 all-target-libgcc

make install-gcc
make install-target-libgcc
cd ..

#####################################


This is for ARM Thumb (ARM Cortex-M), not ARM9, ARM11, ARM
Cortex-A hardware.  It is for the barest of bare-metal (no libc,
no D runtime, no phobos, etc...), intended for those who want to
actually create a D runtime.

Mike

July 13, 2014
On Sunday, 13 July 2014 at 11:17:29 UTC, Joseph Rushton Wakeling via D.gnu wrote:

> Yes, I'm interested principally in cross-compiling, both for linux-on-ARM and bare-metal ARM.
>
>
You may also have a look at my minlibd:
https://bitbucket.org/timosi/minlibd

There is a minimun libdruntime suitable for arm and full toolset and working example for cortex-m4. There is lots of documentation in readme files and in wiki, including instructions how I build a cross gdc compiler.

It should be easy to understand and use. If you find anything that is wrong or something you do not understand, please report it here or use the issue tracker there.