cmake 深入 - 基础命令
在前面我们了解到一些cmake的基本的使用方法,这里我们将对每个命令都做一些介绍,方便一些特定的需求。
基础命令
命令 | 说明 |
---|---|
break | 强制退出循环,和 foreach 或者 while 一起连用 |
cmake_host_system_information 详 | 查询主机信息 |
cmake_minimum_required 详 | cmake版本指定 |
cmake_parse_arguments 详 | 参数生成指令 |
cmake_policy 详 | 可以使用该指令根据项目的实际情况修改规则 |
configure_file 详 | 配置文件,运用该函数,可以根据编译的环境或者配置动态的生成配置文件 |
continue 详 | 退出本次循环,和 foreach 或者 while 一起连用 |
else | 判断分支,和 if 连用, 详情见 if |
elseif | 判断分支,和 if 连用, 详情见 if |
endforeach | foreach结束, 和 foreach 连用, 详情见 foreach |
endfunction | function结束, 和 function 连用, 详情见 function |
endif | if 结束, 和 if 连用, 详情见 if |
endmacro | macro 结束, 和 macro 连用, 详情见 macro |
endwhile | while 结束, 和 while 连用, 详情见 while |
execute_process 详 | 执行子进程 |
file 详 | 文件操作 |
find_file 详 | 寻找文件 |
find_library 详 | 寻找库 |
find_package 详 | 寻找程序包 |
find_path 详 | 寻找目录路径 |
find_program 详 | 寻找程序 |
foreach 详 | foreach 循环 |
function 详 | 程序定义 |
get_cmake_property 详 | 获取cmake属性 |
get_directory_property 详 | 获取目录属性 |
get_filename_component 详 | 获取文件名的各个部分 |
get_property 详 | 获取属性 |
if 详 | if判断 |
include 详 | 引用外部cmake代码 |
include_guard 详 | 引用保护 |
list 详 | 列表操作 |
macro 详 | 宏定义 |
mark_as_advanced 详 | 高级标记 |
math 详 | 数学计算 |
message 详 | 消息打印 |
option 详 | 定义选择项 |
return 详 | 返回退出当前文件,模块或者程序 |
separate_arguments 详 | 对命令参数进行分隔 |
set 详 | 定义变量并赋值 |
set_directory_properties 详 | 设置目录属性 |
set_property 详 | 设置属性 |
site_name 详 | 获取计算机名称 |
string 详 | 字符串操作 |
unset 详 | 取消变量定义 |
variable_watch 详 | 变量修改回调函数设置 |
while 详 | while循环 |
|目录| |
---|
cmake_host_system_information
cmake_host_system_information(RESULT <variable> QUERY <key> ...)
将 主机的 指定 <key> 信息,放入 <variable> 中。后面可以使用 <variable> 来做判断或者显示等操作。
<key> 信息如下:
值 | 说明 |
---|---|
NUMBER_OF_LOGICAL_CORES | 主机逻辑核数目,cpu线程数 |
NUMBER_OF_PHYSICAL_CORES | 主机物理核数目,cpu内核数 |
HOSTNAME | 主机名字 |
FQDN | 域名 |
TOTAL_VIRTUAL_MEMORY | 虚拟内存总大小 |
AVAILABLE_VIRTUAL_MEMORY | 虚拟内存可用大小 |
TOTAL_PHYSICAL_MEMORY | 物理内存总大小 |
AVAILABLE_PHYSICAL_MEMORY | 物理内存可用大小 |
IS_64BIT | 是否是64位,如果是的话,查询值会被赋为1 |
HAS_FPU | cpu是否支持浮点运算 |
HAS_MMX | cpu是否支持MMX(多媒体扩展指令) |
HAS_MMX_PLUS | cpu是否支持MMX PLUS(加强的多媒体扩展指令) |
HAS_SSE | cpu是否支持 SSE |
HAS_SSE2 | cpu是否支持 SSE2 |
HAS_SSE_FP | cpu是否支持 SSE FP |
HAS_SSE_MMX | cpu是否支持SSE MMX |
HAS_AMD_3DNOW | 是否是支持 3D NOW技术的AMD cpu |
HAS_AMD_3DNOW_PLUS | 是否是支持 3D NOW PLUS技术的AMD cpu |
HAS_IA64 | 是否是IA64指令集处理器 |
HAS_SERIAL_NUMBER | cpu是否有序列号 |
PROCESSOR_SERIAL_NUMBER | cpu 序列号查询 |
PROCESSOR_NAME | cpu名称 |
PROCESSOR_DESCRIPTION | cpu的全部说明 |
OS_NAME | 操作系统名字,其实类似于uname -s命令的查询结果,参考CMAKE_HOST_SYSTEM_NAME |
OS_RELEASE | 操作系统子类型 |
OS_VERSION | 操作系统版本 |
OS_PLATFORM | 运行平台信息,类是于uname -p命令,参考CMAKE_HOST_SYSTEM_PROCESSOR |
| 命令 |目录| |
---|
cmake_minimum_required
cmake_minimum_required 命令我们比较熟悉了,其实这个函数可以局部使用,在子模块或者函数中使用,只有在当前模块做版本做判断.
我们认识的 cmake_minimum_required 这只是表面, cmake_minimum_required 命令其实背后偷偷调用了 cmake_policy 命令来实现我们的功能的.
如果你要的版本是2.4以上:
cmake_policy(VERSION <min>[...<max>])
如果你要的是2.4以下版本:
cmake_policy(VERSION 2.4[...<max>])
这里做了一个兼容,也就是说,你永远都看不到2.4以下的版本.
| 命令 |目录| |
---|
cmake_parse_arguments
cmake_parse_arguments 用于宏定义或者函数中,这个函数可以处理提供给函数的参数,产生一系列的变量供后面使用。
有两种使用方法,第一种是在函数后者宏定义中使用:
cmake_parse_arguments(<prefix> <options> <one_value_keywords>
<multi_value_keywords> <args>...)
- <prefix>,变量的头部标识。
- <options>,选项变量,该类变量没有值。
- <one_value_keywords>,单值变量,只能拥有一个值。
- <multi_value_keywords>,多值变量,可以拥有多个值。
第二种只能在函数中使用:
cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
<one_value_keywords> <multi_value_keywords>)
除了标志PARSE_ARGV外, 在该定义中,其实是多了一个 <N> 变量, 该变量从第<N>个位置开始解析,可以允许特殊字符出现在解析的字符串中。
来看个例子:
macro(my_install)
set(options OPTIONAL FAST) #可选变量
set(oneValueArgs DESTINATION RENAME) # 单值变量
set(multiValueArgs TARGETS CONFIGURATIONS) # 多值变量
cmake_parse_arguments(MY_INSTALL "${options}" "${oneValueArgs}"
"${multiValueArgs}" ${ARGN} )
# MY_INSTALL 是变量头
# ...
我们通过下面方法调用宏定义:
my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub CONFIGURATIONS)
调用后,就可以使用下面变量了:
MY_INSTALL_OPTIONAL = TRUE
MY_INSTALL_FAST = FALSE # 未定义
MY_INSTALL_DESTINATION = "bin"
MY_INSTALL_RENAME <UNDEFINED> # 未定义
MY_INSTALL_TARGETS = "foo;bar"
MY_INSTALL_CONFIGURATIONS <UNDEFINED> # 未定义
MY_INSTALL_UNPARSED_ARGUMENTS = "blub" # OPTIONAL接受值,所以blub没有意义,成为没有解析的值
MY_INSTALL_KEYWORDS_MISSING_VALUES = "CONFIGURATIONS" #没有解析成功的变量
注意:
- FAST 变量没有给出,所以是FALSE
- 这里调用宏的时候没有给 RENAME 赋值,所以无效。
- CONFIGURATIONS 是多值变量,这里没有赋值,没有解析成功,所以无效。
- 我们可以通过 MY_INSTALL_UNPARSED_ARGUMENTS MY_INSTALL_KEYWORDS_MISSING_VALUES 两个变量来判断我们宏定义的调用状态。
接下来,你就可以在后面的cmake脚本中使用这些变量了。
| 命令 |目录| |
---|
cmake_policy
cmake演变至今已经有了很多版本,而且有的版本也许包含有一些特色功能,随着版本的迭代,可能被淹没在历史中。
如果项目需要, 我们怎么在新版本中使用一些老的功能呢, 没错,cmake为我们提供了 cmake_policy 函数。 通过 cmake_policy 的配置,可以做到新老兼顾,也算是cmake的一个特色。
其实在之前我们就了解过这个函数的 VERSION 参数了,通过这个参数的设置,可以指定cmake运行的版本。
虽然我们可以通过版本来得到我们想要的功能,但是并没有一个版本包含所有的功能。
其实这个函数设置功能的参数的可读性并不强, 规则都是采用的 CMP<NNNN> 的方式进行编码的,反正看到一串数字我们可能感觉莫名奇妙,不过每个<NNNN>编号多有对应详细的文档说明,文档中会指出老版本对应的功能,老版本选项对应的功能,以及做修改的原因。
设置规则的命令的使用方式如下:
cmake_policy(SET CMP<NNNN> NEW)
cmake_policy(SET CMP<NNNN> OLD)
查看规则的命令使用方式如下:
cmake_policy(GET CMP<NNNN> <variable>)
这些协议还有另外一个玩法, 就是协议栈,协议栈就像是堆栈一样,通过PUSH和POP来完成协议的修改,也可以可以直接在 include 和 find_package 函数中设置 NO_POLICY_SCOPE 来废弃协议栈的影响。
cmake_policy(PUSH)
cmake_policy(POP)
注意: PUSH必须和POP配对,才能让协议栈回复到最初的状态。我们可以使用这个方式非常方便的做协议栈的临时变动。
| 命令 |目录| |
---|
configure_file
configure_file(<input> <output>
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
该函数的功能就是将 <input> 指定的文件内容,进行修改替换,并保存在 <output> 中。
-
<input> 输入文件路径,必须是一个文件名字,可以是 CMAKE_CURRENT_SOURCE_DIR 的相对路径。
-
<output> 输出文件路径,可以是 CMAKE_CURRENT_BINARY_DIR 先对路径。如果指定的路径是一个目录,那输出文件就以输入文件的名字保存在该路径下。
-
<COPYONLY> 只复制,不修改,NEWLINE_STYLE 可能也不会生效
-
<ESCAPE_QUOTES> 将引号使用反斜杠进行转译
-
<@ONLY> 只替换 @VAR@ 类型的变量,不替换 ${VAR} 类型的。这样可以避免修改的到像 Makefile 这样使用 ${} 作为变量的脚本。
-
<NEWLINE_STYLE> 定义换行符
换行符定义 换行符 UNIX, LF \n DOS, WIN32, CRLF \r\n
嗯,下面来看一个例子:
创建一个 foo.h.in 文件,内容如下:
#cmakedefine FOO_ENABLE
#cmakedefine FOO_STRING "@FOO_STRING@"
在cmake文件中添加:
option(FOO_ENABLE "Enable Foo" ON)
if(FOO_ENABLE)
set(FOO_STRING "foo")
endif()
configure_file(foo.h.in foo.h @ONLY)
运行后会在cmake编译的目录下生成 foo.h 文件, 内容如下:
#define FOO_ENABLE
#define FOO_STRING "foo"
如果不定义 FOO_ENABLE 和 FOO_STRING两个变量,运行效果如下:
/* #undef FOO_ENABLE */
/* #undef FOO_STRING */
需要注意的是, foo.h 默认生成在目标文件目录, 如果要使用需要指定 include 目录:
include_directories(${CMAKE_CURRENT_BINARY_DIR})
然后才能在项目源文件中,加入 #include <foo.h> 来引用该头文件。
这里我还有点问题,没有得到上面的结果,等学完了再来检查原因。
| 命令 |目录| |
---|
execute_process
execute_process(COMMAND <cmd1> [<arguments>]
[COMMAND <cmd2> [<arguments>]]...
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[RESULTS_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[COMMAND_ECHO <where>]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
[ENCODING <name>])
参数说明:
参数 | 说明 |
---|---|
COMMAND | 调用命令,所有的参数都会逐字的给子进程,包括重定向符号 > 。重定向实用INPUT_*, OUTPUT_* 和 ERROR_*来完成的 |
WORKING_DIRECTORY | 子进程的工作目录 |
TIMEOUT | 运行最长时间 |
RESULT_VARIABLE | 最后一个进程的运行返回状态 |
RESULTS_VARIABLE | 所有子进程返回的状态的队列 |
OUTPUT_VARIABLE ERROR_VARIABLE | 标准输出和标准错误,如果定义的值是一样的,就会合并输出 |
INPUT_FILE OUTPUT_FILE ERROR_FILE | 第一个进程的标准输入文件,最后一个进程的标准输出文件,所有文件的错误输出文件,如果定义为同一个,就会合并 |
OUTPUT_QUIET ERROR_QUIET | 忽视标准输出和忽视标准错误 |
COMMAND_ECHO | 打印命令执行输出方式,如果不设置,将采用CMAKE_EXECUTE_PROCESS_COMMAND_ECHO设置的默认方式 |
OUTPUT_STRIP_TRAILING_WHITESPACE | 转译标准输出 |
ERROR_STRIP_TRAILING_WHITESPACE | 转译标准错误 |
ENCODING | windows系统的输出编码格式,其他系统忽视 |
execute_process 命令比 exec_program 更加强大,但也保留了旧命令的兼容性,这两个命令在生成项目的时候都可以用,另外,我们可以使用 add_custom_target 和 add_custom_command 来创建执行的命令。
| 命令 |目录| |
---|
file
文件操作,包括,读写,系统操作,转换,传输和文件锁等操作。本应该详细写,但由于内容比较驳杂,再者用cmake来做文件出来,显得有点笨重,不如python或者shell来得轻便,这里我对前面的做了记录,后期在做整理。
Reading
# 文件普通读取
file(READ <filename> <variable>
[OFFSET <offset>] [LIMIT <max-in>] [HEX])
# 以字符串的方式读取,如果是二进制文件,就会忽略, 参数有:
# LENGTH_MAXIMUM: 最大长度
# LENGTH_MINIMUM: 最小长度
# LIMIT_COUNT: 查找个数
# LIMIT_INPUT: 最大输入字节数
# LIMIT_OUTPUT: 最大输出字节数
# NEWLINE_CONSUME: 换行符,默认是 \n
# NO_HEX_CONVERSION; 二进制转换方式
# REGEX: 只读取复合改正则表达式的句子
# ENCODING: 编码,支持UTF-8, UTF-16LE, UTF-16BE, UTF-32LE, UTF-32BE
file(STRINGS <filename> <variable> [<options>...])
# 哈希文件
file(<HASH> <filename> <out-var>)
# UTC时间文件
file(TIMESTAMP <filename> <variable> [<format>] [UTC])
# 给定文件夹递归文件的方式来获取依赖库,可以作为 install(CODE) 或者 install(SCRIPT)的子命令
file(GET_RUNTIME_DEPENDENCIES
[RESOLVED_DEPENDENCIES_VAR <deps_var>]
[UNRESOLVED_DEPENDENCIES_VAR <unresolved_deps_var>]
[CONFLICTING_DEPENDENCIES_PREFIX <conflicting_deps_prefix>]
[EXECUTABLES [<executable_files>...]]
[LIBRARIES [<library_files>...]]
[MODULES [<module_files>...]]
[DIRECTORIES [<directories>...]]
[BUNDLE_EXECUTABLE <bundle_executable_file>]
[PRE_INCLUDE_REGEXES [<regexes>...]]
[PRE_EXCLUDE_REGEXES [<regexes>...]]
[POST_INCLUDE_REGEXES [<regexes>...]]
[POST_EXCLUDE_REGEXES [<regexes>...]]
)
Writing
file({WRITE | APPEND} <filename> <content>...)
file({TOUCH | TOUCH_NOCREATE} [<file>...])
file(GENERATE OUTPUT <output-file> [...])
Filesystem
file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
file(RENAME <oldname> <newname>)
file({REMOVE | REMOVE_RECURSE } [<files>...])
file(MAKE_DIRECTORY [<dir>...])
file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
file(SIZE <filename> <out-var>)
file(READ_SYMLINK <linkname> <out-var>)
file(CREATE_LINK <original> <linkname> [...])
Path Conversion
file(RELATIVE_PATH <out-var> <directory> <file>)
file({TO_CMAKE_PATH | TO_NATIVE_PATH} <path> <out-var>)
Transfer
file(DOWNLOAD <url> <file> [...])
file(UPLOAD <file> <url> [...])
Locking
file(LOCK <path> [...])
find_file (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
| 命令 |目录| |
---|
find_*
我将 find_* 类的函数放在一起,也不是胡来,而是如果在Linux下的话,什么东西都是文件,所以分开来讲没有多大意义得。
cmake 中 find_* 包括 find_file find_library find_package find_path find_program五个命令,我分别粘贴出来,然后找共同点和不同点的方式对比学习方式快速掌握。
find_file (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
find_path (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
find_program (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS path1 [path2 ... ENV var]]
[PATHS path1 [path2 ... ENV var]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)
本来想将上面的四个函数并排起,但是markdown好像没有比较好的解决方案,虽然不能一眼看完,但是我们大致知道,其实这四个函数的参数结构基本一致。只有细节上有些许不同,我们先来看这四个函数的相同部分,然后再来看find_package函数:
参数 | 说明 |
---|---|
<VAR> | 找到’文件’得到变量前缀 |
NAMES | 区分到底是找一个文件,还是找一类文件 |
HINTS, PATHS | 默认路径以外的搜索路径 |
PATH_SUFFIXES | 指定目录下需要搜索的子目录 |
DOC | 说明 |
NO_DEFAULT_PATH | 表示不搜索其他所有路径, 注意的是,不管定不定义其他 NO_* 变量,都不搜索 |
NO_* | 取消搜索指定目录 |
CMAKE_FIND_ROOT_PATH_BOTH | 寻找根目录 |
ONLY_CMAKE_FIND_ROOT_PATH | 仅搜索重新树根的目录以及CMAKE_STAGING_PREFIX下的目录。 |
如果没有定义 NO_* 变量,我们来看看CMAKE的搜索路径:
注意, 有各个find_* 有点不一样,我这里以 find_include 为参考,其他类似。
-
如果没有设置 NO_PACKAGE_ROOT_PATH 并且嵌套在 find_package 中, 就得先找包的 ROOT 目录
-
如果没有设置 NO_CMAKE_PATH 并且 CMAKE_FIND_USE_CMAKE_PATH 没设置为 FALSE 我们接下来将要按顺序搜索下面的CMAKE的内置变量:
- CMAKE_PREFIX_PATH, 搜索 CMAKE_PREFIX_PATH 中定义的所有 <prefix>/include 目录,如果 CMAKE_LIBRARY_ARCHITECTURE 作了设置,还要搜索每个 <prefix>/include/<arch> 目录。
- CMAKE_INCLUDE_PATH
- CMAKE_FRAMEWORK_PATH
-
搜索 HINTS 指定的目录,查找的时候会对该变量定义的路径进行检查,具体检查啥,我还不太清楚。
-
如果没有定义 NO_SYSTEM_ENVIRONMENT_PATH 并且 CMAKE_FIND_USE_CMAKE_SYSTEM_PATH 没设置为 FALSE, 将在系统环境变量给出的路径进行搜索:
- CMAKE_SYSTEM_PREFIX_PATH 搜索 CMAKE_SYSTEM_PREFIX_PATH 中定义的所有 <prefix>/include 目录,如果 CMAKE_LIBRARY_ARCHITECTURE 作了设置,还要搜索每个 <prefix>/include/<arch> 目录。
- CMAKE_SYSTEM_SYSTEM__PATH
- CMAKE_SYSTEM_FRAMEWORK_PATH
-
搜索 PATHS 选项给定的路径,或者命令行的输入路径。
在 macOS 上,CMAKE_FIND_FRAMEWORK 和 CMAKE_FIND_APPBUNDLE 变量可以设置为 Unix样式 或者 Apple样式。
CMAKE_FIND_ROOT_PATH 变量指明了一个或者多个搜索路径,在交叉编译的时候非常有用,其实它算是 CMAKE_STAGING_PREFIX 的一个派生变量,CMAKE_STAGING_PREFIX负责定义交叉编译的搜索前缀。 CMAKE_FIND_ROOT_PATH 变量默认为空。
每个find_*对应 CMAKE_FIND_ROOT_PATH_* 变量,详细如下:
find_* | CMAKE_FIND_ROOT_PATH_* |
---|---|
find_include | CMAKE_FIND_ROOT_PATH_MODE_INCLUDE |
find_file | CMAKE_FIND_ROOT_PATH_MODE_INCLUDE |
find_library | CMAKE_FIND_ROOT_PATH_MODE_LIBRARY |
find_package | CMAKE_FIND_ROOT_PATH_MODE_PACKAGE |
find_path | CMAKE_FIND_ROOT_PATH_MODE_INCLUDE |
find_program | CMAKE_FIND_ROOT_PATH_MODE_PROGRAM |
find_* 函数的 CMAKE_FIND_ROOT_PATH 系列的变量指明是否在 CMAKE_FIND_ROOT_PATH 变量中搜索,在默认情况下会优先搜索 CMAKE_FIND_ROOT_PATH 给定的目录, 然后是 CMAKE_SYSROOT 给定的目录, 然后在是上面提到的目录。
变量 | 说明 |
---|---|
CMAKE_FIND_ROOT_PATH_BOTH | 按照上面的顺序进行检索 |
NO_CMAKE_FIND_ROOT_PATH | 不寻找 CMAKE_FIND_ROOT_PATH 的路径 |
ONLY_CMAKE_FIND_ROOT_PATH | 只搜素 CMAKE_STAGING_PREFIX 喜爱的路径 |
如果调用搜索成功,那路径就会保存在 <VAR> 变量里面,下次就不会再搜索了,如果不成功,变量会设在为 <VAR>-NOFOUND, 并且下次调用的时候,会再次进行搜索。
然后我们来看看 find_package 函数, find_package 可以所是cmake项目用得比较多的一个函数,在搜索的时候加了很多 package 特有的特性参数。
find_package 函数其实是用得最多的,也是 find_* 系列, 我们看到很多参数和上面其实也差不多。
find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[CONFIG|NO_MODULE]
[NO_POLICY_SCOPE]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_PACKAGE_REGISTRY]
[NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])
其实很多参数都是上面四个find差不多的,我们主要看看不一样的参数:
变量 | 说明 |
---|---|
<PackageName> | 需要查找的包名 |
version | 包的版本 |
EXACT | 精准匹配包的版本 |
QUIET | 后台查找 |
REQUIRED | 必须依赖,如果没有匹配的包,就退出 |
COMPONENTS | 包包含的组件 |
OPTIONAL_COMPONENTS | 可选组件 |
CONFIG|NO_MODULE | 在纯配置模式下,该命令将跳过模块模式搜索,并立即进行配置模式搜索 |
NO_POLICY_SCOPE | 不使用规则配置 |
NAMES | 如果给了该参数,就会替换<PackageName> |
CONFIGS | 配置文件,默认会搜索 <PackageName>Config.cmake 或者 <packagename>Config.cmake (后者是全小写) |
对于查询结果,变量信息也比较详细:
变量 | 说明 |
---|---|
CMAKE_FIND_PACKAGE_NAME | 包名字 |
<PackageName>_FIND_REQUIRED | 是否给定 REQUIRED |
<PackageName>_FIND_QUIETLY | 是否静默安装 QUIET |
<PackageName>_FIND_VERSION | 包的版本 |
<PackageName>_FIND_VERSION_MAJOR | 主版本 |
<PackageName>_FIND_VERSION_MINOR | 次版本 |
<PackageName>_FIND_VERSION_PATCH | 补丁版本 |
<PackageName>_FIND_VERSION_TWEAK | 调整版本 |
<PackageName>_FIND_VERSION_COUNT | 版本组件数,0到4 |
<PackageName>_FIND_VERSION_EXACT | 是否精准 EXACT |
<PackageName>_FIND_COMPONENTS | 所需组件列表 |
<PackageName>_FIND_REQUIRED_<c> | <c>是否是必选 |
感觉还有点马虎,有的地方也没有理解清楚,这里只是将理解了的做了记录,有错误的地方欢迎指正,对不能提供一个完整的可读教材感到抱歉。
| 命令 |目录| |
---|
foreach
foreach是用来做已知队列的循环,foreach 的主要格式如下:
foreach(<loop_var> <items>)
<commands>
endforeach()
foreach 的主要用法如下:
foreach(<loop_var> RANGE <stop>)
# 0, 1, … , <stop>
foreach(<loop_var> RANGE <start> <stop> [<step>])
# <start> , <start> + [1 | [<step>], <start> + [2 | [<step>*2], … , <stop>
foreach(loop_var IN [LISTS [<lists>]] [ITEMS [<items>]])
# 遍历LISTS和ITEMS组成的列表,列表元素用空格或者分号隔开
下面是一个例子:
set(A 0;1)
set(B 2 3)
set(C "4 5")
set(D 6;7 8)
set(E "")
foreach(X IN LISTS A B C D E)
message(STATUS "X=${X}")
endforeach()
循环结果为:
-- X=0
-- X=1
-- X=2
-- X=3
-- X=4 5
-- X=6
-- X=7
-- X=8
| 命令 |目录| |
---|
function
使用 function 可以定义一个函数,供后面重复调用。
function的思路和其他编程语言差不多,在cmake中还有类似的宏定义也能达到这种效果,后面在 macro 中会做介绍。
function(<name> [<arg1> ...])
<commands>
endfunction()
例子:
# 申明
function(foo)
<commands>
endfunction()
#调用, 大小写不敏感:
foo()
Foo()
FOO()
| 命令 |目录| |
---|
get_cmake_property
获取 property 熟悉,并保存在 var 变量中, 详细属性可以查看 cmake_property 章节的内容。
get_cmake_property(<var> <property>)
| 命令 |目录| |
---|
get_directory_property
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
# 将目录的 <prop-name> 属性 放到 <variable> 中
get_directory_property(<variable> [DIRECTORY <dir>]
DEFINITION <var-name>)
| 命令 |目录| |
---|
get_filename_component
获取 FileName 中的指定部分。
get_filename_component(<var> <FileName> <mode> [CACHE])
model 替换为以下值
model值 | 说明 |
---|---|
DIRECTORY | 目录名 |
NAME | 文件名 |
EXT | 最长后缀 |
NAME_WE | 没有目录或最长扩展名的文件名 |
LAST_EXT | 文件的最后的后缀 |
NAME_WLE | 没有目录或最后的扩展名的文件名 |
PATH | 2.8.11版本以前的目录名 |
get_filename_component(<var> <FileName> <mode> [BASE_DIR <dir>] [CACHE])
mode 替换为以下值:
model值 | 说明 |
---|---|
ABSOLUTE | 绝对路径 |
REALPATH | 没有符号链接的绝对路径 |
get_filename_component(<var> <FileName> PROGRAM [PROGRAM_ARGS <arg_var>] [CACHE])
程序查找,可以在系统设定的搜索路径中查找。
| 命令 |目录| |
---|
get_property
get_property(<variable>
<GLOBAL |
DIRECTORY [<dir>] |
TARGET <target> |
SOURCE <source> |
INSTALL <file> |
TEST <test> |
CACHE <entry> |
VARIABLE >
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS])
第二个参数必须是下面表格中值的一个:
参数 | 说明 |
---|---|
GLOBAL | 全局唯一,不接收参数 |
DIRECTORY | 默认是当前目录,可以通过该参数指定 |
TARGET | 指定一个存在的目标 |
SOURCE | 指定一个源文件 |
INSTALL | 指定安装路径 |
TEST | 存在的测试 |
CACHE | 缓存实体 |
VARIABLE | 指定一个变量名 |
PROPERTY 指出获取的属性名称, 可以通过 define_property 来定义属性。
最后一个值是:
参数 | 说明 |
---|---|
SET | 是否设置 |
DEFINED | 是否定义 |
BRIEF_DOCS | 获取简介 |
FULL_DOCS | 获取详细文档 |
对这个目前感觉有点抽象,只有后面在做补充了。
| 命令 |目录| |
---|
if
条件控制语句,使用方法如下:
if(<condition>)
<commands>
elseif(<condition>) # optional block, can be repeated
<commands>
else() # optional block
<commands>
endif()
条件使用如下:
if(<constant>)
if(<variable|string>)
if(NOT <condition>)
if(<cond1> AND <cond2>)
if(<cond1> OR <cond2>)
if(COMMAND command-name)
if(POLICY policy-id)
if(TARGET target-name)
if(TEST test-name)
if(EXISTS path-to-file-or-directory)
if(file1 IS_NEWER_THAN file2)
if(IS_DIRECTORY path-to-directory)
if(IS_SYMLINK file-name)
if(IS_ABSOLUTE path)
if(<variable|string> MATCHES regex)
if(<variable|string> LESS <variable|string>)
if(<variable|string> GREATER <variable|string>)
if(<variable|string> EQUAL <variable|string>)
if(<variable|string> LESS_EQUAL <variable|string>)
if(<variable|string> GREATER_EQUAL <variable|string>)
if(<variable|string> STRLESS <variable|string>)
if(<variable|string> STRGREATER <variable|string>)
if(<variable|string> STREQUAL <variable|string>)
if(<variable|string> STRLESS_EQUAL <variable|string>)
if(<variable|string> STRGREATER_EQUAL <variable|string>)
if(<variable|string> VERSION_LESS <variable|string>)
if(<variable|string> VERSION_GREATER <variable|string>)
if(<variable|string> VERSION_EQUAL <variable|string>)
if(<variable|string> VERSION_LESS_EQUAL <variable|string>)
if(<variable|string> VERSION_GREATER_EQUAL <variable|string>)
if(<variable|string> IN_LIST <variable>)
if(DEFINED <name>|CACHE{<name>}|ENV{<name>})
if((condition) AND (condition OR (condition)))
看着这么多,其实本质就是 TRUE, FALSE 以及 与或非(AND OR NOT). 是 扩展出来的字符串对比,二进制对比,文件判断等。
来看看理解这个判断语句没:
set(var1 OFF)
set(var2 "var1")
if(${var2})
上面的 if 等价于:
if(var1)
也就是 OFF
if(var2)
这个语句是ON
感觉还是比较好懂,如果不懂,欢迎后面留言交流,哈哈。
| 命令 |目录| |
---|
include
从其他文件或者模块中加载 cmake 代码:
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>]
[NO_POLICY_SCOPE])
如果定义了OPTIONAL,那如果这个文件不存在,也不会报错。如果指定了 RESULT_VARIABLE,文件找到的话, <var>就会被赋值为完整的文件名,文件没有找到,就会被赋值为 NOTFOUND。
NO_POLICY_SCOPE 是值不使用规则定义。
| 命令 |目录| |
---|
include_guard
为CMake当前正在处理的文件提供包含保护,预防重复运行cmake代码导致的各种问题。
include_guard([DIRECTORY|GLOBAL])
参数 | 说明 |
---|---|
DIRECTORY | 包含保护适用于当前目录及以下目录。该文件只会在此目录范围内包含一次,但可能会被该目录之外的其他文件再次包含。 |
GLOBAL | 包含保护全局适用于整个构建。无论范围如何,当前文件仅被包含一次。 |
功能有点类似与c语言中的ifdef-define-endif, 对比理解:
if(__CURRENT_FILE_VAR__)
return()
endif()
set(__CURRENT_FILE_VAR__ TRUE)
| 命令 |目录| |
---|
list
队列操作:
读取:
list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...] <output variable>)
list(JOIN <list> <glue> <output variable>)
list(SUBLIST <list> <begin> <length> <output variable>)
查找:
list(FIND <list> <value> <out-var>)
修改:
list(APPEND <list> [<element> ...])
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(POP_BACK <list> [<out-var>...])
list(POP_FRONT <list> [<out-var>...])
list(PREPEND <list> [<element> ...])
# 删除
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
# 转换规则修改
list(TRANSFORM <list> <ACTION> [<SELECTOR>]
[OUTPUT_VARIABLE <output variable>])
list(TRANSFORM <list> <APPEND|PREPEND> <value> ...)
list(TRANSFORM <list> <TOLOWER|TOUPPER> ...)
list(TRANSFORM <list> STRIP ...)
list(TRANSFORM <list> GENEX_STRIP ...)
list(TRANSFORM <list> REPLACE <regular_expression>
list(TRANSFORM <list> <ACTION> AT <index> [<index> ...] ...)
list(TRANSFORM <list> <ACTION> FOR <start> <stop> [<step>] ...)
list(TRANSFORM <list> <ACTION> REGEX <regular_expression> ...)
排序:
list(REVERSE <list>)
list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
如果不清楚,可以查查网上的队列操作,这里不做其他介绍了。对函数有疑问,可以看官网。
| 命令 |目录| |
---|
macro
在定义和使用上和 function 非常相似:
macro(<name> [<arg1> ...])
<commands>
endmacro()
例子:
macro(foo)
<commands>
endmacro()
调用:
foo()
Foo()
FOO()
macro 和 function的不同:
- marco 参数其实和c语言一样,都是按照字符串的方式来处理的,也并没有定义,更没有类型检测
- marco 没有return, 如果return的话就会报错
| 命令 |目录| |
---|
mark_as_advanced
将cmake缓存的变量标记为高级
mark_as_advanced([CLEAR|FORCE] <var1> ...)
| 命令 |目录| |
---|
math
执行数学表达式:
math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])
符号和c语言差不多,包括+, -, *, /, %, |, &, ^, ~, <<, >> 等等, 十六进制用 0x 开头。
| 命令 |目录| |
---|
message
message 是cmake的显示函数:
message([<mode>] "message to display" ...)
mode 可以替换为下面值:
model值 | 说明 |
---|---|
FATAL_ERROR | |
SEND_ERROR | |
WARNING | |
AUTHOR_WARNING | |
DEPRECATION | |
(none) or NOTICE | |
STATUS | |
VERBOSE | |
DEBUG | |
TRACE |
| 命令 |目录| |
---|
option
提供用户可以选择选择的选项
option(<variable> "<help_text>" [value])
为用户提供选择打开或关闭的选项。如果未提供初始<value>,则使用OFF。如果<variable>已经设置为普通变量,则该命令不执行任何操作(请参阅策略CMP0077)
| 命令 |目录| |
---|
return
从文件,目录或函数返回
return()
| 命令 |目录| |
---|
separate_arguments
将命令行参数解析为以分号分隔的列表
separate_arguments(<variable> <mode> <args>)
| 命令 |目录| |
---|
set
设置普通变量
set(<variable> <value>... [PARENT_SCOPE])
设置缓冲变量
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
设置环境变量
set(ENV{<variable>} [<value>])
| 命令 |目录| |
---|
set_directory_properties
设置当前目录和子目录的属性
set_directory_properties(PROPERTIES prop1 value1 [prop2 value2] ...)
| 命令 |目录| |
---|
site_name
将给定变量设置为计算机的名称
site_name(variable)
| 命令 |目录| |
---|
set_property
在给定范围内设置命名属性
set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
SOURCE [<src1> ...] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
[APPEND] [APPEND_STRING]
PROPERTY <name> [value1 ...])
参数参考 get_property
| 命令 |目录| |
---|
string
字符串操作,不要太依赖喔。
查找和替换:
string(FIND <string> <substring> <out-var> [...])
string(REPLACE <match-string> <replace-string> <out-var> <input>...)
正则匹配:
string(REGEX MATCH <match-regex> <out-var> <input>...)
string(REGEX MATCHALL <match-regex> <out-var> <input>...)
string(REGEX REPLACE <match-regex> <replace-expr> <out-var> <input>...)
操作:
string(APPEND <string-var> [<input>...])
string(PREPEND <string-var> [<input>...])
string(CONCAT <out-var> [<input>...])
string(JOIN <glue> <out-var> [<input>...])
string(TOLOWER <string> <out-var>)
string(TOUPPER <string> <out-var>)
string(LENGTH <string> <out-var>)
string(SUBSTRING <string> <begin> <length> <out-var>)
string(STRIP <string> <out-var>)
string(GENEX_STRIP <string> <out-var>)
string(REPEAT <string> <count> <out-var>)
比较:
string(COMPARE <op> <string1> <string2> <out-var>)
哈希值:
string(<HASH> <out-var> <input>)
生成:
string(ASCII <number>... <out-var>)
string(CONFIGURE <string> <out-var> [...])
string(MAKE_C_IDENTIFIER <string> <out-var>)
string(RANDOM [<option>...] <out-var>)
string(TIMESTAMP <out-var> [<format string>] [UTC])
string(UUID <out-var> ...)
字符串操作是比较常见的,如果有必要用到,推荐官网学习.
| 命令 |目录| |
---|
unset
取消变量设置:
unset(<variable> [CACHE | PARENT_SCOPE])
unset(ENV{<variable>})
和 set 函数功能相反,使用和参数可以参考 set进行学习。
| 命令 |目录| |
---|
variable_watch
为 cmake 变量改变加上回调函数,默认情况下,修改了会触发打印,可以自己指定触发后的执行命令。
variable_watch(<variable> [<command>])
| 命令 |目录| |
---|
while
while循环,
while(<condition>)
<commands>
endwhile()
condition 参考if。
| 命令 |目录| |
---|
cmake_property
不是说 cmake_property 太难以理解,所以我们要分章节讲解,而是这个东西有点多,感觉分开比较合理。但是要做说明的话,几百个要一个一个的做,不知道何年何月了,好在属性名字可读性还是比较强,粘贴过来大家将就看着。
全局属性
属性 | 说明 |
---|---|
ALLOW_DUPLICATE_CUSTOM_TARGETS | |
AUTOGEN_SOURCE_GROUP | |
AUTOGEN_TARGETS_FOLDER | |
AUTOMOC_SOURCE_GROUP | |
AUTOMOC_TARGETS_FOLDER | |
AUTORCC_SOURCE_GROUP | |
CMAKE_C_KNOWN_FEATURES | |
CMAKE_CXX_KNOWN_FEATURES | |
CMAKE_ROLE | |
DEBUG_CONFIGURATIONS | |
DISABLED_FEATURES | |
ENABLED_FEATURES | |
ENABLED_LANGUAGES | |
FIND_LIBRARY_USE_LIB32_PATHS | |
FIND_LIBRARY_USE_LIB64_PATHS | |
FIND_LIBRARY_USE_LIBX32_PATHS | |
FIND_LIBRARY_USE_OPENBSD_VERSIONING | |
GENERATOR_IS_MULTI_CONFIG | |
GLOBAL_DEPENDS_DEBUG_MODE | |
GLOBAL_DEPENDS_NO_CYCLES | |
IN_TRY_COMPILE | |
PACKAGES_FOUND | |
PACKAGES_NOT_FOUND | |
JOB_POOLS | |
PREDEFINED_TARGETS_FOLDER | |
ECLIPSE_EXTRA_NATURES | |
ECLIPSE_EXTRA_CPROJECT_CONTENTS | |
REPORT_UNDEFINED_PROPERTIES | |
RULE_LAUNCH_COMPILE | |
RULE_LAUNCH_CUSTOM | |
RULE_LAUNCH_LINK | |
RULE_MESSAGES | |
TARGET_ARCHIVES_MAY_BE_SHARED_LIBS | |
TARGET_MESSAGES | |
TARGET_SUPPORTS_SHARED_LIBS | |
USE_FOLDERS | |
XCODE_EMIT_EFFECTIVE_PLATFORM_NAME |
目录属性
属性 | 说明 |
---|---|
ADDITIONAL_CLEAN_FILES | |
BINARY_DIR | |
BUILDSYSTEM_TARGETS | |
CACHE_VARIABLES | |
CLEAN_NO_CUSTOM | |
CMAKE_CONFIGURE_DEPENDS | |
COMPILE_DEFINITIONS | |
COMPILE_OPTIONS | |
DEFINITIONS | |
EXCLUDE_FROM_ALL | |
IMPLICIT_DEPENDS_INCLUDE_TRANSFORM | |
INCLUDE_DIRECTORIES | |
INCLUDE_REGULAR_EXPRESSION | |
INTERPROCEDURAL_OPTIMIZATION_<CONFIG> | |
INTERPROCEDURAL_OPTIMIZATION | |
LABELS | |
LINK_DIRECTORIES | |
LINK_OPTIONS | |
LISTFILE_STACK | |
MACROS | |
PARENT_DIRECTORY | |
RULE_LAUNCH_COMPILE | |
RULE_LAUNCH_CUSTOM | |
RULE_LAUNCH_LINK | |
SOURCE_DIR | |
SUBDIRECTORIES | |
TESTS | |
TEST_INCLUDE_FILES | |
VARIABLES | |
VS_GLOBAL_SECTION_POST_<section> | |
VS_GLOBAL_SECTION_PRE_<section> | |
VS_STARTUP_PROJECT |
目标属性
属性 | 说明 |
---|---|
ADDITIONAL_CLEAN_FILES | |
ALIASED_TARGET | |
ANDROID_ANT_ADDITIONAL_OPTIONS | |
ANDROID_API | |
ANDROID_API_MIN | |
ANDROID_ARCH | |
ANDROID_ASSETS_DIRECTORIES | |
ANDROID_GUI | |
ANDROID_JAR_DEPENDENCIES | |
ANDROID_JAR_DIRECTORIES | |
ANDROID_JAVA_SOURCE_DIR | |
ANDROID_NATIVE_LIB_DEPENDENCIES | |
ANDROID_NATIVE_LIB_DIRECTORIES | |
ANDROID_PROCESS_MAX | |
ANDROID_PROGUARD | |
ANDROID_PROGUARD_CONFIG_PATH | |
ANDROID_SECURE_PROPS_PATH | |
ANDROID_SKIP_ANT_STEP | |
ANDROID_STL_TYPE | |
ARCHIVE_OUTPUT_DIRECTORY_<CONFIG> | |
ARCHIVE_OUTPUT_DIRECTORY | |
ARCHIVE_OUTPUT_NAME_<CONFIG> | |
ARCHIVE_OUTPUT_NAME | |
AUTOGEN_BUILD_DIR | |
AUTOGEN_ORIGIN_DEPENDS | |
AUTOGEN_PARALLEL | |
AUTOGEN_TARGET_DEPENDS | |
AUTOMOC_COMPILER_PREDEFINES | |
AUTOMOC_DEPEND_FILTERS | |
AUTOMOC_EXECUTABLE | |
AUTOMOC_MACRO_NAMES | |
AUTOMOC_MOC_OPTIONS | |
AUTOMOC_PATH_PREFIX | |
AUTOMOC | |
AUTOUIC | |
AUTOUIC_EXECUTABLE | |
AUTOUIC_OPTIONS | |
AUTOUIC_SEARCH_PATHS | |
AUTORCC | |
AUTORCC_EXECUTABLE | |
AUTORCC_OPTIONS | |
BINARY_DIR | |
BUILD_RPATH | |
BUILD_RPATH_USE_ORIGIN | |
BUILD_WITH_INSTALL_NAME_DIR | |
BUILD_WITH_INSTALL_RPATH | |
BUNDLE_EXTENSION | |
BUNDLE | |
C_EXTENSIONS | |
C_STANDARD | |
C_STANDARD_REQUIRED | |
COMMON_LANGUAGE_RUNTIME | |
COMPATIBLE_INTERFACE_BOOL | |
COMPATIBLE_INTERFACE_NUMBER_MAX | |
COMPATIBLE_INTERFACE_NUMBER_MIN | |
COMPATIBLE_INTERFACE_STRING | |
COMPILE_DEFINITIONS | |
COMPILE_FEATURES | |
COMPILE_FLAGS | |
COMPILE_OPTIONS | |
COMPILE_PDB_NAME | |
COMPILE_PDB_NAME_<CONFIG> | |
COMPILE_PDB_OUTPUT_DIRECTORY | |
COMPILE_PDB_OUTPUT_DIRECTORY_<CONFIG> | |
<CONFIG>_OUTPUT_NAME | |
<CONFIG>_POSTFIX | |
CROSSCOMPILING_EMULATOR | |
CUDA_PTX_COMPILATION | |
CUDA_SEPARABLE_COMPILATION | |
CUDA_RESOLVE_DEVICE_SYMBOLS | |
CUDA_EXTENSIONS | |
CUDA_STANDARD | |
CUDA_STANDARD_REQUIRED | |
CXX_EXTENSIONS | |
CXX_STANDARD | |
CXX_STANDARD_REQUIRED | |
DEBUG_POSTFIX | |
DEFINE_SYMBOL | |
DEPLOYMENT_REMOTE_DIRECTORY | |
DEPLOYMENT_ADDITIONAL_FILES | |
DISABLE_PRECOMPILE_HEADERS | |
DOTNET_TARGET_FRAMEWORK_VERSION | |
EchoString | |
ENABLE_EXPORTS | |
EXCLUDE_FROM_ALL | |
EXCLUDE_FROM_DEFAULT_BUILD_<CONFIG> | |
EXCLUDE_FROM_DEFAULT_BUILD | |
EXPORT_NAME | |
EXPORT_PROPERTIES | |
FOLDER | |
Fortran_FORMAT | |
Fortran_MODULE_DIRECTORY | |
FRAMEWORK | |
FRAMEWORK_VERSION | |
GENERATOR_FILE_NAME | |
GHS_INTEGRITY_APP | |
GHS_NO_SOURCE_GROUP_FILE | |
GNUtoMS | |
HAS_CXX | |
IMPLICIT_DEPENDS_INCLUDE_TRANSFORM | |
IMPORTED_COMMON_LANGUAGE_RUNTIME | |
IMPORTED_CONFIGURATIONS | |
IMPORTED_GLOBAL | |
IMPORTED_IMPLIB_<CONFIG> | |
IMPORTED_IMPLIB | |
IMPORTED_LIBNAME_<CONFIG> | |
IMPORTED_LIBNAME | |
IMPORTED_LINK_DEPENDENT_LIBRARIES_<CONFIG> | |
IMPORTED_LINK_DEPENDENT_LIBRARIES | |
IMPORTED_LINK_INTERFACE_LANGUAGES_<CONFIG> | |
IMPORTED_LINK_INTERFACE_LANGUAGES | |
IMPORTED_LINK_INTERFACE_LIBRARIES_<CONFIG> | |
IMPORTED_LINK_INTERFACE_LIBRARIES | |
IMPORTED_LINK_INTERFACE_MULTIPLICITY_<CONFIG> | |
IMPORTED_LINK_INTERFACE_MULTIPLICITY | |
IMPORTED_LOCATION_<CONFIG> | |
IMPORTED_LOCATION | |
IMPORTED_NO_SONAME_<CONFIG> | |
IMPORTED_NO_SONAME | |
IMPORTED_OBJECTS_<CONFIG> | |
IMPORTED_OBJECTS | |
IMPORTED | |
IMPORTED_SONAME_<CONFIG> | |
IMPORTED_SONAME | |
IMPORT_PREFIX | |
IMPORT_SUFFIX | |
INCLUDE_DIRECTORIES | |
INSTALL_NAME_DIR | |
INSTALL_REMOVE_ENVIRONMENT_RPATH | |
INSTALL_RPATH | |
INSTALL_RPATH_USE_LINK_PATH | |
INTERFACE_AUTOUIC_OPTIONS | |
INTERFACE_COMPILE_DEFINITIONS | |
INTERFACE_COMPILE_FEATURES | |
INTERFACE_COMPILE_OPTIONS | |
INTERFACE_INCLUDE_DIRECTORIES | |
INTERFACE_LINK_DEPENDS | |
INTERFACE_LINK_DIRECTORIES | |
INTERFACE_LINK_LIBRARIES | |
INTERFACE_LINK_OPTIONS | |
INTERFACE_PRECOMPILE_HEADERS | |
INTERFACE_POSITION_INDEPENDENT_CODE | |
INTERFACE_SOURCES | |
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES | |
INTERPROCEDURAL_OPTIMIZATION_<CONFIG> | |
INTERPROCEDURAL_OPTIMIZATION | |
IOS_INSTALL_COMBINED | |
JOB_POOL_COMPILE | |
JOB_POOL_LINK | |
LABELS | |
<LANG>_CLANG_TIDY | |
<LANG>_COMPILER_LAUNCHER | |
<LANG>_CPPCHECK | |
<LANG>_CPPLINT | |
<LANG>_INCLUDE_WHAT_YOU_USE | |
<LANG>_VISIBILITY_PRESET | |
LIBRARY_OUTPUT_DIRECTORY_<CONFIG> | |
LIBRARY_OUTPUT_DIRECTORY | |
LIBRARY_OUTPUT_NAME_<CONFIG> | |
LIBRARY_OUTPUT_NAME | |
LINK_DEPENDS_NO_SHARED | |
LINK_DEPENDS | |
LINKER_LANGUAGE | |
LINK_DIRECTORIES | |
LINK_FLAGS_<CONFIG> | |
LINK_FLAGS | |
LINK_INTERFACE_LIBRARIES_<CONFIG> | |
LINK_INTERFACE_LIBRARIES | |
LINK_INTERFACE_MULTIPLICITY_<CONFIG> | |
LINK_INTERFACE_MULTIPLICITY | |
LINK_LIBRARIES | |
LINK_OPTIONS | |
LINK_SEARCH_END_STATIC | |
LINK_SEARCH_START_STATIC | |
LINK_WHAT_YOU_USE | |
LOCATION_<CONFIG> | |
LOCATION | |
MACOSX_BUNDLE_INFO_PLIST | |
MACOSX_BUNDLE | |
MACOSX_FRAMEWORK_INFO_PLIST | |
MACOSX_RPATH | |
MANUALLY_ADDED_DEPENDENCIES | |
MAP_IMPORTED_CONFIG_<CONFIG> | |
MSVC_RUNTIME_LIBRARY | |
NAME | |
NO_SONAME | |
NO_SYSTEM_FROM_IMPORTED | |
OBJC_EXTENSIONS | |
OBJC_STANDARD | |
OBJC_STANDARD_REQUIRED | |
OBJCXX_EXTENSIONS | |
OBJCXX_STANDARD | |
OBJCXX_STANDARD_REQUIRED | |
OSX_ARCHITECTURES_<CONFIG> | |
OSX_ARCHITECTURES | |
OUTPUT_NAME_<CONFIG> | |
OUTPUT_NAME | |
PDB_NAME_<CONFIG> | |
PDB_NAME | |
PDB_OUTPUT_DIRECTORY_<CONFIG> | |
PDB_OUTPUT_DIRECTORY | |
POSITION_INDEPENDENT_CODE | |
PRECOMPILE_HEADERS | |
PRECOMPILE_HEADERS_REUSE_FROM | |
PREFIX | |
PRIVATE_HEADER | |
PROJECT_LABEL | |
PUBLIC_HEADER | |
RESOURCE | |
RULE_LAUNCH_COMPILE | |
RULE_LAUNCH_CUSTOM | |
RULE_LAUNCH_LINK | |
RUNTIME_OUTPUT_DIRECTORY_<CONFIG> | |
RUNTIME_OUTPUT_DIRECTORY | |
RUNTIME_OUTPUT_NAME_<CONFIG> | |
RUNTIME_OUTPUT_NAME | |
SKIP_BUILD_RPATH | |
SOURCE_DIR | |
SOURCES | |
SOVERSION | |
STATIC_LIBRARY_FLAGS_<CONFIG> | |
STATIC_LIBRARY_FLAGS | |
STATIC_LIBRARY_OPTIONS | |
SUFFIX | |
Swift_DEPENDENCIES_FILE | |
Swift_LANGUAGE_VERSION | |
Swift_MODULE_DIRECTORY | |
Swift_MODULE_NAME | |
TYPE | |
UNITY_BUILD | |
UNITY_BUILD_BATCH_SIZE | |
UNITY_BUILD_CODE_AFTER_INCLUDE | |
UNITY_BUILD_CODE_BEFORE_INCLUDE | |
VERSION | |
VISIBILITY_INLINES_HIDDEN | |
VS_CONFIGURATION_TYPE | |
VS_DEBUGGER_COMMAND | |
VS_DEBUGGER_COMMAND_ARGUMENTS | |
VS_DEBUGGER_ENVIRONMENT | |
VS_DEBUGGER_WORKING_DIRECTORY | |
VS_DESKTOP_EXTENSIONS_VERSION | |
VS_DOTNET_REFERENCE_<refname> | |
VS_DOTNET_REFERENCEPROP_<refname>_TAG_<tagname> | |
VS_DOTNET_REFERENCES | |
VS_DOTNET_REFERENCES_COPY_LOCAL | |
VS_DOTNET_TARGET_FRAMEWORK_VERSION | |
VS_DPI_AWARE | |
VS_GLOBAL_KEYWORD | |
VS_GLOBAL_PROJECT_TYPES | |
VS_GLOBAL_ROOTNAMESPACE | |
VS_GLOBAL_<variable> | |
VS_IOT_EXTENSIONS_VERSION | |
VS_IOT_STARTUP_TASK | |
VS_JUST_MY_CODE_DEBUGGING | |
VS_KEYWORD | |
VS_MOBILE_EXTENSIONS_VERSION | |
VS_NO_SOLUTION_DEPLOY | |
VS_PACKAGE_REFERENCES | |
VS_PROJECT_IMPORT | |
VS_SCC_AUXPATH | |
VS_SCC_LOCALPATH | |
VS_SCC_PROJECTNAME | |
VS_SCC_PROVIDER | |
VS_SDK_REFERENCES | |
VS_USER_PROPS | |
VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION | |
VS_WINRT_COMPONENT | |
VS_WINRT_EXTENSIONS | |
VS_WINRT_REFERENCES | |
WIN32_EXECUTABLE | |
WINDOWS_EXPORT_ALL_SYMBOLS | |
XCODE_ATTRIBUTE_<an-attribute> | |
XCODE_EXPLICIT_FILE_TYPE | |
XCODE_GENERATE_SCHEME | |
XCODE_PRODUCT_TYPE | |
XCODE_SCHEME_ADDRESS_SANITIZER | |
XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN | |
XCODE_SCHEME_ARGUMENTS | |
XCODE_SCHEME_DEBUG_AS_ROOT | |
XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING | |
XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER | |
XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS | |
XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE | |
XCODE_SCHEME_ENVIRONMENT | |
XCODE_SCHEME_EXECUTABLE | |
XCODE_SCHEME_GUARD_MALLOC | |
XCODE_SCHEME_MAIN_THREAD_CHECKER_STOP | |
XCODE_SCHEME_MALLOC_GUARD_EDGES | |
XCODE_SCHEME_MALLOC_SCRIBBLE | |
XCODE_SCHEME_MALLOC_STACK | |
XCODE_SCHEME_THREAD_SANITIZER | |
XCODE_SCHEME_THREAD_SANITIZER_STOP | |
XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER | |
XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER_STOP | |
XCODE_SCHEME_ZOMBIE_OBJECTS | |
XCTEST |
测试说明
属性 | 说明 |
---|---|
ATTACHED_FILES_ON_FAIL | |
ATTACHED_FILES | |
COST | |
DEPENDS | |
DISABLED | |
ENVIRONMENT | |
FAIL_REGULAR_EXPRESSION | |
FIXTURES_CLEANUP | |
FIXTURES_REQUIRED | |
FIXTURES_SETUP | |
LABELS | |
MEASUREMENT | |
PASS_REGULAR_EXPRESSION | |
PROCESSOR_AFFINITY | |
PROCESSORS | |
REQUIRED_FILES | |
RESOURCE_GROUPS | |
RESOURCE_LOCK | |
RUN_SERIAL | |
SKIP_REGULAR_EXPRESSION | |
SKIP_RETURN_CODE | |
TIMEOUT | |
TIMEOUT_AFTER_MATCH | |
WILL_FAIL | |
WORKING_DIRECTORY |
源文件属性
属性 | 说明 |
---|---|
ABSTRACT | |
AUTOUIC_OPTIONS | |
AUTORCC_OPTIONS | |
COMPILE_DEFINITIONS | |
COMPILE_FLAGS | |
COMPILE_OPTIONS | |
EXTERNAL_OBJECT | |
Fortran_FORMAT | |
GENERATED | |
HEADER_FILE_ONLY | |
INCLUDE_DIRECTORIES | |
KEEP_EXTENSION | |
LABELS | |
LANGUAGE | |
LOCATION | |
MACOSX_PACKAGE_LOCATION | |
OBJECT_DEPENDS | |
OBJECT_OUTPUTS | |
SKIP_AUTOGEN | |
SKIP_AUTOMOC | |
SKIP_AUTORCC | |
SKIP_AUTOUIC | |
SKIP_PRECOMPILE_HEADERS | |
SKIP_UNITY_BUILD_INCLUSION | |
Swift_DEPENDENCIES_FILE | |
Swift_DIAGNOSTICS_FILE | |
SYMBOLIC | |
VS_COPY_TO_OUT_DIR | |
VS_CSHARP_<tagname> | |
VS_DEPLOYMENT_CONTENT | |
VS_DEPLOYMENT_LOCATION | |
VS_INCLUDE_IN_VSIX | |
VS_RESOURCE_GENERATOR | |
VS_SHADER_DISABLE_OPTIMIZATIONS | |
VS_SHADER_ENABLE_DEBUG | |
VS_SHADER_ENTRYPOINT | |
VS_SHADER_FLAGS | |
VS_SHADER_MODEL | |
VS_SHADER_OBJECT_FILE_NAME | |
VS_SHADER_OUTPUT_HEADER_FILE | |
VS_SHADER_TYPE | |
VS_SHADER_VARIABLE_NAME | |
VS_TOOL_OVERRIDE | |
VS_XAML_TYPE | |
WRAP_EXCLUDE | |
XCODE_EXPLICIT_FILE_TYPE | |
XCODE_FILE_ATTRIBUTES | |
XCODE_LAST_KNOWN_FILE_TYPE |
缓存实体属性
属性 | 说明 |
---|---|
ADVANCED | |
HELPSTRING | |
MODIFIED | |
STRINGS | |
TYPE | |
VALUE |
文件的安装属性
属性 | 说明 |
---|---|
CPACK_DESKTOP_SHORTCUTS | |
CPACK_NEVER_OVERWRITE | |
CPACK_PERMANENT | |
CPACK_START_MENU_SHORTCUTS | |
CPACK_STARTUP_SHORTCUTS | |
CPACK_WIX_ACL |
不推荐的目录属性
属性 | 说明 |
---|---|
ADDITIONAL_MAKE_CLEAN_FILES | |
COMPILE_DEFINITIONS_<CONFIG> | |
TEST_INCLUDE_FILE |
不推荐的目标属性
属性 | 说明 |
---|---|
COMPILE_DEFINITIONS_<CONFIG> | |
POST_INSTALL_SCRIPT | |
PRE_INSTALL_SCRIPT |
不推荐的源文件属性
属性 | 说明 |
---|---|
COMPILE_DEFINITIONS_<CONFIG> |
| 命令 |目录| |
---|
参考翻译: