2012-12-31 35 views
4

目前,我有以下結構是否可以繞過add_subdirectory()命令的新範圍創建?

`-- system 
    |-- CMakeLists.txt 
    |-- dll 
    | |-- CMakeLists.txt 
    | |-- UnixDLoader.cpp 
    | |-- ... 
    | `-- WinDLoader.hh 
    |-- sockets 
    | |-- CMakeLists.txt 
    | |-- crossplateform_utils.h 
    | |-- ... 
    | `-- Udp.hh 
    `-- threads 
     |-- CMakeLists.txt 
     |-- IMutex.hh 
     |-- ... 
     `-- WinThread.hh 

我的根CMakeLists.txt是遵循

project(system) 

add_subdirectory(dll) 
add_subdirectory(sockets) 
add_subdirectory(threads) 

add_library(${PROJECT_NAME} 
    ${${PROJECT_NAME}_HEADERS} 
    ${${PROJECT_NAME}_SOURCES} 
) 

,並在threads/例如,我有以下

list(APPEND ${PROJECT_NAME}_HEADERS 
    IThread.hh 
    UnixThread.hh 
    WinThread.hh 
    IMutex.hh 
    UnixMutex.hh 
    WinMutex.hh 
) 
set(${PROJECT_NAME}_HEADERS ${${PROJECT_NAME}_HEADERS} PARENT_SCOPE) 

list(APPEND ${PROJECT_NAME}_SOURCES 
    UnixThread.cpp 
    WinThread.cpp  
    UnixMutex.cpp 
    WinMutex.cpp  
    PARENT_SCOPE 
) 
set(${PROJECT_NAME}_SOURCES ${${PROJECT_NAME}_SOURCES} PARENT_SCOPE) 

if(UNIX) 
    target_link_libraries(${PROJECT_NAME} pthread) 
endif(UNIX) 

但是,作爲add_subdirectory()創建一個新的範圍,我的${PROJECT_NAME}_*變量是空的。我讀了set(... PARENT_SCOPE),但是路徑變成了殘疾人,並且無論如何cmake在致電target_link_libraries()system/threads/CMakeLists.txtCannot specify link libraries for target "system" which is not built by this project.產生錯誤。範圍問題再次。

所以我雖然我會很好,如果我找到一個解決方案來繞過範圍創建,但我會採取任何解決方案,保持我的架構的邏輯。

回答

6

在這裏我有一些合理的選擇。

add_subdirectory命令通常用於包含一個真正包含獨立模塊的目錄(它實際上不必是文件系統意義上的子目錄),例如,一個庫或可執行文件;一個可以在沒有父CMakeLists文件的幫助下構建。在這種情況下,子模塊的CMakeLists.txt將包含它自己的project命令,使得使用全局變量變得困難。

就你而言,你似乎只是想讓子目錄的CMakeLists文件將文件列表追加到父範圍中定義的變量中。你可以在你的下屬CMakeLists利用CMake的變量CMAKE_CURRENT_LIST_DIR來實現這一目標:

set(${PROJECT_NAME}_HEADERS 
    ${${PROJECT_NAME}_HEADERS} 
    ${CMAKE_CURRENT_LIST_DIR}/IThread.hh 
    ${CMAKE_CURRENT_LIST_DIR}/UnixThread.hh 
    ${CMAKE_CURRENT_LIST_DIR}/WinThread.hh 
    ${CMAKE_CURRENT_LIST_DIR}/IMutex.hh 
    ${CMAKE_CURRENT_LIST_DIR}/UnixMutex.hh 
    ${CMAKE_CURRENT_LIST_DIR}/WinMutex.hh 
    PARENT_SCOPE 
) 

set(${PROJECT_NAME}_SOURCES 
    ${${PROJECT_NAME}_SOURCES} 
    ${CMAKE_CURRENT_LIST_DIR}/UnixThread.cpp 
    ${CMAKE_CURRENT_LIST_DIR}/WinThread.cpp  
    ${CMAKE_CURRENT_LIST_DIR}/UnixMutex.cpp 
    ${CMAKE_CURRENT_LIST_DIR}/WinMutex.cpp  
    PARENT_SCOPE 
) 

確保您在你的子目錄CMakeLists文件project命令。

在這種情況下,可以通過將add_subdirectory命令與include命令交換,從而避免範圍界定問題,從而使其稍微簡單一些。

要做到這一點,從set命令刪除PARENT_SCOPE ARGS,並在頂層的CMakeLists.txt:


             
  
    add_subdirectory(dll) add_subdirectory(sockets) add_subdirectory(threads) 
   
include(dll/CMakeLists.txt) 
include(sockets/CMakeLists.txt) 
include(threads/CMakeLists.txt)


你與target_link_libraries(${PROJECT_NAME} pthread)另一個問題是簡單地倒在事實上,定義庫${PROJECT_NAME}的命令add_library在命令target_link_libraries命令後稱爲。您最簡單的選擇可能是將target_link_libraries命令移至父CMakeLists.txt

+0

您的解決方案非常完美,非常感謝。 – tomahh

相關問題