参考

VSCode 和 CLion 探索_Liuqz2009的博客

Ubuntu学习心得——翻译篇——CMake教程(官方文档中文版)

Cmake官方教程解析

​CMake Reference Documentation​​ 参考手册

​What is the difference between include_directories and target_include_directories in CMake?​

CMake的几种Include

cmake 编译Release版本 - YZFHKMS-X

cmake重新编译_weixin_30468137的博客

​CMake语法—命令list | 程序员灯塔​

cmake 多级目录编译_不是杠杠的博客

cmake(二十七)Cmake中target再理解_wzj_110的博客-CSDN博客_cmake target

cmake - 标签 - SirDigit

​cmake:target_** 中的 PUBLIC,PRIVATE,INTERFACE - 知乎​


cmake 命令

# 生成项目构建系统  Generate a Project Buildsystem
cmake [<options>] <path-to-source>
cmake [<options>] <path-to-existing-build>
cmake [<options>] -S <path-to-source> -B <path-to-build>

# 编译项目 Build a Project
cmake --build <dir> [<options>] [-- <build-tool-options>]

# 安装编译后的工程 Install a Project
cmake --install <dir> [<options>]

# 打开项目 Open a Project
cmake --open <dir>

# 运行脚本 Run a Script
cmake [{-D <var>=<value>}...] -P <cmake-script-file>

# 运行cmake内置命令行工具 Run a Command-Line Tool
cmake -E <command> [<options>]

# 运行Find-Package工具 Run the Find-Package Tool
cmake --find-package [<options>]

# 查看帮助 View Help
cmake --help[-<topic>]

生成项目构建系统

cmake [<options>] <path-to-source>
cmake [<options>] <path-to-existing-build>
cmake [<options>] -S <path-to-source> -B <path-to-build>

命令行

源目录

构建目录

​cmake src​

​src​

当前目录

​cmake build​​(包含CMakeCache.txt)

从缓存中加载

​build​

​cmake -S src​

​src​

当前目录

​cmake -S src build​

​src​

​build​

​cmake -S src -B build​

​src​

​build​

​cmake -B build​

当前目录

​build​

​cmake -B build src​

​src​

​build​

​cmake -B build -S src​

​src​

​build​

cmake -G "Visual Studio 16 2019" -A x64 ../ --fresh

​cmake(1) — CMake 3.24.0-rc3 Documentation​

编译项目

cmake --build <dir> [<options>] [-- <build-tool-options>]

参数:

--parallel [<jobs>], -j [<jobs>]
构建时使用的最大并发进程数。如果<jobs>省略,则使用本机构建工具的默认编号。
这CMAKE_BUILD_PARALLEL_LEVEL如果设置了环境变量,则在未给出此选项时指定默认的并行级别。

--target <tgt>..., -t <tgt>...
构建<tgt>,取代构建默认目标。可以给出多个目标,用空格分隔。

--config <cfg>
对于多配置工具,选择配置<cfg>。

--clean-first
先构建目标clean,然后构建。(仅清洁,使用。)--target clean

常用命令示例:

#windows:
cmake --build . --config Release

#linux:
cmake .. -DCMAKE_BUILD_TYPE=Release

安装编译后的文件

cmake --install <dir> [<options>]

参数:

--install <dir>
要安装的项目二进制目录。这是必需的,并且必须是第一个。

--config <cfg>
对于多配置生成器,请选择配置<cfg>。

--component <comp>
基于组件的安装。只安装组件<comp>。

--default-directory-permissions <permissions>
默认目录安装权限。格式的权限<u=rwx,g=rx,o=rx>。

--prefix <prefix>
覆盖安装前缀,CMAKE_INSTALL_PREFIX.

--strip
安装前精简,去掉调试信息等。


cmake 构建系统 cmake-buildsystem

定义可执行文件:  ​​add_executable()​​ 

定义可执行库: ​​add_library()​

定义二进制target的依赖关: ​​target_link_libraries()​​ 

定义共享库类型: ​​BUILD_SHARED_LIBS​

CMAKE_CONFIGURATION_TYPES

# 只生成 Release 的配置 (多配置的情况下)
cmake ../ -DCMAKE_CONFIGURATION_TYPES=Release

# 生成
cmake --build ./

# 因为只生成了 Release 的配置,所以报错说没有 Debug|x64 的配置
# C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Microsoft\VC\v170\Microsoft.CppBuild.targets(437,5): error MSB8013: 此项目不包含配置和平台组合 Debug|x64。

# 改成 生成 Release
cmake --build ./ --config Release

# 生成 bin 成功


cmake 命令

​cmake命令​​​ 分为:
脚本命令(Scripting Commands),
项目命令(Project Commands),
CTest 命令(CTest Commands),
不推荐使用的命令 (Deprecated Commands)

脚本命令(Scripting Commands)

break

​break — CMake 3.24.0-rc3 Documentation​

# 从 foreach 或 while 循环中跳出
break()

cmake_host_system_information

​cmake_host_system_information — CMake 3.24.0-rc3 Documentation​

# Query host system specific information
# 查询主机系统特定信息
cmake_host_system_information(RESULT <variable> QUERY <key> ...)

# Query Windows registry
# 查询 Windows 注册表
cmake_host_system_information(RESULT <variable> QUERY WINDOWS_REGISTRY <key> ...)


