Howto: Set up a Rumprun toolchain in Mac OS X

Brien Wankel edited this page Jul 29, 2016 · 8 revisions

This page details the extra steps required to obtain a Rumprun toolchain in OS X. For a complete tutorial on building a Rumprun Unikernel please see Rumprun unikernel tutorial and return here when directed.

Overview

The built in tools in OS X are not able to build the Rumprun platform, because they generate executables in the Mach-O format. So to obtain a Rumprun toolchain in OS X we have 2 options:

  • Use a prebuilt toolchain in Docker.
  • Build a compatible compiler in OS X and then build Rumprun using that compiler.

The rest of this page details option 2.

Build an ELF cross-compiler

With NetBSD and build.sh

Warning: since NetBSD 7.0 ships with ld 2.23 instead of the required ld 2.25, this method should be avoided for now. PLease build the toolchain manually

A simple way to get an ELF cross-compiler for OS X is to build the tools from the NetBSD sources using build.sh:

$ mkdir netbsd
$ cd netbsd
$ curl -OOOO http://ftp.netbsd.org/pub/NetBSD/NetBSD-7.0/source/sets/{share,gnu,sys,}src.tgz
$ for file in *.tgz; do tar -xzf $file; done
$ cd usr/src
$ ./build.sh -U -T elftools.x86_64 -m amd64 tools
[... much compiling ...]

This should result in a toolchain being available in elftools.x86_64/bin.

Build Rumprun

Add the toolchain you built above to your $PATH. While we're here we'll also set the location of the readelf command, as we'll need that later:

$ export PATH=$PWD/elftools.x86_64/bin:$PATH
$ export READELF=$PWD/elftools.x86_64/bin/x86_64--netbsd-readelf

You can now tell build-rr.sh to use the above compiler and tools by setting the $CC variable.

$ env CC=x86_64--netbsd-gcc ./build-rr.sh hw

Manually

To build the toolchain, you mainly need to compile binutils and gcc:

# we need a proper GCC to build another one
brew update
brew install gcc

# the directory for the generated files
mkdir toolchain

#required environment variables
export PREFIX=$PWD/toolchain
export TARGET=x86_64-netbsd
export CC=/usr/local/bin/gcc-6
export CXX=/usr/local/bin/g++-6
export LD=/usr/local/bin/gcc-6
export CFLAGS=-Wno-error=deprecated-declarations

# Download and build binutils

curl -O http://ftp.gnu.org/gnu/binutils/binutils-2.26.1.tar.gz
tar xvf binutils-2.26.1.tar.gz 
cd binutils-2.26.1
./configure --prefix=$PREFIX --target=$TARGET --disable-nls
make
make install

cd ..

# Download and build GCC

curl -O http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.gz
tar xvzf gcc-6.1.0.tar.gz 
cd gcc-6.1.0
./contrib/download_prerequisites
./configure --prefix=$PREFIX --target=$TARGET --disable-nls --enable-languages=c --without-headers
make all-gcc
make install-gcc

# Delete the content of env variables, or it will break Rumprun compilation
export CFLAGS=
export CXX=
export LD=

Build Rumprun

Then, add the toolchain to the path:

export PATH=$PREFIX/bin:$PATH
export READELF=$PREFIX/bin/x86_64-netbsd-readelf

You can now tell build-rr.sh to use the above compiler and tools by setting the $CC variable.

$ env CC=x86_64-netbsd-gcc ./build-rr.sh hw

Conclusion

At this point you should be able to eg. continue the Rumprun unikernel tutorial as per the instructions. You'll need to set the $READELF variable to use rumprun or rumprun-bake.

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.