1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j4
cmake --build build --target install

如上设置了-D 当不清除Cache时,下次不加-D,也是Release
-G 指定构建系统生成器 在cmake --help里面可以看到
动态库链接静态库,需要开启PIC set(CMAKE_POSITION_INDEPENDENT_CODE ON)
或者 set_property(TRGET lib PROPERTY POSITION_INDEPENDENT_CODE ON)
设定find_package路径,把路径加入CMAKE_MODULE_PATH、查看包搜索路径,如Qt会找Qt5_DIR,把路径放这里也好使、环境变量的Qt5_DIR也行
生成器表达式语法:$<$<类型:值>:为真时的表达式>
比如 $<$<PLATFORM_ID:Windows,ABC>:MY_NAME="Bill Gates">
在 Windows或者ABC 平台上会变为 MY_NAME="Bill Gates"
set(abc HELLO)
set(HELLO ccc)
if(abc MATCH HELLO) done
if(${abc} MATCH HELLO) no 其会展开为HELLO变量 再变成ccc
if("${abc}" MATCH HELLO) done


__declspec(dllexport) 导出
__declspec(dllimport) 导入

aux_source_directory(<dir> <variable>) #搜索dir目录内文件所有源文件,将列表写到var里

list() #对列表操作

include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>]
[NO_POLICY_SCOPE]) #导入CMake代码。OPTIONAL,文件不存在不报错,RESULT_VARIABLE <var>,var将设置为完整文件名,失败为NOTFOUND。
# 若指定为module则在CMAKE_MODULE_PATH中找<modulename>.cmake,再去CMake模块路径找。除非文件在CMake内置模块路径中。

set(<variable> <value>... [PARENT_SCOPE]) #value可以是0或多个,0即unset,多个时使用;分割。PARENT_SCOPE会向上一层传递,当在function中时,会向调用者传递,但是在当前层不生效,不加则会取时生效并向下传递。
set(<variable> <value>... CACHE <type> <docstring> [FORCE]) #默认情况下值不会被覆盖,除非使用了FORCE。可以通过GUI界面add entry添加,类似环境变量。
#BOOL复选框、FILEPATH文件选择框、PATH目录选择框、STRING文本框、STRINGS下拉框、INTERNAL不对外呈现,主要用于运行过程存储,该type意味着使用FORCE
#docstring文本表示选项摘要
#缓存值是无法覆盖已经存同名的,除非设置了FORCE。如果条目是通过-Dvar=val创建,则会给其指定类型,而set命令会给予类型。若val是相对路径,set会将其转为绝对路径。
set(ENV{<variable>} [<value>]) #设置环境变量,只影响当前进程,不修改调用者进程和系统变量。CMake中的 [环境变量](https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html) 也可以修改。

