有没有办法使用cmake下载tarball一次

时间:2015-04-17 09:01:25

标签: cmake

我将libjpeg构建为外部项目。它的构建正常。 这里项目文件夹结构:

${SOURCE_DIR}/
  ${SOME_BUILD_DIR}/
    externals/
      jpeg-9a/
      jpeg-pre/
  externals/
    jpeg-9a/
    jpeg-overlay/
      CMakeLists.txt
  tarballs/
    jpegsrc.v9a.tar.gz
  CMakeLists.txt

但如果我从零开始构建项目,tarball会再次下载并解压缩。

换句话说,我清理${SOME_BUILD_DIR}/。在下一次构建cmake时,请执行下一步:

  1. 下载tarballs/jpegsrc.v9a.tar.gz
  2. 将libjpeg解压缩到externals/jpeg-9a
  3. externals/jpeg-overlay/CMakeLists.txt复制到externals/jpeg-9a
  4. ${SOME_BUILD_DIR}/externals/jpeg-9a/
  5. 中构建libjpeg

    实际上可以省略前3分。但我只对第一次行动感兴趣。有没有办法阻止额外的下载?

    这是我的${SOURCE_DIR}/CMakeLists.txt

    cmake_minimum_required(VERSION 2.8)
    include(ExternalProject)
    
    set(EXTERNALS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/externals)
    
    set(JPEG_VERSION "9a")
    set(JPEG_URI http://ijg.org/files/jpegsrc.v${JPEG_VERSION}.tar.gz)
    set(JPEG_DIR ${EXTERNALS_DIR}/jpeg-${JPEG_VERSION})
    
    ExternalProject_Add(
        jpeg
        STAMP_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-pre
        BINARY_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-${JPEG_VERSION}
        URL ${JPEG_URI}
        SOURCE_DIR ${JPEG_DIR}
        DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tarballs
        CMAKE_ARGS ""
        UPDATE_COMMAND cmake -E copy_directory ${EXTERNALS_DIR}/jpeg-${JPEG_VERSION}-overlay/. ${JPEG_DIR}
        INSTALL_COMMAND ""
        TEST_COMMAND ""
    )
    

    有关详细信息,请参阅https://github.com/anton-sergeev/cmake_externalproject

2 个答案:

答案 0 :(得分:0)

您不应将生成的文件放在源树中。

在您的情况下,有问题的行是DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tarballs。更简洁的方法是将下载放在二进制目录中的目录中并从那里进行编译。现在,当然这意味着擦除构建目录时它也会擦除下载的源。哪种解决了必须下载已经存在的文件的问题,尽管可能不是您想要的方式。

问题是,这是设计的。擦除二进制目录在概念上等同于告诉CMake从头开始。在这种情况下尝试重用东西没有意义,因为,你想从头开始。启用CMake重用的正确工作流程就是:不要擦除构建目录。而是依靠make clean来强制执行完全重建,如果要执行CMake的完全重新配置,则只擦除构建目录。

避免重新下载的唯一简洁方法是将下载移出ExternalProject命令。例如,您可以将提取的文件放入源树中,并将其作为项目的一部分进行检查。或者通过自定义execute_process命令下载它们,以执行所需的行为。

答案 1 :(得分:0)

如果您运行function myProm() { return new Promise((success, err) => { setTimeout(() => { success("myProm") }, Math.floor(Math.random() * 11000)) }) } function timeoutHandler() { return new Promise((_, timeout) => { setTimeout(() => { timeout(new Error("timeoutHandler")); }, 10000) }) } function onSuccess(data) { console.log("success", data) } function onError(err) { console.log("err:", err) } function onTimeout(e) { if (e.message && e.message === "timeoutHandler") { console.log(e.message + " handled"); } else { onError(e) } } Promise.race([myProm(), timeoutHandler()]) .then(onSuccess, onTimeout);,则可以使用ExternalProject URL_MD5选项输出散列。

md5 jpegsrc.v9a.tar.gz