The instructions below reference the source code repository which is browseable at http://git.openrisc.net
Building the Easy Way!
The easy way to build a toolchain is to use the "toolchain superproject" will allow you to easily check out suitable points of the necessary sub-components for building a working toolchain.
Begin by checking out the superproject, as follows:
$ git clone git://openrisc.net/jonas/toolchain
Once that’s done, you’ve got everything you need. The git submodule command, below, will clone the repositories of the toolchain components and check out suitable commits.
When building the toolchain, specify the installation location by passing the PREFIX variable on the make command line.
|
Note
|
Make use of your multiple CPU cores by passing a suitably large number to the -j parameter in order to parallelize your build. A good rule of thumb here is to use a value which is twice your number of cores plus 1; e.g. for a quad core (four cores) machine, use 2*4+1 = 9. |
$ cd toolchain $ git submodule update --init $ make -j3 PREFIX=<absolute install path>
PREFIX determines where the toolchain will be installed.
A good value for PREFIX might be:
make PREFIX=~/openrisc/toolchain
After that’s all done, you’ll want to put the toolchain install path into your environment’s PATH so that the newly installed tools can be found:
export PATH=<PREFIX>/bin;$PATH
where PREFIX is the same value as you used when building the toolchain.
Building by Hand!
If you really want to understand how the toolchain is built, the following sections will guide you step-by-step through the process of building all the bits and pieces that comprise the toolchain.
These build instructions make use of a few environment variables. The easiest way to follow these build instructions is to export these variables into your environment, as follows. If you do so, you should be able to use the commands in this document verbatim for building your toolchain.
export PREFIX=~/openrisc/toolchain export TARGET=or32-linux export SYSROOT=$PREFIX/$TARGET/sys-root
If you decide not to make use of these environment variables, you will have to adjust the commands in the rest of this document accordingly.
The meanings of these variables are:
-
PREFIX: toolchain installation location
-
TARGET: must be or32-linux
-
SYSROOT: where the or32-linux system root will be location; the value $PREFIX/$TARGET/sys-root is the default, but you can put it elsewhere if you want
Binutils
Get binutils from git:
$ git clone git://openrisc.net/jonas/binutils-svn
Then build:
$ mkdir binutils-build $ cd binutils-build $ ../binutils-svn/configure --target=$TARGET --prefix=$PREFIX --with-sysroot $ make $ make install
|
Note
|
Building with recent gcc versions (e.g. 4.6.1)
The build may fail due to warnings being treated as errors. This can be disabled by passing the --enable-werror=no flag to the configure script. |
Stage 1 GCC
Building GCC requires that the binutils utilities that were just built are available in the search path:
$ export PATH=$PREFIX/bin:$PATH
Get GCC from git:
git clone git://openrisc.net/jonas/gcc-svn
$ mkdir gcc-build $ cd gcc-build $ ../gcc-svn/configure --target=or32-linux --prefix=$PREFIX \ --disable-libssp --srcdir=../gcc-svn --enable-languages=c \ --without-headers --enable-threads=single --disable-libgomp \ --disable-libmudflap $ make $ make install
Install Linux Headers
The next step is build our target C library. Building libC requires that Linux headers be installed. For that we’ll need to check out the kernel:
$ git clone git://openrisc.net/jonas/linux
…and install the headers into the target sysroot.
$ make INSTALL_HDR_PATH=${SYSROOT}/usr headers_install
Compile uClibc
|
Important
|
Don’t be confused by uClibc’s Makefile variable PREFIX. This variable is analogous to Automake’s DESTDIR, and not to Automake’s --prefix. It’s also not the same as the environment variable PREFIX that you defined earlier. |
The default configuration for uClibc makes use of the environment variables SYSROOT for finding the installed kernel headers. Assuming that you exported this variable into your environment then the default configuration should be all you need.
$ git clone git://openrisc.net/jonas/uClibc
$ cd uClibc
$ make ARCH=or32 defconfig
$ make PREFIX=${SYSROOT}
$ make PREFIX=${SYSROOT} install
Stage 2 GCC
Now that we have a libC for our target, it’s time to build the compiler. This "second stage" build will use the C library that we just finished building.
$ mkdir gcc-build-2
$ cd gcc-build-2
$ ../gcc-svn/configure --target=or32-linux --prefix=$PREFIX \
--disable-libssp --srcdir=../gcc-svn --enable-languages=c \
--enable-threads=posix --disable-libgomp --disable-libmudflap \
--with-sysroot=${SYSROOT}
$ make
$ make install
If you want C++, try this instead… important to be explicit about --disable-shared here because libstdc++-v3 isn’t clever enough to figure it out for itself.
$ ../gcc-svn/configure --target=or32-linux --prefix=$PREFIX \
--disable-libssp --srcdir=../gcc-svn --enable-languages=c,c++ \
--enable-threads=posix --disable-libgomp --disable-libmudflap \
--disable-shared --with-sysroot=${SYSROOT}
And rebuild uClibc
Now that the final GCC build is complete, uClibc can be built with the final compiler. This is simple a matter of doing a clean rebuild…
$ cd uClibc
$ make clean
$ make PREFIX=${SYSROOT} install
BusyBox
BusyBox is technically not part of the toolchain, but the below instructions are illustrative of how your new toolchain should be used.
$ git clone git://busybox.net/busybox.git
Configure BusyBox using menuconfig:
make menuconfig
BusyBox uses three important Makefile variables for controlling how to build and where to install.
CROSS_COMPILE: the prefix to apply to 'gcc' to get the cross compiler CONFIG_EXTRA_CFLAGS: extra flags to pass to the compiler CONFIG_PREFIX: where to install
When using a non-default sysroot, we need to make sure that the compiler can find the necessary header files and libraries; this is most easily done by exporting the CFLAGS variable into your environment:
export CFLAGS="--sysroot=$SYSROOT"
Then build BusyBox, specifying the CROSS_COMPILE prefix and the CONFIG_PREFIX for the intallation directory.
$ export CFLAGS="--sysroot=$SYSROOT" $ make CROSS_COMPILE=or32-linux- CONFIG_PREFIX=$SYSROOT install
Build Linux
|
Note
|
You can set the CROSS_COMPILE prefix in the configuration so that you don’t have to repeatedly specify it on command line. |
$ git clone git://openrisc.net/jonas/linux
$ make ARCH=openrisc defconfig $ make CROSS_COMPILE=or32-linux-
or1ksim
The Linux source tree contains a suitable or1ksim config file…
$ sim -f arch/openrisc/or1ksim.cfg vmlinux
Working with --sysroot
The beauty of building the toolchain with --sysroot support, as we have done above, is that you can easily use an alternate system root…
More instructions about this wonderful feature coming shortly!