2010-07-14 74 views
25

我使用一些我不想構建的庫,作爲使用它們的每個項目的一部分。一個非常容易理解的例子是LLVM,它有78個靜態庫。即使有cmake代碼在每個cmake文件中查找和導入這些代碼都是過度的。對於cmake「include」命令,文件和模塊有什麼區別?

顯而易見的解決方案似乎是使用「include」命令,並將相關的cmake腳本塊分解爲* .cmake文件,並設置CMAKE_MODULE_PATH環境變量。

除了它只是普通不起作用。 Cmake沒有找到我在include命令中指定的文件。

就機會而言,我甚至試圖用幾種方式指定環境變量中的路徑 - 一次是反斜線,一次是正斜槓......並且我每次都重新啓動命令提示符並檢查環境變量是目前和正確。

在cmake手冊中,它意味着「文件」與「模塊」不同 - 只有一個模塊獲得自動添加擴展和搜索路徑處理。但是沒有解釋有什麼不同。我猜想,缺少的擴展可能已經足夠了(與標準模塊一樣),但顯然不是。

在該手冊中搜索「模塊」沒有太大的幫助,因爲這個詞似乎被重載。例如,一個模塊也是一個使用LoadLibrary/dl_open加載的動態庫。

任何人都可以解釋在這種情況下文件和模塊之間有什麼區別,以及如何創建我自己的模塊,以便cmake include命令可以找到並使用它?

我在Windows上使用cmake 2.8.1。

編輯

我很有信心,這裏的問題是不理解的cmake是如何工作的。我認爲應該正在做的是寫find_package可以使用的東西。

雖然事實證明,我仍然有些不能回答我自己的問題。

回答

26

我相信CMake'模塊'只是一個可以與find_package指令一起使用的文件。也就是說,當您運行find_package(Module)時,它會在MODULE_PATH中搜索名爲FindModule.cmake的文件。

也就是說,如果include文件沒有擴展名,它也會通過你的MODULE_PATH搜索那個file.cmake。在我正在開發的CMake項目中,我的目錄結構與您的建議非常相似。

+ root/ 
    + CMakeLists.txt 
    + cmake/ 
    | + FindMatlab.cmake 
    | + TestInline.cmake 
    | + stdint.cmake 
    + src/ 
    + include/ 

在的CMakeLists.txt我:

set (CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") 
find_package (Matlab) # runs FindMatlab.cmake 
include(TestInline) # defines a macro: 
test_inline (CONFIG_C_INLINE) 
include(stdint) # simply executes flat CMake code 

也許你的問題是,你正試圖定義從環境的模塊路徑。相反,試着簡單地將附加到之內,您試圖訪問模塊/文件的CMakeList。

+7

現在回頭看看這段代碼,我注意到我沒有追加到'CMAKE_MODULE_PATH';我完全打破了它。你可能想要做更多的事情:'set(CMAKE_MODULE_PATH「$ {CMAKE_MODULE_PATH}; $ {CMAKE_CURRENT_SOURCE_DIR}/cmake」)' – 2010-07-16 01:16:45

+0

我現在沒有時間檢查,但這看起來不錯。謝謝。 – Steve314 2010-07-16 08:09:32

+0

我不知道爲什麼我現在認爲變量是一個環境變量。我想,看看我在找什麼,而不是在那裏。我最近剛剛在YouTube上觀看了Google的techtalk視頻,並指出環境變量大多是故意避免的。無論如何 - 接受和感謝。 – Steve314 2010-07-17 03:11:03

2

文件是CMake listfile,例子是CMakeLists.txt。使用下面的命令來獲得

cmake --help-command-list 

模塊使用的命令列表是cmake的文件(* .cmake)包含cmake的命令。

正如Matt B. put,CMAKE_MODULE_PATH不是shell的環境變量,而是cmake變量。

要附加模塊路徑CMAKE_MODULE_PATH

LIST(APPEND CMAKE_MODULE_PATH ${YourPath}) 

或者,如果你perfer你的模塊中使用第一

LIST(INSERT CMAKE_MODULE_PATH 0 ${Yourpath}) 
2

我有同樣的問題,閱讀CMake的include()命令文檔後。它指出:

從給定的文件中加載並運行CMake代碼。 [...簡寫爲...]如果指定模塊而不是文件,則首先在CMAKE_MODULE_PATH中搜索名稱爲.cmake的文件,然後在CMake模塊目錄中搜索。

由於CMake模塊畢竟是文件系統上的文件,因此這給CMake認爲模塊與文件之間留下了很多解釋。那有什麼區別?

CMake源代碼是唯一可以找到答案的地方。基本上CMake認爲include()的參數是一個文件,如果它看起來像一個絕對路徑。這意味着:

  • 在Linux/Unix
    • 的參數以 '/' 或 '〜'
  • 在Windows
    • 爭論的第二個字符是「開始: '(如C :)
    • 參數以'\'開頭

CMake假設其他任何不符合上述標準的是模塊。在這種情況下,它將'.cmake'附加到參數並搜索CMAKE_MODULE_PATH。

相關問題