Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法使用cmake下载tarball_Cmake - Fatal编程技术网

有没有办法使用cmake下载tarball

有没有办法使用cmake下载tarball,cmake,Cmake,Im将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 但若我从零开始构建项目

Im将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\u BUILD\u DIR}/。在下一次构建时,请执行下一步:

下载tarballs/jpegsrc.v9a.tar.gz 将libjpeg解压为externals/jpeg-9a 将externals/jpeg overlay/CMakeLists.txt复制到externals/jpeg-9a 在${SOME_build_DIR}/externals/jpeg-9a中构建libjpeg/ 实际上前3点可以省略。但我只对第一个行动感兴趣。有没有办法防止额外下载

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


有关详细信息,请参阅。

不应将生成的文件放在源代码树中

在您的例子中,有问题的行是DOWNLOAD_DIR${CMAKE_CURRENT_SOURCE_DIR}/tarballs。一种更干净的方法是将下载内容放在二进制目录中的一个目录中,然后从那里编译。当然,这意味着在擦除构建目录时,它也将擦除下载的源代码。哪种方法解决了您必须下载已经拥有的文件的问题,尽管可能不是您希望的方式

问题是,这是故意的。擦除二进制目录在概念上等同于告诉CMake从头开始。在这种情况下,尝试重用东西是没有意义的,因为,好吧,你想从头开始。使用CMake实现重用的正确工作流很简单:不要擦除构建目录。相反,如果您想要执行CMake的完全重新配置,则依赖make clean强制执行完全重建,并且仅擦除构建目录

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

如果运行md5 jpegsrc.v9a.tar.gz,则可以使用ExternalProject URL_md5选项使用输出的哈希

ExternalProject_Add(
    jpeg
    STAMP_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-pre
    BINARY_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-${JPEG_VERSION}
    URL ${JPEG_URI}
    URL_MD5 <md5_hash_of_downloaded_file>
    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 ""
)

塔克斯。实际上,我在为多平台lin32/lin64/mingw构建的项目中遇到了这个问题。Tarball为每个构建下载一次。我将按照您的建议尝试为下载tarball添加单独的目标。完成。有单独的下载目标。Thanx@ComicSanms。
ExternalProject_Add(
    jpeg
    STAMP_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-pre
    BINARY_DIR ${CMAKE_BINARY_DIR}/externals/jpeg-${JPEG_VERSION}
    URL ${JPEG_URI}
    URL_MD5 <md5_hash_of_downloaded_file>
    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 ""
)