2015-03-13 118 views
3

我有一個基於CMake的項目,它依賴於我需要下載和解壓縮的外部源。我決定使用ExternalProject_Add來完成這一部分。問題是如何使add_library規則依賴於一些提取的文件。Howto在CMake中包含來自第三方項目的選定源碼

這裏是我到目前爲止有:

# This line is needed for the ExternalProject command to work. 
# It references the the Module in the cmake distro 
include(ExternalProject) 

# Download and extract the FreeRTOS core sources 
set(FREERTOS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/FreeRTOS") 
set(FREERTOS_URL "http://downloads.sourceforge.net/project/freertos/FreeRTOS/V6.0.2/FreeRTOSV6.0.2.zip") 
set(FREERTOS_CORE_DIR ${FREERTOS_DIR}/Source) 

set(FREERTOS_SOURCES "${FREERTOS_CORE_DIR}/croutine.c" 
    ${FREERTOS_CORE_DIR}/list.c 
    ${FREERTOS_CORE_DIR}/queue.c 
    ${FREERTOS_CORE_DIR}/tasks.c 
    ${FREERTOS_CORE_DIR}/portable/MemMang/heap_3.c) 

include_directories(${FREERTOS_CORE_DIR}/include) 

add_library(freertos STATIC ${FREERTOS_SOURCES}) 

ExternalProject_Add(freertos_download 
    DOWNLOAD_DIR ${CMAKE_CURRENT_SOURCE_DIR} 
    SOURCE_DIR ${FREERTOS_DIR} 
    URL ${FREERTOS_URL} 
    CONFIGURE_COMMAND "" 
    BUILD_COMMAND "" 
    INSTALL_COMMAND "") 

注意我已禁用的配置,構建和安裝在外部項目的步驟。

正如預期的那樣,因爲我沒有指定的依賴關係,我收到以下錯誤

-- Configuring done 
CMake Error at third-party/CMakeLists.txt:20 (add_library): 
    Cannot find source file: 

    /home/dushara/prj/sw/djetk-demo/djetk/third-party/FreeRTOS/Source/croutine.c 

    Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp 
    .hxx .in .txx 

我嘗試使用

add_dependencies(freertos_download freertos) 

但是,這是行不通的。

理想情況下,我希望FREERTOS_SOURCES中的所有項都取決於外部項目的提取階段。關於如何實現這一點的任何想法?

回答

4

CMake將在配置步驟中嘗試查看庫的源文件是否存在,但是由於您經歷了外部項目的下載步驟未在配置期間完成。

你可以告訴CMake的不要擔心不存在的文件,通過設置對他們的GENERATED屬性:

set_source_files_properties(${FREERTOS_SOURCES} PROPERTIES GENERATED TRUE) 

您仍然應該添加外部項目作爲依賴於你的庫,以確保它是首先下載了&,但在你的例子中命令是不正確的;它應該是:

add_dependencies(freertos freertos_download) 

所以取決於某事的目標是第一個參數,並且其後的依賴列出。