CMake:在XCode中生成和编译特定于体系结构的源文件

时间:2017-10-24 16:38:41

标签: xcode cmake generated-code

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

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

./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每个架构编译一组不同的源文件?

2 个答案:

答案 0 :(得分:3)

XCode没有很好的方法可以根据正在构建的体系结构排除文件。虽然有可能(见Disabling some files in XCode project from compilation),但通过CMake设置它会有点困难。

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

答案 1 :(得分:1)

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

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