为 iOS 模拟器目标构建时忽略 .metal 文件
Posted
技术标签:
【中文标题】为 iOS 模拟器目标构建时忽略 .metal 文件【英文标题】:Ignore .metal files when building for iOS Simulator target 【发布时间】:2018-02-25 12:37:10 【问题描述】:每当我构建一个包含 x86_64 目标(ios 模拟器)的金属着色器的项目时,我都会收到依赖分析警告:
warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64
我知道这不是一个大问题,但我喜欢在构建时让我的项目没有警告,这样当真正出现问题时,我实际上会注意到黄色警告三角形。
有什么快速的方法让 Xcode 忽略模拟器目标的金属文件?
【问题讨论】:
我很好奇你的设置是什么,你有一个可以在模拟器上运行的 Metal 应用程序。你会回退到 OpenGL ES 吗? @NicolasMiari That 将是终极解决方案——在模拟器中运行的金属应用程序!但是不,我主要依赖 UIKit,我有一个用于特定功能的 MTKView,我在模拟器中将其关闭并围绕它进行测试。我想如果你回到 OpenGL,这个问题仍然存在。 一个丑陋的解决方法是有两个单独的目标:一个用于设备,包含所有源文件,另一个用于模拟器,不包括 .metal 文件(文件的目标成员复选框关闭)。然后,设置两个方案(一个来构建每个目标)... 我认为您可以通过每个目标的构建设置来实现该设置(支持的架构?) 是的,这可行,但我希望有更简单的东西。就像一个标志一样,我可以在我的构建设置中传递,甚至是在“编译源”构建阶段着色器文件上的编译器标志。 【参考方案1】:您可以通过在构建步骤中将 .metal 文件预编译到 Metal 库中并从应用目标中删除 .metal 源代码来解决此问题。
从目标中移除 .metal 文件
在项目导航器中选择您的 .metal 文件,然后取消选中发出警告的目标。
金属库编译脚本
在您的项目中创建一个名为 CompileMetalLib.sh 的 bash 脚本,以及您的 .metal 文件,其内容如下:
xcrun -sdk iphoneos metal -c MyShader.metal -o MyShader.air
xcrun -sdk iphoneos metallib MyShader.air -o MyShader.metallib
rm MyShader.air
确保通过运行chmod +x CompileMetalLib.sh
为其授予可执行权限。
MyShader.air
是中间编译步骤,MyShader.metallib
是完全编译的金属库。 Read all about compiling a Metal file here
如果您正在为 OS X 编译,请将 iphoneos
更改为 macosx
。
在构建过程中运行编译脚本
现在您需要在构建阶段触发此脚本。
向您的目标添加一个新的运行脚本阶段。内容应如下所示:
cd $SRCROOT/path/to/folder/containing/yourshader
./CompileMetalLib.sh
拖动此步骤很重要,以便它发生在复制捆绑资源步骤之前。
更改代码以使用已编译的 Metal 库
您现在将从您的应用程序包中加载已编译的 Metal 库。
这是一些伪 Swift:
let metalLibPath = Bundle.main.path(forResource: "MyShader", ofType: "metallib")
let myLibrary = try metalDevice.makeLibrary(filepath: metalLibPath)
结果
您正在使用外部脚本手动编译 .metal 文件,并将编译后的库复制到您的捆绑资源中。您的代码会加载此库。现在您的目标中没有任何 .metal 文件,模拟器将不再抛出无法为 x86_64 编译的警告。
【讨论】:
【参考方案2】:从 Xcode 11 开始,模拟器在 macOS Catalina 上运行时支持 Metal。在构建期间支持金属文件,包括在 macOS Mojave 上运行或使用较旧的部署目标构建时。 Metal 在这些情况下将不起作用,但您不再需要从构建中排除文件。 (当然,在 10.15 Metal 上运行 iOS 13 / tvOS 13 模拟器时实际上可以工作)。
【讨论】:
以上是关于为 iOS 模拟器目标构建时忽略 .metal 文件的主要内容,如果未能解决你的问题,请参考以下文章
以真实设备为目标时,无法在 IOS 中构建 react-native
为 iOS 模拟器构建,但在为 iOS 构建的目标文件中链接,用于架构 arm64
Mac Catalyst 的问题 - 链接为 iOS 模拟器构建的目标文件
Xcode 12 beta 4:为 iOS 模拟器构建,但在为独立构建的目标文件中链接
Flutter - iOS 模拟器部署目标“IPHONEOS_DEPLOYMENT_TARGET”设置为 7.0 && 无法找到构建输入文件 GoogleService-Info.pl