cmake 深入 - 基础命令

本文深入探讨CMake的基础命令,涵盖循环、条件判断、文件操作、宏定义、变量管理等核心功能,适合希望深入了解CMake使用技巧的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
endforeachforeach结束, 和 foreach 连用, 详情见 foreach
endfunctionfunction结束, 和 function 连用, 详情见 function
endifif 结束, 和 if 连用, 详情见 if
endmacromacro 结束, 和 macro 连用, 详情见 macro
endwhilewhile 结束, 和 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_FPUcpu是否支持浮点运算
HAS_MMXcpu是否支持MMX(多媒体扩展指令)
HAS_MMX_PLUScpu是否支持MMX PLUS(加强的多媒体扩展指令)
HAS_SSEcpu是否支持 SSE
HAS_SSE2cpu是否支持 SSE2
HAS_SSE_FPcpu是否支持 SSE FP
HAS_SSE_MMXcpu是否支持SSE MMX
HAS_AMD_3DNOW是否是支持 3D NOW技术的AMD cpu
HAS_AMD_3DNOW_PLUS是否是支持 3D NOW PLUS技术的AMD cpu
HAS_IA64是否是IA64指令集处理器
HAS_SERIAL_NUMBERcpu是否有序列号
PROCESSOR_SERIAL_NUMBERcpu 序列号查询
PROCESSOR_NAMEcpu名称
PROCESSOR_DESCRIPTIONcpu的全部说明
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转译标准错误
ENCODINGwindows系统的输出编码格式,其他系统忽视

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_includeCMAKE_FIND_ROOT_PATH_MODE_INCLUDE
find_fileCMAKE_FIND_ROOT_PATH_MODE_INCLUDE
find_libraryCMAKE_FIND_ROOT_PATH_MODE_LIBRARY
find_packageCMAKE_FIND_ROOT_PATH_MODE_PACKAGE
find_pathCMAKE_FIND_ROOT_PATH_MODE_INCLUDE
find_programCMAKE_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没有目录或最后的扩展名的文件名
PATH2.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>

| 命令 |目录|

参考翻译:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值