CMake Cheatsheet
About
看作是 Makefile 的 DSL 语法糖吧…
基本的命令形式
command([arg]*) # 参数使用空格分隔, 括号内可以换行
一些基础的命令
- 设置变量
set(<variable> <value>... [PARENT_SCOPE])
CMake | set - 取消设置变量
unset(<variable> [CACHE | PARENT_SCOPE])
CMake | unset - 条件判断
if(<condition>) <commands> elseif(<condition>) # optional block, can be repeated <commands> else() # optional block <commands> endif()
- 历遍
# foreach(<loop_var> RANGE <stop>) # foreach(<loop_var> RANGE <start> <stop> [<step>]) # foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]]) foreach(<loop_var> <items>) <commands> endforeach()
基本的 CMakeList.txt 的文件结构
# 声明当前项目最低的 CMake 版本 cmake_minimum_required(VERSION 3.10) # 声明项目名称 project(PROJECT_NAME) # 编译文件 add_executable(EXECUTABLE_NAME [SOURCE_FILE]+) # 或以库的形式进行编译: # add_libaray(LIB_NAME TYPE [SOURCE_FILE]+) # TYPE = STASTIC, SHARED, MODULE
Files
声明一个文件列表.
# Example: # file(GLOB sources ${SRC}/*.cc) file(GLOB <variable> [LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS] <globbing-expressions>...)
复制一些文件.
# Example: # configure_file(IN_FILE OUT_FILE COPYONLY) configure_file(<input> <output> [NO_SOURCE_PERMISSIONS | USE_SOURCE_PERMISSIONS | FILE_PERMISSIONS <permissions>...] [COPYONLY] [ESCAPE_QUOTES] [@ONLY] [NEWLINE_STYLE [UNIX|DOS|WIN32|LF|CRLF] ])
Options
为 config 过程提供可选参数.
option(<variable> "<help_text>" [value]) # value = ON / OFF, ... if (OPTION_NAME) # do-some-thing endif()
解释
效果如下:
cmake .. -DOPTION_NAME=ON
在代码中以宏定义的形式存在:
#ifndef OPTION_NAME
...
#else
...
#endif
Library
链接库.
target_link_libraries(<target> ... <item>... ...)
Package
导入外部项目.
find_package(<PackageName> [<version>] [REQUIRED] [COMPONENTS <components>...])
Include Other CMake
载入并运行其他 CMake 配置文件.
include(<file|module> [OPTIONAL] [RESULT_VARIABLE <var>] [NO_POLICY_SCOPE])
Install
安装编译好的程序.
install(TARGETS <target>... [...])
一些内置的变量
- PROJECT_BINARY_DIR 编译结果的路径
- PROJECT_SOURCE_DIR 源文件的路径