cmake语法
康 林(译)
2012-04-28
Cmake是一个用于生成交叉平台编译工程的工具。它类似autoconf。它产生你所选择的编译环境的本地makefile和workspaces。
英文原文地址: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)。