cmake指令
脚本指令
cmake参数类型分为 方括号参数 引号参数 非引号参数
方括号参数
message(\[\[contens]])
message([===[contents]===])
引号参数
message("contens")
message(" multi... line")
message("inhrent variables: ${CMAKE_VERSION}")
非引号参数 没懂
项目指令
CTest指令
变量
变量名区分大小写 可以包含任何字符 变量操作指令有set()和unset()还有string() list()等
变量名可以写空格 但是影响效率
set(MyString "str content 1")
引用变量
cmake对引用变量会进行重复展开,直到不能展开为止。 {MyOuters{MyInner}} 会先展开MyInner,然后展开 因此变量的书写尽量不要太逆天
ENV{} 用于引用环境变量 $CACHE{} 用于引用缓存变量
在命令行能够通过 -- 向脚本传递信息 CMAKE_ARGV CMAKE_ARC 分别记录值和参数数量 --不传递也行
环境变量
在系统里创建环境变量之后,设置的值会存储在构建树中 如果不改构建树环境变量是不会变的
缓存变量
缓存变量是存储在CMakeCache.txt文件中的变量。
set(<variable> <value> CACHE <type> <docstring> [FORCE])
e.g.
set(VAR1 "VALUE1" CACHE STRING "VARAIBLE1" FORCE)
其中type的类型包括BOOL FILEPATH PATH STRING INTERNAL
BOOL的取值有 ON OFF
FILEPATH ??
PATH ??
STRING ??
INTERNAL 会隐式添加FORCE项
docstring 为说明性文字?
FORCE用于强制覆盖已经设定的值
set(VAR1 "value1" CACHE STRING "variables")
message("VAR1: " ${VAR1})
set(VAR1 "value2" CACHE STRING "variables")
message("VAR1: " ${VAR1})
set(VAR1 "value3" CACHE STRING "variables")
message("VAR1: " ${VAR1})
VAR1均为value1
set(VAR1 "value1" CACHE STRING "variables")
message("VAR1: " ${VAR1})
set(VAR1 "value2" CACHE STRING "variables" FORCE)
message("VAR1: " ${VAR1})
set(VAR1 "value3" CACHE STRING "variables")
message("VAR1: " ${VAR1})
VAR1被强制覆盖,value2
变量作用域
函数作用域 function() 目录作用域 add_subdirectory() 脚本中这个是用不了的
1.变量会覆盖嵌套的子作用域中,类似于多态或者重写。如果子作用域有值用子作用域的,如果没有就是父作用域的值。退出当前局部作用域之后,当前作用域的变量消失。
2.可以在子作用域中修改父作用域的变量,但只能修改高一级的,高两级及以上的就不行了。 修改方法是set(VAR "value" PARENT_SCOPE)
列表
创建列表 set(mylist "value1" "value2" "value3") 列表接口 list(LENGTH <list> <out-var>)
list(LENGTH mylist VARL)
message("list len: " ${VARL})
list(GET <list> <element index> [<index> ...] <out-var>)
list(GET mylist 0 VAR0)
message("var0 is :" ${VAR0})
list(JOIN mylist <glue> <out-var>) 其中<glue>就是一个字符串 用来连接mylist中的各个元素
list(JOIN mylist " _ " L3)
message("L3 : " ${L3})
list(SUBLIST <list> <begin> <length> <out-var>)
list(SUBLIST mylist 1 2 SL)
message("sl: " ${SL})
list(FIND )
list(APPEND <list> [<>])
list(FILTER {INCLUDE | EXCLUDE} REGEX )
list(INSERT <list>)
list(POP_BACK
list(POP_FRONT
list(PREPEND )
list(REMOVE_ITEM ...)
list(REMOVE_AT ...)
list(REMOVE_DUPLICATES )
list(TRANSFORM
list(REVERSE )
list(SORT <list>)
控制结构
if(<condtion>)
<command>
elseif(<condtion>)
<command>
else(<condtion>)
<command>
endif(<condtion>)
<condition>支持NOT AND OR逻辑运算符
if(<cond1> AND | OR <cond2>)
if(NOT <cond>)
字符串和变量的求值
运行一个例子查看结果
set(FOO BAR)
set(FOOR "BAR")
if(${FOO})
message("foo in")
endif ()
if(${FOOR})
message("foor in")
endif ()
if(FOO)
message("$ foo in")
endif ()
if(FOOR)
message("$ foor in")
endif ()
!!![deprecated]发现只有{}会进行宏展开,然后判断展开后的字符串是否是 等于ON Y YES TRUE 或一个非零数,如果是,判断为true否则判断为false【!!!这好像已经不再是这样了】
set (cond TRUE)
if(${cond})
<command>
endif()
上述代码会告警,
CMake Warning (dev) at chap2.cmake:90 (if):
if given arguments:
"TRUE"
An argument named "TRUE" appears in a conditional statement. Policy
CMP0012 is not set: if() recognizes numbers and boolean constants. Run
"cmake --help-policy CMP0012" for policy details. Use the cmake_policy
command to set the policy and suppress this warning.
This warning is for project developers. Use -Wno-dev to suppress it.
正确的应该是
set(cond TRUE)
if(cond)
<command>
endif()
简单版 如果变量cond的值是YES Y TRUE true的时候,if(${cond})会告警。 除此之外,cond为ON Y YES TRUE true 非零数字时,条件为真。 如果,cond为OFF NO FLASE N IGNORE NOTFOUND -NOTFOUND结尾字符串 空字符串 零时,条件为假。
判断变量是否已经定义
if(DEFINED <name>)
if(DEFINED CACHE{<name>})
if(DEFINED ENV {<name>})
比较操作
LESS
EQUAL
LESS_EQUAL
GREATER
GREATER_EQUAL
VERSION_LESS_EQUAL
STREQUAL
检查操作
IN_LIST??
command??
POLICY??
test??
target??
e.g. 具体用法??
文件系统检查
EXISTS <path-to-file-or-directory> 目录存在
<file1> IS_NEWER_THAN <file2> 哪个更新
IS_DIRECTORY <path-to-directory> 检测路径是否为目录
IS_SYMLINK <file-name> 是否为符号链接?
IS_ABSOLUTE <path> 是否为绝对路径
循环
while foreach 语法
foreach(var RANGE <max>)
commands
endforeach()
foreach(var RANGE <min> <max> <step>)
commands
endforeach()
foreach(var IN [LISTS <list>...] [ITEMS <item>...])
commands
endforeach()
foreach(var IN ZIP_LISTS <list1> <list2> ...)
commands(var_0 var_1)
endforeach()
foreach(var num IN ZIP_LISTS <list1> <list2> ...)
commands(var num)
endforeach()
e.g.
foreach (num RANGE 10)
message("num: " ${num})
endforeach ()
foreach (num RANGE 2 10 3)
message("num: " ${num})
endforeach ()
foreach (var IN LISTS ls ITEMS "item22")
message("item: " var)
endforeach ()
foreach (v IN ZIP_LISTS L1 L2)
message("v1: ${v_1}, v2: ${v_0}")
endforeach ()
foreach (v1 v2 IN ZIP_LISTS L1 L2)
message("v1: ${v1}, v2: ${v2}")
endforeach ()
macro和function e.g.
function(MyFunction FirstArg)
set(FirstArg "new value")
message("Function: ${CMAKE_CURRENT_FUNCTION}")
message("Function list dir: ${CMAKE_CURRENT_FUNCTION_LIST_DIR}")
message("Function list file: ${CMAKE_CURRENT_FUNCTION_LIST_FILE}")
message("Function list line: ${CMAKE_CURRENT_FUNCTION_LIST_LINE}")
endfunction()
set(FirstArg "new value1")
MyFunction("value1" "value2")
message("FirstArg in global scope: " ${FirstArg})
2.6实用指令
message(FATAL_ERROR "FATAL_ERROR")
message(SEND_ERROR "SEND_ERROR")
message(WARNING "WARNING")
message(AUTHOR_WARNING "AUTHOR_WARNING")
message(DEPRECATION "DEPRECATION")
message(NOTICE "NOTICE")
message(STATUS "STATUS")
message(VERBOSE "VERBOSE")
message(DEBUG "DEBUG")
message(TRACE "TRACE")
添加调试上下文
list(APPEND CMAKE_MESSAGE_CONTEXT "foo")
message("msg1")
list(APPEND CMAKE_MESSAGE_CONTEXT "top")
message("msg2")
cmake -P script.cmake --log-context
2.6.2
include()指令
include(<file | module> [OPTIONAL] [RESULT_VARIABLE <var>])
e.g.
include(/sub1/sub.cmake OPTIONAL RESULT_VARIABLE res)
if(res)
message("res:" ${res})
endif()
include指令访问并打开另一个脚本(模块),共享作用域。未指定OPTIONAL的情况下,如果文件不存在报错。同时,可以指定RESULT_VARIABLE var保存查找结果,如果找到填充文件路径否则用NOT_FOUND填充。
2.6.3 include_guard() 包含有副作用的文件,??什么样的副作用? include_guard(GLOBAL DIRECTORY) ??
2.6.4 file()指令
file(WRITE Hello.txt "this is a script")
file(READ Hello.txt oc)
message("oc: " ${oc})
file(APPEND Hello.txt "\nthis is a new line.")
file(READ Hello.txt oc)
file(DOWNLOAD www.baidu.com baidu.html)
message("oc: " ${oc})
2.6.5 execute_process()指令
execute_process(COMMAND <cmd1> [<arguments>]... [OPTIONS])
e.g.
execute_process(COMMAND pwd WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/build RESULTS_VARIABLE res)
可选参数包括 TIMEOUT <seconds> WORKING_DIRECTORY <directory> RESULT_VARIABLE <var> RESULTS_VARIABLE <var> OUTPUT_VARIABLE ERROR_VARIABLE