# 1
cmake_host_system_information(RESULT PRETTY_NAME QUERY DISTRIB_PRETTY_NAME)
message(STATUS "${PRETTY_NAME}")

# 2
cmake_host_system_information(RESULT result QUERY WINDOWS_REGISTRY "HKLM")
cmake_host_system_information(RESULT result QUERY WINDOWS_REGISTRY "HKLM/SOFTWARE/Kitware")
cmake_host_system_information(RESULT result QUERY WINDOWS_REGISTRY "HKCU\\SOFTWARE\\Kitware")

cmake_language

​cmake_language — CMake 3.24.0-rc3 Documentation​

# 1 ##########################################################################
# 调用 CMake 元操作命令
# 调用命令
cmake_language(CALL <command> [<arg>...])

# 示例
set(message_command "message")
cmake_language(CALL ${message_command} STATUS "Hello World!")
# 相当于
message(STATUS "Hello World!")

# 2 ##########################################################################
# 评估代码
cmake_language(EVAL CODE <code>...)


# 3 ##########################################################################
# 延迟调用
cmake_language(DEFER <options>... CALL <command> [<arg>...])

# 示例
cmake_language(DEFER CALL message "${deferred_message}")
cmake_language(DEFER ID_VAR id CALL message "Canceled Message")
cmake_language(DEFER CANCEL_CALL ${id})
message("Immediate Message")
set(deferred_message "Deferred Message")

# 4 ##########################################################################
# 依赖提供者
cmake_language(SET_DEPENDENCY_PROVIDER <command> SUPPORTED_METHODS <methods>...)

cmake_minimum_required

​cmake_minimum_required — CMake 3.24.0-rc3 Documentation​

# 定义需要的 最低的 cmake 版本
cmake_minimum_required(VERSION <min>[...<policy_max>] [FATAL_ERROR])

# 示例
cmake_minimum_required(VERSION 3.9)

cmake_parse_arguments

​cmake_parse_arguments — CMake 3.24.0-rc3 Documentation​

# 解析函数或宏参数
cmake_parse_arguments(<prefix> <options> <one_value_keywords>
<multi_value_keywords> <args>...)

cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
<one_value_keywords> <multi_value_keywords>)

cmake_path

​cmake_path — CMake 3.24.0-rc3 Documentation​

# 该命令处理构建系统(即主机平台)格式的路径,而不是目标系统
# 分解 Decomposition
cmake_path( GET <path-var> ROOT_NAME <out-var>)
cmake_path( GET <path-var> ROOT_DIRECTORY <out-var>)
cmake_path( GET <path-var> ROOT_PATH <out-var>)
cmake_path( GET <path-var> FILENAME <out-var>)
cmake_path( GET <path-var> EXTENSION [LAST_ONLY] <out-var>)
cmake_path( GET <path-var> STEM [LAST_ONLY] <out-var>)
cmake_path( GET <path-var> RELATIVE_PART <out-var>)
cmake_path( GET <path-var> PARENT_PATH <out-var>)

# 查询 Query
cmake_path( HAS_ROOT_NAME <path-var> <out-var>)
cmake_path( HAS_ROOT_DIRECTORY <path-var> <out-var>)
cmake_path( HAS_ROOT_PATH <path-var> <out-var>)
cmake_path( HAS_FILENAME <path-var> <out-var>)
cmake_path( HAS_EXTENSION <path-var> <out-var>)
cmake_path( HAS_STEM <path-var> <out-var>)
cmake_path( HAS_RELATIVE_PART <path-var> <out-var>)
cmake_path( HAS_PARENT_PATH <path-var> <out-var>)
cmake_path( IS_ABSOLUTE <path-var> <out-var>)
cmake_path( IS_RELATIVE <path-var> <out-var>)
cmake_path( IS_PREFIX <path-var> <input> [NORMALIZE] <out-var>)
cmake_path(比较<input1> <OP> <input2> <out-var>)

# 修改 Modification
cmake_path( SET <path-var> [NORMALIZE] <input>)
cmake_path( APPEND <path-var> [<input>...] [OUTPUT_VARIABLE <out-var>])
cmake_path( APPEND_STRING <path-var> [<input>...] [OUTPUT_VARIABLE <out-var>])
cmake_path( REMOVE_FILENAME <path-var> [OUTPUT_VARIABLE <out-var>])
cmake_path( REPLACE_FILENAME <path-var> <input> [OUTPUT_VARIABLE <out-var>])
cmake_path( REMOVE_EXTENSION <path-var> [LAST_ONLY] [OUTPUT_VARIABLE <out-var>])
cmake_path( REPLACE_EXTENSION <path-var> [LAST_ONLY] <input> [OUTPUT_VARIABLE <out-var>])

# 生成 Generation
cmake_path( NORMAL_PATH <path-var> [OUTPUT_VARIABLE <out-var>])
cmake_path( RELATIVE_PATH <path-var> [BASE_DIRECTORY <input>] [OUTPUT_VARIABLE <out-var>])
cmake_path( ABSOLUTE_PATH <path-var> [BASE_DIRECTORY <input>] [NORMALIZE] [OUTPUT_VARIABLE <out-var>])

# 本机转换 Native Conversion
cmake_path( NATIVE_PATH <path-var> [NORMALIZE] <out-var>)
cmake_path(转换<输入> TO_CMAKE_PATH_LIST <输出变量> [NORMALIZE])
cmake_path( CONVERT <input> TO_NATIVE_PATH_LIST <out-var> [NORMALIZE])

