【问题标题】:CMake: generate and compile architecture-specific source files in XCodeCMake:在 XCode 中生成和编译特定于体系结构的源文件
【发布时间】:2017-10-24 16:38:41
【问题描述】:

我有一个 CMake 项目,用于生成支持多种 CPU 架构(arm64 和 armv7)的面向 iOS 的 XCode 项目。

我的 CMake 项目包含一些将 Lua 脚本转换为 C++ 源文件的命令(使用 add_custom_command 定义)。这些生成的 C++ 文件因架构而异(不应为 arm64 编译 armv7 文件,反之亦然)。 该工具的调用方式如下:

./data_tool --input <script> --output <C++ source> --architecture <armv7 or arm64>

我的(不正确的)CMake 文件目前看起来像这样:

foreach(ARCHITECTURE ${TARGET_ARCHITECTURES})
        string(
            REPLACE ".lua" ".cpp" GENERATED_CPP
            ${GENERATED_SOURCE_DIRECTORY}/${ARCHITECTURE}/${INPUT_SCRIPT}
        )

        add_custom_command(
                    OUTPUT ${GENERATED_CPP}
                    COMMAND ${DATA_TOOL} --input "${INPUT_SCRIPT}" --output "${GENERATED_CPP}" --architecture ${ARCHITECTURE}
                    MAIN_DEPENDENCY ${INPUT_SCRIPT}
        )
        list( APPEND GENERATED_SOURCE ${GENERATED_CPP} )
endforeach()

稍后,GENERATED_SOURCE 被附加到传递给add_executable 的源文件列表中。这段代码显然是错误的,因为 armv7 和 arm64 文件都是在为任一架构构建时编译的。

我如何告诉 CMake 每个架构编译一组不同的源文件?

【问题讨论】:

    标签: xcode cmake generated-code


    【解决方案1】:

    XCode 没有很好的方法来根据正在构建的架构排除文件。虽然有可能(请参阅Disabling some files in XCode project from compilation),但通过 CMake 进行设置会有些困难。

    相反,我建议简单地让您的生成工具/脚本在整个文件周围放置预处理器保护,以用于生成的文件支持的体系结构。这样,当 XCode 编译它们时,它们基本上是空的,除了它们所要使用的架构。在这个答案 (Determine if the device is ARM64) 中,它展示了如何基于 arm64 进行条件编译(并对 armv7 使用相反的编译)。

    【讨论】:

      【解决方案2】:

      好吧,不要将不同拱门的生成源放到同一个列表中。打开foreach body 并为每个拱门重复这些命令。

      如果您不想引入代码重复,您可以编写一个 CMake function 来创建该自定义命令并返回生成的源列表。有关如何从函数返回值,请参阅 this question

      【讨论】:

      • 嘿箭头,感谢您的回答。我知道我可以为每个架构创建不同的列表。我不明白的是如何避免将 both 列表指定为 add_executable 的输入。在编译通用二进制文件时,我想为一种架构使用一个列表,为另一个架构使用一个列表。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      相关资源
      最近更新 更多