2010-12-07 96 views
0

喂,全局變量的依賴性跟蹤

我在我的項目是相當複雜的一個使用的CMake作爲構建系統。該項目包括幾個庫和幾個應用程序。我的目標是,做如下可能:

  1. 庫可以由用戶請求構建(通過緩存CMake的變量實現)
  2. 應用程序是建立在用戶請求(見上文),但應用程序可能選擇需要哪些文庫和構建它們無需用戶選擇這些
  3. 這不應該改變的庫構建緩存的用戶選擇(禁用自動構建庫如果應用建築物被關閉)

我的構建系統layo ut是以下內容:我有一個父目錄,其中包含一個CMakeLists.txt,它將庫和應用程序添加爲子目錄。每個庫和應用程序都有自己的CmakeLists.txt,它定義了要存儲在緩存中的用戶可定義的配置選項,要構建的目標以及它所依賴項目的其他庫。應用程序不一定位於父目錄的下一個子目錄中,但也可能會降低一些級別,以至於我無法使用PARENT_SCOPE,因爲父級不是最高級的父級,但必須知道依賴關係在上面。

我試着將PROJECT_BUILD_SOMELIBRARY這樣的GLOBAL屬性設置爲on,並試圖在SOMELIBRARY的CMakeLists.txt中檢索它們來決定是否構建或者不構建,但是這些屬性並沒有傳遞給庫,所以它從來沒有構建過如果實際上不得不這樣做,因爲另一個圖書館或應用程序表示它依賴於該圖書館。使用包含每個應用程序或庫目標的名稱(取決於庫)的LIST,並在內部緩存該目錄也不起作用。爲了總結這些許多單詞,我正在尋找一種方法來影響CMakeLists的一些子目錄,這些子目錄負責通過CMakeLists在其他一些子目錄中創建一個庫(這不一定與其他子目錄級別相同subdir)構建該庫,即使用戶沒有通過cmake調用的配置選項明確指定它。

有人知道如何實現這個目標,或者CMake是不可能實現的嗎?然而,是否有其他解決這個問題的方法的建議,包括使用CMake?你知道任何其他可以舒適地處理這些需求的構建系統嗎?

非常感謝, crispinus從而使得全球的CMake變量

回答

0

我在此期間自己解決了這個問題。事實上,實現上面解釋的設置非常簡單。我將EXCLUDE_FROM_ALL選項用於所有目標,具體取決於它們是否由用戶明確選擇(=省略EXCLUDE_FROM_ALL)。

EXCLUDE_FROM_ALL選項具有all-Target中不包含目標的效果,除非另一個目標(未標記爲EXCLUDE_FROM_ALL)取決於此目標。這甚至可以在子目錄上工作,因爲CMake目標實際上是全局的,甚至最頂層的父節點也知道最底層的子目錄的目標,甚至同一級別的子目錄也知道另一個子目錄的目標。

在我的佈局,我的項目的各個獨立部分都包含自己的CMakeLists.txt,並增加了其自身的選擇到緩存中,這樣的樣本子項目看起來是這樣的:如果用戶選擇


SET(PART_NAME SAMPLE_PART) 
SET(PART_TARGET_NAME samplepart) 

SET(BUILD_${PART_NAME} off CACHE BOOL "Build part ${PART_NAME}") 
SET(${PART_NAME}_FILES some_file.c another_file.c) 

IF(NOT BUILD_${PART_NAME}) 
SET(EXCLUDE_${PART_NAME} EXCLUDE_FROM_ALL) 
ENDIF(NOT BUILD_${PART_NAME}) 

ADD_LIBRARY(${PART_TARGET_NAME} SHARED ${EXCLUDE_SAMPLE_PART} ${PART_NAME}_FILES) 
TARGET_LINK_LIBRARY(${PART_TARGET_NAME} some_other_target) 
 

所以到BUILD_SAMPLE_PART,目標未設置爲EXCLUDE_FROM_ALL,並將包含在所有;如果不是,則目標設置爲EXCLUDE_FROM_ALL,並且只有在另一個目標依賴於此目標時纔會構建目標。如果構建了這個目標,那麼也會構建「some_other_target」,無論它是否包含它自己。

2

一種方法是:

set(EXAMPLE_INCLUDE_DIRS CACHE INTERNAL "include directories" FORCE) 

時要附加或設定值使用比:

set(EXAMPLE_INCLUDE_DIRS ${EXAMPLE_INCLUDE_DIRS } ${EXTRA_INCLUDE_DIRS } 
CACHE INTERNAL "include directories") 
0

我創建試圖回答這個問題的在線示例。你 應該能夠下載它我的GitHub存儲庫在 bgoodrs-CMake-Examples。如果您點擊該鏈接,您可以閱讀該文檔(該庫中的README.markdown) ,該文檔嘗試執行與我認爲 想要做的事情相同的事情。您可以點擊下載按鈕下載 本地實驗示例的副本。如果錯過了這個標記,那麼 對我的回答發表評論,我會試着相應地改進這個例子。

+0

感謝您的精心解答。據我所見,你的解決方案將走向一個不同的方向,因爲我不能忽略add_subdirectory,因爲每個部分子目錄中的CMakeLists.txt包含緩存選項,這將使該部分的目標構建或不構建。無論選擇哪個部件,都必須添加每個子目錄。 – crispinus 2010-12-20 09:31:00