CMake 學習筆記 04 - 常用變量和指令
源代碼見 https://github.com/fengyc/cmake-tutorial
常用變量
cmake 中支持變量來控制構建過程。一個變量可通過 ${變量名}
取得其值,在 IF 語句裏面,直接使用變量名而不需要取值。
通過 SET 指令能顯式地自定義變量,有一些指令會隱式地創建變量,如 PROJECT 指令,會同時創建 <project_name>_SOURCE_DIR
和 <project_name>_BINARY_DIR
變量。
常用的一些變量 ::
PROJECT_NAME 項目名 CMAKE_BINARY_DIR PROJECT_BINARY_DIR <project_name>_BINARY_DIR 構建目錄 CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR <project_name>_SOURCE_DIR 工程根目錄 CMAKE_CURRENT_SOURCE_DIR 當前 CMakeLists.txt 所在的目錄 CMAKE_CURRRENT_BINARY_DIR 當前 target 的構建目錄 CMAKE_CURRENT_LIST_FILE 當前 CMakeLists.txt 完整路徑 CMAKE_CURRENT_LIST_LINE 當前執行的行號 CMAKE_MODULE_PATH 加入 cmake 的擴展模塊路徑 EXECUTABLE_OUTPUT_PATH 可執行目標文件輸出路徑 LIBRARY_OUTPUT_PATH 庫目標文件輸出路徑
在 cmake 中調用 shell 環境變量用 $ENV{變量名}
,通過 SET(ENV{變量名} 值)
設置。
跟系統相關的一些變量::
CMAKE_MAJOR_VERSION,CMAKE 主版本號,比如 2.4.6 中的 2 CMAKE_MINOR_VERSION,CMAKE 次版本號,比如 2.4.6 中的 4 CMAKE_PATCH_VERSION,CMAKE 補丁等級,比如 2.4.6 中的 6 CMAKE_SYSTEM,系統名稱,比如 Linux-2.6.22 CMAKE_SYSTEM_NAME,不包含版本的系統名,比如 Linux CMAKE_SYSTEM_VERSION,系統版本,比如 2.6.22 CMAKE_SYSTEM_PROCESSOR,處理器名稱,比如 i686. UNIX,在所有的類 UNIX 平臺為 TRUE,包括 OS X 和 cygwin WIN32,在所有的 win32 平臺為 TRUE,包括 cygwin
常用指令
以下是常用的指令
ADD_DEFINITIONS 添加一個 define 標誌 ADD_DEPENDENCIES 定義依賴關系,ADD_DEPENDENCIES(target depends-on-target;depends-on-target) AUX_SOURCE_DIRECTORY 自動找到目錄下的源文件,保存到變量 AUX_SOURCE_DIRECTORY(dir VARIABLE) CMAKE_MINIMUM_REQUIRED cmake 最小版本依賴 EXEC_PROGRAM 執行一個命令 FILE 文件操作 INCLUDE 載入 CMakeLists.txt 或 cmake 模塊,INCLUDE 後直接執行 INSTALL 安裝 FIND_* 系列指令,包含 FILE LIBRARY PATH PROGRAM PACKAGE 等 MESSAGE 輸出消息 IF ELSE ENDIF 分支指令
分支指令
分支指令經常用到,結構為 ::
IF(expression) # THEN section. COMMAND1(ARGS ...)COMMAND2(ARGS ...) ... ELSE(expression) # ELSE section. COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDIF(expression)
表達式不為空、0、N、NO、OFF、FALSE、NOTFOUND 等,表達式為真。表達式可用 NOT AND OR EXISTS IS_NEWER_THAN
IS_DIRECTORY
MATCHES 等進行比較。
對數字進行比較時,用 LESS GREATER EQUAL 等。
對字符串比較時,用 STRLESS STRGREATER STREQUAL 等。
循環指令
cmake 中使用 WHILE 和 FOREACH 循環指令。
WHILE(condition) COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDWHILE(condition) FOREACH(loop_var arg1 arg2 ...) COMMAND1(ARGS ...) COMMAND2(ARGS ...) ... ENDFOREACH(loop_var)
FOREACH 可與 RANGE 指令結合使用(有點像 python) ::
FOREACH(var RANGE total) ... ENDFOREACH()
到這裏,已經基本能夠使用 cmake 來管理項目的構建了,更加復雜的用法需要學習 cmake 的模塊寫法 .cmake
文件,以及熟悉 cmake 在不同平臺上的工具,像 ccmake、 cmake-qt-gui 等。
Tags: cmake CMake學習筆記
文章來源: