2015-04-17 33 views
0

我将libjpeg构建为外部项目。它的构建通常。 这里项目文件夹结构:有没有办法使用cmake下载tarball

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

但是压缩包下载并重新拆封,如果我从零开始建设项目。

换句话说我清洁${SOME_BUILD_DIR}/。在接下来的构建cmake的做了下:

  1. 下载tarballs/jpegsrc.v9a.tar.gz
  2. 解压的libjpeg到externals/jpeg-9a
  3. 副本externals/jpeg-overlay/CMakeLists.txtexternals/jpeg-9a
  4. 构建的libjpeg在${SOME_BUILD_DIR}/externals/jpeg-9a/

可以省略其实前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

回答

0

您不应该将生成的文件放置在源代码树中。

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

事情是,这是设计。擦除二进制目录在概念上等同于告诉CMake从头开始。在这种情况下尝试重复使用是没有意义的,因为,你想从头开始。使用CMake重复使用的正确工作流程很简单:不要擦除构建目录。而是依赖make clean来强制执行完全重建,并且只有在执行完全重新配置CMake时才擦除构建目录。

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

+0

Thanx。其实我遇到了这个问题在项目中建立的多平台(lin32/lin64/mingw)。每次构建Tarball下载一次。 我试着按照你的建议为下载tarball添加单独的目标。 – SergA

+0

完成。 [这里是CMakeLists.txt](https://github.com/anton-sergeev/cmake_externalproject/blob/b3ef26fe616ac98a3b3eeb86a6b33add0765cacf/CMakeLists.txt)与单独的下载目标。 Thanx @ComicSansMS。 – SergA

0

如果您运行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 "" 
) 
相关问题