CMake 學習筆記 04

分類:技術 時間:2017-01-20

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學習筆記

文章來源:


ads
ads

相關文章
ads

相關文章

ad