CMake 常用命令解析

參考:

http://www.cnblogs.com/coderfenghc/archive/2012/06/16/CMake_ch_01.html

一、常用命令解析

1、CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

     #CMake 最低版本要求,低於2.8 構建構過程會被終止


2、PROJECT(gpuMat)

     #定義工程名稱


3、FIND_PACKAGE(CUDA REQUIRED)

 find_package 爲外部工程加載設置。

 find_package(<package> [version] [EXACT] [QUIET]
               [[REQUIRED|COMPONENTS] [components...]]
               [NO_POLICY_SCOPE])

  查找並加載外來工程的設置。該命令會設置<package>_FOUND變量,用來指示要找的包是否被找到了。如果這個包被找到了,與它相關的信息可以通過包自身記載的變量中得到。QUIET選項將會禁掉包沒有被發現時的警告信息。REQUIRED選項表示如果報沒有找到的話,cmake的過程會終止,並輸出警告信息。在REQUIRED選項之後,或者如果沒有指定REQUIRED選項但是指定了COMPONENTS選項,在它們的後面可以列出一些與包相關的部件清單(components list)。[version]參數需要一個版本號,它是正在查找的包應該兼容的版本號(格式是major[.minor[.patch[.tweak]]])。EXACT選項要求該版本號必須精確匹配。如果在find-module內部對該命令的遞歸調用沒有給定[version]參數,那麼[version]和EXACT選項會自動地從外部調用前向繼承。對版本的支持目前只存在於包和包之間(詳見下文)。

  用戶代碼總體上應該使用上述的簡單調用格式查詢需要的包。本命令文檔的剩餘部分則詳述了find_package的完整命令格式以及具體的查詢過程。期望通過該命令查找並提供包的項目維護人員,我們鼓勵你能繼續讀下去。

  該命令在搜索包時有兩種模式:“模塊”模式和“配置”模式。當該命令是通過上述的精簡格式調用的時候,合用的就是模塊模式。在該模式下,CMake搜索所有名爲Find<package>.cmake的文件,這些文件的路徑由變量由安裝CMake時指定的CMAKE_MODULE_PATH變量指定。如果查找到了該文件,它會被CMake讀取並被處理。該模式對查找包,檢查版本以及生成任何別的必須信息負責。許多查找模塊(find-module)僅僅提供了有限的,甚至根本就沒有對版本化的支持;具體信息查看該模塊的文檔。如果沒有找到任何模塊,該命令會進入配置模式繼續執行。


4、INCLUDE(FindCUDA)

  include 從給定的文件中讀取CMake的列表文件。

  include(<file|module> [OPTIONAL] [RESULT_VARIABLE <VAR>]
                        [NO_POLICY_SCOPE])

  從給定的文件中讀取CMake的清單文件代碼。在清單文件中的命令會被立即處理,就像它們是寫在這條include命令展開的地方一樣。如果指定了OPTIONAL選項,那麼如果被包含文件不存在的話,不會報錯。如果指定了RESULT_VARIABLE選項,那麼var或者會被設置爲被包含文件的完整路徑,或者是NOTFOUND,表示沒有找到該文件。

  如果指定的是一個模塊(module)而不是一個文件,查找的對象會變成路徑CMAKE_MODULE_PATH下的文件<modulename>.camke。

       一句話, 就告訴了CMake “我們的程序需要CUDA”。


5、INCLUDE_DIRECTORIES(/usr/local/cuda/include)

  include_directories 爲構建樹添加包含路徑。

  include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

  將給定的路徑添加到編譯器搜索包含文件(.h文件)的路徑列表中。缺省情況下,該路徑會被附加在當前路徑列表的後面。這種缺省行爲可以通過設置CMAKE_include_directories_BEFORE變量爲ON被改變。通過將該變量改變爲BEFORE或AFTER,你可以在追加和附加在前端這兩種方式中選擇,而不用理會缺省設置。如果指定了SYSTEM選項,編譯器將會認爲該路徑是某種平臺上的系統包含路徑。


