如何通过CMake的add_custom_command实现*.y文件转存为*.txt?
解决CMake中用add_custom_command将.y文件转为.txt的问题
首先看你现有代码里的核心问题:你写的add_custom_command把原.y文件设为OUTPUT,这完全搞反了逻辑——CMake的add_custom_command是用来定义如何生成某个输出文件的,所以OUTPUT应该是你最终要得到的.txt文件,而不是已经存在的.y文件。另外,你没有把这些生成.txt的命令关联到实际会被构建的target上,所以CMake根本不会触发这些命令。
下面是修正后的完整宏代码,我会逐点说明修改:
macro(COMPARE file function type type_out) get_filename_component(main_base_name ${file} NAME_WE) set(main_base_name_mangled ${main_base_name}_${function}_${type_out}) # file generated by simulation set(output_file ${function}_${type_out}_0_opt.y) # reference file generated by generator set(reference_file ${function}_${type_out}_0_ref.y) set(output_file_txt ${function}_${type_out}_0_opt.txt) set(reference_file_txt ${function}_${type_out}_0_ref.txt) # 1. 定义生成output.txt的自定义命令:以output.y为依赖,生成output.txt add_custom_command( OUTPUT ${output_file_txt} COMMAND ${CMAKE_COMMAND} -E copy ${output_file} ${output_file_txt} # 若需跨平台重定向(比如处理特殊格式),可替换为: # COMMAND $<IF:$<PLATFORM_ID:Windows>,type,cat> ${output_file} > ${output_file_txt} MAIN_DEPENDENCY ${output_file} COMMENT "Copying ${output_file} to ${output_file_txt}" ) # 2. 定义生成reference.txt的自定义命令:同理 add_custom_command( OUTPUT ${reference_file_txt} COMMAND ${CMAKE_COMMAND} -E copy ${reference_file} ${reference_file_txt} # COMMAND $<IF:$<PLATFORM_ID:Windows>,type,cat> ${reference_file} > ${reference_file_txt} MAIN_DEPENDENCY ${reference_file} COMMENT "Copying ${reference_file} to ${reference_file_txt}" ) # 3. 修改compare target,让它依赖生成的txt文件,确保构建compare时先生成txt add_custom_target(compare_${main_base_name_mangled} DEPENDS ${output_file_txt} ${reference_file_txt} COMMAND cmp ${reference_file} ${output_file} COMMENT "Comparing ${reference_file} ${output_file}" ) add_dependencies(compare_${main_base_name_mangled} simulate_${main_base_name_mangled}) add_test(NAME Compare_${main_base_name_mangled} COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target compare_${main_base_name_mangled}) set_tests_properties(Compare_${main_base_name_mangled} PROPERTIES REQUIRED_FILES ${reference_file} ${output_file}) # 修复变量名错误:原代码里的base_name_mangled未定义,替换为main_base_name_mangled set_tests_properties(Compare_${main_base_name_mangled} PROPERTIES DEPENDS Simulate_${main_base_name_mangled}) endmacro()
关键修改点说明:
- 调整add_custom_command的OUTPUT指向:现在
OUTPUT是要生成的.txt文件,CMake会自动检查该文件是否存在,若不存在且依赖的.y文件已更新,就执行命令生成它。 - 关联到实际构建target:通过
DEPENDS把生成的.txt文件加到compare_xxxtarget的依赖列表中,这样当你构建这个target时,CMake会先执行生成txt的命令。 - 修复变量名错误:原代码中
Simulate_${base_name_mangled}的base_name_mangled是未定义变量,替换为已声明的main_base_name_mangled。 - 跨平台重定向可选方案:如果你的
.y文件需要通过shell命令转换格式,用$<IF:$<PLATFORM_ID:Windows>,type,cat>可以兼容Windows和类Unix系统的文本输出命令。
如果希望.txt文件在生成.y文件后立刻自动生成,也可以把output_file_txt和reference_file_txt加到simulate_${main_base_name_mangled} target的依赖中,这样模拟任务完成后就会自动转存为txt文件。
内容的提问来源于stack exchange,提问作者jailaxmi k
相关产品推荐
相关产品推荐

