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

如何在CMake add_custom_command中为dd命令从临时文件传入seek参数值

问题分析

你的核心问题出在管道导致的变量作用域和命令顺序错误:

  • read OFFSET < offset.tmp | tr -d '\r' 中,read 是在管道的子shell里执行的,父shell无法获取这个子shell里的OFFSET变量,所以后续dd的${OFFSET}为空。
  • tr命令的位置不对,应该先清理offset.tmp里的回车符,再读取内容。
修复方案

有两种简洁的修复方式,任选其一即可:

方式一:移除临时文件,直接用命令替换获取偏移量

这种方式不需要生成offset.tmp,直接把偏移量通过命令替换赋值给变量,避免子shell问题:

add_custom_target(calc_extra_file_hash ALL
    DEPENDS target_binary extra_file
    COMMAND ${CMAKE_COMMAND} -E sha256sum ${EXTRA_FILE_PATH} | cut -f1 -d' ' | xxd -r -p > hash.tmp
)

add_custom_command(
    TARGET calc_extra_file_hash POST_BUILD
    DEPENDS calc_extra_file_hash 
    COMMAND OFFSET=$(grep -abo 'EXTRA_FILE_HASH' ${TARGET_BINARY} | cut -f1 -d':' | tr -d '\r') && 
            dd if=hash.tmp of=${TARGET_BINARY} bs=1 seek=${OFFSET} conv=notrunc
)

方式二:正确处理临时文件的读取(保留临时文件)

如果需要保留offset.tmp,调整命令顺序,先清理文件内容再读取,且避免管道导致的子shell问题:

add_custom_target(calc_extra_file_hash ALL
    DEPENDS target_binary extra_file
    COMMAND ${CMAKE_COMMAND} -E sha256sum ${EXTRA_FILE_PATH} | cut -f1 -d' ' | xxd -r -p > hash.tmp
)

add_custom_command(
    TARGET calc_extra_file_hash POST_BUILD
    DEPENDS calc_extra_file_hash 
    COMMAND grep -abo 'EXTRA_FILE_HASH' ${TARGET_BINARY} | cut -f1 -d':' > offset.tmp && 
            tr -d '\r' < offset.tmp > offset_clean.tmp && 
            read OFFSET < offset_clean.tmp && 
            dd if=hash.tmp of=${TARGET_BINARY} bs=1 seek=${OFFSET} conv=notrunc &&
            ${CMAKE_COMMAND} -E rm offset.tmp offset_clean.tmp hash.tmp
)

额外加上了清理临时文件的命令,避免构建目录冗余。

关键改动说明
  • 方式一中,用OFFSET=$(...)直接通过命令替换获取偏移量,变量在当前shell生效,不会因为子shell丢失。
  • 两种方式都用tr -d '\r'清理了Windows风格的回车符,避免偏移量包含多余字符导致dd报错。
  • 方式二通过生成清理后的临时文件再读取,确保read在当前shell执行,变量能被后续dd使用。

内容的提问来源于stack exchange,提问作者tserge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:33:09