如何在cmake add_custom_command中的临时文件中提供dd命令中的seek参数值?

问题描述 投票:0回答:1

我正在使用 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-custom-command
1个回答
0
投票

因此,告诉 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
)
© www.soinside.com 2019 - 2024. All rights reserved.