在樹莓派 3 上構建 Swift 3.0

做者:iAchieved.it,原文連接,原文日期:2016-06-2
譯者:pucca601;校對:靛青K;定稿:CMBhtml

有許多小夥伴對在他們的樹莓派 3 上構建 Swift 3.0 感興趣,這篇教程獻給那些勇敢的靈魂!python

在開始以前你須要準備好如下東西:linux

顯然這是能夠作到的;並且咱們已經作到了,而且還有其餘小夥伴也對基於 ARM 的設備上構建 Swift 程序做出了貢獻。因此別放棄。不過就算你放棄了咱們也不會說什麼,直接下載咱們的 prebuilt Swift 3.0 package for the Raspberry Pi 2 and 3 吧。ubuntu

安裝 Xenial

咱們用 Ubuntu Xenial 代替 Raspbian 。用 curlwget 獲取 Xenial,而後用 dd 將文件系統寫入 microSD 卡。swift

注意:請確保閱讀此警告。你必須替換下文提到的 YOUR_DEVICE 爲正確的設備名。若是不替換成正確的名字,你的數據可能會毀壞(它們調用 dd 清除你的文件)。服務器

使用 Linux

# wget http://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
# xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz | sudo dd of=/dev/YOUR_DEVICE bs=8M

想知道你的 YOUR_DEVICE,你須要將 microSD 卡插入一臺裝載 Linux 的機器,運行 dmesg|tai 查看相似下面的內容

[1255451.544316] usb-storage 4-2:1.0: USB Mass Storage device detected
[1255451.544466] scsi host25: usb-storage 4-2:1.0
[1255452.545332] scsi 25:0:0:0: Direct-Access     Generic  STORAGE DEVICE   0817 PQ: 0 ANSI: 6
[1255452.545670] sd 25:0:0:0: Attached scsi generic sg8 type 0
[1255452.828405] sd 25:0:0:0: [sdh] 15523840 512-byte logical blocks: (7.94 GB/7.40 GiB)
[1255452.829402] sd 25:0:0:0: [sdh] Write Protect is off
[1255452.829409] sd 25:0:0:0: [sdh] Mode Sense: 23 00 00 00
[1255452.830400] sd 25:0:0:0: [sdh] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[1255452.835967]  sdh: sdh1
[1255452.840401] sd 25:0:0:0: [sdh] Attached SCSI removable disk

在這個例子中,你的設備是 /dev/sdh

使用 OS X (macOS)

我我的喜歡用一個單獨的 Linux 服務器進行這些操做,但你也能夠在一臺 Mac 上使用 homebrew 完成這些操做:

# brew install wget xz
# wget http://www.finnie.org/software/raspberrypi/ubuntu-rpi3/ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
# xzcat ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz|sudo dd of=/dev/rdisk3 bs=8m

注意到當在 Mac 上操做 dd,使用 /dev/rYOUR_DEVICE 會更明智。使用 /dev/YOUR_DEVICE 的速度很慢,詳細解釋見這裏

要在 Mac 上找到 YOUR_DEVICE,插入 microSD 卡而且在終端運行 diskutil list 。尋找匹配你 SD 卡大小的磁盤(若是你有其餘相同大小可匹配的磁盤,記得查看其餘屬性保證你找到的磁盤是對的)。

# diskutil list
...
/dev/disk5 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *16.0 GB    disk5
   1:             Windows_FAT_32 system-boot             134.2 MB   disk5s1
   2:                      Linux                         15.9 GB    disk5s2

若是你對使用 diskutildd 命令感到困惑,建議閱讀這篇文章。順便說一句,若是你常常擺弄 Raspberry Pi 而且造成了習慣,wgetxzcatdd 命令都是很重要的工具。要熟練操做它們。

更新 Xenial

好啦,既然你有一個裝着 Xenial 的 microSD 卡,就能夠直接塞進樹莓派 3 啓動它!沒錯就是這樣,而後咱們假設你有一個以太網接口或者 miniUSB 接口鏈接網絡。你能夠先嚐試用 ssh ubuntu@ubuntu.local 遠程登陸你的樹莓派,若是失敗了,你能夠打開路由器的 LAN 頁面確認一下 IP 地址。默認密碼是 ubuntu

# ssh ubuntu@192.168.1.115
The authenticity of host '192.168.1.115 (192.168.1.115)' can't be established.
ECDSA key fingerprint is 62:e9:f9:09:d0:30:3c:c9:0e:47:a3:42:f5:2c:e2:ae.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.115' (ECDSA) to the list of known hosts.
ubuntu@192.168.1.115's password:
You are required to change your password immediately (root enforced)
Welcome to Ubuntu 16.04 LTS (GNU/Linux 4.4.0-1009-raspi2 armv7l)
...
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for ubuntu.
(current) UNIX password:

一旦你修改了密碼,你須要用 ubuntu 用戶從新登陸而且更新系統:

# sudo apt-get update && sudo apt-get upgrade -y
# reboot

安裝構建所需的依賴

編譯 Swift 須要不少依賴。能夠用以下命令一次性搞定:

# sudo apt-get install -y 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

