cblock@126.com纸上得来终觉浅绝知此事要躬亲
CMake语法简介
CMake特点
1.在每个源码目录下都有一个CMakeLists.txt.
2.CMake语句不区分大小写。一句一行,无行结束符号,注释用#
3.CMake实际也是一种编程语言。CMake根据CMakeLists.txt自动生成Makefile.
4.CMake比Autotools更简单明了
CMake语法
语法规则
1.变量使用${}方式取值,但是在IF语句中是直接使用变量名取值
MESSAGE(STATUS“Thisisbindir”$(PROJECT_BINARY_DIR))
MESSAGE(STATUS“Thisisbindir$(PROJECT_BINARY_DIR)”)
上面两句等效。
2.指令(参数1参数2…),参数之间用空格或分号隔开。
SET(SRC_LISTmain.cpphello.cpp)
SET(SRC_LIST“main.cpp”“hello.cpp”)
SET(SRC_LIST“main.cpp”;“hello.cpp”)
3.内部构建和外部构建:在哪个目录下执行cmake命令,则在哪个目录构建
In-source:编译过程文件和源码文件在同一目录下面(在工程目录下cmake)
Out-of-sourc:将编译目录和源码目录分割开(在非工程目录下cmake)。
4.常用变量及指令
CMake变量
序号语句注释
1PROJECT_BINARY_DIR、PROJECT_SOURCE_DIR
CMAKE_BINARY_DIR、CMAKE_SOURCE_DIR
工程目标文件目录
工程源文件目录
2CMAKE_CURRENT_BINARY_DIR
CMAKE_CURRENT_SOURCE_DIR
指当前处理的CMakeLists.txt所在
的路径。
3CMAKE_CURRENT_LIST_FILE
CMAKE_CURRENT_LIST_LINE
输出调用这个变量的
CMakeLists.txt的路径及行号
4_BINARY_DIR
_SOURCE_DIR
projectname工程目标文件
projectname源目标文件
5EXECUTABLE_OUTPUT_PATH最终目标二进制文件存放目录
6LIBRARY_OUT_PATH最终目标库文件存放目录
7CMAKE_INSTALL_PREFIX目标文件安装目录,默认目录为
/usr/local/bin
8CMAKE_MODULE_PATH定义自己的CMake模块所在路径
cblock@126.com纸上得来终觉浅绝知此事要躬亲
9PROJECT_NAME返回通过PROJECT指令定义的值
10CMAKE_INCLUDE_CURRENT_DIR自动添加
CMAKE_CURRENT_BINARY_DIR和
CMAKE_CURRENT_SOURCE_DIR添
加到当前CMakeLists.txt处理。
11CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFO
RE
将工程提供的头文件目录始终至于
系统头文件目录前面
12CMAKE_MAJOR_VERSION
CMAKE_MINOR_VERSION
CMAKE_PATCH_VERSION
CMake主版本号,2.4.6中的2
CMake次版本号,2.4.6中的4
CMake的补丁等级,2.4.6中的6
13CMAKE_SYSTEM
CMAKE_SYSTEM_NAME
CMAKE_SYSTEM_VERSION
CMAKE_SYSTEM_PROCESSOR
系统名称,如Linux-2.6.26
Linux
2.6.26
I386
14UNIX
WIN32
在所有的类UNIX平台值为TRUE,
包括MacOS和Cygwin
在所有的WIN32平台值为TRUE,包
括Cygwin
15CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS开关选项,用来控制ifelse的书写
方式
16BUILD_SHARED_LIBS开关,默认为静态库
17CMAKE_C_FLAGS
CMAKE_CXX_FLAGS
设置C编译选项
设置C++编译选项
CMake指令([]表示可选参数)
序号语句注释
1PROJECT(projectname[CXX][C][Java])定义工程名称(工程名与生成的目
标文件名称是没有任何关系的)。此
条指令隐含了两个变量
_BINARY_DIR
_SOURCE_DIR
2SET(var[value][cachetypedocstring[force]])自定义变量指令
set(SRC_LISTmain.cpphello.cpp)
set(SRC_LIST“main.cpp”“test.cpp”)
3MASSEGE([SEND_ERROR|STATUS|FATAL_ERROR]
“massagetodisplay”…)
SEND_ERROR:产生错误,生成过程
被跳过
STATUS:输出前缀为---的信息
FATAL_ERROR:立即终止所有CMake
过程
4ADD_EXECUTABLE(targetsource_file…)增加可执行目标文件,
target由source_file生成
5ADD_SUBDIRECTORY(source_dir[binary_dir]
[EXCLUDEFROMALL])
增加子目录
cblock@126.com纸上得来终觉浅绝知此事要躬亲
6SUBDIRS(dir1dir2…)一次添加多个目录,即使外部编译,
子目录体系仍然会被保存
7INSTALL(TARGETStargets[
[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION]
[PERMISSIONSpermissions…]
[CONFIGGURATIONS[Debug|Release|…]]
[COMPONENT]
[OPTIONAL]
][…])
安装目标文件
ARCHIVE静态库文件
LIBRARY动态库文件
RUNTIME可执行文件
DESTINATION定义安装路径,如果
是绝对路径则覆盖了
CMAKE_INSTALL_PREFIX,否则是指
相对CMAKE_INSTALL_PREFIX的相
对路径
8INSTALL(FILESfiles[
[DESTINATION]
[PERMISSIONSpermissions…]
[CONFIGGURATIONS[Debug|Release|…]]
[COMPONENT]
[OPTIONAL]
][…])
安装普通文件
可以指定权限,如果不指定,则默
认是644权限
9INSTALL(DIRECTORYdirs[
[DESTINATION]
[FILE_PERMISSIONSpermissions…]
[DIRECTORY_PERMISSIONSpermissions…]
[USE_SOURCE_PERMISSIONSpermissions…]
[CONFIGGURATIONS[Debug|Release|…]]
[COMPONENT]
[[PATTERN|REGEX]
[EXCLUDE][PERMISSIONSpermissions…]]
[…])
安装目录
可以指定权限,如果不指定,则默
认是644权限
10ADD_LIBRARY(libname[SHARED|STATIC|
MODULE][EXCLUDE_FROM_ALL]source1
source2…sourceN)
MODULE:在使用dydl的系统有效,
如果支持dydl,则默认为SHARED
11SET_TARGET_PROPERTIES(target1target2…
PROPERTIESprop1valueprop2value2…)
设置目标输出的名字及属性
由于TARGET名字不能有重复,所
以需在生成库文件再改为需要的名
字,这时就要用到这个指令了。
相关变量:
OUTPUT_NAME,输出名字(库,可执
行文件名字,可以不用加后缀
OUTPUT_VALUE
CLEAN_DIRECT_OUTPUT
VERSION
SOVERSION
12GET_TARGET_PROPERTIES(VARtargetproperty)获取目标的属性
13$ENV{NAME}调用系统环境变量
cblock@126.com纸上得来终觉浅绝知此事要躬亲
14SET(ENV{变量名}值)设置环境变量值
15ADD_DEFINITIONS
例:ADD_DEFINITIONS(-DENABLE_DEBUG)
向编译器添加-D定义
16ADD_DEPENDENCIES(target_name
depend_target1depend_target)
定义target依赖的其他target
17ADD_TEST(testnameprogramarg1arg2)在打开了ENABEL_TESTING后有效
18ENABEL_TESTING不带任何参数,控制Makefile是否
构建test目标,一般用在工程主
CMakeList.txt中
19AUX_SOURCE_DIRECTORY(dirVARIABLE)
例AUX_SOURCE_DIRECTORY(.SRC_LIST),将当
前目录下源文件名赋给变量SRC_LIST
自动构建源文件列表
20CMAKE_MINIMUM_REQUIRED(VERSION
version_num[FATAL_ERROR])
检查CMake版本,若不满足,产生
错误提示或退出
21EXEC_PROGRAM(program
[ARGSargs]
[OUTPUT_VARIABLEvar]
[RETURN_VALUEvalue])
ARGS用于添加参数
OUTPUT_VARIABLE用于获取命令
输出
RETURN_VALUE用于获取返回值
22FILE指令
FILE(WRITEfilename“message”…)
FILE(APPENDfilename“message”…)
FILE(READfilenamevariable)
FILE(GLOBvariable[RELATIVEpath][globing
expressions]…)
FILE(GLOB_RECURSEvariable[RELATIVEpath]
[globingexpressions]…)
FILE(REMOVE[directory]…)
FILE(REMOVE_RECURSE[directory]…)
FILE(MAKE_DIRECTORY[directory]…)
FILE(RELATIVE_PATHvariabledirectoryfile)
FILE(TO_CMAKE_PATHpathresult)
FILE(TO_NATIVE_PATHpathresult)
写文件
添加内容到文件
读文件
移除目录
递归移除目录
创建目录
23INCLUDE(file[OPTIONAL])
INCLUDE(module[OPTIONAL])
用来载入CMakeLists.txt文件或者
CMake模块
24FIND指令
FIND_FILE(name1path1path2…)
FIND_LIBRARY(name1path1path2…)
FIND_PATH(name1path1path2…)
FIND_PROGRAM(name1path1path2…)
FIND_PACKAGE([major.minor][QUITE]
[NO_MODULE]
[[REQUIRED|COMPONENTS][components…]])
VAR变量name1代表找到的文件全
路径,包含文件名
VAR变量name2代表找到的文件全
路径,包含库文件名
VAR变量代表包含这个文件的路径
VAR变量代表包含这个程序的全路
径
cblock@126.com纸上得来终觉浅绝知此事要躬亲
5.判断语句
cblock@126.com纸上得来终觉浅绝知此事要躬亲
6.循环语句
cblock@126.com纸上得来终觉浅绝知此事要躬亲
7.模块的使用和编写
cblock@126.com纸上得来终觉浅绝知此事要躬亲
cblock@126.com纸上得来终觉浅绝知此事要躬亲
cblock@126.com纸上得来终觉浅绝知此事要躬亲
cblock@126.com纸上得来终觉浅绝知此事要躬亲
|
|