Scripts to clone, configure, patch and build Swift 5.1.3 on Linux ARM devices.
- Supported Architectures
- Prebuilt binaries
- Building on ARM
- GitHub CI on ARM
- REPL Issues
- Previous Releases
- ✅ ARMv6 32bit: Original RaspberryPi, Pi Zero, etc...
- ✅ ARMv7/8 32bit: All versions of RaspberryPi 2/3, OrangePi, ODroid, CHIP, etc...
- ✅ aarch64: RaspberryPis or other ARMv8 boards with a 64 bit OS, Pine64, etc...
| OS | Architecture | Boards | Download |
| -- | ------------ | ------ | -------- | | Raspbian Stretch | ARMv6 | All RaspberryPis: Classic, Zero, 2, 3 | 5.1.5 | | Raspbian Buster | ARMv6 | All RaspberryPis: Classic, Zero, 2, 3, 4 | 5.1.5 | | Debian Stretch | ARMv7 | Every ARMv7 board, RaspberryPis 2/3 included | 5.1.5 | | Debian Buster | ARMv7 | Every ARMv7 board, RaspberryPis 2/3/4 included | 5.1.5 | | Ubuntu 16.04 | ARMv7 | All versions of RaspberryPi 2/3, other ARMv7 boards | 5.1.5 | | Ubuntu 18.04 | ARMv7 | All versions of RaspberryPi 2/3/4, other ARMv7 boards | 5.1.5 | | Ubuntu 16.04/18.04 | aarch64 | All versions of RaspberryPi 3/4, other ARMv7 boards | 5.1.3: swift-arm64 | | Fedora/CentOS/RHEL | aarch64 | All versions of RaspberryPi 3/4, other ARMv7 boards | 5.1.4:
sudo dnf install swift-lang |
For binaries of older releases, check out the releases page.
For alternative ways to install these Swift binaries on your ARM board, check out Swift on Balena by Will Lisac, Helge Heß's dockSwiftOnARM, both based on Docker, and the Swift Deb Repository maintained by Neil Jones.
To quickly cross-compile your Swift applications for ARM on a Mac (a time saver) check out the Swift Cross Compilation Toolchains project built by Van Simmons.
When using the Swift Package Manager on one of these boards, that usually have limited memory/cpu, you'll need to use the new
-j option to reduce the number of threads spawned by the tool and be able to compile.
For example, when building an SPM project most of the times we'll limit the number of jobs to one:
pi@raspberrypi:> swift build -j 1
In order to use the provided prebuilt binaries you'll need to install the following dependencies:
Raspbian Stretch and Ubuntu 16.04
sudo apt install clang-3.8 libicu-dev libcurl4-nss-dev sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.8 100 sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.8 100
Raspbian Buster, Ubuntu 18.04 and newer
sudo apt install clang libicu-dev libcurl4-nss-dev curl
Decompress the archive on the RaspberryPi, you'll find the Swift binaries in
usr/bin/ relative to where you decompressed the archive.
tar -xzf <archivename.tgz>
Ensure that the path you decompressed to is in your
PATH environment variable:
echo $PATH. If it's not then add it to your path for your shell.
To permanently add this to your
PATH variable, you can add the following block of code to the end of your
if [ -d "$HOME/usr/bin" ] ; then PATH="$HOME/usr/bin:$PATH" fi
Verify the swift version is setup:
$ swift --version Swift version 5.1.3 (swift-5.1.3-RELEASE) Target: armv7-unknown-linux-gnueabihf
Building on ARM
For the latest updates on Swift on ARM, check out my blog here.
Check out Helge Heß's project dockSwiftOnARM to build Swift in a Docker container or to build a cross-compiling toolchain that will allow you to build arm binaries directly from your Mac using a precompiled swiftc for ARM.
The scripts that buildSwiftOnARM provides:
clone.sh - Install dependencies and clones the main Swift repository and all the related projects
checkoutRelease.sh - Resets all repos, updates them, checks out a specific tag (5.1.3 at the moment) and apply the patches.
build.sh - Builds Swift producing a tgz archive with the Swift distributions.
clean.sh - Cleans all build artifacts, only needed when you want to start again from scratch.
Step by step instructions
First of all, use a suitably sized sd-card, at least 32Gb in size, but I recommend to use an external USB drive to clone the project and build Swift.
Configure a swap file of at least 2Gb, on Ubuntu:
sudo fallocate -l 2G swapfile sudo chmod 600 swapfile sudo mkswap swapfile sudo swapon swapfile
You'll need to manually enable the swap file with
swapon each time you reboot the RaspberryPi (or the system will just run without swap).
On Raspbian, since the swapfile is already configured, open
/etc/dphys-swapfile and edit
CONF_SWAPSIZE to increase the size:
Save the file and:
sudo /etc/init.d/dphys-swapfile stop sudo /etc/init.d/dphys-swapfile start
Now, call the included scripts as follows:
clone.shthat will install the required dependencies (git cmake ninja-build clang-3.8 python uuid-dev libicu-dev icu-devtools libbsd-dev libedit-dev libxml2-dev libsqlite3-dev swig libpython-dev libncurses5-dev pkg-config libblocksruntime-dev libcurl4-openssl-dev autoconf libtool systemtap-sdt-dev libcurl4-openssl-dev libz-dev), fix clang links and clone apple/swift with all its dependecies.
checkoutRelease.shthat will select the current release (5.1.3) and apply the needed patches.
Once done, start the build with
Once the build completes a few hours later, you'll have a
swift-5.1.3-armv7.tgzarchive containing the whole Swift compiler distribution. Once decompressed you'll find the Swift binaries under
I recommend to perform all these operations in a permanent background
screen session (
CTRL+B d to detach from the session and
tmux a to reattach to it when you ssh again into the RaspberryPi).
Additional steps could be required in some cases check the latest ARM posts on my blog for additional info.
To build a different release than the one currently configured in the script, open
build.sh and modify the variables on top, with the branch name for the release and the release name for the tgz respectively.
Setup your own build infrastructure
If you need to replicate a setup like the one I use to build all the Swift binaries you can find above, using only a single Raspberry Pi 4 or a similar board ARMv7 board as build machine, check out buildSwiftOnARMInfra with its docker containers.
GitHub CI on ARM
ARM projects can be tested in an environment simulated through QEMU on GitHub using the Run-On-Architecture action. While you will not be able to use hardware interfaces available on real ARM boards, this environment should be more than enough to perform some basic testing or even build your projects and deploy them directly to your target ARM board (with considerable time savings).
Since the first releases of Swift on ARM32, the REPL has never been available on this platform, but that doesn't impact the compiler itself. Considering this, as you would expect, launching
swift without parameters will result in an error instead of the REPL prompt.
We wouldn't have Swift on ARM and most of the patches included on buildSwiftOnARM without the work done by these developers:
The community can be reached at the swift-arm Slack channel.
You can compile old releases checking out the specific tag:
You may find interesting
5.1.5 - 2020-03-17 09:11:32
A few improvements, a security fix in Foundation (crash when parsing deep JSON structures) and a memory leak in Process fixed. You should upgrade (especially if your Pi is exposed to the public internet).
Official announcement: https://forums.swift.org/t/swift-5-1-5-for-linux/34478
Issue #60 is still there, don't lose hope.
5.1.3 - 2019-12-21 10:13:31
Release 5.1.3 with Linux-specific improvements, no official announcement thread yet.
Issue #60 is still a thing.
5.1.2 - 2019-12-07 18:34:33
Contains a few bug fixes and improvements to lldb integration on Linux, nothing new on the arm32 side.
See announcement: https://forums.swift.org/t/swift-5-1-2-released/30620
5.1.1 - 2019-10-07 09:29:43
5.1 - 2019-10-05 06:52:23
It's time for another release of Swift on ARM, this time around only one additional patch (#54) has been added to the required fixes (already merged into master).
Notably added in 5.1:
- Property wrappers introduce a consistent and general purpose syntax for defining custom access patterns for property values, including (and not limited to) delayed initializers, atomic operations, thread-specific storage, and copy-on-write behavior
- Opaque result types allow the use of a generic type to support different types conforming to the same protocol or to hide implementation details in APIs
- The return keyword is not necessary for single expression functions or getters Self can now be used for classes and value types
- The compiler now synthesizes default values for properties with default initializers
Official announcement with all the details: https://swift.org/blog/swift-5-1-released/
5.0.3 - 2019-09-09 05:37:32
Likely the last Linux release for 5.0, it contains a few fixes for Foundation and SPM, see announcement: https://forums.swift.org/t/swift-5-0-3-for-linux/28523
v5.0.2 - 2019-07-23 14:45:09
Linux only maintenance release with a few bugs fixed, mostly in Foundation.
See announcement: https://forums.swift.org/t/swift-5-0-2/27008
v5.0.1 - 2019-06-19 15:11:37
These 5.0.1 binaries contain a Swift Package Manager that allows to specify the number of jobs to be launched during compilation through the
-j option, functionality that will be available officially in Swift 5.1.
It's recommended to launch SPM with
-j 1 in most cases.
From this release, Raspbian binaries will be compiled only for ARMv6 as expected by this distribution. One set of Raspbian binaries will work on every Raspberry Pi. Generic ARMv7 Debian Stretch binaries, that will work on Pi 3 and 4 too, will be provided separately.
5.0 - 2019-04-02 10:33:44
See the official announcement for a list of new features: https://swift.org/blog/swift-5-released/
- 2019-03-06 08:54:37