file(read <filename> <variable> [OFFSET <offset>] [LIMIT <max-in>] [HEX]) #将文件读到var变量中,偏移量、读取长度、16进度读。
file(STRINGS <filename> <variable> [<options> ...]) #以ASCII读取到var中,将忽略二进度、回车和\r。LENGTH_MAXMUN <max-len>、LENGTH_MINIMUN <min-len>、LIMIT_COUNT <max-num>限制字符串数量、LIMIT_OUTPUT <max-out>限制var总长度、NEWLINE_CONSUME不忽略换行、NO_HEX_CONVERSION不对16进度转换、REGX <regex>、ENCODING <encoding-type>。
file(<HASH> <filename> <variable>) #将文件加密读入到var,HASH支持MD5、SHA!、SHA224、SHA256、SHA384、SHA512、SHA3_224、SHA3_256、SHA3_384、SHA3_512等。
file(TIMESTAMP <filename> <variable> [<format>] [UTC]) #读取文件最后修改时间搓,format指定格式。
file(WRITE <filename> <content> ... ) #可创建,覆盖定入
file(APPEND <filename> <content> ... ) #可创建,追加
file(TOUCH [<files> ...]) #创建空白文件,文件存在只刷新修改时间
file(TOUCH_NOCREATE [<files> ...]) #文件不存在,不创建
file(GENERATE OUTPUT output-file <INPUT input-file|CONTENT content> [CONDITION expression]) #在构建时将信息写到文件中,保证是本次构建的内容,仅当CONDITION <expression>为true时,才输出到文件
file(GLOB <variable>
[LIST_DIRECTORIES true|false] [RELATIVE <path>]
[<globbing-expressions>...]) #将当前目录内符合expressions的写到var里,LIST_D...表示是否输出文件夹名,RELATIVE <path>表示是否以相对path为相对路径输出
file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE <path>]
[<globbing-expressions>...]) #FOLLOW_SYMLINKS设定和LIST_DIRECTORIES为true可以遍历子文件夹
file(RENAME <oldname> <newname>
[RESULT <result>]
[NO_REPLACE]) #重命名
file(REMOVE [<files>...]) #删除文件
file(REMOVE_RECURSE [<files>...]) #会删除指定的文件及子目录,包括非空文件夹
file(MAKE_DIRECTORY [<directories> ...]) #创建目录
file(COPY_FILE <oldname> <newname>
[RESULT <result>]
[ONLY_IF_DIFFERENT])
file(<COPY|INSTALL> <files>... DESTINATION <dir>
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]
[NO_SOURCE_PERMISSIONS] [USE_SOURCE_PERMISSIONS]
[FILES_MATCHING]
[[PATTERN <pattern> | REGEX <regex>]
[EXCLUDE] [PERMISSIONS <permissions>...]] [...]) #OWNER_READO、WNER_WRITE、OWNER_EXECUTE、GROUP_READ、GROUP_WRITE、GROUP_EXECUTE、WORLD_READ、WORLD_WRITE、WORLD_EXECUTE
file(SIZE <filename> <variable>)
file(READ_SYMLINK <linkname> <variable>) #获取符号文件的路径
file(CREATE_LINK <original> <linkname>
[RESULT <result>] [COPY_ON_ERROR] [SYMBOLIC]) #创建符号链接,默认是硬连接
file(CHMOD|CHMOD_RECURSE <files>... <directories>...
[PERMISSIONS <permissions>...]
[FILE_PERMISSIONS <permissions>...]
[DIRECTORY_PERMISSIONS <permissions>...]) #设置权限
file(REAL_PATH <path> <out-var> [BASE_DIRECTORY <dir>] [EXPAND_TILDE]) #计算已解析符号链接的现有文件或目录的绝对路径
file(RELATIVE_PATH <variable> <directory> <file>) #根据file推出相对dir的相对路径
file(TO_CMAKE_PATH "<path>" <variable>) #转为CMake格式的路径
file(TO_NATIVE_PATH "<path>" <variable>) #转换为特定平台格式的路径
file(DOWNLOAD <url> [<file>] [<options>...]) #从指定URL下载文件
file(UPLOAD <file> <url> [<options>...]) #上传
file(LOCK <path> [DIRECTORY] [RELEASE]
[GUARD <FUNCTION|FILE|PROCESS>]
[RESULT_VARIABLE <variable>]
[TIMEOUT <seconds>]) #对指定文件上锁
file(ARCHIVE_CREATE OUTPUT <archive>
PATHS <paths>...
[FORMAT <format>]
[COMPRESSION <compression> [COMPRESSION_LEVEL <compression-level>]]
[MTIME <mtime>]
[VERBOSE]) #根据 <paths> 中的文件或目录 创建归档文件 <archive>。FORMAT 指定归档格式,支持的值为 7zip、gnutar、pax、paxr、raw 和 zip,默认格式为 paxr
file(ARCHIVE_EXTRACT INPUT <archive>
[DESTINATION <dir>]
[PATTERNS <patterns>...]
[LIST_ONLY]
[VERBOSE]
[TOUCH]) #提取归档文件 <archive>,并输出到 DESTINATION 目录中,如果目录不存在,它将被创建,默认情况下输出目录为 CMAKE_CURRENT_BINARY_DIR

 [file GENERATE图片引用](https://blog.csdn.net/weixin_42730667/article/details/122568165)

 [file DownLoad图片引用](https://www.jianshu.com/p/ed151fdcf473)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
add_library(<name> [STATIC | SHARED | MODULE] [EXCLUED_FROM_ALL] [<source>...]) #使用指定的source生成对应平台的库。static、shared、module则表示类型,module则是在使用时使用dlopen动态加载的模块。
add_library(<name> OBJECT [<source>...]) #添加OBJECT库,可以使用$<TARGET_OBJECTS:objlib>方式使用,感觉就是一个集合
add_library(<name> INTERFACE) #其不编译也不生成东西,一般用于携带属性传递
add_library(<name> <type> IMPORTED [GLOBAL]) #导入一个已经存在的库,type为STATIC, SHARED, MODULE, UNKNOWN其一,通过IMPORTED导入的类,其属性以IMPORTED_开头,否则为INTERFACE_开头。IMPORTED_LOCATION标明library硬盘位置,可加DEBUG/RELEASE进行具体;IMPORTED_OBJECTS标明对象Library在硬盘的位置,也可加...。PUBLIC_HEADER保存install头文件目录
add_library(<name> ALIAS <target>) #设置别名

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...]) #WIN32将WIN32_EXECUTABLE设置为true,其会创建一个使用WinMain()入口的GUI可执行文件,而不是控制台应用程序。MACOSX_BUNDLE将在macOS或者iOS设置为true,使其可以在Finder启动GUI可执行文件。EXCLUDE_FORM_ALL表示可执行文件会排除在alltarget列表外,当执行默认的make或者nmake时,不会编译,需要make name手动指明才会编译。
add_executable(<name> IMPORTED [GLOBAL]) #从外部导入可执行文件,不指定GLOBAL则只向下传递,其属性IMPORTED会设置为true。
add_executable(<name> ALIAS <target>)

