构建iOS模拟器目标

时间:2017-09-16 13:34:33

标签: ios xcode ios-simulator metal metalkit

每当我构建一个包含金属着色器到x86_64目标(iOS模拟器)的项目时,我都会收到依赖性分析警告:

warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64

我知道这不是一个大问题,但我喜欢在构建时保持我的项目免受警告,所以当出现真正的问题时,我实际上会注意到黄色警告三角形。

让Xcode忽略模拟器目标的金属文件的任何快捷方法?

2 个答案:

答案 0 :(得分:2)

您可以通过以下方法解决此问题:在构建步骤中将.metal文件预先编译到Metal库中,然后从应用程序目标中删除.metal源代码。

从目标中删除.metal文件

在项目导航器中选择.metal文件,然后取消选中发出警告的目标。

金属库编译脚本

在项目中以及.metal文件旁边创建一个名为CompileMetalLib.sh的bash脚本,其内容如下:

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

拖动此步骤很重要,这样它可以在 Copy Bundle Resources 步骤之前。

更改代码以使用已编译的Metal库

您现在将从应用程序包中加载已编译的Metal库。

这里是一些伪Swift:

let metalLibPath = Bundle.main.path(forResource: "MyShader", ofType: "metallib")
let myLibrary = try metalDevice.makeLibrary(filepath: metalLibPath)

结果

您正在使用外部脚本手动编译.metal文件,并将已编译的库复制到包资源中。您的代码将加载该库。现在您的目标中没有任何.metal文件,模拟器将不再发出无法针对x86_64进行编译的警告。

答案 1 :(得分:1)

从Xcode 11开始,模拟器在macOS Catalina上运行时支持Metal。金属文件在构建过程中受支持,包括在macOS Mojave上运行或使用较旧的部署目标进行构建时。在这些情况下,Metal将不起作用,但是您不再需要从构建中排除文件。 (当然,当在10.15 Metal上运行iOS 13 / tvOS 13模拟器时,确实可以使用。)