Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

An Update on Swift 3.1.1 For Raspberry Pi Zero/1/2/3 #52

Closed
mmoaay opened this issue Mar 27, 2018 · 1 comment
Closed

An Update on Swift 3.1.1 For Raspberry Pi Zero/1/2/3 #52

mmoaay opened this issue Mar 27, 2018 · 1 comment

Comments

@mmoaay
Copy link
Member

mmoaay commented Mar 27, 2018

https://www.uraimo.com/2017/05/01/An-update-on-Swift-3-1-1-for-raspberry-pi-zero-1-2-3/

@mmoaay
Copy link
Member Author

mmoaay commented Mar 27, 2018

title: "An Update on Swift 3.1.1 For Raspberry Pi Zero/1/2/3"
date: 2017/05/01
tags: [Raspberry Pi]
categories: []
permalink:
keywords:
custom_title:
description:


原文链接=https://www.uraimo.com/2017/05/01/An-update-on-Swift-3-1-1-for-raspberry-pi-zero-1-2-3/
作者=Umberto Raimondi
原文日期=2017/05/01
译者=TonyHan
校对=
定稿=
发布时间=

Swift 3.1.1 版本关于树莓派(Raspberry Pi) Zero/1/2/3 的更新

5 月 12 号更新:添加了交叉编译部分。

我认为现在是时候再次在 Raspberry Pi 和其他 ARM 板上更新 Swift 了。

如果你正在 Ubuntu Mate 16.04 上使用 Raspberry Pi 2 或 3(我一直推荐的版本),只需要从这里下载 3.1.1 版本或使用 buildSwiftOnARM 脚本更新并构建自己的二进制文件即可。

多亏了 Florian Friedrich, 在 ARM 上编译所需的大部分补丁已经集成到 Swift master 和 3.1 分支上。如果你有 ARMv6 的板子,比如原来的 Raspberry Pi、新的 Zero 板或者你刚刚运行的 Raspbian,那么目前无法在比 3.0.2 更新版的 Swift 上编译。

如果上述版本已经可以满足你的需求,你可以从这里找到(的确仍然没有 Raspbian/Debian 上的 SPM,请阅读有关交叉编译的部分)。

自从 3.1 版本发布以来,基于 swift-arm 所建立的社区就一直致力于让 Swift 在 Raspbian(或其他 Debian 系统)上编译,并且取得了一些进展。

已经有一些补丁(某些 Ubuntus 版本也是需要的),并且已经提出了几个 issue 来跟踪当前的阻塞问题:SR-4613SR-4147

像往常一样,3.1.1 版本已经使用 SwiftyGPIO 进行测试,一切似乎都可以正常运行。

在 Docker 上构建和交叉编译

还有一项最近的进展是 Helge Heß 的名为 dockSwiftOnARM 新项目,这个项目可以允许在 Linux 或 MacOS 上的 ARM docker 容器中运行甚至构建 Swift,相当方便而且有文档的支持。

几周前,Swift Package Manager 终于获得了交叉编译的支持。

感谢 Johannes Weiß 的伟大工作,他完成了交叉编译toolchains generation

这意味着现在你终于可以在 Mac(或 Ubuntu)上交叉编译 ARM 二进制文件,并且按照 Helge Heß 的详细说明,构建自己的具有 SPM 功能的交叉编译工具链(Cross-compiling Toolchain),该工具链可以在 macOS 上为 Ubuntu 16.04 生成 Swift 3.1.1 ARM 二进制文件。

在 Raspbian 上用于 Swift 3.0.2 的 Cross-compiling Toolchain

将上面提到的说明略作修改,可以生成一个工具链,它用来构建基于 Swift 3.0.2 的可在 Raspbian 上运行的的二进制文件,但更重要的是,它具有可用的 SPM!

原始指南中所描述的内容中,有一些需要进行更改。

下载 Swift 3.0.2 软件包而不是 3.1.1 软件包:

