我有一个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每个架构编译一组不同的源文件?
答案 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。