target_sources(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) #给target添加编译文件 按执行顺序添加文件
target_sources(<target>
[<INTERFACE|PUBLIC|PRIVATE>
[FILE_SET <set> [TYPE <type>] [BASE_DIRS <dirs>...] [FILES <files>...]]...
]...) #每个target有多个文件集,文件集有自己的属性。会给PRIVATE和PUBLIC的文件设置为源文件,HEADERS文件设置HEADER_FILE_ONLY为true。FILE_SET <set>,文件集名,有预留的是HEADERS,然后不能以_和大写字母开头。TYPE <type>,若为HEADERS则可省,否则加。BASE_DIRS <dirs>...,文件集目录列表,首次创建可填CMAKE_CURRENT_SOURCE_DIR。FILES <files>...,文件列表,文件要位于目录列表中。

target_compile_definitions(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) #给target添加编译定义

target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) #AFTER、BEFORE 添加到列表的前面或者后面,默认后面,CMAKE_INCLUDE_DIRECTORIES_BEFORE可以修改默认值;SYSTEM则表示指定目录为系统目录,仅当前CMakeList.txt生效
#INTERFACE、PUBLIC填充INTERFACE_INCLUDE_DIRECTORIES属性,而PRIVATE和PUBLIC填充填充INCLUDE_DIRECTORIES属性

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) #添加头文件搜索目录 相当于-l 从当前文件开始向下传递

link_directories([AFTER|BEFORE] directory1 [directory2 ...]) #添加库搜索目录 相当于-L 用在add_executable之前

link_libraries([item1 [item2 [...]]]
[[debug|optimized|general] <item>] ...) #添加库文件路径 全路径包括库名

target_link_libraries(<target> ... <item>... ...) #用在add_executable之后
#item 可能是library target name、full path to a library file、plain library name、link flag、generator expression、A debug, optimized, or general keyword immediately followed by another <item>。 ex: hello libhello.a libhello.so -lhello

get_filename_component(<var> <FileName> <mode> [CACHE]) #根据mode获取文件路径中指定项到var中 3.20以后被cmake_path取代

