我有一个CMake项目,用于生成支持多CPU体系结构(arm64和armv7)的面向iOS的XCode项目。
我的CMake项目包括一些命令(用add_custom_command
定义),这些命令将Lua脚本转换为C++源文件。这些生成的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,每个体系结构编译一组不同的源文件?
发布于 2017-10-24 18:07:28
XCode没有一个很好的方法来排除基于正在构建的体系结构的文件。虽然这是可能的(请参阅Disabling some files in XCode project from compilation),但是通过CMake来设置它会有些困难。
相反,我建议让生成工具/脚本在整个文件周围设置预处理器保护,以支持生成的文件所支持的体系结构。这样,当XCode编译它们时,它们本质上将是空的,除了它们所要用于的体系结构。在这个答案(Determine if the device is ARM64)中,它展示了如何基于arm64进行条件编译(并对armv7使用反向编译)。
发布于 2017-10-24 17:29:15
好吧,不要把不同拱门的生成源放在同一个列表中。打开foreach
主体,并对每个拱形重复这些命令。
如果不想引入代码复制,可以编写一个CMake function
,它创建自定义命令并返回生成的源代码列表。有关如何从函数返回值,请参见this question。
https://stackoverflow.com/questions/46915776
复制相似问题