在darwin-jail中运行swift

将 XCode command line tools目录 /Library/Developer/CommandLineTools 移植到 darwin-jail 中之后,jail中同时具备了 CSwift 的运行环境。现在来尝试开发命令行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 机制

参考