option(<variable> "<help_text>" [value]) #提供用户可选的布尔选项,若var已经定义或者在CACHE里,则不生效

configure_file(<input> <output>
[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
FILE_PERMISSIONS <permissions>...]
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ]) 将文件复制到其它位置并修改内容,将input文件中@var@或者${var}替换为cmake指定的值,#cmakedefine var关键字替换成#define var或者#undef var,取决是否定义了var;input,一定是要文件;output,可以是路径,那就会使用intput的名字;COPYONLY,直接拷贝,啥也不干;ESCAPE_QUOTES,不转义;@ONLY,只替换@,不替换$;NEWLINE_STYLE,指定Output换行风格。

需要先include(CheckCXXCompilerFlag)
check_cxx_compiler_flag(<flag> <var>) 检测编译器是否支持CXX,结果在var里

mark_as_advanced([CLEAR|FORCE] <var1> ...) #清除或者标记var变量为advanced变量,advance变量不会显示在GUI中,除非advanced选项开启

source_group(<name> [FILES <src>...] [REGULAR_EXPRESSION <regex>])
source_group(TREE <root> [PREFIX <prefix>] [FILES <src>...]) #给IDE的源码分组,TREE,会根据root路径将src转为相对路径,自动的将文件结构分出来。PREFIX,TREE会放在该group里,可以使用\\指定子group。REGULAR_EXPRESSION,一个文件只会加入最后一个符合条件的group,如果没有则优先与最后一个组。

set_property(<GLOBAL |
DIRECTORY [<dir>] |
TARGET [<target1> ...] |
SOURCE [<src1> ...]
[DIRECTORY <dirs> ...]
[TARGET_DIRECTORY <targets> ...] |
INSTALL [<file1> ...] |
TEST [<test1> ...] |
CACHE [<entry1> ...] >
[APPEND] [APPEND_STRING]
PROPERTY <name> [<value1> ...]) #GLOBAL,属性全局有效;DIRECTORY,在指定目录有效,类似set_directory_proerties;TARGET,设置target属性,类似set_target_properties;SOURCE,指定属性对应多个源文件,默认仅对同一目录中的目标可见,类似set_source_files_properties,DIRECTORY,源文件在每个dirs有效,dirs必须已知,TARGET_DIRECTORY在指定的targets中有效,targets必须有效;INSTALL,属性对应多个安装文件路径;TEST,对应多个测试,类似set_tests_properties;CACHE,对应缓存条目。APPEND,以列表形式附加到属性后面。APPEND_STRING,以字符串形式添加到属性后面。

get_property(<variable>
<GLOBAL |
DIRECTORY [<dir>] |
TARGET <target> |
SOURCE <source>
[DIRECTORY <dir> | TARGET_DIRECTORY <target>] |
INSTALL <file> |
TEST <test> |
CACHE <entry> |
VARIABLE >
PROPERTY <name>
[SET | DEFINED | BRIEF_DOCS | FULL_DOCS]) #VARIABLE,范围内唯一,不接收名字。SET,变量设为布尔,表示是否设置了属性;DEFINED,变量设置为布尔,表示属性是否定义;BRIEF_DOCS | FULL_DOCS,设置为字符串,包含请示的属性,没有会写NOTFOUND。

set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...) #同时设置多个target的多个属性

get_target_property(<VAR> target property) #获取target属性

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) #添加子目录进行构建,source_dir,子目录CMakeList.txt的位置;binary_dir,输出目录;EXCLUDE_FROM_ALL,是否排除自动构建

add_compile_options(<option> ...) #添加选项到编译源文件,对当前目录的targets和向下有效

target_compile_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...]) #给target添加编译参数,BEFORE,放到所有属性前,默认是追加

add_definitions(-DFOO -DBAR ...) #将定义添加到编译器命令行,不管写在前后都生效,并向下目录传递,相当于-D

add_dependencies(<target> [<target-dependency>]...) #确保依赖的target在自己前生成