# 散列 Hashing
cmake_path( HASH <path-var> <out-var>)

cmake_policy

​cmake_policy — CMake 3.24.0-rc3 Documentation​

configure_file

​configure_file — CMake 3.24.0-rc3 Documentation​

# 将文件复制到另一个位置并修改其内容。

configure_file(<input> <output>
[NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS |
FILE_PERMISSIONS <permissions>...]
[COPYONLY] [ESCAPE_QUOTES] [@ONLY]
[NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])

# 示例 ###############
# 考虑一个包含foo.h.in文件的源代码树:
#cmakedefine FOO_ENABLE
#cmakedefine FOO_STRING "@FOO_STRING@"

# 一个相邻的CMakeLists.txt可以configure_file用来配置标头:
option(FOO_ENABLE "Enable Foo" ON)
if(FOO_ENABLE)
set(FOO_STRING "foo")
endif()
configure_file(foo.h.in foo.h @ONLY)

# foo.h这将在与此源目录对应的构建目录中创建一个。如果该FOO_ENABLE选项打开,配置文件将包含:
#define FOO_ENABLE
#define FOO_STRING "foo"

# 否则它将包含:
/* #undef FOO_ENABLE */
/* #undef FOO_STRING */

# 然后可以使用include_directories()命令指定输出目录为头文件搜索路径

include_directories(${CMAKE_CURRENT_BINARY_DIR})

# 以便源可以将标头包含为 #include <foo.h>

continue

​continue — CMake 3.24.0-rc3 Documentation​

continue()

else

​else — CMake 3.24.0-rc3 Documentation​

else([<condition>])

elseif

​elseif — CMake 3.24.0-rc3 Documentation​

elseif(<condition>)

endforeach

​endforeach — CMake 3.24.0-rc3 Documentation​

endforeach([<loop_var>])

endfunction

​endfunction — CMake 3.24.0-rc3 Documentation​

endfunction([<name>])

endif

​endif — CMake 3.24.0-rc3 Documentation​

endif([<condition>])

endmacro

​endmacro — CMake 3.24.0-rc3 Documentation​

endmacro([<name>])

endwhile

​endwhile — CMake 3.24.0-rc3 Documentation​

endwhile([<condition>])

execute_process

​execute_process — CMake 3.24.0-rc3 Documentation​

# 执行一个或多个子进程。

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>])

file

​file — CMake 3.24.0-rc3 Documentation​

# 文件操作命令
# 此命令专用于需要访问文件系统的文件和路径操作
# Reading 读取
file(READ <filename> <out-var> [...])
file(STRINGS <filename> <out-var> [...])
file(<HASH> <filename> <out-var>)
file(TIMESTAMP <filename> <out-var> [...])
file(GET_RUNTIME_DEPENDENCIES [...])

# Writing 写入
file({WRITE | APPEND} <filename> <content>...)
file({TOUCH | TOUCH_NOCREATE} [<file>...])
file(GENERATE OUTPUT <output-file> [...])
file(CONFIGURE OUTPUT <output-file> CONTENT <content> [...])

# Filesystem 文件系统
file({GLOB | GLOB_RECURSE} <out-var> [...] [<globbing-expr>...])
file(MAKE_DIRECTORY [<dir>...])
file({REMOVE | REMOVE_RECURSE } [<files>...])
file(RENAME <oldname> <newname> [...])
file(COPY_FILE <oldname> <newname> [...])
file({COPY | INSTALL} <file>... DESTINATION <dir> [...])
file(SIZE <filename> <out-var>)
file(READ_SYMLINK <linkname> <out-var>)
file(CREATE_LINK <original> <linkname> [...])
file(CHMOD <files>... <directories>... PERMISSIONS <permissions>... [...])
file(CHMOD_RECURSE <files>... <directories>... PERMISSIONS <permissions>... [...])

# Path Conversion 路径转换
file(REAL_PATH <path> <out-var> [BASE_DIRECTORY <dir>] [EXPAND_TILDE])
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> [...])

# Archiving 归档
file(ARCHIVE_CREATE OUTPUT <archive> PATHS <paths>... [...])
file(ARCHIVE_EXTRACT INPUT <archive> [...])

find_file

​find_file — CMake 3.24.0-rc3 Documentation​

# 此命令用于查找命名文件的完整路径
# 速记签名是:

find_file (<VAR> name1 [path1 path2 ...])

find_file (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)

find_library

​find_library — CMake 3.24.0-rc3 Documentation​

#速记签名是
find_library (<VAR> name1 [path1 path2 ...])

# 该命令用于查找库
find_library (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)

# 如果指定NO_CACHE,则查找结果缓存到变量VAR中,否则存放在缓存条目中。如果什么都没找到,结果将是<VAR>-NOTFOUND

find_package

​find_package — CMake 3.24.0-rc3 Documentation​

​CMake的find_package指令详解 - 知乎​

# 查找包
# 基本用法
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[NO_POLICY_SCOPE]
[GLOBAL])


# 完全用法
find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[CONFIG|NO_MODULE]
[NO_POLICY_SCOPE]
[GLOBAL]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[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_INSTALL_PREFIX]
[NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])

