First, install all the necessary packages.
$ sudo dnf install git cmake ninja-build clang uuid-devel libuuid-devel libicu-devel libbsd-devel libbsd-devel libedit-devel libxml2-devel libsqlite3-devel swig python-devel ncurses-devel pkgconfig
Next, create our working folder.
$ mkdir swift-lang
Clone the minimum repositories to build Swift.
$ git clone https://github.com/apple/swift.git swift $ git clone https://github.com/apple/swift-clang.git clang $ git clone https://github.com/apple/swift-cmark.git cmark $ git clone https://github.com/apple/swift-llvm.git llvm
If you have slow internet connection and experiencing disconnection during clone, is best to clone partially. Otherwise, you've to restart from the beginning again.
$ git clone --depth 1 https://github.com/apple/swift-llvm.git llvm $ cd llvm $ git fetch --unshallow
If you have the great Internet connection, you can proceed with the remaining repositories.
$ git clone https://github.com/apple/swift-lldb.git lldb $ git clone https://github.com/apple/swift-llbuild.git llbuild $ git clone https://github.com/apple/swift-package-manager.git swiftpm $ git clone https://github.com/apple/swift-corelibs-xctest.git $ git clone https://github.com/apple/swift-corelibs-foundation.git
As Swift was configured to work in Ubuntu or Debian, you may encounter error several issues during compilation. These are my workaround.
/usr/bin/which: no ninja in ...
In Fedora, Ninja Built binary name is 'ninja-build' but Swift builder script expect it to be 'ninja'. We create an alias to bypass that.
$ sudo ln -s /usr/bin/ninja-build /usr/bin/ninja
During compilation, the ioctl.h header file was not found as the build script assumed it's located in '/usr/include/x86_64-linux-gnu' as shown below.
Temporary workaround is to symlink the folder that contains these files.
$ sudo mkdir -p /usr/include/x86_64-linux-gnu/ $ sudo ln -s /usr/include/sys/ /usr/include/x86_64-linux-gnu/sys
pod2man conversion failure
The 'pod2man' doesn't seems to convert the POD file to MAN page as illustrated in error message below.
FAILED: cd /home/hojimi/Projects/swift-lang/build/Ninja-ReleaseAssert/swift-linux-x86_64/docs/tools && /usr/bin/pod2man --section 1 --center Swift\ Documentation --release --name swift --stderr /home/hojimi/Projects/swift-lang/swift/docs/tools/swift.pod > /home/hojimi/Projects/swift-lang/build/Ninja-ReleaseAssert/swift-linux-x86_64/docs/tools/swift.1 Can't open swift: No such file or directory at /usr/bin/pod2man line 68.
Upon this error message, the 'swift.pod' file has been corrupted and emptied. You'll need to restore it back from the repository.
$ git checkout -- docs/tools/swift.pod
We need to disable the '--name swift' parameter. This is done by commenting out the 'MAN_FILE' variable.
$ sed -i 's/MAN_FILE/#MAN_FILE/g' swift/docs/tools/CMakeLists.txt
Once all the workarounds have been applied, we'll proceed with our compilation. You do not really need to set the '-j 4' parameter for parallel compilation which can really reduce compilation time. By default, Ninja Build will compile code using the available CPU cores. Also, we just want the release (-R) build without any debugging information attached.
$ ./swift/utils/build-script -R -j 4
Add our compiled binary path to the system path.
$ cd /build/Ninja-ReleaseAssert/swift-linux-x86_64/bin/ export PATH=$PATH:`pwd`
Lastly, check our compiled binary.
$ swift --version Swift version 2.2-dev (LLVM 7bae82deaa, Clang 587b76f2f6, Swift 1171ed7081) Target: x86_64-unknown-linux-gnu
Be warned, compilation took quite a while, maybe for several hours. This depends on your machine specification and the type of build. I've noticed my lappy was burning hot as four CPU cores were running at 100% most of the time. It's recommended during compilation, place your lappy near a fan or any place with good ventilation. See that the temperature exceed high threshold of 86.0°C.
$ sensors acpitz-virtual-0 Adapter: Virtual device temp1: +95.0°C (crit = +98.0°C) thinkpad-isa-0000 Adapter: ISA adapter fan1: 4510 RPM coretemp-isa-0000 Adapter: ISA adapter Physical id 0: +97.0°C (high = +86.0°C, crit = +100.0°C) Core 0: +94.0°C (high = +86.0°C, crit = +100.0°C) Core 1: +97.0°C (high = +86.0°C, crit = +100.0°C)
Under normal usage, the average temperature is roughly 50°C.
$ sensors acpitz-virtual-0 Adapter: Virtual device temp1: +46.0°C (crit = +98.0°C) thinkpad-isa-0000 Adapter: ISA adapter fan1: 3525 RPM coretemp-isa-0000 Adapter: ISA adapter Physical id 0: +49.0°C (high = +86.0°C, crit = +100.0°C) Core 0: +49.0°C (high = +86.0°C, crit = +100.0°C) Core 1: +45.0°C (high = +86.0°C, crit = +100.0°C)