Cross-compiling SuperCollider


06 August 2017

The following is a rough guide on how to set up cross compilation between a BeagleBone BELA and an OSX machine. It is based on the description in the README_BELA file of the SuperCollider installation.


set date

For proper compilation, it is necessary that the BELA board’s time is reasonably similar to your main machine.

dpkg-reconfigure tzdata # configure your time zone
ntpdate pool.ntp.org    # sync time once with an ntp server
date                    # make sure this gives the right result

Since the BBB does not feature a realtime clock that survives reboots, you have to repeat this procedure every time you reboot the board. To prevent that, you might want to set up NTP for details.

preparation

Since BELA’s SuperCollider compiles on gcc4.8, you need the crosscompiler for arm linux. You can find binaries here. This package installs arm-linux compilers in an exotic directory, which needs to be in your PATH variable:

export PATH=$PATH:/usr/local/linaro/arm-linux-gnueabihf/bin

To prevent mixups of gcc versions, I created symbolic links of gcc and g++ to name the specific versions:

cd /usr/local/linaro/arm-linux-gnueabihf/bin/
ln -s arm-linux-gnueabihf-gcc arm-linux-gnueabihf-gcc-4.8
ln -s arm-linux-gnueabihf-g++ arm-linux-gnueabihf-g++-4.8

Install distcc on both your main machine and the BELA. For OSX, this is easily done with homebrew by

brew install distcc

on the BELA this is done via

apt-get install -t jessie distcc

compile

To ensure proper connection, do not attempt to cross-compile over a wireless connection. It will just not work properly.

On your main machine, run distcc via

distccd --verbose --no-detach --daemon --allow 192.168.7.2 --log-level error --log-file ~/distccd.log

Alternatively, you can set the allowed IP address to the range of your ethernet connection, this could be e.g. 192.168.1.0/22.

Optionally, you might want to set the log level to info in order to see some output in the log files, even when the compiler is initiated. I found this very helpful in gaining trust in the system.

Watch the helpfile via

tail ~/distccd.log

On the BELA board, announce the IP to send compile directives to and how the compilers are called

export DISTCC_HOSTS="192.168.7.1"
export CC="/usr/bin/distcc arm-linux-gnueabihf-gcc-4.8"
export CXX="/usr/bin/distcc arm-linux-gnueabihf-g++-4.8"

Make sure you don’t pass -march=native to the compiler when using distcc, or it will compile natively (for your main machine). So do not pass -DNATIVE=ON to cmake.

Building, then, is pretty straight forward:

mkdir build; cd build

# cmake
cmake .. -DNOVA_SIMD=ON -DSSE=OFF -DSSE2=OFF -DINSTALL_HELP=OFF -DSC_QT=OFF -DSC_IDE=OFF -DSC_EL=OFF -DSC_ED=OFF -DSC_VIM=OFF -DSUPERNOVA=OFF -DNO_AVAHI=ON -DENABLE_TESTSUITE=OFF -DAUDIOAPI=bela

# make will take about 10 minutes, observe the log files on your main machine
make -j8
make install

SC3 plugins setup is similar, only the configuration step is different:

cmake -DSC_PATH="/usr/local/include/SuperCollider/" ..