幸運地是咱們不用本身一個個去尋找依賴(你知道的,那些一次又一次下載一個目錄嘗試構建它後才發現缺乏的依賴),由於這些依賴全都列在了 Open Source Swift README 裏。

我也喜歡包含 htop 這樣我就能夠看看樹莓派編譯出的進程信息:

添加一些 Swap 分區

儘管派 3 自帶 1GB 的高容量 RAM,依然不夠完整的構建 Swift(一般在連接步驟發生問題)。讓咱們手動添加 1G Swap 分區。

# fallocate -l 1G 1G.swap
# sudo mkswap 1G.swap
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=184d002a-2f15-4b23-8360-8e792badc6a2
# sudo swapon 1G.swap

如下是你在構建過程當中出現 Swap 分區不可用的問題。

cd /root/workspace/Swift-3.0-Pi3-ARM-Incremental/build/buildbot_linux/swift-linux-armv7/bin && /usr/bin/cmake -E create_symlink swift swiftc && cd /root/workspace/Swift-3.0-Pi3-ARM-Incremental/build/buildbot_linux/swift-linux-armv7/bin && /usr/bin/cmake -E create_symlink swift swift-autolink-extract
clang: error: unable to execute command: Killed
clang: error: linker command failed due to signal (use -v to see invocation)
ninja: build stopped: subcommand failed.
./swift/utils/build-script: fatal error: command terminated with a non-zero exit status 1, aborting

在一個 microSD 卡上利用 Swap 分區雙倍擴容 RAM 並非通用的辦法。一旦咱們進入到構建階段須要咱們染指 Swap 分區時,構建過程會變慢。可是不使用分區程序,其代價是之內存不足爲錯誤提示崩潰。

使用 package-swift

package-swift 是咱們的 Github 目錄,內含一些輔助腳本使得構建 Swift 更便捷。

# git clone https://github.com/iachievedit/package-swift
# cd package-swift

默認狀況下 package-swift 會遷出一個 swift-3.0 的分支。腳本都很是簡單:

  • get.sh – 下載全部構建 Swift 須要的目錄

  • update.sh – 從 Github 上更新全部的本地目錄

  • patch.sh – 應用 Swift on ARM 團隊推出的最新補丁;咱們必須時不時的更新保證可運行。一旦補丁再也不須要咱們就移除它,因此在實際的構建以前須要先 git pull 保證全部補丁包最新。

  • package.sh – 運行 Swift 的構建腳本,預設腳本名爲 buildbot_linux_armv7

我建議你看看每一個 shell 腳本,在執行前弄清它們的邏輯。腳本看上去很簡單,可是花時間去弄懂它們仍是至關值得的。請注意在 get.sh 和 update.sh 中會檢到咱們的構建是在 ARMv7 處理器上,因此咱們須要 William Dillon 的 swift-llvm fork

開始構建

請確保你有:

  • 安裝全部依賴包

  • 激活 1 GB Swap 分區

  • 已經從 Github 克隆的 package-swift

如今,克隆全部須要的目錄:

# cd package-swift
# ./get.sh

這個步驟我在個人 SD 卡上用了 15 分鐘下載和寫入全部東西。

緊接着,打補丁。獲取 Swift on ARM 團隊開發測試過的最新的補丁是很是重要的一步。這些補丁時不時就會改變,因此請保證明時更新它們。

# ./patch.sh

如今開始編譯。Swift on ARM 團隊使用 Jenkins 運行這個腳本,在這之上的構建工做是沒有日誌的。可是若是你使用 nohup 來確保你的編譯正在進行,即便你的終端斷線了也能知道。

# nohup ./package.sh > swiftbuild.log&

如今,只須要等待!整個構建過程至少 6 個小時。然而等待的成果是值得的,最後獎勵是 swift.tar.gz bundle,能夠在跑着 Ubuntu Xenial 的樹莓派 2 或 3 上安裝(不要嘗試在裝了 Raspbian 的機器上安裝,否則你會失望的)。我選擇像這樣在 /opt/swift/ 安裝 Swift:

# cd /opt
# mkdir -p swift/swift-3.0
# cd swift/swift-3.0
# tar -xzvf /path/to/swift.tar.gz

而後你能夠用 export PATH=/opt/swift/swift-3.0/usr/bin:$PATH 設置 PATH。要正確的使用 swiftcswift build 還須要運行如下命令:

sudo apt-get install -y libicu-dev
sudo apt-get install -y clang-3.6
sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-3.6 100
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-3.6 100

須要幫助

你的第一次構建每每會失敗的。事實上,在 ARM 設備上例如樹莓派 2 和 3 上構建可能會持續很長時間一團糟一直到有人可以修理它們。若是你有什麼編譯問題,請大膽的發郵件到 admin@iachieved.it,咱們會邀請你到 Swift for ARM Slack 社區來討論你的問題。

致謝

我應該單獨爲此寫一頁;許多小夥伴在推進在 ARM 設備上運行 Swift 做出了不少貢獻。像 PJ 開創了 樹莓派 1 上構建 Swift 的先河,以及任何一篇文章都離不開的 William Dillon’s 貢獻,感謝小夥伴們所作的這一切。

本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 http://swift.gg

相關文章
相關標籤/搜索