在darwin-jail中运行swift
将 XCode command line tools目录 /Library/Developer/CommandLineTools
移植到 darwin-jail 中之后,jail中同时具备了 C 和 Swift 的运行环境。现在来尝试开发命令行swift程序
首先使用 SwiftPM来创建一个项目:
初始化swift项目
mkdir MyCLI
cd MyCLI
swift package init --name MyCLI --type executable
此时项目目录构建完成:
项目目录结构
.
├── Package.swift
└── Sources
└── main.swift
其中 Sources/main.swift
就是最简单 Hello, World
代码
Hello, World
// The Swift Programming Language
// https://docs.swift.org/swift-book
print("Hello, world!")
运行:
运行
swift run MyCLI
在jail中运行有报错:
运行报错
error: 'mycli': Invalid manifest (compiled with: ["/Library/Developer/CommandLineTools/usr/bin/swiftc", "-vfsoverlay", "/var/folders/fb/1zwz4_152_g8lv6w4m6zq78r0000gn/T/TemporaryDirectory.8D37hS/vfs.yaml", "-L", "/Library/Developer/CommandLineTools/usr/lib/swift/pm/ManifestAPI", "-lPackageDescription", "-Xlinker", "-rpath", "-Xlinker", "/Library/Developer/CommandLineTools/usr/lib/swift/pm/ManifestAPI", "-target", "x86_64-apple-macosx13.0", "-F", "/Library/Developer/CommandLineTools/Library/Developer/Frameworks", "-sdk", "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk", "-swift-version", "6", "-I", "/Library/Developer/CommandLineTools/usr/lib/swift/pm/ManifestAPI", "-sdk", "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk", "-package-description-version", "6.0.0", "/Users/huatai/src/MyCLI/Package.swift", "-o", "/var/folders/fb/1zwz4_152_g8lv6w4m6zq78r0000gn/T/TemporaryDirectory.WUCP4W/mycli-manifest"])
sandbox-exec: unable to open "system.sb": not found
error: 'mycli': Invalid manifest (compiled with: ["/Library/Developer/CommandLineTools/usr/bin/swiftc", "-vfsoverlay", "/var/folders/fb/1zwz4_152_g8lv6w4m6zq78r0000gn/T/TemporaryDirectory.tcHOk8/vfs.yaml", "-L", "/Library/Developer/CommandLineTools/usr/lib/swift/pm/ManifestAPI", "-lPackageDescription", "-Xlinker", "-rpath", "-Xlinker", "/Library/Developer/CommandLineTools/usr/lib/swift/pm/ManifestAPI", "-target", "x86_64-apple-macosx13.0", "-F", "/Library/Developer/CommandLineTools/Library/Developer/Frameworks", "-sdk", "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk", "-swift-version", "6", "-I", "/Library/Developer/CommandLineTools/usr/lib/swift/pm/ManifestAPI", "-sdk", "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk", "-package-description-version", "6.0.0", "/Users/huatai/src/MyCLI/Package.swift", "-o", "/var/folders/fb/1zwz4_152_g8lv6w4m6zq78r0000gn/T/TemporaryDirectory.sPxtsw/mycli-manifest"])
sandbox-exec: unable to open "system.sb": not found
这里 system.sb
是一个库,通过 import "system.sb"
导入,具体在哪里呢?
在 Missing librairies in /usr/lib on Big Sur? 找到一个启发,提到从 macOS Big Sur 11.0.1 开始,系统附带所有系统提供的库的内置动态连接起缓存,文件系统不在保存动态库的副本。
是不是 darwin-jail
打包时候缺少了某部分缓存(还是没有安装XCode command line tools就打包导致缺少了部分)?
备注
上述报错信息可以看到,在 macOS 上执行 chroot
实际上是通过 Apple App Sandbox 提供的 sandbox-exec 来实现的,所以需要学习和研究 sandbox-exec
机制