CMake 为包构造了一组可能的安装前缀。在每个前缀下搜索几个目录以查找配置文件。下表显示了搜索的目录。每个条目都适用于遵循 Windows ( ​​W​​​)、UNIX ( ​​U​​​) 或 Apple ( ​​A​​) 约定的安装树:

<prefix>/                                                       (W)
<prefix>/(cmake|CMake)/ (W)
<prefix>/<name>*/ (W)
<prefix>/<name>*/(cmake|CMake)/ (W)
<prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U)
<prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)

在支持 macOS 的系统上​​FRAMEWORK​​​和​​BUNDLE​​,在以下目录中搜索包含配置文件的框架或应用程序包:

<prefix>/<name>.framework/Resources/                    (A)
<prefix>/<name>.framework/Resources/CMake/ (A)
<prefix>/<name>.framework/Versions/*/Resources/ (A)
<prefix>/<name>.framework/Versions/*/Resources/CMake/ (A)
<prefix>/<name>.app/Contents/Resources/ (A)
<prefix>/<name>.app/Contents/Resources/CMake/ (A)

在所有情况下​​<name>​​​都被视为不区分大小写并对应于任何指定的名称(​​<PackageName>​​​或由 给出的名称​​NAMES​​)。

如果​​lib/<arch>​​​_ ​​CMAKE_LIBRARY_ARCHITECTURE​​​变量已设置。包括一个或​​lib*​​​多个值​​lib64​​​、​​lib32​​​或(按该顺序搜索)。​​libx32​​​​lib​

find_path

​find_path — CMake 3.24.0-rc3 Documentation​

# 速记用法
find_path (<VAR> name1 [path1 path2 ...])

# 通用用法
find_path (
<VAR>
name | NAMES name1 [name2 ...]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)

# 此命令用于查找包含命名文件的目录,如果指定NO_CACHE,则查找结果缓存到变量VAR中,否则存放在缓存条目中。如果什么都没找到,结果将是<VAR>-NOTFOUND

find_program

​find_program — CMake 3.24.0-rc3 Documentation​

# 该命令用于查找程序
# 速记用法
find_program (<VAR> name1 [path1 path2 ...])

# 通用用法
find_program (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS [path | ENV var]... ]
[PATHS [path | ENV var]... ]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
)

# 该命令用于查找程序,如果指定NO_CACHE,则查找结果缓存到变量VAR中,否则存放在缓存条目中。如果什么都没找到,结果将是<VAR>-NOTFOUND

foreach

​foreach — CMake 3.24.0-rc3 Documentation​

foreach(<loop_var> <items>)
<commands>
endforeach()

foreach(<loop_var> RANGE <stop>)

foreach(<loop_var> RANGE <start> <stop> [<step>])

foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])

foreach(<loop_var>... IN ZIP_LISTS <lists>)

#############################################################
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 — CMake 3.24.0-rc3 Documentation​

function(<name> [<arg1> ...])
<commands>
endfunction()

get_cmake_property

​get_cmake_property — CMake 3.24.0-rc3 Documentation​

get_cmake_property(<var> <property>)

#从 CMake 实例获取全局属性。把<property>的值存储在变量<var>中。如果未找到该属性,<var>将设置为NOTFOUND。

get_directory_property

​get_directory_property — CMake 3.24.0-rc3 Documentation​

get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)

get_directory_property(<variable> [DIRECTORY <dir>]
DEFINITION <var-name>)

# 将目录范围的属性存储在<variable>变量中

get_filename_component

# 获取完整文件名的特定组成部分
get_filename_component(<var> <FileName> <mode> [CACHE])

get_filename_component(<var> <FileName> <mode> [BASE_DIR <dir>] [CACHE])

get_filename_component(<var> <FileName> PROGRAM [PROGRAM_ARGS <arg_var>] [CACHE])

# 在 3.20 版更改:此命令已被cmake_path()命令取代

get_property

​get_property — CMake 3.24.0-rc3 Documentation​

# 从范围内的一个对象中获取一个属性
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])

if

​if — CMake 3.24.0-rc3 Documentation​

# 语法
if(<condition>)
<commands>
elseif(<condition>) # optional block, can be repeated
<commands>
else() # optional block
<commands>
endif()

# 基本表达式
if(<constant>)
if(<variable>)
if(<string>)

# 逻辑运算符
if(NOT <condition>)
if(<cond1> AND <cond2>)
if(<cond1> OR <cond2>)
if((condition) AND (condition OR (condition)))

# 存在性检查
if(COMMAND command-name)
if(POLICY policy-id)
if(TARGET target-name)
if(TEST test-name)
if(DEFINED <name>|CACHE{<name>}|ENV{<name>})
if(<variable|string> IN_LIST <variable>)

# 文件操作
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)

# Comparisons
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> PATH_EQUAL <variable|string>)

include

​include — CMake 3.24.0-rc3 Documentation​

# 从文件或模块加载并运行 CMake 代码
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>]
[NO_POLICY_SCOPE])

include_guard

​include_guard — CMake 3.24.0-rc3 Documentation​

# 为 CMake 当前正在处理的文件提供包含保护
include_guard([DIRECTORY|GLOBAL])

list

​list — CMake 3.24.0-rc3 Documentation​

​CMake语法—命令list | 程序员灯塔​

Reading
list(LENGTH <list> <out-var>)
list(GET <list> <element index> [<index> ...] <out-var>)
list(JOIN <list> <glue> <out-var>)
list(SUBLIST <list> <begin> <length> <out-var>)

Search
list(FIND <list> <value> <out-var>)

Modification
list(APPEND <list> [<element>...])
list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)
list(INSERT <list> <index> [<element>...])
list(POP_BACK <list> [<out-var>...])
list(POP_FRONT <list> [<out-var>...])
list(PREPEND <list> [<element>...])
list(REMOVE_ITEM <list> <value>...)
list(REMOVE_AT <list> <index>...)
list(REMOVE_DUPLICATES <list>)
list(TRANSFORM <list> <ACTION> [...])

Ordering
list(REVERSE <list>)
list(SORT <list> [...])

macro

​macro — CMake 3.24.0-rc3 Documentation​

# 开始录制宏以供以后作为命令调用
macro(<name> [<arg1> ...])
<commands>
endmacro()

mark_as_advanced

​mark_as_advanced — CMake 3.24.0-rc3 Documentation​

# 将 cmake 缓存变量标记为高级
mark_as_advanced([CLEAR|FORCE] <var1> ...)

math

​math — CMake 3.24.0-rc3 Documentation​

# 评估一个数学表达式
math(EXPR <variable> "<expression>" [OUTPUT_FORMAT <format>])

# 示例
math(EXPR value "100 * 0xA" OUTPUT_FORMAT DECIMAL) # value is set to "1000"
math(EXPR value "100 * 0xA" OUTPUT_FORMAT HEXADECIMAL) # value is set to "0x3e8"

message

​message — CMake 3.24.0-rc3 Documentation​

# 一般信息  General messages  
message([<mode>] "message text" ...)

# 报告检查 Reporting checks
message(<checkState> "message text" ...)

# 可选项 mode
# FATAL_ERROR
# CMake 错误,停止处理和生成
# SEND_ERROR
# CMake 错误,继续处理,但跳过生成
# WARNING
# CMake 警告,继续处理
# AUTHOR_WARNING
# CMake 警告(开发),继续处理
# DEPRECATION
# CMake 弃用错误或警告
# (无)或NOTICE
# 打印到 stderr 以吸引用户注意的重要消息
# STATUS
# 项目用户可能感兴趣的主要有趣信息
# VERBOSE
# 针对项目用户的详细信息消息
# DEBUG
# 详细的信息消息旨在为项目本身的开发人员而不是只想构建它的用户提供
# TRACE
# 具有非常低级实现细节的细粒度消息

option

​option — CMake 3.24.0-rc3 Documentation​

# 提供布尔选项给用户选择
option(<variable> "<help_text>" [value])

# 如果<value>没有提供初始值,则布尔值默认值是OFF。如果<variable>通过普通或缓存变量进行了设置,则该命令不执行任何操作

return

​return — CMake 3.24.0-rc3 Documentation​

return()

separate_arguments

​separate_arguments — CMake 3.24.0-rc3 Documentation​

# 将命令行参数解析为分号分隔的列表
# 将空格分隔的字符串解析<args>为项目列表,并将此列表以分号分隔的标准格式存储在<variable>
separate_arguments(<variable> <mode> [PROGRAM [SEPARATE_ARGS]] <args>)

# mode 可取 UNIX_COMMAND, WINDOWS_COMMAND, NATIVE_COMMAND




# 示例
separate_arguments (out UNIX_COMMAND PROGRAM "cc -c main.c")
# out值 /path/to/cc;-c main.c

separate_arguments (out UNIX_COMMAND PROGRAM SEPARATE_ARGS "cc -c main.c")
# out值 /path/to/cc;-c;main.c

set

​set — CMake 3.24.0-rc3 Documentation​

​Cmake命令之set介绍 - 百度文库​

cmake命令之set_物随心转的博客-CSDN博客_cmake set命令

# 设置普通变量  Set Normal Variable
set(<variable> <value>... [PARENT_SCOPE])


# 设置缓存条目 Set Cache Entry
set(<variable> <value>... CACHE <type> <docstring> [FORCE])

# <type>
# BOOL
# 布尔ON/OFF值。 cmake-gui(1)提供一个复选框。
# FILEPATH
# 磁盘上文件的路径。 cmake-gui(1)提供文件对话框。
# PATH
# 磁盘上目录的路径。 cmake-gui(1)提供文件对话框。
# STRING
# 一行文字。 cmake-gui(1)如果STRINGS缓存条目属性已设置。
# INTERNAL
# 一行文字。 cmake-gui(1)不显示内部条目。它们可用于跨运行持久存储变量。使用这种类型意味着FORCE.


# 设置环境变量 Set Environment Variable
set(ENV{<variable>} [<value>])

# 使用 $ENV{<variable>} 引用此环境变量

set_directory_properties

​set_directory_properties — CMake 3.24.0-rc3 Documentation​

# 设置当前目录和子目录的属性
set_directory_properties(PROPERTIES prop1 value1 [prop2 value2] ...)

# 以键值对的形式设置当前目录及其子目录的属性

set_property

​set_property — CMake 3.24.0-rc3 Documentation​

# 在给定范围内设置命名属性
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> ...])

site_name

​site_name — CMake 3.24.0-rc3 Documentation​

# 将给定变量设置为计算机的名称
site_name(variable)

string

​string — CMake 3.24.0-rc3 Documentation​

