如何在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
相关产品推荐
相关产品推荐

