操作数
* 类型
分类
BOOL STRING PATH FILEPATH – 配置变量类型
LIST
转换
推导
* 具名
声明周期:set 声明,${具名},unset取消
# 定义一个变量 判断是否定义用DEFINED
set(<变量名> <变量值>)
# 引用一个变量
${变量名}
# 取消一个变量
unset(<变量名>)
内部变量:
- cmake_COMMAND
系统环境变量 $ENV{<环境变量名>}
工程源目录和bin目录
- PROJECT_SOURCE_DIR 顶级CMakeLists所在目录
- PROJECT_BINARY_DIR cmake生成目录
- CMAKE_CURRENT_SOURCE_DIR CMakeLists所在目录
- CMAKE_CURRENT_BINARY_DIR 工程文件所在目录
- CMAKE_CURRENT_LIST_FILE 引用这个变量所在文件的全路径
- CMAKE_CURRENT_LIST_DIR 引用这个变量所在文件的全目录
- CMAKE_CURRENT_LIST_LINE 引用这个变量所在文件行号
- CMAKE_INSTALL_PREFIX 安装目录前缀
工程自身变量
- PROJECT_NAME
- <PROJECT-NAME>_VERSION
- <PROJECT-NAME>_VERSION_MAJOR
符号文件、静态库、动态库和运行输出目录变量
- CMAKE_PDB_OUTPUT_DIRECTORY
- CMAKE_PDB_OUTPUT_DIRECTORY_<CONFIG>
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY_<CONFIG>
- CMAKE_LIBRARY_OUTPUT_DIRECTORY
- CMAKE_LIBRARY_OUTPUT_DIRECTORY_<CONFIG>
- CMAKE_RUNTIME_OUTPUT_DIRECTORY
- CMAKE_RUNTIME_OUTPUT_DIRECTORY_<CONFIG>
区别系统
- CMAKE_HOST_WIN32
- CMAKE_HOST_UNIX(注意macos也属于unix)
- CMAKE_HOST_APPLE
- CMAKE_SYSTEM_NAME
- CMAKE_HOST_SYSTEM_PROCESSOR (uname -p 或%PROCESSOR_ARCHITECTURE%)
配置
- CMAKE_CONFIGURATION_TYPES 多配置的Generator才存在,(Debug、Release…)
- CMAKE_BUILD_TYPE
编译器
- XCODE_VERSION
- MSVC_VERSION 1800表示Visual Studio 2013
- MSVC
编译参数
- CMAKE_C_FLAGS
- CMAKE_CXX_FLAGS
- CMAKE_CXX_STANDARD 指定c++标准,可设置为11
链接参数
- CMAKE_SHARED_LINKER_FLAGS 指定链接库空格间隔,
- CMAKE_EXE_LINKER_FLAGS
配置
- CMAKE_<CONFIG>_POSTFIX 指定目标名称后缀,比如set(CMAKE_DEBUG_POSTFIX “d”)
其他
- BUILD_SHARED_LIBS 指定生成动态库开关,默认为on
- CMAKE_<CONFIG>_POSTFIX 指定生成配置文件后缀,比如DEBUG的库带d
常量
真:1 ON YES TRUE Y
假:0 OFF NO FALSE N IGNORE NOTFOUND
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SUBSYSTEM:CONSOLE")
运算符
- EQUAL LESS GREATER STREQUAL STRLESS STRGREATER
- VERSION_EQUAL VERSION_LESS VERSION_GREATER
- MATCHES 正则匹配
- NOT AND OR
- EXISTS IS_DIRECTORY
- COMMAND 判断函数或者宏是否可以触发
- TARGET 判断目标是否存在
- DEFINED 判断是否 set,直接变量名
- IN_LIST
流程控制
分支控制
# 单分支
if()
set()
endif()
# 双分支
if()
set()
else()
set()
endif()
# 多分支
if()
set()
elseif()
set()
else()
set()
endif()
循环控制
# 列表遍历
# 第一种表达
foreach(<item> IN LISTS <item_list>)
message("")
endforeach()
# 第二种表达
foreach(<item> ${<item_list>})
message("")
endforeach()
# 遍历多项
foreach(item item1 item2 item3})
message("${item}")
endforeach()
# 循环n次
foreach(loop_var RANGE num)
endforeach()
foreach(loop_var RANGE 0 num 1)
endforeach()
函数
基本形式
function(<函数名> <变量名> ...)
endfunction()
函数类型
调用方式
string(TOUPPER …)
string(APPEND …)
string(REGEX MATCH …)
list(APPEND …)
标准函数
message 打印消息
add_subdirectory 包含子CMakeLists.txt目录
include 包含其他*.cmake文件
include_directories 头文件包含目录
link_directories 库链接目录
target_link_libraries 添加链接库
add_definitions 添加编译参数或宏
add_dependencies 为target指定依赖的target
add_executable 添加可执行程序target
add_library 添加静态库或者动态库target
add_compile_definitions
add_compile_options
add_link_options
target_compile_definitions 为目标添加编译参数或宏
target_compile_options
target_link_options
target_include_directories 为目标添加包含目录
target_link_directories
target_link_libraries
ExternalProject_Add 添加一个外部target,多用于安装,更新等
get_cmake_property 获取cmake工程的所有变量,包括自定义和自带变量
source_group 为IDE工程设置分组,VS相当于筛选器
find_path 从默认目录和指定目录查找头文件,并返回结果
find_library 从默认目录和指定目录查找库文件,并返回结果
find_package(name) 从CMAKE_MODULE_PATH目录中查找Find<name>.cmake 模块,并放入工程中使用
file 读写文件创建删除文件,重新命名文件等等
语法概念
target
cmake认为一个执行体、一个库或者自定义的target为一个target,通过add_executable,add_library,add_custom_target、ExternalProject_Add来增加target,简单来说通过这三个函数添加的,就是一个target,可通过if(TARGET target-name)来判断
command
简单来讲就是宏和函数,通过if(COMMAND command-name)来判断