cmake 语法

语法说明

CMakeLists.txt 文件遵循一种简单的语法包括 注释,命令和空格字符。注释使用#符号,从符号开始之后的一行都表示注释。命令包括命令名,左括号,分隔参数的空白字符和右括号。命令既可以是一个内置命令如 add_library,也可以是自定义的宏和函数。输入CMake的源目录是CMakeList.txt文件。这个文件也可以使用include和add_subdirectory命令添加外部输入文件。

所有的空白符号(空格,换行,制表符)除了分隔参数外被忽略。对大多数语言来说,任何加了双引号的符号都被当成一个参数。反斜杠可以用来转义。

每一个命令按在CMakefile文件中出现的顺序评估。命令有如下形式

 command (args...)

其中command是命令,宏或者函数的名称,args是一个用空白符分隔的参数表。(嵌入空白符的参数必须使用双引号) CMake 大小写不敏感。所以可以用COMMAND和Command互相代替。

列表和字符串

在CMake中基础的数据形式是字符串。CMake也支持字符串列表。

列表通过分号分隔。譬如两个声明给变量VAR设同样的值:

set(VAR a;b;c)     set(VAR a b c)

字符串列表可以通过foreach命令迭代或直接操控列表命令。

变量

CMake 支持简单的变量可以是字符串也可以是字符串列表。变量参考使用${VAR}语法。多参数可以使用set命令组合到一个列表中。所有其他的命令

通过空白分隔符传递命令来扩展列表,例如

set(Foo a b c)

将 变量 Foo 设为 a b c, 并且如果Foo 传递给另一个命令

command(${Foo})

等同于

command(a b c)

如果要把参数列表传递给一个命令,且它是一个简单的参数只要加一个双引号就可以。例如

command("${Foo}")

将执行只传递一个参数的命令等价于

command("a b c")

控制流

不用方法写CMakeLists文件就像用一种简单语言写程序。像大多数语言一样,Cmake 提供了控制流结构。Cmake提供了三中控制流:

1: 条件控制流 if

# some_command will be called if the variable‘s value is not:
# empty, 0, N, NO, OFF, FALSE, NOTFOUND, or -NOTFOUND.
if(var)
   some_command(...)
endif(var) 

2:  循环结构: foreach 和 while

set(VAR a b c)
  # loop over a, b,c with the variable f
foreach(f ${VAR})
    message(${f})
endforeach(f) 

3: 过程定义 宏和函数(函数在2.6及更高的版本中有效)。函数对变量局部有效,宏是全局有效。

# define a macro hello
macro(hello MESSAGE)
    message(${MESSAGE})
endmacro(hello)
# call the macro with the string "hello world"
hello("hello world")
# define a function hello
function(hello MESSAGE)
    message(${MESSAGE})
endfunction(hello)

更多控制流信息参见命令 if,while,foreach,macro,function文档。

引号,字符串和转义

在CMake中原义字符串用双引号括起来。字符串可以是多行字符串,并在其中嵌入新的行。例如

