ofDocsguides RaspberryPi Raspberry-Pi-Cross-compiling-guide

Raspberry-Pi-Cross-compiling-guideko

-- coding: utf-8 --

.. title: raspberry pi

Cross-compiling for the Raspberry Pi

Introduction

Creating a cross-compiler is a fairly advanced process but can be useful for heavy use. This guide will give some details on how to create a cross-compiler for use with openFrameworks 0.9.0. For older releases (OF 0.8.4/Wheezy) see Raspberry Pi Cross-compiling Guide for Wheezy

Do you need it?

The RPI2/arm7 is much faster and can natively compile openFrameworks in about 15 minutes by utilizing all 4 cores (make -j4). Applications are typically much faster depending on complexity, use of ofxAddons, etc.

Compiling openFrameworks on the RPI1/arm6 is much slower and can take over an hour. Applications can be much faster however still slow.

A typical cross-compiler on a modern Desktop PC will compile the OF core library in about 3 minutes.

Cross-compiling process

To use a cross-compiler you will need to setup a few things:

Toolchain

This is basically a custom version of GCC that understands your target platform. In order to cross-compile openFrameworks the compiler must support GCC 4.9. Previous versions of GCC do not support the level of C++11 features that openFrameworks requires. At the time of openFrameworks 0.9.0 release, the [offical Raspberry Pi tools](https://github.com/raspberrypi/tools) were out-of-date, requiring you to build GCC yourself. The tools were updated with GCC 4.9.3 on February 14, 2016 but have yet to be verified.

Target Root File System

This is a copy of the RPI's file system that the compiler will use to build openFrameworks and applications. It is a copy because you will need to manipulate certain files that if changed directly would cause the RPI to stop working.

Makefile variables

The openFrameworks Makefile system has some built-in variables that allow for easier cross-compiling.

TOOLCHAIN_ROOT

`TOOLCHAIN_ROOT` is a path to the directory that contains your Toolchain. If you don't pass this in OF will guess a default value of `/opt/cross/bin`

GCC_PREFIX

A toolchain is often set up with multiple architectures in order to cross-compile a project for multiple platforms. `GCC_PREFIX` is used to differentiate between these platforms.

For example, to compile for an RPI/Arch Linux target the prefix is often armv6l-unknown-linux-gnueabihf. For Raspbian it is commonly arm-linux-gnueabihf

If GCC_PREFIX is not passed in arm-linux-gnueabihf is assumed. The prefix is then added to -g++, -gcc, -ar and -ld to complete the paths to the compiler and linkers.

RPI_ROOT

`RPI_ROOT` is the Target Root File System previously described. This is required to be passed in and there is no default value.

These variables are either passed in with the make command:

make TOOLCHAIN_ROOT=/path/to/toolchain GCC_PREFIX=arm-linux-gnueabihf RPI_ROOT=/path/to/local_copy_of_pi_filesystem

or set via environmental variables

export TOOLCHAIN_ROOT=/path/to/toolchain

export GCC_PREFIX=arm-linux-gnueabihf

export RPI_ROOT=/path/to/local_copy_of_pi_filesystem

Using export allows you just use the shorter make command throughout a session. You can make these variables permanent by adding the export lines to the end of ~/.profile.

Cross compiling guides for 0.9.0

Mac based, uses Debian VM, custom compiled GCC