curl -o /tmp/swift-3.0.2-RPi1Zero-RaspbianNov16.tgz  https://www.dropbox.com/s/dkrkt9ht1c3hog2/swift-3.0.2-RPi1Zero-RaspbianNov16.tgz
curl -o /tmp/swift-3.0.2-RELEASE-osx.pkg https://swift.org/builds/swift-3.0.2-release/xcode/swift-3.0.2-RELEASE/swift-3.0.2-RELEASE-osx.pkg

使用以下参数启动脚本:

./build_rpi_ubuntu_cross_compilation_toolchain \
/tmp/ \
/tmp/swift-3.0.2-RELEASE-osx.pkg \
/tmp/swift-3.0.2-RPi23-RaspbianNov16.tgz

工具链构建成功,但 SPM 却无法工作。这是因为 Swift 3.0.2 版本的 swiftc 不支持在调用编译器时包管理器所追加的新 -swift-version 选项。

下面构建一个不使用此选项的包管理器的版本。

克隆 SPM:

cd /tmp/
git clone /~https://github.com/apple/swift-package-manager.git

将脚本保存到文件并执行:(patch -p1 < file.diff):

diff --git a/Sources/Build/BuildPlan.swift b/Sources/Build/BuildPlan.swift
index 5c48fb57..af50f539 100644
--- a/Sources/Build/BuildPlan.swift
+++ b/Sources/Build/BuildPlan.swift
@@ -260,7 +260,7 @@ public final class SwiftTargetDescription {
     /// The arguments needed to compile this target.
     public func compileArguments() -> [String] {
         var args = [String]()
-        args += ["-swift-version", String(swiftVersion)]
+        //args += ["-swift-version", String(swiftVersion)]
         args += buildParameters.toolchain.extraSwiftCFlags
         args += buildParameters.swiftCompilerFlags
         args += optimizationArguments
diff --git a/Sources/PackageLoading/ManifestLoader.swift b/Sources/PackageLoading/ManifestLoader.swift
index 9f8f3cbd..02cde4be 100644
--- a/Sources/PackageLoading/ManifestLoader.swift
+++ b/Sources/PackageLoading/ManifestLoader.swift
@@ -306,7 +306,7 @@ public final class ManifestLoader: ManifestLoaderProtocol {
     ) -> [String] {
         var cmd = [String]()
         let runtimePath = self.runtimePath(for: manifestVersion)
-        cmd += ["-swift-version", String(manifestVersion.rawValue)]
+        //cmd += ["-swift-version", String(manifestVersion.rawValue)]
         cmd += ["-I", runtimePath.asString]
       #if os(macOS)
         cmd += ["-target", "x86_64-apple-macosx10.10"]

编译 SPM:

swift build

暂时将正在使用的 swift-build 库移除,然后将上边的库复制过去(路径可能有所不同,一旦完成交叉编译,需要恢复到原来的二进制文件)。

cd /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2017-05-09-a.xctoolchain/usr/bin/
sudo mv swift-build swift-build.old
sudo cp /tmp/swift-package-manager/.build/debug/swift-build /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2017-05-09-a.xctoolchain/usr/bin/

现在可以使用工具链,进入到项目的根目录并使用新的SPM选项进行编译:

swift build --destination /tmp/cross-toolchain/rpi-ubuntu-xenial-destination.json

所得到的二进制文件可以在 Raspberry Pi 上处理 Swift 3.0.2(请记住按照指南更新 LD_LIBRARY_PATH)。

而且,正如你所注意到的那样,这个程序对 Raspbian 来说有点复杂。

�另外

其他方面的消息,我计划启动一个新的开源项目,目的是降低使用 Swift 开发 IoT 项目的门槛,这个项目将提供更好的文档,设备库注册表,以及你项目中所需的所有其他信息(遵循 Android Things 采用的方法并加以改进):

Umberto Raimondi

请继续关注这个项目的更新,根据投票情况,目前暂时可能会命名为 Swifty Things 或 Swift IoT。

喜欢这篇文章的话,请在 Twitter 上通知我!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants