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

时间:2016-08-18 15:32:14

标签: 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 ""
)

我希望能够对任意文件执行相同的操作,在我的情况下,为了演示目的下载其他数据。为此目的,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会有所帮助,因为我真的只想从互联网上下载任意文件。

1 个答案:

答案 0 :(得分:1)

  

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

难怪为什么。您没有添加目标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 "" ) add_custom_target(demo tar -xzf ${CMAKE_BINARY_DIR}/demo/src/bunny.tar.gz -C ${CMAKE_BINARY_DIR}/demo) add_dependencies(demo bunny) 的依赖项。

所以,像下面这样的东西应该有效:

ExternalProject_Add

注意: 默认情况下,bunny.tar.gz生成的目标会提取归档。并且您正在下载名为src/bunny.tar.gz的存档,其中包含另一个int[] noDuplicates = IntStream.of(array).distinct().toArray(); 内嵌的存档。