在 macOS 上编译能在 Linux 上运行的 Swift 项目。
安装 Swiftly
下载 swiftly 安装包 swiftly
然后解压 pkg 安装包,只需要其中的 swiftly 主程序复制到 /opt/local/bin:
$ pkgutil --expand-full swiftly.pkg swiftly
$ sudo mv swiftly/swiftly-1.1.3.pkg/Payload/bin/swiftly /opt/local/bin
下载安装 Swift 工具链
需要使用 swiftly 来安装 swift.org 官方上的工具链,不能直接使用 Xcode 里自带的 swift 工具链。
$ swiftly init
然后使用 swiftly 自带的脚本配置环境变量,运行后只对当前终端窗口有效。
$ . ~/.swiftly/env.sh
安装 Swift SDK for Linux
$ swift sdk install https://download.swift.org/swift-6.3.3-release/static-sdk/swift-6.3.3-RELEASE/swift-6.3.3-RELEASE_static-linux-0.1.0.artifactbundle.tar.gz --checksum 87c3eaf908e67c0e13a84367119e12273cec1d2cd3d81f7d74bb36722d6b607b
安装完后查看一下结果:
$ swift sdk list
swift-6.3.3-RELEASE_static-linux-0.1.0
跨平台编译 Linux 下的程序
$ swift build --swift-sdk x86_64-swift-linux-musl -c release
Building for production...
/Users/v/Documents/NIOForwarder/Sources/NIOForwarder/EntryPoint.swift:4:8: error: no such module 'Darwin'
2 | import Logging
3 | import NIOPosix
4 | import Darwin
| `- error: no such module 'Darwin'
5 |
6 | @main
报错了,是因为 Linux SDK 中没有 Darwin 模块,需要调整项目中的源码,把 import Darwin 替换为:
#if os(macOS) || os(iOS)
import Darwin
#elseif canImport(Glibc)
import Glibc
#elseif canImport(Musl)
import Musl
#elseif os(Windows)
import ucrt
#else
#error("Unknown platform")
#endif
再重新编译一次就没问题了:
$ swift build --swift-sdk x86_64-swift-linux-musl -c release
查看一下编译好的程序文件信息:
$ file .build/release/NIOForwarder
.build/release/NIOForwarder: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, BuildID[sha1]=ef530910056993e46fa58dedc3bdab06db7f9683, with debug_info, not stripped
现在已经是 Linux 下的文件格式了。