message([<mode>] "message text" ...) #FATAL_ERROR,会中断编译;SEND_ERROR,继续处理,但是会跳过生成;WARNING,发出警告,继续处理。AUTHOR_WARNING,警告dev,继续处理;DEPRECATION,根据CMAKE_ERROR_DEPRECATED或者CMAKE_WARN_DEPRECATED状态决定是警告还是错误;(none) or NOTICE,重要标准错误;STATUS,信息;VERBOSE,更详细的信息;DEBUG,项目开发人员;TRACE,临时信息。
message(<checkState> "message text" ...) #CHECK_START,记录将要执行检查的消息;CHECK_PASS,记录一个成功结果;CHECK_FAIL,记录一个失败结果。

project(<PROJECT-NAME> [<language-name>...]) #指定cmake工程名,<language-name> 语言
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...]) #VERSION,版本;DESCRIPTION,描述;HOMEPAGE_URL,主页URL;LANGUAGES,语言。
当指定了project,会自动定义如下变量,则PROJECT_NAME工程名;PROJECT_SOURCE_DIR源码路径;<PROJECT-NAME>_SOURCE_DIR源码路径,与前者区别就是后者是指定工程的,前者是当前工程的;PROJECT_BINARY_DIR二进制路径;<PROJECT-NAME>_BINARY_DIR同意思;CMAKE_PROJECT_NAME顶层工程名。 指定了VERSION,会定义出一堆PROJECT_VERSION*和<PROJECT-NAME>_VERSION*。其它两个也一样。目前支持C、CXX、CUDA、OBJC、OBJCXX、Fortran、ASM,不指定则是C和CXX,指定为NONE或者LANGUAGES则表示不支持任何语言。检测CMAKE_<LANGUAGES>_COMPILER指定编译器是否存在。多次调用,则以最近一次为准。

add_custom_target(Name [ALL] [command1 [args1...]]
[COMMAND command2 [args2...] ...]
[DEPENDS depend depend depend ... ]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[JOB_POOL job_pool]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]
[SOURCES src1 [src2...]]) #根据命令生成一个target,且默认不在all target中,目标没有输出文件。ALL,加入all target;DEPENDS,依赖其它target或者文件;COMMAND,执行的命令,可以使用configure_file或者GENERATE生成脚本再执行;BYPRODUCTS,声明target随之生成的文件,需要有COMMAND命令否则报错;WORKING_DIRECTORY,修改当前COMMAND执行命令的目录;COMMENT,构建时执行COMMAND前的消息;JOB_POOL,指定一个池给Ninja生成器,VERBATIM,所有参数都根据构建工具转义,以保证COMMAND正确接收参数,否则行为依赖平台行为;USES_TERMINAL,直接访问终端的权限;COMMAND_EXPAND_LISTS,参数列表将展开,包括生成器表达式列表;SOURCES,将文件附加到目标中,在IDE中显示。

add_custom_command(OUTPUT output1 [output2 ...]
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[MAIN_DEPENDENCY depend]
[DEPENDS [depends...]]
[BYPRODUCTS [files...]]
[IMPLICIT_DEPENDS <lang1> depend1
[<lang2> depend2] ...]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[DEPFILE depfile]
[JOB_POOL job_pool]
[VERBATIM] [APPEND] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]) #在生成的构建系统中添加自定义构建规则,当没有output1或者DEPENDS的东西发生变化时,则生成;MAIN_DEPENDENCY,指定主要输入文件,源文件只能作为一个命令的主依赖项;IMPLICIT_DEPENDS,请求扫描输入文件的隐式依赖关系;DEPFILE,为Ninja生成器制定一个depfile文件;APPEND将其追加到第一个自定义输出命令;

