配色: 字号:
CMakeLists.txt编写语法
2014-03-09 | 阅:  转:  |  分享 
  
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纸上得来终觉浅绝知此事要躬亲



献花(0)
+1
(本文系馆名不空首藏)