菜鸟笔记
提升您的技术认知

CMake基本语法

操作数

* 类型

分类

BOOL STRING PATH FILEPATH - 配置变量类型

LIST

转换

推导

* 具名

  声明周期:set 声明,${具名},unset取消

# 定义一个变量 判断是否定义用DEFINED
set(<变量名> <变量值>)
# 引用一个变量
${变量名}
# 取消一个变量
unset(<变量名>)

内部变量:

  系统环境变量  $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)来判断