樹莓派 2 和 3 上的 Swift 3.0

作者:JOE遂庄,原文鏈接,原文日期:2016-05-01
譯者:ckitakishi劲赠;校對:mmoaay涛目;定稿:CMB

當(dāng)前,有許多人正在努力將 Swift 3.0 引入到基于 ARM 的系統(tǒng)中凛澎。通過本文你將了解如何在運(yùn)行 Ubuntu 16 (Xenial Xerus) 的樹莓派 2 或樹莓派 3 上構(gòu)建并使用 Swift 3.0霹肝。不過,我們暫時還沒有對它在 Raspbian 系統(tǒng)上的可用性進(jìn)行測試 (看起來并不可以)塑煎。

一個善意的提醒:樹莓派 (以及所有 ARM 設(shè)備) 所支持的 Swift 3.0 仍然是測試版沫换。 因此,盡管你可以在原型制作以及概念驗(yàn)證時盡情使用最铁,但利用它來構(gòu)筑產(chǎn)品還需三思讯赏。另外垮兑,我們有一個團(tuán)隊(duì),正以在 ARM 設(shè)備上使用 Swift 3.0 為目標(biāo)而不懈努力漱挎,如果你有興趣加入甥角,請發(fā)郵件到:admin@iachieved.it,我們將會邀請你加入 Slack 群組识樱。

在樹莓派上部署 Xenial

也許你還不知道支持樹莓派的 Xenial 是存在的。不過沒關(guān)系震束,因?yàn)槲乙郧耙彩橇梗∈紫饶憧梢酝ㄗx Ubuntu Wiki 來了解它的核心內(nèi)容,然后在樹莓派上部署它垢村。建議使用至少 8G 的 SD 卡割疾。

安裝 Swift 3.0

我們的團(tuán)隊(duì)致力于在 ARM 設(shè)備上使用 Swift,最近大家正在一臺樹莓派 3 上通過 Jenkins 來構(gòu)建樹莓派專用的二進(jìn)制文件嘉栓『觊牛看,下圖就是構(gòu)建設(shè)備侵佃!

Swift 3.0 構(gòu)建設(shè)備

如果你好奇這一切是如何進(jìn)行的麻昼,可以查看 Jenkins 構(gòu)建項(xiàng)目。坦率地說馋辈,我十分驚訝抚芦,因?yàn)樗换?6 個小時就完成了 Swift 的編譯。

現(xiàn)在可以開始折騰了迈螟。首先叉抡,在你的樹莓派上下載 Swift 3.0 的構(gòu)建包 (build artifact) ,并將其解壓放置在某個目錄中答毫,然后像下面這樣設(shè)置你的 PATH 值:

shell
cd $HOME
wget http://swift-arm.ddns.net/job/Swift-3.0-Pi3-ARM-Incremental/16/artifact/swift-3.0-2016-07-19-RPi23-ubuntu16.04.tar.gz
mkdir swift-3.0
cd swift-3.0 && tar -xzf ../swift-3.0.tgz
export PATH=$HOME/swift-3.0/usr/bin:$PATH

注意:把 Swift 3.0 放在 $HOME 并不是強(qiáng)制性的褥民,我通常使用的路徑是:/opt/swift/swift-3.0

一切就緒洗搂,讓我們馬上來體驗(yàn)一下吧消返!

創(chuàng)建一個名為 helloWorld.swift 的文件:

print("Hello, world!")

然后你可以使用 swift helloWorld.swift 語句來執(zhí)行該文件,就像執(zhí)行腳本一樣:

shell
# swift helloWorld.swift
Hello, world!

如果你下載了 clang 并對它進(jìn)行了正確配置的話蚕脏,也可以另辟蹊徑侦副,使用 swiftc 將上述文件編譯為可執(zhí)行文件:

shell
# swiftc helloWorld.swift
# ./helloWorld
Hello world!

倘若執(zhí)行 swiftc 時失敗并拋出error: link command failed with exit code 127 錯誤,則極有可能是因?yàn)槟銢]有正確下載或配置 clang

shell
sudo apt-get update
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

接下來讓我們再來看一些有趣的小花絮吧:

導(dǎo)入 Glibc!

swiftcat.swift:

import Glibc

guard Process.arguments.count == 2 else {
  print("Usage:  swiftcat FILENAME")
  exit(-1)
}

let filename = Process.arguments[1]

let BUFSIZE = 1024
var pp      = popen("cat " + filename, "r")
var buf     = [CChar](repeating:0, count:BUFSIZE)

while fgets(&buf, Int32(BUFSIZE), pp) != nil {
  print(String(cString:buf), terminator:"")
}

exit(0)

編譯 (swiftc swiftcat.swift) 并執(zhí)行 (swiftcat)驼鞭!

橋接 C 程序

鏈接已編譯對象文件也可以了秦驯!示例如下:

escapetext.c:

c
#include <string.h>
#include <stdlib.h>
#include <curl/curl.h>
int escapeText(const char* text, char** output) {
  int rc = -1;
  CURL* curl = curl_easy_init();
  if (curl) {
    char* escaped = curl_easy_escape(curl, text, strlen(text));
    if (escaped) {
      *output = (char*)malloc(strlen(escaped) + 1);
      strcpy(*output, escaped);
      curl_free(escaped);
      rc = strlen(*output);
    }
  }
  return rc;
}

escapetext.h:

c
int escapeText(const char* text, char** output);


import Glibc