# 字符串操作
# 搜索和替换 Search and Replace
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>...)

# 操作 Manipulation
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>)

# 比较 Comparison
string(COMPARE <op> <string1> <string2> <out-var>)

# 哈希 Hashing
string(<HASH> <out-var> <input>)

# 生成 Generation
string(ASCII <number>... <out-var>)
string(HEX <string> <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> ...)

# JSON
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
{GET | TYPE | LENGTH | REMOVE}
<json-string> <member|index> [<member|index> ...])
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
MEMBER <json-string>
[<member|index> ...] <index>)
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
SET <json-string>
<member|index> [<member|index> ...] <value>)
string(JSON <out-var> [ERROR_VARIABLE <error-var>]
EQUAL <json-string1> <json-string2>)

unset

​unset — CMake 3.24.0-rc3 Documentation​

# 取消设置普通变量或缓存条目
# Unset Normal Variable or Cache Entry
unset(<variable> [CACHE | PARENT_SCOPE])


# 取消设置环境变量
# Unset Environment Variable
unset(ENV{<variable>})

variable_watch

​variable_watch — CMake 3.24.0-rc3 Documentation​

# 观察 CMake 变量的变化
variable_watch(<variable> [<command>])

# 如果指定的<variable>更改并且没有<command>给出,将打印一条消息以通知更改。
# 如果<command>给出,则将执行此命令。该命令将接收以下参数: COMMAND(<variable> <access> <value> <current_list_file> <stack>)

while

​while — CMake 3.24.0-rc3 Documentation​

while(<condition>)
<commands>
endwhile()

项目命令(Project Commands)

add_compile_definitions

​add_compile_definitions — CMake 3.24.0-rc3 Documentation​

cmake(13):构建时设置预处理宏定义以及add_compile_definitions命令详解_翔底的博客-CSDN博客_cmake预定义宏

CMAKE语法:add_definitions、add_compile_options_持续学习,不断沉淀的博客-CSDN博客_add_compile_options

cmake的四个命令:add_compile_options、add_definitions、target_compile_definitions、build_command - DoubleLi - 博客园

# 将预处理器定义添加到源文件的编译中
# 为当前路径以及下层路径的目标加入编译定义
add_compile_definitions(<definition> ...)

# 示例
# add_definitions 推荐使用 add_compile_definitions 替代
add_definitions (-DCOMPILE_M1)
add_definitions (-DCOMPILE_M2=0x100)

add_compile_definitions (COMPILE_M3=0x200)

if(COMPILE_M4)
add_compile_definitions (COMPILE_M4)
endif()

add_compile_options

​add_compile_options — CMake 3.24.0-rc3 Documentation​

# 为源文件的添加编译选项
add_compile_options(<option> ...)

# 示例
if (MSVC)
# warning level 4 and all warnings as errors
add_compile_options(/W4 /WX)
else()
# lots of warnings and all warnings as errors
add_compile_options(-Wall -Wextra -pedantic -Werror)
endif()

add_custom_command

​add_custom_command — CMake 3.24.0-rc3 Documentation​

# 将自定义构建规则添加到生成的构建系统
# 生成文件
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])

# 示例:生成文件
# 自定义命令可用于生成源文件。例如,代码:

add_custom_command(
OUTPUT out.c
COMMAND someTool -i ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
-o out.c
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/in.txt
VERBATIM)
add_library(myLib out.c)



# 构建事件
# 第二个签名将自定义命令添加到库或可执行文件等目标。这对于在构建目标之前或之后执行操作很有用。该命令成为目标的一部分,并且只会在构建目标本身时执行。如果目标已经构建,该命令将不会执行。

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])

# 示例:构建事件
# 一个POST_BUILD事件可用于在链接后对二进制文件进行后处理。例如,代码:

add_executable(myExe myExe.c)
add_custom_command(
TARGET myExe POST_BUILD
COMMAND someHasher -i "$<TARGET_FILE:myExe>"
-o "$<TARGET_FILE:myExe>.hash"
VERBATIM)

add_custom_target

​add_custom_target — CMake 3.24.0-rc3 Documentation​

# 添加一个没有输出的目标,以便始终构建它
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...]])

add_definitions

​add_definitions — CMake 3.24.0-rc3 Documentation​

# 将 -D 定义标志添加到源文件的编译中
add_definitions(-DFOO -DBAR ...)

# 注意 此命令已被替代命令取代:
# 利用add_compile_definitions()添加预处理器定义。
# 利用include_directories()添加包含目录。
# 利用add_compile_options()添加其他选项

add_dependencies

​add_dependencies — CMake 3.24.0-rc3 Documentation​

# 在顶级目标之间添加依赖关系。

add_dependencies(<target> [<target-dependency>]...)

add_executable

​add_executable — CMake 3.24.0-rc3 Documentation​

# 普通的可执行文件
# Normal Executables
add_executable(<name> [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 ...])


# 导入的可执行文件
# Imported Executables
add_executable(<name> IMPORTED [GLOBAL])


# 给可执行文件创建一个别名
# Alias Executables
add_executable(<name> ALIAS <target>)

add_library

​add_library — CMake 3.24.0-rc3 Documentation​

javascript:void(0)

cmake : add_library详解_lainegates的博客-CSDN博客_add_library

# 普通库
# Normal Libraries
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[<source>...])


