如何在CMake自定义命令中跨平台生成非配置类文件
实现方案
你可以通过调用CMake自身能力实现完全跨平台的构建阶段文件生成,不需要依赖任何平台特定命令,两种常用方案如下:
方案1:全平台兼容所有CMake版本(推荐)
利用CMake的脚本执行模式-P运行file(WRITE)指令,适配所有CMake 3.x版本,无任何平台依赖:
# 配置阶段先生成执行写入操作的临时CMake脚本,内容完全由CMake控制,无转义问题 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/write_generated_c.cmake "file(WRITE \"generated.c\" \"int main() { return 0; }\")" ) add_custom_command( OUTPUT generated.c COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/write_generated_c.cmake # 可根据实际需求调整依赖项,此处默认监听当前CMakeLists.txt修改 MAIN_DEPENDENCY ${CMAKE_CURRENT_LIST_FILE} COMMENT "Generating generated.c" )
如果需要生成的内容包含多行、特殊字符,你可以提前把内容存入CMake变量,再替换到file(WRITE)的参数中即可,CMake会自动处理转义逻辑。
方案2:CMake 3.18+ 简化写法
CMake 3.18版本开始为cmake -E新增了write子命令,可以直接调用,写法更简洁:
add_custom_command( OUTPUT generated.c COMMAND ${CMAKE_COMMAND} -E write generated.c "int main() { return 0; }" MAIN_DEPENDENCY ${CMAKE_CURRENT_LIST_FILE} COMMENT "Generating generated.c" )
两种方案都使用${CMAKE_COMMAND}调用CMake自身可执行文件,不会依赖任何平台特定的shell命令,完全满足跨平台要求。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

