我正在使用 add_custom_command 对生成的二进制文件进行一些修改。在我的项目的构建过程中,会生成一些非二进制文件。我想将这些生成的文件的校验和嵌入到目标二进制文件中。
所以我使用 add_custom_command 作为构建后命令。在目标二进制文件中,我为校验和保留了一些空间。我有包含校验和的临时文件,使用 grep -abo 我找到目标二进制文件中的保留位置,然后我想将校验和放入其中。我正在尝试使用 dd if=${CHECKSUM_FILE} of=${TARGET_FILE} bs=1eek=?转换=notrunc。我尝试将目标二进制文件中的偏移量保存在变量中,但 sh 不提供 OFFSET=$(cat offset.tmp) 语法。我还尝试通过 read OFFSET < offset.tmp 将值放入变量中,但没有成功。
所以我的问题是如何提供目标二进制文件中的偏移量(该值存储在临时文件中)作为 dd 命令的 seek 参数?
更新我的代码看起来像
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 &&
read OFFSET < offset.tmp | tr -d '\r' &&
dd if=hash.tmp of=${TARGET_BINARY} bs=1 seek=${OFFSET} conv=notrunc
)
但这不起作用。 ${OFFSET} 为空,但 offset.tmp 包含有效值
因此,告诉 cmake 生成自定义文件内容并正确建模趋势。一个文件依赖于另一个文件,另一个文件又依赖于另一个文件,依此类推。不要覆盖现有文件,否则无法跟踪依赖关系。将构建工件保留在 CMAKE_CURRENT_BINARY_DIR 中。我建议不要 POST_BUILD 生成一些东西。
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/hash.tmp
DEPENDS ${EXTRA_FILE_PATH}
COMMAND
${CMAKE_COMMAND} -E sha256sum ${EXTRA_FILE_PATH} |
cut -f1 -d' ' |
xxd -r -p >${CMAKE_CURRENT_BINARY_DIR}/hash.tmp
)
add_custom_command(
OUTPUT ${TARGET_BINARY}.output
DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/hash.tmp ${TARGET_BINARY}
BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/offset.tmp
COMMAND
grep -abo 'EXTRA_FILE_HASH' ${TARGET_BINARY} | cut -f1 -d':' > offset.tmp &&
read OFFSET < offset.tmp | tr -d '\r' &&
cp ${TARGET_BINARY} ${TARGET_BINARY}.output &&
dd if=${CMAKE_CURRENT_BINARY_DIR}/hash.tmp of=${TARGET_BINARY}.output bs=1 seek=${OFFSET} conv=notrunc
)