【发布时间】:2022-06-20 08:13:06
【问题描述】:
我正在尝试在我的 Xcode 框架中使用特定于体系结构的构建设置,以便我可以分别处理 Apple Silicon Mac 和 Intel Mac 的情况。我需要将此构建设置用作 Metal 中的宏来检查 CPU 是否支持 half 数据类型(Apple Silicon 支持但 Intel 不支持)。
我当前的实现使用带有以下行的 xcconfig 文件:
IS_X86_64[arch=x86_64] = 1
然后,在我的构建设置中,我有以下用户定义的条件(来自 xcconfig):
然后我创建了宏 IS_INTEL,以便它可以在 Metal 中使用:
问题来了
理论上我觉得这应该可行。但是,在我的 Intel mac 上运行我的 Metal 应用程序会为 IS_X86_64 生成 0。我做的第一件事是检查我的构建设置是否正确并被替换
IS_X86_64[arch=x86_64] = 1
和
IS_X86_64[arch=*] = 1
这行得通,所以我知道问题一定是我当前的架构没有被正确表示。进一步探究为什么会发生这种情况,事实证明CURRENT_ARCH 的值(应该保存项目正在运行的当前设备架构的值)是undefined_arch。
在他们的Xcode 10 release notes 中,苹果提到了一些关于undefined_arch 的内容:
新的构建系统在运行 shell 脚本构建阶段时传递 undefined_arch 作为 ARCH 环境变量的值。该值以前没有很好地定义。任何依赖于该值的 shell 脚本必须对所有正在构建的已定义架构正确运行,可通过 ARCHS 环境变量获得。
但是,我没有在 shell 上构建我的项目,也没有任何 shell 脚本。 有谁知道我该如何解决这个问题,以便特定于架构的构建设置能够正常运行?
【问题讨论】: