Cmake語法詳解

2021-09-24 14:29:31 字數 4253 閱讀 5643

一、什麼是cmake

在android studio 2.2及以上, 構建原生庫的預設工具是cmake。

cmake是乙個跨平台的構建工具,可以用簡單的語句來描述所有平台的安裝編譯過程。能夠輸出各種各樣的makefile或者project檔案。cmake並不直接構建最終的軟體,而是產生其他工具的腳步(如makefile),然後再依據這個工具的構建方式使用。

cmake是乙個比make更高階的編譯配置工具,他可以根據不同的平台、不同的編譯器,生成相應的makefile或者vcproj專案,從而達到跨平台的目的。android studio利用cmake生成的是ninja。ninja是乙個小型的關注速度的構建系統。我們不需要關係ninja的指令碼,知道怎麼配置cmake就可以了。

cmake其實是乙個跨平台的支援產出各種不同的構建指令碼的乙個工具。

二、cmake原始檔

cmake的原始檔可以保護命令、注釋、空格和換行。

以cmake編寫的原始檔以cmakelists.txt命名或以.cmake為副檔名。

可以通過add_subdirectory()命令把子目錄的cmake原始檔新增進來。

cmake原始檔中所有有效的語句都是命令,可以是內建命令或者自定義的函式/巨集命令。

cmake注釋

單行注釋:#注釋內容

多行注釋:可以使用括號來實現多行注釋:

#[[多行注釋

多行注釋

多行注釋]]

cmake變數

cmake中所有的變數都是string型別。可以使用set() 和 unset() 命令來宣告或者移除乙個變數

變數的引用:$

#宣告變數 set(變數名 變數值)

set(var 123)

#引用變數 message命令列印

message("var = $")

cmake列表(lists)

列表也是字串,可以把列表看做是乙個特殊的變數,這個變數有多個值。

語法格式:

set(列表名 值1 值2 ... 值n)

或set(列表名 「值1;值2;...值n」)

列表的引用:

$#宣告列表 set set(列表名 值1 值2 ... 值n)   或  set(列表名 「值1;值2;...值n」)

set(list_var 1 2 3 4 5)

#或者set(list_var "1;2;3;4;5")

#列印列表

message("list_var = $")

cmake流程控制-操作符

優先順序 () > 一元 > 二元 > 邏輯

cmake流程控制-布林常量值

cmake流程控制-條件命令

語法格式:

if (表示式)

command(args...)

elseif(表示式)

command(args...)

else(表示式)

command(args...)

endif(表示式)

elseif和else部分是可選的, 也可以使用多個elseif部分,縮排和空格對語句的解析沒有影響。

set(if_tap off)

set(elseif_tap on)

if($)

message("if")

elseif($)

message("elseif")

else($)

message("else")

endif($)

cmake流程控制-迴圈命令

語法格式:

while(表示式)

command(args...)

endwhile(表示式)

break() 命令可以跳出整個迴圈, continue() 可以跳出當前迴圈。

set(a "")

while(not a strequal "***")

set(a "$x")

message("a = $")

endwhile()

cmake流程控制-迴圈遍歷

語法格式:

foreach(迴圈變數 引數1 引數2... 引數n)

command(args...)

endforeach(迴圈變數)

每次迭代設定迴圈遍歷為引數。

foreach也支援 break() 和 continue() 命令跳出迴圈。

foreach(item 1 2 3)

message("item = $")

endforeach(item)

# range 4  表示  0到4

foreach(item range 4)

message("item = $")

endforeach(item)

語法格式:

foreach(迴圈變數 range start stop step)

command(args...)

endforeach(迴圈變數)

迴圈範圍 從 start 到 stop, 迴圈增量為step

# 列印 1 3 5

foreach(item range 1 5 2)

message("item = $")

endforeach(item)

foreach支援對列表的迴圈

語法格式

foreach(迴圈遍歷 in lists 列表)

command(args...)

endforeach(迴圈變數)

set(list_var 1 2 3)

foreach(item in lists list_var)

message("item = $")

endforeach(item)

cmake自定義函式命令

自定義函式命令格式:

function([arg1 [arg3 [arg3...]]])

command(args...)

endfunction()

函式命令呼叫格式

name(引數列表)

function(func x y z)

message("call function func")

message("x = $")

message("y = $")

message("z = $")

# argc 內建變數   引數個數

message("argc = $")

# ar**n 內建變數   第 n 個引數,從0開始

message("arg1 = $")

message("arg2 = $")

message("arg3 = $")

# ar** 內建變數   引數列表

message("all args = $")

endfunction(func)

fun(1 2 3)

cmake自定義巨集命令

自定義巨集命令格式:

macro([arg1 [arg3 [arg3...]]])

command(args...)

endmacro()

巨集定義呼叫格式:

name(實參列表)

函式命令有自己的作用域,巨集的作用域和呼叫者的作用域是一樣的。

marco(ma x y z)

message("call macro ma")

message("x = $")

message("y = $")

message("z = $")

endmacro(ma)

ma(1 2 3)

cmake中變數的作用域

全域性層:cache變數,在整個專案範圍可見,一般在set定義變數式,指定cache引數就能定義cache變數。

目錄層:在當前目錄cmakelists.txt中定義,以及在該檔案包含的其他cmake原始檔中定義的變數。

函式層:在命令函式中定義的變數,屬於函式作用域內的變數。

CMake基本語法

型別 分類 bool string path filepath 配置變數型別 list 轉換 推導 具名 宣告週期 set 宣告,unset取消 定義乙個變數 判斷是否定義用defined set 變數名 變數值 引用乙個變數 取消乙個變數 unset 變數名 內部變數 系統環境變數 env 工程源...

Cmake之基本語法

cmake注意就是乙個cmakelists.txt.參考下面 下面開始乙個乙個語法的研讀 cmake minimum required version 3.5 檢查cmake的版本,至少為3.5 cmake policy set cmp0025 new 暫時步研究,看不懂 project absl ...

CMake筆記 簡單語法

command 引數1 引數2 a b c d 用分號或者空格分割set var a b c 設定變數var command 引用變數var的值,等價於command a b c command 等價於 command a b c command 使用轉義,和 a b c無關聯if expressi...