2015-04-17 55 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 "" 
) 
相關問題