在樹(shù)莓派 3 上構(gòu)建 Swift 3.0

作者:iAchieved.it,原文鏈接,原文日期:2016-06-2
譯者:pucca601测萎;校對(duì):靛青K;定稿:CMB

有許多小伙伴對(duì)在他們的樹(shù)莓派 3 上構(gòu)建 Swift 3.0 感興趣届巩,這篇教程獻(xiàn)給那些勇敢的靈魂硅瞧!

在開(kāi)始之前你需要準(zhǔn)備好以下東西:

顯然這是可以做到的;而且我們已經(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 。用 curlwget 獲取 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ì)使用 diskutildd 命令感到困惑瓣蛀,建議閱讀這篇文章陆蟆。順便說(shuō)一句,如果你經(jīng)常擺弄 Raspberry Pi 并且形成了習(xí)慣惋增,wget 叠殷、 xzcatdd 命令都是很重要的工具。要熟練操作它們诈皿。

更新 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。要正確的使用 swiftcswift 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执桌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鄙皇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子仰挣,更是在濱河造成了極大的恐慌伴逸,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘壶,死亡現(xiàn)場(chǎng)離奇詭異错蝴,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颓芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門顷锰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人亡问,你說(shuō)我怎么就攤上這事官紫。” “怎么了州藕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵束世,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我床玻,道長(zhǎng)良狈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任笨枯,我火速辦了婚禮,結(jié)果婚禮上遇西,老公的妹妹穿的比我還像新娘馅精。我一直安慰自己,他們只是感情好粱檀,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布洲敢。 她就那樣靜靜地躺著,像睡著了一般茄蚯。 火紅的嫁衣襯著肌膚如雪压彭。 梳的紋絲不亂的頭發(fā)上睦优,一...
    開(kāi)封第一講書(shū)人閱讀 52,895評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音壮不,去河邊找鬼汗盘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛询一,可吹牛的內(nèi)容都是我干的隐孽。 我是一名探鬼主播,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼健蕊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼菱阵!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缩功,我...
    開(kāi)封第一講書(shū)人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晴及,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后嫡锌,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虑稼,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年世舰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了动雹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跟压,死狀恐怖胰蝠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情震蒋,我是刑警寧澤茸塞,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站查剖,受9級(jí)特大地震影響钾虐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笋庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一效扫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧直砂,春花似錦菌仁、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春摹迷,著一層夾襖步出監(jiān)牢的瞬間疟赊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工峡碉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留近哟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓异赫,卻偏偏與公主長(zhǎng)得像椅挣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子塔拳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容