Written with StackEdit.
CMake是什么
CMake是一個(gè)opensource的軟件項(xiàng)目構(gòu)建管理工具采转;它允許開(kāi)發(fā)者用一種簡(jiǎn)單的文本格式進(jìn)行構(gòu)建參數(shù)的指定聪廉。
為什么使用CMake
如果你之前有過(guò)維護(hù)軟件包的構(gòu)建和安裝的經(jīng)驗(yàn),你就會(huì)對(duì)CMake有興趣氏义。
當(dāng)前很多項(xiàng)目都可以在Linux下用Makefile和在Windows下用Visual Studio進(jìn)行編譯锄列;這要求開(kāi)發(fā)者在對(duì)應(yīng)的系統(tǒng)下保持構(gòu)建工具的更新,并且不同系統(tǒng)的構(gòu)建行為保持一致惯悠;如果再引入XCode,這需要更多的構(gòu)建工具竣况,這樣會(huì)是一個(gè)問(wèn)題克婶。
如果在此基礎(chǔ)上引入可選組件,比如如果系統(tǒng)上有l(wèi)ibjpeg丹泉,項(xiàng)目就支援JPEG情萤,這會(huì)造成更大的麻煩。
CMake提供了一個(gè)簡(jiǎn)單的摹恨,易于理解的文件格式來(lái)解決上述問(wèn)題筋岛。
如果一個(gè)項(xiàng)目有多個(gè)開(kāi)發(fā)者參與,或者這個(gè)項(xiàng)目有多個(gè)目標(biāo)平臺(tái)晒哄;那么不可避免的需要在多臺(tái)PC上進(jìn)行構(gòu)建睁宰,不同的PC在開(kāi)發(fā)環(huán)境上會(huì)有差異肪获。
- 自動(dòng)進(jìn)行項(xiàng)目構(gòu)建所需的program、library柒傻、header file的查找能力孝赫;
- 在source tree以外進(jìn)行構(gòu)建的能力;
- 為Qt moc红符,SWIG等自動(dòng)產(chǎn)生復(fù)雜的自定義命令的能力青柄;
- 在configuration階段進(jìn)行可選組件定制的能力;
- 自動(dòng)從簡(jiǎn)單文件文件產(chǎn)生workspace和project的能力预侯;
- 配置生成靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)的能力致开;
- 自動(dòng)產(chǎn)生文件依賴,支持并行編譯萎馅;
CMake的基本語(yǔ)法
build的過(guò)程由每個(gè)目錄下的名為CMakeFileLists.txt
的文件組成的一系列文件列表所控制双戳;
CMakeFileLists.txt
文件由CMake語(yǔ)句進(jìn)行項(xiàng)目描述,CMake語(yǔ)句的語(yǔ)法為:
command( args... )
- command是命令的名字校坑,CMake是不區(qū)分大小寫(xiě)的拣技;
- args是一系列由空格分隔的參數(shù),如果參數(shù)中有空格耍目,參數(shù)需要用雙引號(hào)引起來(lái)膏斤;
變量被引用的格式是${VAR}
;
多個(gè)參數(shù)可以使用set
來(lái)使之構(gòu)成一個(gè)list
set( Foo a b c )
這樣設(shè)置的結(jié)果是Foo
的值是 a b c
;
CMake可以直接訪問(wèn)系統(tǒng)環(huán)境變量和Windows注冊(cè)表;
訪問(wèn)系統(tǒng)環(huán)境變量的語(yǔ)法:
$Env{ARG}
訪問(wèn)Windows注冊(cè)表:
[HKEY_CURRENT_USER\\Software\\path1\\path2;key]
Hello World
一個(gè)簡(jiǎn)單的CMakeFileLists.txt
的例子
project( Hello )
add_executalbe( Hello Hello.c )
一個(gè)稍微復(fù)雜的例子
cmake_minimum_required( 2.6 )
project( HELLO )
set( HELLO_SRCS Hello.c File2.c File3.c )
if( WIN32 )
set( HELLO_SRCS ${HELLO_SRCS} WinSupport.c )
esle()
set( HELLO_SRCS ${HELLO_SRCS} LinuxSupport.c )
endif()
add_executable( HELLO ${HELLO_SRCS} )
# look for the Tcl library
find_library( TCL_LIBRARY
NAMES tcl tcl84 tcl83 tcl82 tcl80
PATHS /usr/lib /usr/local/lib
)
if( TCL_LIBRARY )
target_link_library( Hello ${TCL_LIBRARY} )
endif()
如何運(yùn)行CMake
通常使用兩種方式運(yùn)行CMake
cmake-gui
通過(guò)桌面或者命令行運(yùn)行cmake-gui
邪驮,打開(kāi)后UI如下:
按照如下步驟進(jìn)行設(shè)置:
- 圖示1莫辨, 選擇source code所在位置(如果通過(guò)
cmake-gui path_to_src
的方式,source code位置已經(jīng)設(shè)定好); - 圖示2毅访, 選擇build要產(chǎn)生文件的存放位置沮榜;
- 圖示3,configure喻粹;如果是第一次執(zhí)行configure蟆融,會(huì)彈出對(duì)話框讓進(jìn)行compiler的選擇,指定toolchain file守呜;這樣設(shè)置以后型酥,configure過(guò)程會(huì)進(jìn)行,在圖示4的區(qū)域顯示相關(guān)option查乒;
- 圖示4弥喉,進(jìn)行相關(guān)參數(shù)或者option的設(shè)置;
- 圖示5玛迄,generate由境,產(chǎn)生指定平臺(tái)的build file(Linux的Makefile或者Visual Studio的sln file);
命令行使用cmake
- 切換到準(zhǔn)備放置binary file的目錄
- cmake path_to_src -Doption
- make
- make install