构建时如何为COMMAND生成的文件创建目录?CMake自定义命令求助
解决CMake自定义命令中预创建输出目录的问题
这个场景太常见了——不少命令行工具都不会自动生成输出文件的父目录,所以我们得在执行转换操作前先把目录建好。这里给你一个跨平台的解决方案,直接集成到你的自定义命令里就行:
修改后的CMake宏代码
MACRO(ConvertToBinary _name) # 先定义输出文件的完整路径,方便后续复用 set(_output_file "${CMAKE_BINARY_DIR}/${_name}.bin") # 从输出路径中提取所在目录 get_filename_component(_output_dir "${_output_file}" DIRECTORY) ADD_CUSTOM_COMMAND( OUTPUT ${_output_file} # 第一步:用CMake自带的跨平台命令创建目录 COMMAND ${CMAKE_COMMAND} -E make_directory ${_output_dir} # 第二步:执行二进制转换命令 COMMAND ${EXE_DIR}/toBinary -i "${CMAKE_CURRENT_SOURCE_DIR}/${_name}" -o ${_output_file} DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name} COMMENT "Converting ${_name} to binary format..." ) ENDMACRO()
关键细节说明
- 跨平台兼容:用
${CMAKE_COMMAND} -E make_directory替代系统原生的mkdir(Windows是md),不管是Windows、Linux还是macOS都能正常运行,不用写繁琐的平台判断。 - 动态适配路径:通过
get_filename_component自动提取输出文件的目录,哪怕以后你把输出路径改成更深的嵌套结构(比如${CMAKE_BINARY_DIR}/bin/${_name}.bin),代码也能自动适配,不用手动修改目录路径。 - 执行顺序保障:CMake会严格按照
COMMAND的顺序依次执行,所以创建目录的操作一定会在转换命令之前完成,确保工具能找到合法的输出目录。
简化版(如果输出目录固定)
要是你的输出目录始终是${CMAKE_BINARY_DIR},也可以直接简化成下面这样,省去提取目录的步骤:
MACRO(ConvertToBinary _name) ADD_CUSTOM_COMMAND( OUTPUT ${CMAKE_BINARY_DIR}/${_name}.bin COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR} COMMAND ${EXE_DIR}/toBinary -i ${CMAKE_CURRENT_SOURCE_DIR}/${_name} -o ${CMAKE_BINARY_DIR}/${_name}.bin DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${_name} COMMENT "Converting ${_name} to binary format..." ) ENDMACRO()
不过还是推荐第一种动态提取的方式,扩展性更强。
内容的提问来源于stack exchange,提问作者Cyril
相关产品推荐
相关产品推荐

