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

eqqqjvef  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(171)

通过它的ExternalProject,CMake可以在构建过程中轻松下载大量的归档文件,保持存储库的整洁。例如,我可以像这样下载和解压Eigen:

include(ExternalProject)

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

我希望能够对任意文件做同样的事情,在我的例子中,下载额外的数据用于演示目的。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)

这将下载一个归档文件,验证它,然后--使用make demo--提取它。但是,每次运行CMake时都会下载归档文件,而不是只下载一次,并且它不依赖于正在调用的目标demo
CMake能做到吗?我不认为ExternalData会有帮助,因为我真的只想从互联网上下载任意文件。

ruyhziif

ruyhziif1#

但是,每次运行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 ""
)

**注意:**默认情况下,由ExternalProject_Add生成的目标会提取归档文件。您正在下载名为bunny.tar.gz的归档文件,其中包含另一个捆绑在其中的src/bunny.tar.gz
**编辑:**如果我们谈论的是较新的CMake(〉=3.11),你还应该看看FetchContent()(官方文档),这可能也会减轻一些负担。

相关问题