【问题标题】:CMake ExternalData custom fetch scriptCMake ExternalData 自定义获取脚本
【发布时间】:2021-01-14 12:08:01
【问题描述】:

简介

我有一个带有“测试”目标的项目,它需要从远程源中提取的一些资产在运行时出现在构建树中。目前我已经使用ExternalData 在构建时从远程 url 检索压缩文件并将其放入构建树中。

/tests/CMakeLists.txt:

include(ExternalData)
set(ExternalData_URL_TEMPLATES "https://data.com/path/samples.zip")

# [...]

ExternalData_Add_Test(MyData
   NAME MyTest
   COMMAND MyProjectTests DATA{samples.zip})
ExternalData_Add_Target(MyData)

(在源代码树中,我有一个文件 /tests/samples.zip.md5,其中包含存档的 md5。)

问题

我想在检索到此存档后对其进行提取。通过阅读 CMake documentation,似乎有一种方法可以在从远程检索时使用自定义提取脚本。

文档没有显示自定义提取脚本的示例。它提到 file(DOWNLOAD) 命令是正常使用的,但它没有明确显示它的默认行为如何被自定义提取脚本复制。

我希望实现和使用复制 ExternalData 的默认行为的自定义提取脚本,以便我可以添加 file(ARCHIVE_EXTRACT) 命令来提取存档。

(我还想知道提取下载的文件是否应该是自定义提取脚本的职责,如果不是,最好的放置位置是,因为资产仅在构建时下载)。

【问题讨论】:

    标签: c++ cmake post-build


    【解决方案1】:

    我没有设法复制 ExternalData 提取脚本的默认行为。但是,使用add_custom_command(),我将测试资产提取为POST_BUILD 步骤。

    附加到/tests/CMakeLists.txt:

    set(ASSETS_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/assets)
    file(MAKE_DIRECTORY ${ASSETS_DIRECTORY})
    set(ExternalData_BINARY_ROOT ${ASSETS_DIRECTORY})
    
    add_custom_command(TARGET waveioTests
                       POST_BUILD
                       COMMAND 
                       dir & 
                       echo "${CMAKE_COMMAND} -E copy samples.tar ${ASSETS_DIRECTORY}/samples.tar" & 
                       ${CMAKE_COMMAND} -E copy samples.tar ${ASSETS_DIRECTORY}/samples.tar & 
                       ${CMAKE_COMMAND} -E chdir ${ASSETS_DIRECTORY} tar vxf samples.tar
                       COMMENT "Extracting test assets...")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-27
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      相关资源
      最近更新 更多