每当我构建一个包含金属着色器到x86_64目标(iOS模拟器)的项目时,我都会收到依赖性分析警告:
warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64
我知道这不是一个大问题,但我喜欢在构建时保持我的项目免受警告,所以当出现真正的问题时,我实际上会注意到黄色警告三角形。
让Xcode忽略模拟器目标的金属文件的任何快捷方法?
答案 0 :(得分:2)
您可以通过以下方法解决此问题:在构建步骤中将.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库。
这里是一些伪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模拟器时,确实可以使用。)