set(MY_STRING "this is a string with a

 newline in

it")

也可以在一个字符串中转义字符和使用变量

set(VAR "

  hello

  world

")

message("\${VAR}= ${VAR}")

# prints out

${VAR}=

hello

world

同样支持标准C中的转义

message("\n\thello world")

#prints out

hello world

如果字符在引号之前是空格则原义字符串只是原义字符串。例如

message(hell"o") -> prints hell"o"

message(hell"o") -> prints hell"o"

message(hell\"o\") -> prints hello"o"

然而引号必须成对,一下就是一个错误

message(hell"o) -> produces this error:
Parse error.Function missing ending ")".
Instead found unterminated string with text "o)

".

message(hell\"o) -> prints hell"o

正则表达式

一些CMake命令,比如if 和 string,使用正则表达式或者用一个正则表达式来代替一个参数。最简单的形式,一个正则表达式就是字符序列中精确查询匹配字符。

然而,很多次这个精确序列式找不到的,或者只匹配了字符串中期望的头尾部分。由于对特定的正则表达式有许多不同的约定,CMake的标准描述如下。描述是基于Texas Instruments开源的正则表达式类。

正则表达式可以使用标准文字数值字符和如下正则表达式元字符的结合

  • ^ Matches at beginning of a line or string
  • $ Matches at end of a line or string
  • . Matches any single character other than a newline
  • [ ] Matches any character(s) inside the brackets
  • [^ ] Matches any character(s) not inside the brackets
  • [-] Matches any character in range on either side of a dash
  • * Matches preceding pattern zero or more times
  • + Matches preceding pattern one or more times
  • ? Matches preceding pattern zero or once only
  • () Saves a matched expression and uses it in a later replacement
  • ^ 匹配一行或一字符串开头
  • $匹配一行或一字符串结尾
  • .匹配单一字符或一个新行
  • [ ]匹配括号中的任一字符
  • [^ ] 匹配不在括号内的任一字符
  • [-] 匹配指定范围内的字符
  • * 匹配0次或多次
  • + 匹配一次或多次
  • ? 匹配0次或一次
  • ()保存匹配的表达式并用随后的替换它
时间: 2024-10-16 11:37:35

cmake 语法的相关文章

cmake语法学习

1.项目最外层cmake编写:----------用于kdevelop编译器 ××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× eg: project(filtering) cmake_minimum_required(VERSION 2.8) ————必须有的 include_directories(${PROJECT_SOURCE_DIR}/src)  ————设置include头文件查找路径lin

CMake快速入门教程-实战

http://www.ibm.com/developerworks/cn/linux/l-cn-cmake/ http://blog.csdn.net/dbzhang800/article/details/6314073 http://www.cnblogs.com/coderfenghc/archive/2013/01/20/2846621.html http://blog.sina.com.cn/s/blog_4aa4593d0100q3bt.html http://hahack.com/c

CMake入门以及学习笔记

使用cef3替代chromium内核开发产品过程中,第一次接触到系统构建,使用了最常见的CMake.CMake虽然在构建系统中用的比较多,但是使用到的程序员还是很少的.现在在国内能找到的相关资料和博客比较多,本人在学习中也看了很多人的博客,比如 CMake学习(一)  , CMake语法之流程控制 等.再次感谢这些作者的分享.下边提供一些系统学习的资料. CMake的官网地址:http://www.cmake.org/ CMake主要的文档<learning_cmake> <CMake

【转载】cmake编写

Cmake的输入是在源码目录下的CMakeLists.txt文件.这个文件可以用include或者 add_subdirectory 命令增加入其它的输入文件. 语法 CMakeList.txt文件是由注释.命令和空白字符组成. 注释是由 # 开始,到行结尾. 命令是由:命令名.(.空格分隔的参数.)组成. 例如:command (args….) 上面的command可以是一个命令名:或者是一个宏:也可以是一个函数名. args是以空格分隔的参数例表(如果参数中包含空格,则要加双引号) 除了用于

CMake快速入门教程:实战

转自http://blog.csdn.net/ljt20061908/article/details/11736713 0. 前言    一个多月前,由于工程项目的需要,匆匆的学习了一下cmake的使用方法,现在有时间拿出来整理一下.本文假设你已经学会了cmake的使用方法,如果你还不会使用cmake,请参考相关资料之后再继续向下看.    本文中介绍的是生成可执行程序的方法和步骤,生成动态库和静态库的方法与此有所不同,随后会介绍动态库和静态库项目中cmake的编写方法.    本文参考<CMa

转:CMake安装和使用

CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程).他能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake.只是 CMake 的组态档取名为 CmakeLists.txt.Cmake 并不直接建构出最终的软件,而是产生标准的建构档(如 Unix 的 Makefile 或 Windows Visual C++ 的 projects/workspaces),然后再依一般的建构方式使用.这使得

转:CMake快速入门教程-实战

CMake快速入门教程:实战 收藏人:londonKu     2012-05-07 | 阅:10128  转:34    |   来源   |  分享      0. 前言一个多月前,由于工程项目的需要,匆匆的学习了一下cmake的使用方法,现在有时间拿出来整理一下.本文假设你已经学会了cmake的使用方法,如果你还不会使用cmake,请参考相关资料之后再继续向下看.本文中介绍的是生成可执行程序的方法和步骤,生成动态库和静态库的方法与此有所不同,随后会介绍动态库和静态库项目中cmake的编写方

【密码工程】asn1——asn1c、javaAsn1Comilper、protobuf的使用示例

1 使用asn1c实现编码 参考网址:http://lengxuezhixuan.blog.chinaunix.net/uid-28765492-id-3765759.html PS:这个网址就是根据下载的asn1c中的英文指导文档做的. * 遇到的问题: (1)头文件的引用:头文件放在了vc/include下,对.h文件可以使用include<>.对于本工程下的.h文件使用include"" (2)如果cpp与c文件共存,会有预编译头不兼容的问题,可以设置所有源文件的属性

关于VS2015支持编译Linux程序的问题

现状 目前已经发布的VS2015中包括VS2015 Preview 以及 VS2015 CTP6,这两个版本均不支持直接编译C++代码为Linux程序,具体情况可以参考 Visual Studio 2015 CTP 6 和 Visual Studio 2015 Preview. 正式版发布时间 在微软官网没有找到明确的发布时间,只是说在今年晚些时间发布.另外Windows10正式版的发布时间为夏末秋初,推测到时候VS2015正式版也会一起推出,参考文章夏末秋初!Windows 10正式版发布时间