2012-07-05 151 views
2

我有一個包含幾個工具,我用獨立的項目,例如目錄用於構建庫B.我想我有兩個選擇:CMake的:由多個項目

  1. 我可以安裝該工具的系統目錄下(如適用於Windows,C:\Program Files)。由於我沒有足夠的權限寫入系統目錄,因此我的一些程序打算在與它們相同的目錄中使用,這不一定是好事。此外,我仍然需要找到頭文件來編譯使用這些工具的項目。

  2. 我可以用find_library找到它們。然後我遇到以下問題:find_library(A)將不會工作,直到我實際上建立了A,所以我不能cmake CommonTools(因爲工具B需要工具A)。我可以從make調用cmake,但是看起來相當複雜......

  3. 我可以在工具B中放置工具A的相對路徑&只對其他項目使用find_library。不幸的是,這種相對路徑的變化取決於我是否構建CommonTools或工具B.

您對此有何看法?謝謝!

+0

這些工具是否可以修改所有庫,哪些使用CMake自己? – Fraser 2012-07-05 20:27:20

+0

是的,他們是。感謝回覆! – Deimos 2012-07-06 06:34:57

+0

驅使我的調查進一步,我現在這樣做:在每個add_subdirectory命令後,我通過手動設置* module_FOUND,module_LIBRARIES和module_INCLUDE_DIRS變量來「註冊」模塊,但這對我來說似乎有點笨拙。在工具B裏面,我有如果(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR)find_package(Tool_A)...這個想法是,如果我自己構建工具B,我想檢查它是否可用並執行svn checkout,如果它不是。 – Deimos 2012-07-06 06:41:01

回答

1

正如我想能夠執行一步構建,這是我最終做的。

  • 我將目前正在構建的模塊的子模塊與外部依賴關係&第三方工具區分開來。 每個(子)模塊只負責構建自己。這意味着所有外部依賴&第三方工具必須已經安裝或從服務器以二進制+表頭形式提供。作爲推論,這意味着缺少的依賴關係是一個二進制文件,應該可以從給定的服務器獲得,但不是。
  • 子模塊使用add_subdirectory添加,這意味着如果它們中的任何一個不可用,則配置步驟將失敗並顯示一條明確的消息。
  • 外部依賴關係&第三方工具使用find_package定位。 HINT位置是一個選項,必須由執行構建的用戶提供(這表示模塊對用戶的依賴關係,如果找不到任何一個,則使用ExternalProject_Add從給定位置下載二進制文件。<module>_FOUND<module>_LIBRARIES & <module>_INCLUDE_DIRS變量必須在文件的CMakeLists.txt手動設置,但由於在服務器端(如<module>-<version>-<platform>/include & <module>-<version>-<platform>/binaries)適當的目錄佈局,可以以一致的方式進行(使用宏如)。再有,如果在服務器上找不到二進制文件,配置步驟將失敗,並顯示一條明確的消息。

所有這些持續集成服務器將正確檢測到任何缺失的依賴關係(即,組件應該在服務器上,但不是在版本控制下的子模塊)在配置時而不是在構建時,同時仍然允許一步構建。

我希望這可以用於其他人。 PS:作爲Google Test用戶的一個附屬節點:「對於每個模塊,gtest 必須重新編譯,因爲每個用戶都需要使用用於編譯已安裝的Google Test庫的相同編譯器標誌來編譯其測試;否則,可能會遇到未定義的行爲,如果您使用不同的編譯器標記編譯Google Test和您的測試代碼,它們可能會看到同一個類/函數/變量的不同定義)。這意味着您實際上需要(在我的情況下)在的每個模塊中運行ExternalProject_Add命令,因爲每個模塊都包含自己的測試。