6、FILE(GLOB SOURCES "*.cu" "*.cpp" "*.c" "*.h")

  file  文件操作命令

  file(WRITE filename "message to write"... )
  file(APPEND filename "message to write"... )
  file(READ filename variable [LIMIT numBytes] [OFFSET offset] [HEX])
  file(STRINGS filename variable [LIMIT_COUNT num]
       [LIMIT_INPUT numBytes] [LIMIT_OUTPUT numBytes]
       [LENGTH_MINIMUM numBytes] [LENGTH_MAXIMUM numBytes]
       [NEWLINE_CONSUME] [REGEX regex]
       [NO_HEX_CONVERSION])
  file(GLOB variable [RELATIVE path] [globbing expressions]...)
  file(GLOB_RECURSE variable [RELATIVE path] 
       [FOLLOW_SYMLINKS] [globbing expressions]...)
  file(RENAME <oldname> <newname>)
  file(REMOVE [file1 ...])
  file(REMOVE_RECURSE [file1 ...])
  file(MAKE_DIRECTORY [directory1 directory2 ...])
  file(RELATIVE_PATH variable directory file)
  file(TO_CMAKE_PATH path result)
  file(TO_NATIVE_PATH path result)
  file(DOWNLOAD url file [TIMEOUT timeout] [STATUS status] [LOG log]
       [EXPECTED_MD5 sum] [SHOW_PROGRESS])

  WRITE選項將會寫一條消息到名爲filename的文件中。如果文件已經存在,該命令會覆蓋已有的文件;如果文件不存在,它將創建該文件。

  APPEND選項和WRITE選項一樣,將會寫一條消息到名爲filename的文件中,只是該消息會附加到文件末尾。

  READ選項將會讀一個文件中的內容並將其存儲在變量裏。讀文件的位置從offset開始,最多讀numBytes個字節。如果指定了HEX參數,二進制代碼將會轉換爲十六進制表達方式,並存儲在變量裏。

  STRINGS將會從一個文件中將一個ASCII字符串的list解析出來,然後存儲在variable變量中。文件中的二進制數據會被忽略。回車換行符會被忽略。它也可以用在Intel的Hex和Motorola的S-記錄文件;讀取它們時,它們會被自動轉換爲二進制格式。可以使用NO_HEX_CONVERSION選項禁止這項功能。LIMIT_COUNT選項設定了返回的字符串的最大數量。LIMIT_INPUT設置了從輸入文件中讀取的最大字節數。LIMIT_OUTPUT設置了在輸出變量中存儲的最大字節數。LENGTH_MINIMUM設置了要返回的字符串的最小長度;小於該長度的字符串會被忽略。LENGTH_MAXIMUM設置了返回字符串的最大長度;更長的字符串會被分割成不長於最大長度的字符串。NEWLINE_CONSUME選項允許新行被包含到字符串中,而不是終止它們。REGEX選項指定了一個待返回的字符串必須滿足的正則表達式。典型的使用方式是:

  file(STRINGS myfile.txt myfile)

該命令在變量myfile中存儲了一個list,該list中每個項是輸入文件中的一行文本。
  GLOB選項將會爲所有匹配查詢表達式的文件生成一個文件list,並將該list存儲進變量variable裏。文件名查詢表達式與正則表達式類似,只不過更加簡單。如果爲一個表達式指定了RELATIVE標誌,返回的結果將會是相對於給定路徑的相對路徑。文件名查詢表達式的例子有:

   *.cxx      - 匹配所有擴展名爲cxx的文件。
   *.vt?      - 匹配所有擴展名是vta,...,vtz的文件。
   f[3-5].txt - 匹配文件f3.txt, f4.txt, f5.txt。

  GLOB_RECURSE選項將會生成一個類似於通常的GLOB選項的list,只是它會尋訪所有那些匹配目錄的子路徑並同時匹配查詢表達式的文件。作爲符號鏈接的子路徑只有在給定FOLLOW_SYMLINKS選項或者cmake策略CMP0009被設置爲NEW時,纔會被尋訪到。參見cmake --help-policy CMP0009 查詢跟多有用的信息。

