树莓派 2 和 3 上的 Swift 3.0

作者:JOE,原文链接,原文日期:2016-05-01
译者:ckitakishi;校对:mmoaay;定稿:CMB

当前,有许多人正在努力将 Swift 3.0 引入到基于 ARM 的系统中。通过本文你将了解如何在运行 Ubuntu 16 (Xenial Xerus) 的树莓派 2 或树莓派 3 上构建并使用 Swift 3.0。不过,我们暂时还没有对它在 Raspbian 系统上的可用性进行测试 (看起来并不可以)。

一个善意的提醒:树莓派 (以及所有 ARM 设备) 所支持的 Swift 3.0 仍然是测试版。 因此,尽管你可以在原型制作以及概念验证时尽情使用,但利用它来构筑产品还需三思。另外,我们有一个团队,正以在 ARM 设备上使用 Swift 3.0 为目标而不懈努力,如果你有兴趣加入,请发邮件到:admin@iachieved.it,我们将会邀请你加入 Slack 群组。

在树莓派上部署 Xenial

也许你还不知道支持树莓派的 Xenial 是存在的。不过没关系,因为我以前也是!首先你可以通读 Ubuntu Wiki 来了解它的核心内容,然后在树莓派上部署它。建议使用至少 8G 的 SD 卡。

安装 Swift 3.0

我们的团队致力于在 ARM 设备上使用 Swift,最近大家正在一台树莓派 3 上通过 Jenkins 来构建树莓派专用的二进制文件。看,下图就是构建设备!

Swift 3.0 构建设备

如果你好奇这一切是如何进行的,可以查看 Jenkins 构建项目。坦率地说,我十分惊讶,因为它只花了 6 个小时就完成了 Swift 的编译。

现在可以开始折腾了。首先,在你的树莓派上下载 Swift 3.0 的构建包 (build artifact) ,并将其解压放置在某个目录中,然后像下面这样设置你的 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 并不是强制性的,我通常使用的路径是:/opt/swift/swift-3.0

一切就绪,让我们马上来体验一下吧!

创建一个名为 helloWorld.swift 的文件:

print("Hello, world!")

然后你可以使用 swift helloWorld.swift 语句来执行该文件,就像执行脚本一样:

shell
# swift helloWorld.swift
Hello, world!

如果你下载了 clang 并对它进行了正确配置的话,也可以另辟蹊径,使用 swiftc 将上述文件编译为可执行文件:

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

倘若执行 swiftc 时失败并抛出error: link command failed with exit code 127 错误,则极有可能是因为你没有正确下载或配置 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

接下来让我们再来看一些有趣的小花絮吧:

导入 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) 并执行 (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

然后运行:

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

Swift 包管理

除非你很享受写 makefile 和构建脚本 (相信我,的确有人是这样的),不然你可以在这里使用 Swift Package Manager 来协助管理软件的包依赖。对于 Swift 3.0 引入的 SwiftPM,后面我们会写更多与其相关的内容,说起来,SwiftPM 提供了一个能够在 armv 7 设备上工作的版本,这实在是一件令人很振奋的事情。不妨试一试下面的代码:

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 的内容替换为下面的代码:

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)

现在,执行 swift build 来构建你的 finalCountdown 应用:

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 系统上运行 Swift 3.0 编写的应用还是一知半解的话,可以看一看 moreswift 项目的 swift-3.0 分支。

这是什么版本?

当前的构建并非是针对 Swift 3.0 预览版进行的。如果需要验证与 swift 二进制文件相关联的 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 设备中。下面这份名单只提到了他们中很少的几个人。推荐你去访问他们的博客;这些博客蕴藏着很多宝贵的信息和学习经验。

请允许我再说一次,如果你有兴趣加入由一群 Swift 爱好者组成的 Slack 小组,务必发邮件到 admin@iachieved.it,我会邀请你加入!

本文由 SwiftGG 翻译组翻译,已经获得作者翻译授权,最新文章请访问 http://swift.gg

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容