guard Process.arguments.count == 2 else {
  print("Usage:  escapeswift STRING")
  exit(-1)
}

let string = Process.arguments[1]
var buffer:UnsafeMutablePointer<Int8>? = nil

let rc = escapeText(string, &buffer)

guard rc > 0 else {
  print("Error escaping text")
  exit(-1)
}

if let escaped = buffer {
  let escapedString = String(cString:escaped)
  print("Escaped text:  " + escapedString)
}

exit(0)

編譯并將所有文件鏈接在一起:

shell
# clang -c escapetext.c
# swiftc -c escapeswift.swift -import-objc-header escapetext.h
# swiftc escapeswift.o escapetext.o -o escapeswift -lcurl

然后運(yùn)行:

shell
# ./escapeswift "foo > bar"
Escaped text:  foo%20%3E%20bar

Swift 包管理

除非你很享受寫 makefile 和構(gòu)建腳本 (相信我,的確有人是這樣的)挣棕,不然你可以在這里使用 Swift Package Manager 來協(xié)助管理軟件的包依賴译隘。對于 Swift 3.0 引入的 SwiftPM亲桥,后面我們會寫更多與其相關(guān)的內(nèi)容,說起來固耘,SwiftPM 提供了一個能夠在 armv 7 設(shè)備上工作的版本题篷,這實(shí)在是一件令人很振奮的事情。不妨試一試下面的代碼:

shell
# mkdir finalCountdown && cd finalCountdown
# swift package init --type executable
Creating executable package: finalCountdown
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/

然后再將 Sources/main.swift 的內(nèi)容替換為下面的代碼:

import Foundation
import Glibc
let thread = NSThread(){
  print("Entering thread")
  for i in (1...10).reversed() {
    print("\(i)...", terminator:"")
    fflush(stdout)
    sleep(1)
  }
  print("\nExiting thread")
  print("Done")
  exit(0)
}
thread.start()
select(0, nil, nil, nil, nil)

現(xiàn)在厅目,執(zhí)行 swift build 來構(gòu)建你的 finalCountdown 應(yīng)用:

shell
# swift build
Compile Swift Module 'finalCountdown' (1 sources)
Linking .build/debug/finalCountdown
# .build/debug/finalCountdown
Entering thread
10...9...8...7...6...5...4...3...2...1...
Exiting thread
Done

moreswift

如果你對在 x86 與 armv 7 系統(tǒng)上運(yùn)行 Swift 3.0 編寫的應(yīng)用還是一知半解的話番枚,可以看一看 moreswift 項(xiàng)目的 swift-3.0 分支。

這是什么版本损敷?

當(dāng)前的構(gòu)建并非是針對 Swift 3.0 預(yù)覽版進(jìn)行的葫笼。如果需要驗(yàn)證與 swift 二進(jìn)制文件相關(guān)聯(lián)的 Git 哈希值,輸入 swift --version 即可:

shell
# swift --version
Swift version 3.0-dev (LLVM eb140647a6, Clang a9f2183da4, Swift bb43874ba1)

之后拗馒,你就可以直接在 Swift 倉庫里類似 https://github.com/apple/swift/tree/bb43874ba1 的 commit 記錄中路星,查看以最后一份合并到該版本的 commit 開始的歷史記錄。

致謝

很多人都一直在努力將 Swift 引入到 Linux ARM 設(shè)備中诱桂。下面這份名單只提到了他們中很少的幾個人洋丐。推薦你去訪問他們的博客;這些博客蘊(yùn)藏著很多寶貴的信息和學(xué)習(xí)經(jīng)驗(yàn)挥等。

請?jiān)试S我再說一次友绝,如果你有興趣加入由一群 Swift 愛好者組成的 Slack 小組,務(wù)必發(fā)郵件到 admin@iachieved.it肝劲,我會邀請你加入九榔!

本文由 SwiftGG 翻譯組翻譯,已經(jīng)獲得作者翻譯授權(quán)涡相,最新文章請?jiān)L問 http://swift.gg哲泊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市催蝗,隨后出現(xiàn)的幾起案子切威,更是在濱河造成了極大的恐慌,老刑警劉巖丙号,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件先朦,死亡現(xiàn)場離奇詭異,居然都是意外死亡犬缨,警方通過查閱死者的電腦和手機(jī)喳魏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怀薛,“玉大人刺彩,你說我怎么就攤上這事。” “怎么了创倔?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵嗡害,是天一觀的道長。 經(jīng)常有香客問我畦攘,道長霸妹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任知押,我火速辦了婚禮叹螟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘台盯。我一直安慰自己首妖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布爷恳。 她就那樣靜靜地躺著,像睡著了一般象踊。 火紅的嫁衣襯著肌膚如雪温亲。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天杯矩,我揣著相機(jī)與錄音栈虚,去河邊找鬼。 笑死史隆,一個胖子當(dāng)著我的面吹牛魂务,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泌射,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粘姜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了熔酷?” 一聲冷哼從身側(cè)響起孤紧,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拒秘,沒想到半個月后号显,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躺酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年押蚤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羹应。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡揽碘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钾菊,我是刑警寧澤帅矗,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站煞烫,受9級特大地震影響浑此,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜滞详,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一凛俱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧料饥,春花似錦蒲犬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至巡蘸,卻和暖如春奋隶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背悦荒。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工唯欣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搬味。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓境氢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碰纬。 傳聞我的和親對象是個殘疾皇子萍聊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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