# 对象库
# Object Libraries
add_library(<name> OBJECT [<source>...])


# 接口库
# Interface Libraries
add_library(<name> INTERFACE)


# 导入的库
# Imported Libraries
add_library(<name> <type> IMPORTED [GLOBAL])


# 别名库
# Alias Libraries
add_library(<name> ALIAS <target>)

add_link_options

​add_link_options — CMake 3.24.0-rc3 Documentation​

# 为当前目录及以下目录中的可执行文件、共享库或模块库目标的链接步骤添加选项,这些选项是在调用此命令后添加的
add_link_options(<option> ...)

add_subdirectory

​add_subdirectory — CMake 3.24.0-rc3 Documentation​

# 将子目录添加到构建。

add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

add_test

​add_test — CMake 3.24.0-rc3 Documentation​

add_test(NAME <name> COMMAND <command> [<arg>...]
[CONFIGURATIONS <config>...]
[WORKING_DIRECTORY <dir>]
[COMMAND_EXPAND_LISTS])

aux_source_directory

​aux_source_directory — CMake 3.24.0-rc3 Documentation​

# 查找目录中的所有源文件。

aux_source_directory(<dir> <variable>)

build_command
create_test_sourcelist
define_property

enable_language

​enable_language — CMake 3.24.0-rc3 Documentation​

# 启用一种语言(CXX/C/OBJC/OBJCXX/Fortran/等)

enable_language(<lang> [OPTIONAL] )

enable_testing

​enable_testing — CMake 3.24.0-rc3 Documentation​

# 启用当前目录及以下目录的测试。

enable_testing()

export
fltk_wrap_ui
get_source_file_property
get_target_property
get_test_property

include_directories

​include_directories — CMake 3.24.0-rc3 Documentation​

# 为项目构建添加头文件搜索目录

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

# 搜索目录添加到属性 INCLUDE_DIRECTORIES 中

include_external_msproject
include_regular_expression

install

​install — CMake 3.24.0-rc3 Documentation​

install(TARGETS <target>... [...])
install(IMPORTED_RUNTIME_ARTIFACTS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])
install(RUNTIME_DEPENDENCY_SET <set-name> [...])


# 示例
install(TARGETS MathFunctions DESTINATION lib)
install(FILES MathFunctions.h DESTINATION include)

install(TARGETS Tutorial DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/TutorialConfig.h"
DESTINATION include
)

link_directories

​link_directories — CMake 3.24.0-rc3 Documentation​

# 添加目录到链接器搜索库的目录中。

link_directories([AFTER|BEFORE] directory1 [directory2 ...])

目录会设置到 LINK_DIRECTORIES 属性中

link_libraries

​link_libraries — CMake 3.24.0-rc3 Documentation​

target_link_libraries 和link_libraries区别_日作诗歌三千首的博客-CSDN博客_target_link_libraries

# 将库链接到以后添加的所有目标。

link_libraries([item1 [item2 [...]]]
[[debug|optimized|general] <item>] ...)

load_cache

project

​project — CMake 3.24.0-rc3 Documentation​

# 设置项目的名称
project(<PROJECT-NAME> [<language-name>...])
project(<PROJECT-NAME>
[VERSION <major>[.<minor>[.<patch>[.<tweak>]]]]
[DESCRIPTION <project-description-string>]
[HOMEPAGE_URL <url-string>]
[LANGUAGES <language-name>...])


# 示例
project(nlohmann_json VERSION 3.10.5 LANGUAGES CXX)

remove_definitions

​remove_definitions — CMake 3.24.0-rc3 Documentation​

# 删除由 -D 添加的变量

remove_definitions(-DFOO -DBAR ...)

# 见 add_definitions()

set_source_files_properties
set_target_properties
set_tests_properties
source_group

target_compile_definitions

​target_compile_definitions — CMake 3.24.0-rc3 Documentation​

target_compile_definitions(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

# PRIVATE 和 PUBLIC items 会设置到<target>的 COMPILE_DEFINITIONS 属性中.
# PUBLIC 和 INTERFACE items 会设置到<target>的 INTERFACE_COMPILE_DEFINITIONS 属性中.


# 项目上的任何前导-D都将被删除。空项目被忽略。例如,以下都是等价的:
target_compile_definitions(foo PUBLIC FOO)
target_compile_definitions(foo PUBLIC -DFOO) # -D removed
target_compile_definitions(foo PUBLIC "" FOO) # "" ignored
target_compile_definitions(foo PUBLIC -D FOO) # -D becomes "", then ignored

# 定义可选择的值:
target_compile_definitions(foo PUBLIC FOO=1)

target_compile_features

​target_compile_features — CMake 3.24.0-rc3 Documentation​

# 将预期的编译器功能添加到目标。

target_compile_features(<target> <PRIVATE|PUBLIC|INTERFACE> <feature> [...])

target_compile_options

​target_compile_options — CMake 3.24.0-rc3 Documentation​

# 将编译选项添加到目标。

target_compile_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

target_include_directories

​target_include_directories — CMake 3.24.0-rc3 Documentation​

# 将包含目录添加到目标
target_include_directories(<target> [SYSTEM] [AFTER|BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])


# PRIVATE 和 PUBLIC items 会设置到<target>的 INCLUDE_DIRECTORIES 属性中.
# PUBLIC 和 INTERFACE items 会设置到<target>的 INTERFACE_INCLUDE_DIRECTORIES属性中.

target_link_directories

​target_link_directories — CMake 3.24.0-rc3 Documentation​

# 将链接目录添加到目标。

target_link_directories(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])