使用遞歸查詢的例子有:

 /dir/*.py  - 匹配所有在/dir及其子目錄下的python文件。

  MAKE_DIRECTORY選項將會創建指定的目錄,如果它們的父目錄不存在時,同樣也會創建。(類似於mkdir命令——譯註)

  RENAME選項對同一個文件系統下的一個文件或目錄重命名。(類似於mv命令——譯註)

  REMOVE選項將會刪除指定的文件,包括在子路徑下的文件。(類似於rm命令——譯註)

  REMOVE_RECURSE選項會刪除給定的文件以及目錄,包括非空目錄。(類似於rm -r 命令——譯註)

  RELATIVE_PATH選項會確定從direcroty參數到指定文件的相對路徑。

  TO_CMAKE_PATH選項會把path轉換爲一個以unix的 / 開頭的cmake風格的路徑。輸入可以是一個單一的路徑,也可以是一個系統路徑,比如"$ENV{PATH}"。注意,在調用TO_CMAKE_PATH的ENV周圍的雙引號只能有一個參數(Note the double quotes around the ENV call TO_CMAKE_PATH only takes one argument. 原文如此。quotes和後面的takes讓人後糾結,這句話翻譯可能有誤。歡迎指正——譯註)。

  TO_NATIVE_PATH選項與TO_CMAKE_PATH選項很相似,但是它會把cmake風格的路徑轉換爲本地路徑風格:windows下用\,而unix下用/。

  DOWNLOAD 將給定的URL下載到指定的文件中。如果指定了LOG var選項,下載日誌將會被輸出到var中。如果指定了STATUS var選項,下載操作的狀態會被輸出到var中。該狀態返回值是一個長度爲2的list。list的第一個元素是操作的數字返回值,第二個返回值是錯誤的字符串值。錯誤信息如果是數字0,操作中沒有發生錯誤。如果指定了TIMEOUT time選項,在time秒之後,操作會超時退出;time應該是整數。如果指定了EXPECTED_MD5 sum選項,下載操作會認證下載的文件的實際MD5和是否與期望值匹配。如果不匹配,操作將返回一個錯誤。如果指定了SHOW_PROGRESS選項,進度信息會以狀態信息的形式被打印出來,直到操作完成。

  file命令還提供了COPY和INSTALL兩種格式:

  file(<COPY|INSTALL> files... DESTINATION <dir>
       [FILE_PERMISSIONS permissions...]
       [DIRECTORY_PERMISSIONS permissions...]
       [NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
       [FILES_MATCHING]
       [[PATTERN <pattern> | REGEX <regex>]
        [EXCLUDE] [PERMISSIONS permissions...]] [...])

7、CUDA_ADD_EXECUTABLE(app ${SOURCES})

  add_executable: 使用給定的源文件,爲工程引入一個可執行文件。

  add_executable(<name> [WIN32] [MACOSX_BUNDLE]
                 [EXCLUDE_FROM_ALL]
                 source1 source2 ... sourceN)

  引入一個名爲<name>的可執行目標,該目標會由調用該命令時在源文件列表中指定的源文件來構建。<name>對應於邏輯目標名字,並且在工程範圍內必須是全局唯一的。被構建的可執行目標的實際文件名將根據具體的本地平臺創建出來(比如<name>.exe或者僅僅是<name>)。

  默認情況下,可執行文件將會在構建樹的路徑下被創建,對應於該命令被調用的源文件樹的路徑。如果要改變這個位置,查看RUNTIME_OUTPUT_DIRECTORY目標屬性的相關文檔。如果要改變最終文件名的<name>部分,查看OUTPUT_NAME目標屬性的相關文檔。

  如果指定了MACOSX_BUNDLE選項,對應的屬性會附加在創建的目標上。查看MACOSX_BUNDLE目標屬性的文檔可以找到更多的細節。

  如果指定了EXCLUDE_FROM_ALL選項,對應的屬性將會設置在被創建的目標上。查看EXCLUDE_FROM_ALL目標屬性的文檔可以找到更多的細節。

  使用下述格式,add_executable命令也可以用來創建導入的(IMPORTED)可執行目標:

  add_executable(<name> IMPORTED)

   一個導入的可執行目標引用了一個位於工程之外的可執行文件。該格式不會生成構建這個目標的規則。該目標名字的作用域在它被創建的路徑以及底層路徑有效。它可以像在該工程內的其他任意目標一樣被引用。導入可執行文件爲類似於add_custom_command之類的命令引用它提供了便利。


8、LIST(APPEND CMAKE_CXX_FLAGS "-std=c++0x -O3 -ffast-math -Wall")

  list 列表操作命令。

  list(LENGTH <list> <output variable>)
    list(GET <list> <element index> [<element index> ...] <output variable>)
    list(APPEND <list> <element> [<element> ...])
    list(FIND <list> <value> <output variable>)
    list(INSERT <list> <element_index> <element> [<element> ...])
    list(REMOVE_ITEM <list> <value> [<value> ...])
    list(REMOVE_AT <list> <index> [<index> ...])
    list(REMOVE_DUPLICATES <list>)
    list(REVERSE <list>)
    list(SORT <list>)

  使用LENGTH選項時,該命令會返回給定list的長度。

  使用GET選項時,該命令返回list中所有被index索引的元素構成的list。

  使用APPEND選項時,該命令將會在該list之後追加若干元素。

  使用FIND選項時,該命令將返回list中指定的元素的索引;若果未找到,返回-1。

  使用INSERT選項時,該命令將在list中指定的位置插入若干元素。

  使用REMOVE_AT和REMOVE_ITEM選項將會從list中刪除一些元素。它們之間的區別是:REMOVE_ITEM刪除的是指定的項,而REMOVE_AT刪除的是在指定索引處的項。

  使用REMOVE_DUPLICATES選項時,該命令將刪除list中的重複項。

  使用REVERSE選項時,該命令將把list的內容就地前後倒換。

  使用SORT選項時,該命令將按字母序對list總的內容就地排序。

  注意:在CMake中,一個list是一個由封號;分割的一組字符串。使用set命令可以創建一個list。例如,set(var a b c d e)命令將會創建一個list:a;b;c;d;e;而set(var "a b c d e")命令創建的只是一個字符串,或者說是隻有一個項的list。

  當使用指定索引的命令格式時,如果<element index>是大於等於0的數,<element index>是從list第一個項開始的序號,list的第一項的索引是0。如果<element index>小於等於-1,這個索引是從結尾開始的逆向索引,其中-1表示的是list的最後一項。當使用負數索引時,注意它們不是從0開始!-0與0等價,它指向list的第一個成員。


9、TARGET_LINK_LIBRARIES(app /usr/local/cuda/lib64/libcudart.so  ${OpenCV_LIBS})

      顯式指定鏈接時需要的庫文件 

      爲每個目標分別指定需要鏈接的庫文件(指定部分目標專用的庫文件)

     TARGET_LINK_LIBRARIES: Link a target to given libraries.

     TARGET_LINK_LIBRARIES(target library1                        <debug | optimized> library2                        ...)

     Specify a list of libraries to be linked into the specified target. The debug and optimized strings may be used to indicate that the next library listed is to be used only for that specific type of build













發佈了119 篇原創文章 · 獲贊 55 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章