做者:iAchieved.it,原文連接,原文日期:2016-06-2
譯者:pucca601;校對:靛青K;定稿:CMBhtml
有許多小夥伴對在他們的樹莓派 3 上構建 Swift 3.0 感興趣,這篇教程獻給那些勇敢的靈魂!python
在開始以前你須要準備好如下東西:linux
一個樹莓派 3git
一個容量至少 16GB 的 UHS-I/class 10 microSD 卡(我喜歡性價比高的 Patriot EP Series)github
耐心shell
顯然這是能夠作到的;並且咱們已經作到了,而且還有其餘小夥伴也對基於 ARM 的設備上構建 Swift 程序做出了貢獻。因此別放棄。不過就算你放棄了咱們也不會說什麼,直接下載咱們的 prebuilt Swift 3.0 package for the Raspberry Pi 2 and 3 吧。ubuntu
咱們用 Ubuntu Xenial 代替 Raspbian 。用 curl
或 wget
獲取 Xenial,而後用 dd 將文件系統寫入 microSD 卡。swift
注意:請確保閱讀此警告。你必須替換下文提到的 YOUR_DEVICE
爲正確的設備名。若是不替換成正確的名字,你的數據可能會毀壞(它們調用 dd 清除你的文件)。服務器
# 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
。
我我的喜歡用一個單獨的 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
若是你對使用 diskutil
和 dd
命令感到困惑,建議閱讀這篇文章。順便說一句,若是你常常擺弄 Raspberry Pi 而且造成了習慣,wget
、 xzcat
和 dd
命令都是很重要的工具。要熟練操做它們。
好啦,既然你有一個裝着 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 這樣我就能夠看看樹莓派編譯出的進程信息:
儘管派 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
是咱們的 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。要正確的使用 swiftc
和 swift 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。