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



我在Util.cmake脚本中使用CMakeadd_custom_command来下载几个文件,这些文件稍后将在构建过程中使用。然而,这些文件可能会更改,我想添加一种方法,根据提供的值(在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()的更简单的调用来做到这一点。

附言:如果更容易的话,我也可以使用MD5而不是SHA256

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

file(SHA256 ./file.dat CHECKSUM_VARIABLE)

应将哈希放入CHECKSUM_VARIABLE

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将使用第二个命令创建。

最新更新