2017-07-30 56 views
1

FindBoost.cmake模塊CMake的3.8:如何在以後導入目標GLOBAL?

foreach(COMPONENT ${Boost_FIND_COMPONENTS}) 
    if(_Boost_IMPORTED_TARGETS AND NOT TARGET Boost::${COMPONENT}) 
    string(TOUPPER ${COMPONENT} UPPERCOMPONENT) 
    if(Boost_${UPPERCOMPONENT}_FOUND) 
     if(Boost_USE_STATIC_LIBS) 
     add_library(Boost::${COMPONENT} STATIC IMPORTED) 
     else() 
     # Even if Boost_USE_STATIC_LIBS is OFF, we might have static 
     # libraries as a result. 
     add_library(Boost::${COMPONENT} UNKNOWN IMPORTED) 
     endif() 

,並從docu of that module相應的註釋:

重要的是要注意的是,進口的目標行爲不同於通過這個模塊創建的變量是很重要的:多調用相同目錄下的find_package(Boost)或具有不同選項(例如靜態或共享)的子目錄不會覆蓋第一個調用創建的目標的值。

我看到合理的目標不是GLOBAL

但是,使它們成爲全球性的首選方式是什麼?

我習慣於在包含任何find_package(...)調用的子目錄中定義我的項目的依賴關係。因此,Boost導入的目標在另一目錄中不可用,例如, /tests/CMakeLists.txt

<project_root> 
    /3rdparty 
    /git-submodule-of-a-small-lib 
    /CMakeLists.txt 
    /include 
    /... 
    /tests 
    /CMakeLists.txt 
    /CMakeLists.txt 

回答

1

我設法要解決由包括3rdparty/CMakeLists.txt不是add_subdirectory(3rdparty)而是通過include(3rdparty/CMakeLists.txt)因爲這樣評價在調用者的範圍3rdparty/CMakeLists.txt其在全球範圍內的項目不具備的進口升壓目標的問題。

1

會有這個新IMPORTED_GLOBAL目標屬性在CMake的3.11:

set_target_properties(Boost::unit_test_framework PROPERTIES IMPORTED_GLOBAL TRUE) 

對於舊版本:find_package()使用標準add_library()電話,讓你可以隨時更改/擴展它的功能有IMPORTED目標始終GLOBAL喜歡的東西:

的3rdParty \的CMakeLists.txt

function(add_library) 
    set(_args ${ARGN}) 
    if ("${_args}" MATCHES ";IMPORTED") 
     list(APPEND _args GLOBAL) 
    endif() 
    _add_library(${_args}) 
endfunction() 

find_package(Boost REQUIRED COMPONENTS unit_test_framework) 

參考