前段時間在學習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 過濾後的文件權限。