add_custom_command(TARGET <target>
PRE_BUILD | PRE_LINK | POST_BUILD
COMMAND command1 [ARGS] [args1...]
[COMMAND command2 [ARGS] [args2...] ...]
[BYPRODUCTS [files...]]
[WORKING_DIRECTORY dir]
[COMMENT comment]
[VERBATIM] [USES_TERMINAL]
[COMMAND_EXPAND_LISTS]) #为目标添加自定义命令,目标构建时执行,PRE_BUILD | PRE_LINK | POST_BUILD表示命令执行相对构建的时机

> 当add_custom_target所要生成的target依赖add_custom_command所生成的文件时,这个文件就是一个纽带;add_custom_command命令输出的OUTPUT文件和命令里的command之间的关系是:每当这个文件需要被重新生成时,都会执行这段command;开始构建target,依赖add_custom_command的输出文件,再查看其是否构建,其构建就会执行COMMAND

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>]
[ECHO_OUTPUT_VARIABLE]
[ECHO_ERROR_VARIABLE]
[COMMAND_ERROR_IS_FATAL <ANY|LAST>]) #命令作为管道同时执行,其输出管道作为下个管道的输入,共享一个错误管道。COMMAND,子进程命令行,CMake使用API直接执行子进程,中间不能使用shell脚本,像重定义等操作符都当普通参数;WORKING_DIRECTORY,指定子进程的工作目录;TIMEOUT,超时时间;RESULT_VARIABLE,执行进程的返回结果,最后一个子进程整数或者错误描述字符串;RESULTS_VARIABLE,接收第条命令返回结果;OUTPUT_VARIABLE,ERROR_VARIABLE,设置为输出管道和错误管道的内容,若命名相同,则输出将按生成的顺序合并;INPUT_FILE, OUTPUT_FILE, ERROR_FILE,第一个标准输入名,最后一个标准输出名,所有的标准错误名;OUTPUT_QUIET, ERROR_QUIET,输出和错误将忽略;COMMAND_ECHO <where>重置命令到指定标准输出,如STDERR、STDOUT、NONE;OUTPUT_STRIP_TRAILING_WHITESPACE、ERROR_STRIP_TRAILING_WHITESPACE删除输出空白符;ENCODING <name>,在win上指定解码方式,NONE、AUTO、ANSI、OEM、UTF8、UTF-8;ECHO_OUTPUT_VARIABLE, ECHO_ERROR_VARIABLE,不会专门重定向到配置的变量,将发送到配置的变量中和标准输出或错误中;COMMAND_ERROR_IS_FATAL <ANY|LAST>,决定出错时的行为ANY出错则停止报错,LAST则只看最后一个

find_package
目的是帮助我们调用对应的cmake文件,导入某个库,这个cmake文件是官方、安装、自行编写的,其格式为Find<lib_name>.cmake、。一般会产生<lib_name>_FOUND、<lib_name>_INCLUDE_DIR、<lib_name>_INCLUDES、<lib_name>_LIBRARY、<lib_name>_LIBRARIES,需要根据cmake文件中实现决定,并不统一。其引入模式分为两种,Module和Config,其中Module是从CMAKE_MODULE_PATH和cmake安装路径/Modules中,找的是Find<lib_name>.cmake;Config找的是<lib_name>Config.cmake或<lib_name>-config.cmake,其一般是通过安装添加到/usr/local/lib/cmake/...目录的。

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER]) #MODULE,只在该模式找;version,找的版本;EXACT,查找的版本要精确匹配;QUIET,找到包时,不输出信息;REQUIRED,找不到会终止;COMPONENTS,要查找的子组件;OPTIONAL_COMPONENTS,可选组件;REGISTRY_VIEW,在win中怎么查询注册表;GLOBAL,将找到的目标设为全局可见;NO_POLICY_SCOPE;BYPASS_PROVIDER,可以直接调用find_package内置的实现,防止自调用;
CONFIG|NO_MODULE,指定搜索模式;NAMES使用该名为lib_name名;PATHS/HINTS,Config模式下,搜索的路径;NO_XXX_PATH,Config模式下,忽略的路径。
默认优先用MODULE模式,CMAKE_FIND_PACKAGE_PREFER_CONFIG可以更换。