如何使用 CMake 下载任意文件作为自定义目标的一部分?

She*_*eki 6 cmake

CMake 通过其ExternalProject,可以在构建过程中轻松下载大量档案,从而保持存储库清洁。举个例子,我可以像这样下载并解压 Eigen:

include(ExternalProject)

ExternalProject_Add(
    eigen
    URL http://bitbucket.org/eigen/eigen/get/3.2.8.tar.bz2
    URL_HASH SHA512=53c27ba530c985dfef52188e03273eeef33abbc67e3f150cacd3371c8b9ddbd399228730595821c4c56c061d109cf509266c1dab2b8a7c730902cbd6fb18c100
    INSTALL_COMMAND ""
)
Run Code Online (Sandbox Code Playgroud)

我希望能够对任意文件执行相同的操作,在我的例子中下载附加数据以用于演示目的。CMake 确实file(DOWNLOAD...)为此提供了功能,并且效果很好,例如:

file(DOWNLOAD
    http://graphics.stanford.edu/pub/3Dscanrep/bunny.tar.gz
    ${CMAKE_BINARY_DIR}/demo/bunny.tar.gz
    SHA512=59e7b43db838dbe6f02fda5e844d18e190d32d2ca1a83dc9f6b1aaed43e0340fc1e8ecabed6fffdac9f85bd34e7e93b5d8a17283d59ea3c14977a0372785d2bd
    SHOW_PROGRESS
)
add_custom_target(demo tar -xzf ${CMAKE_BINARY_DIR}/demo/bunny.tar.gz -C ${CMAKE_BINARY_DIR}/demo)
Run Code Online (Sandbox Code Playgroud)

这将下载一个存档,验证它并make demo提取它。但是,每次运行 CMake 时都会下载存档,而不仅仅是一次,并且它不依赖于demo所调用的目标。

这可以通过 CMake 来实现吗?我认为这没有ExternalData帮助,因为我真的只想从互联网下载任意文件。

Kam*_*olo 4

但是,每次运行 CMake 时都会下载存档,而不仅仅是一次,并且它不依赖于调用的目标演示。

难怪为什么。您没有添加目标eigen或其他任何内容作为demo.

因此,类似以下内容应该有效:

ExternalProject_Add(
    bunny
    PREFIX "demo"
    URL http://graphics.stanford.edu/pub/3Dscanrep/bunny.tar.gz
    URL_HASH SHA512=59e7b43db838dbe6f02fda5e844d18e190d32d2ca1a83dc9f6b1aaed43e0340fc1e8ecabed6fffdac9f85bd34e7e93b5d8a17283d59ea3c14977a0372785d2bd
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
)
Run Code Online (Sandbox Code Playgroud)

注意:默认情况下提取存档 生成的目标ExternalProject_Add。您正在下载名为的存档bunny.tar.gz,其中包含另一个src/bunny.tar.gz捆绑的存档。

编辑: 如果我们谈论的是较新的 CMake (>=3.11),您还应该看看FetchContent()(官方文档),这也可能会减轻一些负担。