我在我的項目是相當複雜的一個使用的CMake作爲構建系統。該項目包括幾個庫和幾個應用程序。我的目標是,做如下可能:
- 庫可以由用戶請求構建(通過緩存CMake的變量實現)
- 應用程序是建立在用戶請求(見上文),但應用程序可能選擇需要哪些文庫和構建它們無需用戶選擇這些
- 這不應該改變的庫構建緩存的用戶選擇(禁用自動構建庫如果應用建築物被關閉)
我的構建系統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變量
感謝您的精心解答。據我所見,你的解決方案將走向一個不同的方向,因爲我不能忽略add_subdirectory,因爲每個部分子目錄中的CMakeLists.txt包含緩存選項,這將使該部分的目標構建或不構建。無論選擇哪個部件,都必須添加每個子目錄。 – crispinus 2010-12-20 09:31:00