1.List用法
list(LENGTH <list><output variable>)
list(GET <list> <elementindex> [<element index> ...]<output variable>)
list(APPEND <list><element> [<element> ...])
list(FIND <list> <value><output variable>)
list(INSERT <list><element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value>[<value> ...])
list(REMOVE_AT <list><index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
LENGTH
返回list的长度
GET
返回list中index的element到value中
APPEND
添加新element到list中
FIND
返回list中element的index,没有找到返回-1
INSERT
将新element插入到list中index的位置
REMOVE
从list中删除某个element
REMOVE_AT
从list中删除指定index的element
EMOVE_DUPLICATES
从list中删除重复的element
REVERSE
将list的内容反转
SORT
将list按字母顺序排序
2.file用法
1)Reading
file(READ <filename> <variable>
[OFFSET <offset>] [LIMIT <max-in>] [HEX])
从名为的文件中读取内容<filename>
并将其存储在 <variable>
. 可选择从给定的开始<offset>
并最多读取<max-in>
字节。该HEX选项将数据转换为十六进制表示
file(STRINGS <filename> <variable> [<options>...])
#解析 ASCII 字符串列表<filename>
并将其存储在 <variable>
.variable中新建一个列表,然后每一个项目都是输入文件的一行
file(<HASH> <filename> <variable>)
#计算内容的加密哈希<filename>
并将其存储在<variable>
. 支持的<HASH>
算法名称是由string() 命令列出的名称。
file(TIMESTAMP <filename> <variable> [<format>] [UTC])
#计算修改时间的字符串表示<filename>
并将其存储在<variable>
. 如果命令无法获取时间戳变量,则将设置为空字符串(“”)
2)Writing
file(WRITE <filename> <content>...)
file(APPEND <filename> <content>...)
写入/加入<content>
一个名为<filename>
. 如果文件不存在,则会创建它
3)Filesystem
file(GLOB <variable>
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
生成与 匹配的文件列表<globbing-expressions>
并将其存储到<variable>
. 这里用一个例子说明:
file(GLOB_RECURSE NODE_SRCS "src/*_node.cpp")
捕获所有src目录下面的.cpp 文件作为源文件 (NODE_SRCS)
file(REMOVE [<files>...])
file(REMOVE_RECURSE [<files>...])
删除给定的文件。该REMOVE_RECURSE
模式将删除给定的文件和目录,以及非空目录。如果给定文件不存在,则不会发出错误
file(RENAME <oldname> <newname>
[RESULT <result>]
[NO_REPLACE])
将文件系统中的文件或目录从 <oldname>
到 <newname>
,以原子方式替换目标。
4)Path Conversion
#计算已解析符号链接的现有文件或目录的绝对路径。
file(REAL_PATH <path> <out-var> [BASE_DIRECTORY <dir>] [EXPAND_TILDE])
#计算从 a<directory>到 a的相对路径<file>并将其存储在<variable>.
file(RELATIVE_PATH <variable> <directory> <file>)
5)Transfer
file(DOWNLOAD <url> [<file>] [<options>...])
file(UPLOAD <file> <url> [<options>...])
该DOWNLOAD
子命令将给定的内容下载<url>
到本地<file>
。该UPLOAD
模式将本地上传<file>
到给定的<url>
.
6)Locking
file(LOCK <path> [DIRECTORY] [RELEASE]
[GUARD <FUNCTION|FILE|PROCESS>]
[RESULT_VARIABLE <variable>]
[TIMEOUT <seconds>])
<path>
如果不存在DIRECTORY
选项, 则锁定指定的文件,<path>/cmake.lock
否则锁定文件。文件将被 GUARD
选项定义的范围锁定(默认值为PROCESS
)。RELEASE
选项可用于显式解锁文件。如果TIMEOUT
未指定选项,CMake 将等待锁定成功或发生致命错误。如果TIMEOUT
设置为 0
锁定,将尝试一次并立即报告结果。如果 TIMEOUT
不是0
,CMake 将尝试在<seconds>
value 指定的时间段内锁定文件。如果没有 RESULT_VARIABLE
选项,任何错误都将被解释为致命错误。否则结果将被存储<variable>
并0
在成功或失败时显示错误消息。
7)Archiving
file(ARCHIVE_CREATE OUTPUT <archive>
PATHS <paths>...
[FORMAT <format>]
[COMPRESSION <compression> [COMPRESSION_LEVEL <compression-level>]]
[MTIME <mtime>]
[VERBOSE])
3.include用法
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>]
[NO_POLICY_SCOPE])
include 指令用来载入并运行来自于文件或模块的 CMake 代码。比如:
调用一个包,就是常规三步:find_package,include_directions,target_link_libraries
有时候还需要一些判断,就加一些if else。
这样也是同样的问题,包多的时候代码太杂。所以我们把每个包对应的这些操作放在cmake文件夹下对应的XX.cmake文件中,然后在CMakeLists中 include(cmake/XX.cmake)一行代码就可以搞定。
4.find_package用法
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
PackageName
:依赖包名称;version
:版本号,如果指定,那么find_package
一定要检查找到的包是否与与version版本兼容;EXACT
:如果指定,表示必须完全匹配version指定版本的包而不是仅仅兼容就可以;QUIET
:如果指定,表示disable信息输出,即命令运行时不输出相关message,即使没有找到该包。但是如果REQUIRED
被指定,还是会有信息输出;MODULE
:表示只用于module模式,即使没有找到也不会进入CONFIG模式;REQUIRED
:表示此包是必须的,如果没有找到,构建程序报错并终止;[COMPONENTS] [components…]
:表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行;OPTIONAL_COMPONENTS components…
:可选的依赖组件,即使找不到也不会影响cmake继续执行;
5.set用法
set(<variable> <value>... [PARENT_SCOPE])
将<value>
赋值给<variable>
6.add_executable
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])
添加一个<name>
从命令调用中列出的源文件构建的可执行目标。对应于逻辑目标名称, <name>
并且在项目中必须是全局唯一的。[source1] [source2 ...]
:构建可执行目标文件所需要的源文件。也可以通过target_sources()
继续为可执行目标文件添加源文件,要求是在调用target_sources
之前,可执行目标文件必须已经通过add_executable
或add_library
定义了。