Cmake工具
- cmake 交叉編譯系統(tǒng)生成工具
- ctest 自動(dòng)化測(cè)試工具
- cpack 自動(dòng)化打包工具 可以生成各種格式的安裝程序和源碼包
Cmake 語(yǔ)法
相比于make的規(guī)則同云,輸入文件有指定的命名規(guī)則即為Makefile
.
Cmake 輸入文件是以Cmake語(yǔ)法編寫的溯壶,以CmakeLists.txt命
名或以.cmake
擴(kuò)展名的文件.為了盡可能的跨平臺(tái)使用的7-bit ASCII 字符編寫鞍匾,使用UTF-8編碼。
1. 多級(jí)依賴目錄樹(shù)和配置文件配置
- 使用
add_subdirectory()
函數(shù)蹋订,添加同樣包含CmakeList.txt
,Cmake進(jìn)行編譯時(shí)赂弓,會(huì)在build相應(yīng)的目錄下生成輸出文件. - 通用資源或配置可以添加
<script>.cmake
,以模塊的形式進(jìn)行加載,相應(yīng)的加載函數(shù)為include()
. - 單獨(dú)運(yùn)行配置文件,使用
-P
選項(xiàng) 如:cmake -P <script>.cmake
2. 命令調(diào)用
命令格式
命令調(diào)用是方法名加圓括號(hào)的形式,括號(hào)內(nèi)的參數(shù)以空格或換行符分割開(kāi)雁比。方法命名不區(qū)分大小寫。
line_ending ::= line_comment? newline
space ::= <match '[ \t]+'>
newline ::= <match '\n'>
separation ::= space | line_ending
三種參數(shù)格式支持
命令調(diào)用支持三種語(yǔ)法格式撤嫩,分別是引用格式偎捎、未引用格式、lua長(zhǎng)括號(hào)語(yǔ)法序攘。
未引用格式所有 空格茴她、
(
、)
两踏、#
败京、"
、\
都應(yīng)該使用轉(zhuǎn)譯符\
進(jìn)行注釋
實(shí)例如下:
#引用語(yǔ)法(quoted argument )
message(STATUS "config is called syntax 1 ")
#未引用語(yǔ)法(unquoted argument)
message(STATUS config\ is\ called\ syntax\ 2)
#長(zhǎng)括號(hào)語(yǔ)法(Bracket Argument)
message(STATUS [==[config is called syntax 3]==])
#result
cmake -P ../app/config.cmake
-- config is called syntax 1
-- config is called syntax 2
-- config is called syntax 3
變量引用
引用變量格式為${<variable>}
梦染,可以在引用格式或未引用格式中使用赡麦。支持變量的嵌套,由內(nèi)而外的解析${outer_${inner_variable}_variable}
帕识。
注釋
注釋應(yīng)該以#
開(kāi)頭泛粹,支持lua長(zhǎng)括號(hào)語(yǔ)法\
# this is a Comment
#[=[ lua long bracket syntax Comment]=] #可多行
3. 控制語(yǔ)句
控制語(yǔ)句主要分為以下幾類:
- 條件語(yǔ)句
- 循環(huán)語(yǔ)句
- 宏、函數(shù)定義
- 變量肮疗、環(huán)境變量
- 列表
條件語(yǔ)句
使用if()
/elseif()
/else()
/endif()
命令分割代碼塊完成條件控制晶姊。
if(<condition>)
<commands>
elseif(<condition>) # optional block, can be repeated
<commands>
else() # optional block
<commands>
endif()
循環(huán)語(yǔ)句
使用foreach()
/endforeach()
/ while()
/endwhile()
來(lái)劃分代碼塊用以在循環(huán)中執(zhí)行。類似于其他語(yǔ)言使用 break()
提前結(jié)束循環(huán)伪货, 使用 continue()
函數(shù)提前開(kāi)始下一個(gè)迭代過(guò)程们衙。
#foreach 遍歷循環(huán)
foreach(<loop_var> <items>)
<commands>
endforeach()
#while條件循環(huán)
while(<condition>)
<commands>
endwhile()
宏、函數(shù)定義
使用 macro()
/endmacro()
, and function()
/endfunction()
命令定義宏或者函數(shù)碱呼,在后面作為新的命令調(diào)用相應(yīng)代碼塊蒙挑。
變量、環(huán)境變量
變量和環(huán)境變量類型都是字符串類型愚臀,使用set()
和unset()
命令令進(jìn)行定義和撤銷變量忆蚀,但是其他命令可以更新變量值。注意姑裂,變量名不同于命令是區(qū)分大小寫的馋袜,理論上名命可以是任意字符,但是只推薦使用-
和_
作為分隔符舶斧。
環(huán)境變量的區(qū)別在于欣鳖,作用域是當(dāng)前Cmake進(jìn)程,設(shè)置和引用時(shí)要增加ENV
標(biāo)記.
#變量設(shè)置
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
#變量引用
${<variable>}
#環(huán)境變量設(shè)置
set(ENV{<variable>} [<value>])
#環(huán)境變量引用
$ENV{<variable>}
列表
列表是以;
區(qū)分開(kāi)的字符串茴厉,而且大多數(shù)的命令并不會(huì)自動(dòng)轉(zhuǎn)譯掉;
观堂,因此可以扁平化嵌套列表.
set(x a "b;c") # sets "x" to "a;b;c", not "a;b\;c"