# PRIVATE 和 PUBLIC items 会设置到<target>的 LINK_DIRECTORIES 属性中.
# PUBLIC 和 INTERFACE items 会设置到<target>的 INTERFACE_LINK_DIRECTORIES 属性中.

target_link_libraries

​target_link_libraries — CMake 3.24.0-rc3 Documentation​

# 为<target>指定其要依赖项的库或标志
target_link_libraries(<target> ... <item>... ...)


# 目标和/或其依赖的库
target_link_libraries(<target>
<PRIVATE|PUBLIC|INTERFACE> <item>...
[<PRIVATE|PUBLIC|INTERFACE> <item>...]...)


# 目标及其依赖的库
target_link_libraries(<target> <item>...)

target_link_options

​target_link_options — CMake 3.24.0-rc3 Documentation​

# 为可执行文件、共享库或模块库目标的链接步骤添加选项。

target_link_options(<target> [BEFORE]
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

target_precompile_headers

​target_precompile_headers — CMake 3.24.0-rc3 Documentation​

# 添加要预编译的头文件列表。

# 预编译头文件可以通过创建一些头文件的部分处理版本,然后在编译期间使用该版本而不是重复解析原始头文件来加速编译。

# 主要用法 Main Form
target_precompile_headers(<target>
<INTERFACE|PUBLIC|PRIVATE> [header1...]
[<INTERFACE|PUBLIC|PRIVATE> [header2...] ...])


# 重用预编译头 Reusing Precompile Headers
# 该命令还支持第二个签名,可用于指定一个目标重用来自另一个目标的预编译头文件工件,而不是生成自己的:

target_precompile_headers(<target> REUSE_FROM <other_target>)

target_sources

​target_sources — CMake 3.24.0-rc3 Documentation​

# 将源代码添加到目标。

target_sources(<target>
<INTERFACE|PUBLIC|PRIVATE> [items1...]
[<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])


# 文件集
target_sources(<target>
[<INTERFACE|PUBLIC|PRIVATE>
[FILE_SET <set> [TYPE <type>] [BASE_DIRS <dirs>...] [FILES <files>...]]...
]...)

try_compile
try_run

CTest 命令(CTest Commands)

ctest_build
ctest_configure
ctest_coverage
ctest_empty_binary_directory
ctest_memcheck
ctest_read_custom_files
ctest_run_script
ctest_sleep
ctest_start
ctest_submit
ctest_test
ctest_update
ctest_upload


cmake-env-variables

cmake 环境变量

改变行为的环境变量

控制构建的环境变量

语言环境变量

CTest 的环境变量

CMake curses 接口的环境变量


cmake-generator-expressions

​在构建系统生成期间使用生成器评估表达式以生成特定于每个构建配置的信息​

$<BOOL:string>
$<AND:conditions>
$<OR:conditions>
$<NOT:condition>


cmake-generators

生成原生系统的编辑文件,如windows的vcxproj,linux的makefile

命令行构建工具生成器

Makefile Generators

Ninja Generators

Ninja首页、文档和下载 - 小而快的构建系统 - OSCHINA - 中文开源技术交流社区

Ninja 是 Google 的一名程序员推出的注重速度的构建工具,一般在 Unix/Linux 上的程序通过 make/makefile 来构建编译,而 Ninja 通过将编译任务并行组织,大大提高了构建速度。Ninja 的目标是成为汇编程序。

IDE 构建工具生成器

Visual Studio Generators

Other Generators

额外的生成器


cmake-language

​cmake 语言。讲述其组织、目录结构、脚本、模块、语法、编码、命令调用等​


cmake-modules

此处列出的模块是 CMake 发行版的一部分。项目可能提供更多模块,它们的位置可以由​​CMAKE_MODULE_PATH​​指定。

实用模块

这些模块使用include()命令进行加载

查找模块

这些模块用来搜索第三方软件。它们通常通过find_package()命令进行使用


cmake-packages

​包含使用包,包的结构,创建包,注册包​

find_package(Qt4 4.7.0 REQUIRED) # CMake provides a Qt4 find-module
find_package(Qt5Core 5.1.0 REQUIRED) # Qt provides a Qt5 package config file.
find_package(LibXml2 REQUIRED) # Use pkg-config via the LibXml2 find-module


​cmake-policies​​  策略

​cmake-presets​​  与人共享

​cmake-properties​​  属性

​cmake-qt​​  qt cmake

 


cmake-toolchains

​cmake-toolchains(7) — CMake 3.24.0-rc3 Documentation​

设置编译工具链

# 一个典型的 Linux 交叉编译工具链包含以下内容:
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_SYSROOT /home/devel/rasp-pi-rootfs)
set(CMAKE_STAGING_PREFIX /home/devel/stage)

set(tools /home/devel/gcc-4.7-linaro-rpi-gnueabihf)
set(CMAKE_C_COMPILER ${tools}/bin/arm-linux-gnueabihf-gcc)
set(CMAKE_CXX_COMPILER ${tools}/bin/arm-linux-gnueabihf-g++)

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)


cmake-variables

​cmake-variables(7) — CMake 3.24.0-rc3 Documentation​