Raspberry Pi Kernel Compilation

= Raspberry PI kernel compilation =

You can compile the kernel on the board itself, but because of the limited resources it will take a lot of time. Alternatively you can crosscompile the kernel on another machine running Linux, Windows or OS X.

Compiling on the Raspberry pi itself
TODO: write the rest of this section.

getting the compiler
On Ubuntu Oneiric getting the arm cross compiler can be as easy as:

sudo apt-get install gcc-4.6-arm-linux-gnueabi sudo apt-get install git  #jhauser14905 -- might as well state the obvious, you need git installed!

(TODO: Is this the right one? More packages required? I did this a while ago! TODO: Other distributions?)

getting the sources
create a directory where you can work on the raspberry pi software. I called mine "raspberrypi". Then clone the git repository.

mkdir raspberrypi cd raspberrypi git clone https://github.com/raspberrypi/linux.git cd linux

jhauser14905: on 2012-01-28, with all package updates applied, i had to add the following symlink in order to get the make commands to work. otherwise they would error out

sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-4.6 /usr/bin/arm-linux-gnueabi-gcc

compiling
Next you have to configure the kernel: cp arch/arm/configs/bcmrpi_cutdown_defconfig .config make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig

Then building the kernel: make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k

You can use the "-j" flag to improve compilation time. If you have a dual core machine you can use "-j 3", for a quad core machine you can use "-j 6", and so on.

If you get the error messages that arm-linux-gnueabi-gcc cannot be found when running make, run the following command:

sudo ln -s /usr/bin/arm-linux-gnueabi-gcc-4.6 /usr/bin/arm-linux-gnueabi-gcc

this creates a symbolic link to the 4.6 gcc binary

getting the compiler
Build the cross toolchain: crossdev -S -v -t arm-unknown-linux-gnueabi

This command should create a cross-toolchain using the latest stable versions of the required packages. If it fails, you can specify exact versions by removing the "-S" flag and adding the "--b", "--g", "--k" and "--l" flags. For the exact usage refer to the crossdev manpage. A good starting point for figuring out the right versions are those which are stable for the arm architecture.

getting the sources
create a directory where you can work on the raspberry pi software. I called mine "raspberrypi". Then clone the git repository.

mkdir raspberrypi cd raspberrypi git clone https://github.com/raspberrypi/linux.git cd linux

compiling
Next you have to configure the kernel: cp arch/arm/configs/bcmrpi_cutdown_defconfig .config make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- oldconfig

Then building the kernel: make ARCH=arm CROSS_COMPILE=/usr/bin/arm-linux-gnueabi- -k

You can use the "-j" flag to improve compilation time. If you have a dual core machine you can use "-j 3", for a quad core machine you can use "-j 6", and so on.

Windows
TODO

getting the compiler
Downoad and install GNU ARM toolchain yagarto

getting the sources
create a directory where you can work on the raspberry pi software. I called mine "raspberrypi". Then clone the git repository.

mkdir raspberrypi cd raspberrypi git clone https://github.com/raspberrypi/linux.git cd linux

compiling
Next you have to configure the kernel: cp arch/arm/configs/bcmrpi_cutdown_defconfig .config make ARCH=arm CROSS_COMPILE=/path/to/yagarto/bin/arm-none-eabi- oldconfig

Then building the kernel: make ARCH=arm CROSS_COMPILE=/path/to/yagarto/bin/arm-none-eabi- -k

You can use the "-j" flag to improve compilation time. If you have a dual core machine you can use "-j 3", for a quad core machine you can use "-j 6", and so on.

If you get an error message that elf.h is missing

install macports install libelf and symlink to /usr/libelf: sudo port install libelf && sudo ln -s /opt/local/include/libelf /usr/include/libelf copy elf.h to /usr/include