cmake使用一 —— cmake语法

来源:互联网 发布:淘宝汽车凹陷修复工具 编辑:程序博客网 时间:2024/04/30 21:51

cmake语法

 ()

2012-04-28

 

Cmake是一个用于生成交叉平台编译工程的工具。它类似autoconf。它产生你所选择的编译环境的本地makefileworkspaces

 

英文原文地址:http://www.cmake.org/cmake/help/syntax.html

 

Cmake的输入是在源码目录下的CMakeLists.txt文件。这个文件可以用include或者 add_subdirectory命令增加入其它的输入文件。

语法

CMakeList.txt文件是由注释、命令和空白字符组成。

注释是由 # 开始,到行结尾。

命令是由:命令名、(、空格分隔的参数、)组成。

例如:command (args….)

上面的command可以是一个命令名;或者是一个宏;也可以是一个函数名。

args是以空格分隔的参数例表(如果参数中包含空格,则要加双引号)

除了用于分隔参数的空白字符(空格、换行号、tabs)都是被忽略不计的。任何包含在双引号中的字符都做为一个参数。一个反斜杠用于转换码。

命令名是大小写不敏感的。

 

 

字符串(string)和字符串列表(lists

CMake的基本数据类型是字符串(string)。CMake也支持由字符串组成的字符串列表。字符串列表可以由;或空格分隔的组成。例如:下面设置变量var是等效的。

set(var a;b;c)

set(var a b c)

字符串列表可以用 foreach命令叠代(iterated)或list命令操作。

 

变量

CMake支持简单的变量:字符串或字符串列表。用${VAR}语法得到变量的引用。

可以用一个set命令把一个字符串列表设置为一个变量,然后把这个变量传递给需要传递多参数的函数。例如:

set(Foo a b c)

command(${Foo})

上面两行等效 command(a b c)

 

如果你想传把一个字符串列表做为一个单独的参数传递给函数,用双引号包含它。例如:

Command(“${Foo}”)

等效于:command(“a b c”)

 

环境变量:

$ENV{VAR}得到环境变量的引用

设置环境变量:

Set(ENV{VAR} /home)

 

程序流控制

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.         程序定义:宏或函数(函数在CMake2.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)

译者注:

函数可以返回,可以用 return()命令返回。如果要从函数中返回值,只能通过参数返回:

#定义函数 get_lib从给定的目录查找指定的库,并把它传回到参数 lib_FILE

function(get_lib lib_FILE lib_NAME lib_PATH)

       #message("lib_name:""${lib_NAME}")

       set(__LIB "__LIB-NOTFOUND")

       #message("__LIB:""${__LIB}")

      

       find_library(__LIB ${lib_NAME} ${lib_PATH})

       if(__LIB STREQUAL "__LIB-NOTFOUND")

              message("don't find ${lib_NAME} librarys in ${lib_PATH}")

              return()

       endif()

      

       #message("__LIB:""${__LIB}")

      

       set(${lib_FILE} ${__LIB}PARENT_SCOPE)

endfunction(get_lib)

 

set命令中 PARENT_SCOPE表示传递给函数调用者所拥有的变量

 

引号、字符串和escapes

一个用双引号包含的字符串,是这个字符串的字面含义。一个字符串能包含多行。例如:

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 hell"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)。

    • ^ 匹配一行或一字符串开头
    • $匹配一行或一字符串结尾
    • .匹配单一字符或一个新行
    •  [ ]匹配括号中的任一字符
    • [^ ] 匹配不在括号内的任一字符
    • [-] 匹配指定范围内的字符
    • * 匹配0次或多次
    • + 匹配一次或多次
    • ? 匹配0次或一次
    • ()保存匹配的表达式并用随后的替换它

原创粉丝点击