You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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_xxx target的依赖列表中,这样当你构建这个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:24:15