I often write these blog posts in part to remind my future self how I did something as well as for the benefit others. Today I’m looking at what’s involved with compiling Swift for ARM devices, namely the popular Raspberry Pi. While these are meant for the RPi, they should also apply generally to devices like the BeagleBone Black. Before you get started, you should be reminded that Swift3 is very much an alpha-level project, especially on ARM devices. There are times when swift won’t even compile properly, or even if it does compile, there could be issues running it smoothly. armv7 devices (BeagleBone Black, Raspberry Pi2, and others) seem to be most reliable; armv8 (Raspberry Pi3) are in the weeds, so to speak, because there’s been little effort toward that architecture due to resources. It will probably work in the future, just not as well in June, 2016. Now that you’ve been adequately warned, let’s begin.
[NB: If you’re setting up a new system, start over on Part 1: Readying Your Pi for Swift]
- Making a Swapfile
- Installing required components
- Getting and building the source
- Cross compiling
Make a Big Ol’ Swapfile
- You’ll need to have a lot of memory to compile swift, and while the Raspberry Pi has 1GB, it’s not enough. Let’s start with increasing the swapfile size by following the from over here. (Paraphrased below)
Edit the configuration file at /etc/dphys-swapfile
sudo nano /etc/dphys-swapfile
Find CONF_SWAPSIZE and set the value to 2048 :
Reboot or stop/start the dphys-swapfile service
sudo /etc/init.d/dphys-swapfile stop sudo /etc/init.d/dphys-swapfile start
It may take several minutes, so be patient.
One point some have noted is that having a large swapfile as this lends to decreasing the lifespan of the memory card due to the large amount of writes you’d expect in a swapfile. It’s a risk you run, but 32GB memory cards are inexpensive. Keep backups if it concerns you
Next, we need to install required components (CMAKE, ninja, & other dev tools) – from the Swift README
sudo apt-get install git cmake ninja-build clang uuid-dev libicu-dev icu-devtools libbsd-dev libedit-dev libxml2-dev libsqlite3-dev swig libpython-dev libncurses5-dev pkg-config
Once that is finished, clone Joe Bell’s package-swift repo on your Pi. This provides some handy shortcuts for building swift on ARM devices: https://github.com/iachievedit/package-swift.git
Start a new screen session so that we don’t have to remain logged in during the whole build (in other words, if you lose your connection, you can resume where you left off)
screen -S swift
To resume the screen session, simply log back in and type
screen -r swift
Get and Build the Source
Inside the Package Swift repo, run the get script to download the appropriate repos used for arm builds
./package ~/swift | tee ~/swift/build-log.txt
or (it doesn’t really matter much)
./swift/utils/build-script --preset=buildbot_linux_armv7 install_destdir=~/swift/Swift-3.0-ARM/install installable_package=~/swift/Swift-3.0-ARM/swift.tar.gz | tee ~/swift/build-log.txt
Just one note – notice the tee command at the end. That takes the input and write it to a file. Since the Swift build process doesn’t output build logs, we pipe the build output to tee so we can save it, in case there was an error along the way. Sometimes these errors are minor and occur after the swift binaries successfully build. It’s important to know.
Now, it’s time to wait several hours for first build. You remember to enter a screen session, right?
When it’s all said and done, you should be able to run swiftc on a simple helloWorld.swift
~/swift/usr/bin/swiftc helloWorld.swift && ./helloWorld
Attempting to build Swift on these low-powered devices is a noble effort, but it takes a very long time. I personally don’t like having to wait several hours to find out the build failed. That’s where cross-compiling comes in. This process means you build binaries on one platform (for example, a Mac/Intel) that work on another (Linux/armv7). Usually takes less than an hour. The following instructions are meant to be executed on a Mac.
First, you need to install dpkg so the build system can create a proper debian package
brew install dpkg
Next, make sure you have Joe Bell’s Package Swift repo, mentioned above: https://github.com/iachievedit/package-swift.git
Download all the appropriate repos and branches using ./crosscompile_get.sh
Next, it’s time to build: ./crosscompile_build.sh -t linux-armv7
When the build is complete, copy it over to your Pi. If all went well, you should have functioning Swift binaries*.
*Of course, there may still be issues with Swift on ARM itself – it’s still alpha.
I hope this tutorial was helpful. At the time of this writing, there were still several considerable issues with Swift on ARM devices, but it is possible to compile it yourself. If you continue to run into issues, it may be worthwhile to check back at Joe’s Website for updates and downloadable binaries.