CMake快速上手筆記

前段時間在學習Qgis示例代碼時,需要利用CMakeList.txt文件生成工程,生成工程中出現很多錯誤,想着打開CMakeList.txt看看,爲了看懂就順便學習了CMake的知識。

基礎

CMake工程定義:

PROJECT(projectname [C] [CXX] [Java])

兩個隱藏的cmake變量:

<projectname>_BINARY_DIR
<projectname>_SOURCE_DIR

另外有兩個預定義變量:

PROJECT_BINARY_DIR`
PROJECT_SOURCE_DIR`

這兩個變量分別與前面兩個變量對應,建議使用這個兩個變量,因爲當工程名修改後無需修改這裏的變量名。

SET指令:顯示定義變量
語法:

SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])

例如:

SET(SRC_LIST main.c t1.c t2.c)
SET(SRC_LIST “main.c”)

MESSAGE指令:向終端輸出用戶定義的信息
語法:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

  • SEND_ERROR:產生錯誤,生成過程被跳過;
  • STATUS:產生前綴爲“-”的信息;
  • FATAL_ERROR:立即終止所有cmake過程。
  • ADD_EXECUTABLE指令:定義工程生成可執行文件的文件名

例如:

ADD_EXECUTABLE(hello ${SRC_LIST})

其中“${}”表示引用變量的值,在IF控制語句中不能加它,直接引用變量名。

外部構建(out-of-source)

  • ADD_SUBDIRECTORY:用於向當前工程添加存放源文件的子目錄,並可以指定“中間二進制”和“目標二進制”存放位置
  • ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
    通過SET指令可以重新指定目標二進制的位置,例如:

    SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
    SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)

安裝

INSTALL指令、CMAKE_INSTALL_PREFIX變量:用於定義安裝規則,安裝的內容可以包括目標二進制、動態庫、靜態庫以及文件、目錄、腳本等。

INSTALL目標文件安裝

語法:

INSTALL(TARGETS targets...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS
[Debug|Release|...]]
[COMPONENT <component>]
[OPTIONAL]
] [...])

TARGETS後面跟的就是通過 ADD_EXECUTABLE 或者 ADD_LIBRARY 定義的目標文件,可能是可執行二進制、動態庫、靜態庫。
目標類型也就相對應的有三種,ARCHIVE 特指靜態庫,LIBRARY 特指動態庫,RUNTIME特指可執行目標二進制。
DESTINATION 定義了安裝的路徑,如果路徑以/開頭,那麼指的是絕對路徑,這時候CMAKE_INSTALL_PREFIX 其實就無效了。如果你希望使用 CMAKE_INSTALL_PREFIX 來定義安裝路徑,就要寫成相對路徑,即不要以/開頭,那麼安裝後的路徑就是${CMAKE_INSTALL_PREFIX}/

INSTALL普通文件的安裝


INSTALL(FILES files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL]
)

可用於安裝一般文件,並可以指定訪問權限,文件名是此指令所在路徑下的相對路徑。如果默認不定義權限 PERMISSIONS,安裝後的權限爲:OWNER_WRITE, OWNER_READ, GROUP_READ,和 WORLD_READ,即 644 權限。

非目標文件的可執行程序安裝(如腳本之類)


INSTALL(PROGRAMS files... DESTINATION <dir>
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[RENAME <name>] [OPTIONAL])

跟上面的 FILES 指令使用方法一樣,唯一的不同是安裝後權限爲:OWNER_EXECUTE, GROUP_EXECUTE, 和 WORLD_EXECUTE,即 755 權限。

INSTALL目錄安裝


INSTALL(DIRECTORY dirs... DESTINATION <dir>
[FILE_PERMISSIONS permissions...]
[DIRECTORY_PERMISSIONS permissions...]
[USE_SOURCE_PERMISSIONS]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS permissions...]] [...]
)

這裏主要介紹其中的 DIRECTORY、PATTERN 以及 PERMISSIONS 參數。
DIRECTORY 後面連接的是所在 Source 目錄的相對路徑,但務必注意:abc 和 abc/有很大的區別。如果目錄名不以/結尾,那麼這個目錄將被安裝爲目標路徑下的 abc,如果目錄名以/結尾,代表將這個目錄中的內容安裝到目標路徑,但不包括這個目錄本身。PATTERN 用於使用正則表達式進行過濾,PERMISSIONS 用於指定 PATTERN 過濾後的文件權限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章