2015-06-01 73 views
3

當使用兩個依賴包(其中上游包具有可選鏈接庫)時,我正在努力應對基於CMake「Config」的包描述。有條件的傳遞鏈接庫

假設您有libA,可選擇使用zip功能(例如libACMakeLists.txt中的某個選項USE_ZLIB)。這意味着libA將在其INTERFACE_LINK_LIBRARIES(導出到liba-config.cmake)中可選地具有-lz。 現在,如果你有一個libB使用libA通過find_package(libA),你怎麼知道libA已建立有或沒有zlib支持時,這兩個庫安裝和出口與CMake的包配置系統?

我知道鏈接庫信息被傳遞處理,並將傳播到鏈接庫libB,因此,只要鏈接到libB,就會出現-lz。但是,libz的PATH沒有包括在內;因此,除非您奇蹟般地知道libzlibA的鏈接庫並且包含它的位置,否則鏈接將失敗,並顯示「找不到庫z」。 在libA的配置中包含到libz的絕對路徑也不是可行的方法,因爲它破壞了在不同系統上的可移植性。

編輯:我一直在收到建議使用target_link_libraries(libA PRIVATE z)的回覆,例如,聲明(實際上是libA內部的)libz是一個私有庫。不幸的是,這並不能解決問題,因爲CMake通過$<LINK_ONLY:z>自動將PRIVATE標記的鏈接庫添加到INTERFACE_LINK_LIBRARIES列表中。這表明以另一種方式在出口鏈接庫列表中顯示-lz(以及CMake導出腳本作者理解傳遞性問題)的必要性。

+0

爲什麼'liba-config.cmake'包含'find_package(ZLIB)'並且鏈接到'$ {ZLIB_LIBRARIES}'? –

+0

以及xxx-config.cmake文件是由CMake的安裝(EXPORT ..)命令生成的,這是你不想用來模糊的東西。當然,我腦子裏有很多骯髒的黑客來解決這個問題,但如果有一個正確的CMake本機方式來處理這個問題,我很感興趣。 –

+0

只爲您的信息:http://public.kitware.com/pipermail/cmake-developers/2015-April/025034.html –

回答

2

執行此操作的規範方法是使您的liba-config.cmake成爲模板,然後使用configure_file()填充它以提供有關構建選項的信息。

例如,您CMakeLists.txt看起來是這樣的:

if(ZLIB_FOUND) 
... # link with ZLIB 
set(BUILT_WITH_ZLIB 1) 
endif() 
... # more options 
configure_file(alib-config.cmake.in alib-config.cmake) 

現在,liba-config.cmake.in應該有

set(BUILT_WITH_ZLIB @[email protected]) 
if(BUILT_WTH_ZLIB) 
# append lz to ALIB_LIBRARIES or whetever you variable is called 
endif() 

配置alib-config.cmake之後將包含根據其在CMake的價值set(BUILT_WITH_ZLIB 0)set(BUILT_WITH_ZLIB 1)

+0

謝謝,但這是一個50/50有用。對我來說,這是人們可以想到的「骯髒黑客」之一。正如在我的評論中,配置文件是由CMake創建的,我不打算搞砸(他們可能會隨着時間的推移而改變/改進,我不想最終更新模板)。但實際情況是,如果這是包間通信的手段,那麼最終關於包的所有信息都必須包含在配置文件中。 –