下载文件的CMake检查哈希值(MD5 / SHA256)

时间:2017-01-16 00:39:25

标签: c++ hash download cmake sha256

我正在使用CMake add_custom_commandUtil.cmake脚本中下载一些稍后将在构建过程中使用的文件。然而,这些文件可能会更改,我想添加一种方法来检查本地文件的哈希值与提供的值(在CMake中),以决定是否需要重新下载该文件。

目前,一旦下载文件,CMake将不会考虑重新下载,因为该文件已存在于本地。

将来,我想提供该文件的MD5 / SHA256校验和,并确保本地文件是核心文件。

这是我想要做的(这只是一个概念示例):

add_custom_command( OUTPUT ./file.dat
    COMMAND wget ${FILE_PATH}
)
if (opt_HASH)
    add_custom_command(OUTPUT ${local_HASH}
        COMMAND local_HASH=$(sha256sum ./file.dat)
        DEPENDS ./file.dat
    )
    if (NOT ${opt_HASH} STREQUAL ${local_HASH})
        # throw ERROR
    endif()
endif()

正如您所看到的,我现在只想检测到不匹配,甚至不想自动下载更改的文件。 opt_HASH显然是通过CMake提供的,但重要的是这个调用需要依赖于已经下载的文件,我似乎能够通过更简单的FILE()调用来实现。

PS:如果它在某种程度上更容易,我也可以使用MD5而不是`SHA256。

2 个答案:

答案 0 :(得分:1)

cmakes FILE命令支持散列: https://cmake.org/cmake/help/v3.8/command/file.html

file(SHA256 ./file.dat CHECKSUM_VARIABLE)

应该将哈希放入CHECKSUM_VARIABLE

答案 1 :(得分:0)

使用add_custom_target可能是一种解决方案。默认情况下,它将始终执行。以下应该适用于linux:

add_custom_target(UpdateExternalFiles
    COMMAND "sha256sum -c file.dat.checksum ./file.dat || wget ${FILE_PATH}"
    COMMAND "sha256sum ./file.dat >> file.dat.checksum"
)

第一行验证校验和并在差异上加载文件。第二行更新校验和。

注意:此剪辑假定将使用第二个命令创建file.dat.checksum。