为 iOS 模拟器目标构建时忽略 .metal 文件
Ignore .metal files when building for iOS Simulator target
每当我为 x86_64 目标(iOS 模拟器)构建一个包含金属着色器的项目时,我都会收到依赖性分析警告:
warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64
我知道这不是什么大问题,但我希望在构建时让我的项目免受警告,这样当真正的问题出现时,我实际上会注意到黄色警告三角形。
有什么快速方法可以让 Xcode 忽略模拟器目标的金属文件?
您可以通过在构建步骤中将 .metal 文件预编译为 Metal 库并从应用目标中删除 .metal 源代码来解决此问题。
从目标中删除 .metal 文件
Select 项目导航器中的 .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.
的警告
自 Xcode 11 起,模拟器在 macOS Catalina 上 运行 时支持 Metal。在构建期间支持 Metal 文件,包括在 macOS Mojave 上 运行 时或使用较旧的部署目标构建时。 Metal 在这些情况下将不起作用,但您不再需要从构建中排除文件。 (当然,当 运行 iOS 10.15 Metal 上的 13 / tvOS 13 模拟器实际工作时)。
每当我为 x86_64 目标(iOS 模拟器)构建一个包含金属着色器的项目时,我都会收到依赖性分析警告:
warning: no rule to process file '[File Path]/Shaders.metal' of type sourcecode.metal for architecture x86_64
我知道这不是什么大问题,但我希望在构建时让我的项目免受警告,这样当真正的问题出现时,我实际上会注意到黄色警告三角形。
有什么快速方法可以让 Xcode 忽略模拟器目标的金属文件?
您可以通过在构建步骤中将 .metal 文件预编译为 Metal 库并从应用目标中删除 .metal 源代码来解决此问题。
从目标中删除 .metal 文件
Select 项目导航器中的 .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.
的警告自 Xcode 11 起,模拟器在 macOS Catalina 上 运行 时支持 Metal。在构建期间支持 Metal 文件,包括在 macOS Mojave 上 运行 时或使用较旧的部署目标构建时。 Metal 在这些情况下将不起作用,但您不再需要从构建中排除文件。 (当然,当 运行 iOS 10.15 Metal 上的 13 / tvOS 13 模拟器实际工作时)。