一、预定义变量

1、宏

CMAKE_CXX_STANDARD 设置gcc标准,-std=c++11
PROJECT_SOURCE_DIR 工程的根目录
PROJECT_BINARY_DIR 运行cmake命令时所在的目录
CMAKE_INCLUDE_PATH 环境变量
CMAKE_LIBRARY_PATH
CMAKE_CURRENT_SOURCE_DIR 当前在处理的CMakeLists.txt所在目录
CMAKE_CURRENT_BINARY_DIR target编译目录
CMAKE_CURRENT_LIST_FILE 调用这个变量的CMakeLists.txt所在的完整路径
CMAKE_CURRENT_SOURCE_DIR CMakeLists.txt所在的完整路径

2、文件设置

# 设置编译模式,debug/release
set(CMAKE_BUILD_TYPE "Debug")
# debug/release的编译选项
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
# 也可以直接设置编译选项
set(CMAKE_CXX_FLAGS ...)
# 设置编译器
# 这两条命令应该放在文件的开始位置(cmake_minimum_required命令之下,其他命令之上),否则可能无效
set (CMAKE_C_COMPILER "/usr/local/gcc/bin/gcc")
set (CMAKE_CXX_COMPILER "/usr/local/gcc/bin/g++")

3、支持的flags变量

CMAKE_C_FLAGS			:C语言编译器选项,对应于环境变量CFLAGS
CMAKE_CXX_FLAGS			:C++语言编译器选项,对应于环境变量CXXFLAGS
CMAKE_CUDA_FLAGS		:CUDA语言编译器选项,对应于环境变量CUDAFLAGS
CMAKE_Fortran_FLAGS		:Fortran语言编译器选项,对应于环境变量FFLAGS

二、cmake编译宏

宏:-D 在命令行使用-D定义宏,在CMakeLists.txt里面可以用set定义宏
CMAKE_CXX_COMPILER 指定c++编译工具
CMAKE_CXX_FLAGS 指定c++编译参数,
CMAKE_C_COMPILER 指定c编译工具
CMAKE_C_FLAGS 指定c编译参数,相当于CFLAGS
CMAKE_TOOLCHAIN_FILE 指定cmake文件,这个文件可以定义一系列的CMAKE_前缀变量
CMAKE_INSTALL_PREFIX 指定cmkae的安装目录(make install)
CMAKE_CXX_STANDARD 指定g++的标准,用set的时候类似 –std=c++11
CMAKE_C_STANDARD指定gcc的标准,用set的时候类似 –std=c11
EXECUTABLE_OUTPUT_PATH 指定exe文件最终输出文件夹
LIBRARY_OUTPUT_PATH 指定lib文件最终输出文件夹

三、cmake的方法(函数)

findpackage()

add_definitions()
添加编译选项,多个可以用空格隔开,实际上可以用它来添加宏定义,添加-std=c++11/c11

add_compile_options(-std=c++11)
添加编译选项(gcc和g++都添加),类似CMAKE_CXX_FLAGS和CMAKE_C_FLAGS,

set()
设置一个变量,也可以用来定义宏,也可以定义其他的环境变量

add_dependencies(taget depend1 …)
给目标添加依赖,在编译目标前会先编译被依赖的目标,多个依赖用空格分开

aux_source_directory(dirname arg)
把指定文件夹下所有的源文件名列表加入到指定变量中

include(file)
导入其他CMakeLists.txt文件

file(cmd filename arg …) 对文件操作
cmd read/write/append/copy/rename/…

install()
安装,与CMAKE_INSTALL_PREFIX有关

四、自己创建函数(function)和宏(macro)

五、cmake语法if-else/while/foreach

六、cmake与/或/非

关键字:
and/or/not

七、CMakeLists.txt文件编辑

1、cmake版本要求

cmake_minimun_required(VERSION version)

2、添加一个可执行文件编译目标

add_executable(target sourcefile …)

3、添加一个动态/静态库的编译目标

add_library(target SHARED/STATIC sourcefile …)

4、给编译目标链接库

target_link_libraries(target –lxxx …)

5、设置变量(可以用这种方法定义宏,只针对宏有内容情况)

set(arg content)

例:

set(EXECUTABLE_OUTPUT_PATH dirname) # 指定exe文件最终的输出路径
set(LIBRARY_OUTPUT_PATH dirname) # 指定lib文件最终的输出路径

这2个设置一般是紧紧跟随同一个CMakeLists.txt文件的add_executable()/add_library()

6、定义宏,格式跟命令行一样

add_definitions(命令行定义宏样式)

例如:add_definitions(-DDEBUG)

7、包含子目录(包含子目录的CMakeLists.txt文件)

add_subdirectory(dirmane)

8、指定头文件扫描目录

include_directories(dirname)

9、指定库扫描目录

link_directories(dirname)

10、消息打印

# 输出非重要消息
message(STATUS "")
# 输出警告消息
message(WARNING "")
# ...

可以设置不同的消息等级,设置如下:

(无) = 重要消息;
STATUS = 非重要消息;
WARNING = CMake 警告, 会继续执行;
AUTHOR_WARNING = CMake 警告 (dev), 会继续执行;
SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤;
FATAL_ERROR = CMake 错误, 终止所有处理过程;

11、file命令

file(cmd filename arg1 arg2 ...)

12、在目录中查找所有源文件,文件列表存在variable中

aux_source_directory(<dir> <variable>)

13、在目录中扫描所有符合条件的文件,GLOB只有本地有效,GLOB_RECURSE子文件也有效

file(GLOB USER_LIBS_PATH ./src/*.cpp)
file(GLOB_RECURSE USER_LIBS_PATH ./src/*.cpp)