作者:iAchieved.it,原文鏈接,原文日期:2016-06-2
譯者:pucca601测萎;校對(duì):靛青K;定稿:CMB
有許多小伙伴對(duì)在他們的樹(shù)莓派 3 上構(gòu)建 Swift 3.0 感興趣届巩,這篇教程獻(xiàn)給那些勇敢的靈魂硅瞧!
在開(kāi)始之前你需要準(zhǔn)備好以下東西:
- 一個(gè)樹(shù)莓派 3
- 一個(gè)容量至少 16GB 的 UHS-I/class 10 microSD 卡(我喜歡性價(jià)比高的 Patriot EP Series)
- Ubuntu Xenial 16.04
- 耐心
顯然這是可以做到的;而且我們已經(jīng)做到了恕汇,并且還有其他小伙伴也對(duì)基于 ARM 的設(shè)備上構(gòu)建 Swift 程序作出了貢獻(xiàn)腕唧。所以別放棄。不過(guò)就算你放棄了我們也不會(huì)說(shuō)什么瘾英,直接下載我們的 prebuilt Swift 3.0 package for the Raspberry Pi 2 and 3 吧枣接。
安裝 Xenial
我們用 Ubuntu Xenial 代替 Raspbian 。用 curl
或 wget
獲取 Xenial缺谴,然后用 dd 將文件系統(tǒng)寫(xiě)入 microSD 卡但惶。
注意:請(qǐng)確保閱讀此警告。你必須替換下文提到的 YOUR_DEVICE
為正確的設(shè)備名瓣赂。如果不替換成正確的名字榆骚,你的數(shù)據(jù)可能會(huì)毀壞(它們調(diào)用 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 卡插入一臺(tái)裝載 Linux 的機(jī)器妓肢,運(yùn)行 dmesg|tai
查看類似下面的內(nèi)容
[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
在這個(gè)例子中,你的設(shè)備是 /dev/sdh
苫纤。
使用 OS X (macOS)
我個(gè)人喜歡用一個(gè)單獨(dú)的 Linux 服務(wù)器進(jìn)行這些操作碉钠,但你也可以在一臺(tái) 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
注意到當(dāng)在 Mac 上操作 dd纲缓,使用 /dev/rYOUR_DEVICE
會(huì)更明智。使用 /dev/YOUR_DEVICE
的速度很慢喊废,詳細(xì)解釋見(jiàn)這里祝高。
要在 Mac 上找到 YOUR_DEVICE
,插入 microSD 卡并且在終端運(yùn)行 diskutil list
污筷。尋找匹配你 SD 卡大小的磁盤(如果你有其他相同大小可匹配的磁盤工闺,記得查看其他屬性保證你找到的磁盤是對(duì)的)。
# 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
如果你對(duì)使用 diskutil
和 dd
命令感到困惑瓣蛀,建議閱讀這篇文章陆蟆。順便說(shuō)一句,如果你經(jīng)常擺弄 Raspberry Pi 并且形成了習(xí)慣惋增,wget
叠殷、 xzcat
和 dd
命令都是很重要的工具。要熟練操作它們诈皿。
更新 Xenial
好啦林束,既然你有一個(gè)裝著 Xenial 的 microSD 卡,就可以直接塞進(jìn)樹(shù)莓派 3 啟動(dòng)它稽亏!沒(méi)錯(cuò)就是這樣壶冒,然后我們假設(shè)你有一個(gè)以太網(wǎng)接口或者 miniUSB 接口連接網(wǎng)絡(luò)。你可以先嘗試用 ssh ubuntu@ubuntu.local
遠(yuǎn)程登錄你的樹(shù)莓派截歉,如果失敗了依痊,你可以打開(kāi)路由器的 LAN 頁(yè)面確認(rèn)一下 IP 地址。默認(rèn)密碼是 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
用戶重新登錄并且更新系統(tǒng):
# sudo apt-get update && sudo apt-get upgrade -y
# reboot
安裝構(gòu)建所需的依賴
編譯 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
幸運(yùn)地是我們不用自己一個(gè)個(gè)去尋找依賴(你知道的,那些一次又一次下載一個(gè)目錄嘗試構(gòu)建它后才發(fā)現(xiàn)缺少的依賴)群井,因?yàn)檫@些依賴全都列在了 Open Source Swift README 里状飞。
我也喜歡包含 htop 這樣我就可以看看樹(shù)莓派編譯出的進(jìn)程信息:
添加一些 Swap 分區(qū)
盡管派 3 自帶 1GB 的高容量 RAM,依然不夠完整的構(gòu)建 Swift(通常在鏈接步驟發(fā)生問(wèn)題)书斜。讓我們手動(dòng)添加 1G Swap 分區(qū)诬辈。
# 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
以下是你在構(gòu)建過(guò)程中出現(xiàn) Swap 分區(qū)不可用的問(wèn)題。
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
在一個(gè) microSD 卡上利用 Swap 分區(qū)雙倍擴(kuò)容 RAM 并不是通用的辦法荐吉。一旦我們進(jìn)入到構(gòu)建階段需要我們?nèi)局?Swap 分區(qū)時(shí)焙糟,構(gòu)建過(guò)程會(huì)變慢。但是不使用分區(qū)程序样屠,其代價(jià)是以內(nèi)存不足為錯(cuò)誤提示崩潰穿撮。
使用 package-swift
package-swift
是我們的 Github 目錄缺脉,內(nèi)含一些輔助腳本使得構(gòu)建 Swift 更便捷。
# git clone https://github.com/iachievedit/package-swift
# cd package-swift
默認(rèn)情況下 package-swift 會(huì)遷出一個(gè) swift-3.0 的分支悦穿。腳本都非常簡(jiǎn)單:
-
get.sh
– 下載所有構(gòu)建 Swift 需要的目錄 -
update.sh
– 從 Github 上更新所有的本地目錄 -
patch.sh
– 應(yīng)用 Swift on ARM 團(tuán)隊(duì)推出的最新補(bǔ)豆ダ瘛;我們必須時(shí)不時(shí)的更新保證可運(yùn)行栗柒。一旦補(bǔ)丁不再需要我們就移除它礁扮,所以在實(shí)際的構(gòu)建之前需要先git pull
保證所有補(bǔ)丁包最新。 -
package.sh
– 運(yùn)行 Swift 的構(gòu)建腳本瞬沦,預(yù)設(shè)腳本名為 buildbot_linux_armv7
我建議你看看每個(gè) shell 腳本太伊,在執(zhí)行前弄清它們的邏輯。腳本看上去很簡(jiǎn)單蛙埂,但是花時(shí)間去弄懂它們還是相當(dāng)值得的倦畅。請(qǐng)注意在 get.sh 和 update.sh 中會(huì)檢到我們的構(gòu)建是在 ARMv7 處理器上,所以我們需要 William Dillon 的 swift-llvm fork绣的。
開(kāi)始構(gòu)建
請(qǐng)確保你有:
- 安裝所有依賴包
- 激活 1 GB Swap 分區(qū)
- 已經(jīng)從 Github 克隆的
package-swift
現(xiàn)在叠赐,克隆所有需要的目錄:
# cd package-swift
# ./get.sh
這個(gè)步驟我在我的 SD 卡上用了 15 分鐘下載和寫(xiě)入所有東西。
緊接著屡江,打補(bǔ)丁芭概。獲取 Swift on ARM 團(tuán)隊(duì)開(kāi)發(fā)測(cè)試過(guò)的最新的補(bǔ)丁是非常重要的一步。這些補(bǔ)丁時(shí)不時(shí)就會(huì)改變惩嘉,所以請(qǐng)保證實(shí)時(shí)更新它們罢洲。
# ./patch.sh
現(xiàn)在開(kāi)始編譯。Swift on ARM 團(tuán)隊(duì)使用 Jenkins 運(yùn)行這個(gè)腳本文黎,在這之上的構(gòu)建工作是沒(méi)有日志的惹苗。但是如果你使用 nohup 來(lái)確保你的編譯正在進(jìn)行,即使你的終端斷線了也能知道耸峭。
# nohup ./package.sh > swiftbuild.log&
現(xiàn)在桩蓉,只需要等待!整個(gè)構(gòu)建過(guò)程至少 6 個(gè)小時(shí)劳闹。然而等待的成果是值得的院究,最后獎(jiǎng)勵(lì)是 swift.tar.gz bundle,可以在跑著 Ubuntu Xenial 的樹(shù)莓派 2 或 3 上安裝(不要嘗試在裝了 Raspbian 的機(jī)器上安裝本涕,不然你會(huì)失望的)业汰。我選擇像這樣在 /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 設(shè)置 PATH。要正確的使用 swiftc
和 swift build
還需要運(yùn)行以下命令:
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
需要幫助
你的第一次構(gòu)建往往會(huì)失敗的菩颖。事實(shí)上样漆,在 ARM 設(shè)備上例如樹(shù)莓派 2 和 3 上構(gòu)建可能會(huì)持續(xù)很長(zhǎng)時(shí)間一團(tuán)糟一直到有人能夠修理它們。如果你有什么編譯問(wèn)題位他,請(qǐng)大膽的發(fā)郵件到 admin@iachieved.it氛濒,我們會(huì)邀請(qǐng)你到 Swift for ARM Slack 社區(qū)來(lái)討論你的問(wèn)題产场。
致謝
我應(yīng)該單獨(dú)為此寫(xiě)一頁(yè);許多小伙伴在推動(dòng)在 ARM 設(shè)備上運(yùn)行 Swift 作出了很多貢獻(xiàn)舞竿。像 PJ 開(kāi)創(chuàng)了 樹(shù)莓派 1 上構(gòu)建 Swift 的先河京景,以及任何一篇文章都離不開(kāi)的 William Dillon’s 貢獻(xiàn),感謝小伙伴們所做的這一切骗奖。
本文由 SwiftGG 翻譯組翻譯确徙,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問(wèn) http://swift.gg执桌。