目录
参考资料
命令行
1. 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> 可以通过-D传递多个变量值,格式为KeyA:ValueA[::KeyX:ValueX],其中双冒号分隔多个表达式,单冒号分隔每个表达式的变量和值,例如-DMODULE_ARGS=KeyA:ValueA::KeyX:ValueX |
Run a Command-Line Tool |
cmake -E <command> [<options>] 调用cmake内建的外部命令,比如拷贝命令,可以屏蔽系统差异 |
Run the Find-Package Tool | cmake --find-package [<options>] |
View Help | cmake --help[-<topic>] |
2. ctest
略
3. cpack
略
关键字
关键字 | 指令 & 解释 |
---|---|
PUBLIC PRIVATE INTERFACE |
对于target_link_libraries(A XXX B): PUBLIC: 任何链接到A的目标, 必须链接到B, 且A本身需要链接B PRIVATE: 任何链接到A的目标, 不会链接到B, 但A本身需要链接B INTERFACE: 任何链接到A的目标, 都会链接到B, 但A本身不链接B 对于target_include_directories(A XXX B): PUBLIC: 任何链接到A的目标, 必须包含B文件夹, 且A本身需要包含B PRIVATE: 任何链接到A的目标, 不会包含B文件夹, 但A本身需要包含B INTERFACE: 任何链接到A的目标, 都会包含到B文件夹, 但A本身不包含B |
in-source out-source |
in-source编译就是把编译输出文件(包括.o文件)和CMakeLists.txt放在同一个目录,比如直接执行cmake . out-source编译就是把编译输出文件(包括.o文件)放到与CMakeLists.txt目录不同的其他目录,比如先进入build目录再执行cmake .. |
指令分类
Scripting Commands
指令 | 解释 |
---|---|
aux_source_directory() | 用于自动生成目录源文件集合 |
configure_file() | 拷贝一份文件到指定位置并修改其内容 |
execute_process() | 执行外部程序,具体参见链接 |
include() | 加载并执行指定的CMake文件或Module(即名字为<module>.cmake的文件,搜索路径为CMAKE_MODULE_PATH) |
find_package() | 查找CMAKE_FRAMEWORK_PATH对应的库,使用方法: 1)find_package(MODULE)模式,先用CMAKE_MODULE_PATH找到Find<PackageName>.cmake, 然后用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到二进制。 2)find_package(CONFIG)模式,用<PackageName>_ROOT或者CMAKE_PREFIX_PATH找到<PackageName>Config.cmake, 然后用<PackageName>Config.cmake的相对路径找到二进制。 |
file() | 文件操作,具体参见链接 |
function() | 自定义函数 |
get_filename_component() | 获取指定文件的信息,比如文件后缀名、绝对地址等 |
list() | 链表操作,支持 APPEND, INSERT, FILTER, PREPEND, POP_BACK, POP_FRONT, REMOVE_AT, REMOVE_ITEM, REMOVE_DUPLICATES, REVERSE, SORT几种操作 |
message() | 输出消息,不同的消息效果可能不同,比如有的会导致构建停止,有的不会。等级有FATAL_ERROR、SEND_ERROR、WARNING、AUTHOR_WARNING、DEPRECATION、(none) or NOTICE、STATUS、VERBOSE、DEBUG、TRACE |
macro() | 自定义宏 |
option() | 自定义提供一些开关选项,用户可以设置成ON或OFF,默认是OFF。 |
string() | 字符串相关操作,具体可以参见链接 |
set() | 设置normal, cache, 或 environment变量值 |
separate_arguments() | 将空格分隔的命令行形式字符串转换成逗号分隔的列表模式 |
get_property(TARGET) | 获取一个对象属性 |
set_property(TARGET) | 在某个域中对零个或多个对象设置一个属性,例如修改一个文件的编译选项: |
set_property(
SOURCE sub.c
APPEND
PROPERTY COMPILE_OPTIONS "-DDEBUG"
)
Project Commands
指令 | 解释 |
---|---|
add_compile_definitions() | 可以给当前目录以及当前目录以下的目录的 sources 添加编译选项。 例如:add_compile_definitions (EX1 EX2) 不建议使用,建议用target_compile_definitions ( )代替 |
add_compile_options() | 添加编译选项,例如add_compile_options(-Wall -Wextra -pedantic -Werror) 不建议使用,建议用target_compile_options ( )代替 |
add_link_options() | 添加链接选项 不建议使用,建议用target_link_options()代替 |
add_custom_command | 添加文件依赖,当某个文件需要被用到时,会执行该命令。需要在同一个CMakefile.txt文件中,通常有两个作用: 场景1:使用OUTPUT参数指定输出target,然后在add_custom_target中指定依赖于该target,这样在构建add_custom_target目标时就会执行add_custom_command 中设定的命令; 场景2:直接使用TARGET参数指定target,并设定在该target产生前或产生后执行指定命令 |
add_custom_target | 添加非文件依赖,总是被执行。 add_custom_target(DEPENDS)用于依赖add_custom_command(OUTPUT)的输出文件,编译custom target时custom command的输出文件也会被更新。其他target的依赖关系,请使用add_dependencies()命令。 注意,add_custom_target(DEPENDS)只能依赖同一CMakeLists.txt中的add_custom_command(OUTPUT)输出文件,譬如下面的例子中依赖子目录下的add_custom_command(OUTPUT)输出文件将会失败。 |
add_subdirectory() | 跳转到子目录 |
add_executable() | 生成可执行文件 |
add_library() | 指定目标,可以是库或者可执行文件 |
add_dependencies() | 为目标设置依赖 |
add_definitions(-DFOO -DBAR ...) | 添加宏定义,已被add_compile_definitions()取代 |
get_target_property() | 获取构建对象的属性 |
include_directories() | 添加头文件路径,相当于编译器参数 -Idir1 -Idir2 |
link_libraries() | 为所有目标设置需要链接的库 |
set_target_properties() | 设置构建对象的属性 |
set_source_files_properties() | 设置指定文件的属性 |
target_sources() | 设置源码文件 |
target_include_directories() | 设置单个目标头文件引用目录 |
target_compile_definitions() | 设置单个目标预编译宏,也可以通过-D添加 |
target_compile_features() | 设置单个目标编译功能 |
target_compile_options() | 设置单个目标编译选项 |
target_link_libraries() | 设置单个目标需要链接的库 |
target_link_directories() | 设置单个目标链接目录 |
target_link_options() | 设置单个目标链接选项 |
CTest Commands
略
Deprecated Commands
略
CMAKE变量
Variables that Provide Information
变量 | 解释 |
---|---|
CMAKE_AR CMAKE_<LANG>_COMPILER_AR |
CMAKE用来打静态库的工具名称 |
CMAKE_COMMAND | CMAKE可执行文件的完整路径,一般用于构建过程中调用-E操作 |
CMAKE_BINARY_DIR PROJECT_BINARY_DIR ${PROJECT_NAME}_BINARY_DIR |
这三个变量内容一致,如果是内部编译,就指的是工程的顶级目录,如果是外部编译,指的就是工程编译发生的目录 |
CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR ${PROJECT_NAME}_SOURCE_DIR |
这三个变量内容一致,都指的是工程的顶级目录,即顶层CMakeLists.txt所在的路径。 |
CMAKE_CURRENT_SOURCE_DIR | 表示当前代码路径,即当前CMakeLists.txt所在的路径。 |
CMAKE_CURRENT_BINARY_DIR | 当前CMakeLists.txt所在的路径在目标文件路径下的映射。如果是in-source编译,它跟CMAKE_CURRENT_SOURCE_DIR一致,如果是out-ofsource 编译,他指的是target编译目录 |
CMAKE_CURRENT_LIST_DIR | CMakeList.txt的完整路径 |
CMAKE_CURRENT_LIST_LINE | 当前所在的行 |
CMAKE_CURRENT_LIST_FILE | 输出调用这个变量的CMakeLists.txt的完整路径 |
CMAKE_CROSSCOMPILING | 指示当前是否是交叉编译,如果CMAKE_SYSTEM_NAME变量被赋值,则该变量会自动配置为TRUE |
CMAKE_TOOLCHAIN_FILE | 指定交叉编译工具的路径 |
CMAKE_VERBOSE_MAKEFILE | 构建过程中输出详细信息,默认为OFF,打开需要改为ON |
PROJECT_NAME | 项目名称,通过project()指令配置的值 |
PROJECT_SOURCE_DIR | 工程的根目录 |
PROJECT_VERSION | 项目版本,通过project()指令配置的值 |
OBJECT_LIST | 当前目标所依赖的obj文件列表,可以通过${CMAKE_COMMAND} -E copy拷贝到指定位置 |
Variables that Change Behavior
变量 | 解释 |
---|---|
CMAKE_MODULE_PATH | 如果工程复杂,可能需要编写一些cmake模块。 通过SET指定这个变量指定搜索路径,模块名为<modulename>.cmake。 |
CMAKE_BUILD_TYPE | 可以是Debug, Release, RelWithDebInfo, MinSizeRel,可以通过CMAKE_C_FLAGS_<CONFIG>配置 |
CMAKE_INSTALL_PREFIX | 最终编译结果输出目录 |
CMAKE_PREFIX_PATH | 指定package查找路径,find_package(), find_program(), find_library(), find_file(), and find_path() commands命令会加上该路径进行查找 |
CMAKE_C_OUTPUT_EXTENSION_REPLACE CMAKE_CXX_OUTPUT_EXTENSION_REPLACE |
linux系统上,cmake默认生成的object文件后缀为".c.o"或者".cpp.o"等。通过设置下面的变量,可以将源文件后缀".c"或者".cpp"去掉,变成".o"。 |
CMAKE_C_OUTPUT_EXTENSION CMAKE_CXX_OUTPUT_EXTENSION |
通过设置下面的变量,可以把object文件后缀从".c.o"或者".cpp.o"改成".c.obj"或者".cpp.obj"。 上述两组变量同时使用,可以把object文件后缀从".c.o"或者".cpp.o"改成".obj"。 注意:1、在linux系统中, 即set(CMAKE_SYSTEM_NAME Linux)时,设置变量CMAKE_C_OUTPUT_EXTENSION是不生效的,需要将系统名称改成Generic,如下:set(CMAKE_SYSTEM_NAME Generic) 2、上述设置必须写在toolchain中,如果写在CMakeLists.txt中,有时不会生效。 |
Variables that Describe the System
略
Variables that Control the Build
变量 | 解释 |
---|---|
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE |
设置debug和release版本输出路径 |
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE |
设置debug和release版本库文件的输出路径 |
CMAKE_DEBUG_POSTFIX CMAKE_RELEASE_POSTFIX |
设置debug和release版本库文件的后缀名 |
set_target_properties(${TARGET_NAME} PROPERTIES DEBUG_POSTFIX "_d") set_target_properties(${TARGET_NAME} PROPERTIES RELEASE_POSTFIX "_r") |
分别设置了Debug版本和Release版本下可执行文件的后缀名. |
EXECUTABLE_OUTPUT_PATH | 可执行输出文件的存放位置 |
LIBRARY_OUTPUT_PATH | 库文件的输出位置 |
Variables for Languages
变量 | 解释 |
---|---|
CMAKE_<LANG>_FLAGS | 指定编译选项,不建议通过类似set(CMAKE_C_FLAGS “”)的方式修改,而是建议通过target_compile_options ( )添加编译选项 |
CMAKE_<LANG>_COMPILER | 指定语言对应的编译器 |
CMAKE_<LANG>_COMPILE_OBJECT | 自定义编译生成obj的策略,不使用cmake默认的链接策略 |
CMAKE_<LANG>_LINK_EXECUTABLE | 自定义链接策略,不使用cmake默认的链接策略 |
Variables for CTest
略
Variables for CPack
略
Variable Expansion Operators
略
Internal Variables
略
CMAKE 属性
Properties of Global Scope
Properties on Directories
Properties on Targets
Properties on Tests
Properties on Source Files
Properties on Cache Entries
Properties on Installed Files
Deprecated Properties on Directories
Deprecated Properties on Targets
Deprecated Properties on Source Files
CMake Module
:- | :-
CMakeDependentOption | 复杂编译选项控制,如果option相互依赖关联可以用这个模块管理