CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。
CMake能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下automake
Cmake是用来makefile的一个工具:即读入所有源文件之后,自动生成makefile。
1)配置和生成各大平台的工程(vs的vcxproj,Qt的Pro):比如设置输出目录,设置编译对象的debug后缀,设置源码在工程中的那个文件夹(Filter),配置需要依赖的第三方的头文件目录,库目录等等属性
2)生成makefile文件:计算机编译源文件的时候是一条指令一条指令的发送给编译器执行的,这样效率很低下,所以就产生了一种文件,把所有的命令写到一个文件中,这个文件就是makefile。CMake生成了这个makeFile之后,各大平台的编译器都会拿到这个makeFile然后解析它。将他的命令解析出来一条一条执行。(在linux/Unix平台,生成makefile,在苹果平台可以生成Xcode,在windows平台,可以生成MSVC的工程文件)
在CMake中,大小写、甚至大小写混合的命令都是被支持的。
PROJECT_SOURCE_DIR:工程根目录;
PROJECT_BINARY_DIR:运行cmake命令的目录。建议定义${PROJECT_SOURCE_DIR}/build下
CMAKE_INCLUDE_PATH:环境变量,非cmake变量;
CMAKE_LIBRARY_PATH:环境变量;
CMAKE_CURRENT_SOURCE_DIR:当前处理的CMakeLists.txt文件所在路径;
CMAKE_CURRENT_BINARY_DIR:target编译目录;
使用ADD_SURDIRECTORY指令可以更改该变量的值;
SET(EXECUTABLE_OUTPUT_PATH < dir >) 指令不会对该变量有影响,但改变了最终目标文件的存储路径;
CMAKE_CURRENT_LIST_FILE:输出调用该变量的CMakeLists.txt的完整路径;
CMAKE_CURRENT_LIST_LINE:输出该变量所在的行;
CMAKE_MODULE_PATH:定义自己的cmake模块所在路径;
EXECUTABLE_OUTPUT_PATH:重新定义目标二进制可执行文件的存放位置(使用set指令可对其进行设置)
LIBRARY_OUTPUT_PATH:重新定义目标链接库文件的存放位置;
PROJECT_NAME:返回由PROJECT指令定义的项目名称;
CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用来控制IF…ELSE…语句的书写方式;
CMAKE_MAJOR_VERSION cmake主版本号,如2.8.6中的2
CMAKE_MINOR_VERSION cmake次版本号,如2.8.6中的8
CMAKE_PATCH_VERSION cmake补丁等级,如2.8.6中的6
CMAKE_SYSTEM 系统名称,例如Linux-2.6.22
CMAKE_SYSTEM_NAME 不包含版本的系统名,如Linux
CMAKE_SYSTEM_VERSION 系统版本,如2.6.22
CMAKE_SYSTEM_PROCESSOR 处理器名称,如i686
UNIX 在所有的类UNIX平台为TRUE,包括OS X和cygwin
WIN32 在所有的win32平台为TRUE,包括cygwin
BUILD_SHARED_LIBS 控制默认的库编译方式。如果未进行设置,使用ADD_LIBRARY时又没有指定库类型,默认编译生成的库都是静态库。
CMAKE_C_FLAGS 设置C编译选项
CMAKE_CXX_FLAGS 设置C++编译选项
该语句一般都可以放置在CMakeLists.txt的开头,用于说明CMake最低版本要求
该指令一般置于CMakeLists.txt的开头,定义了工程的名称name。但项目最终编译生成的可执行文件并不一定是这个项目名称,而是由另一条命令确定的
执行完这条指令后将会自动创建如上的两个变量(这时候前面简述的PROJECT_BINARY_DIR = < projectname >_BINARY_DIR,PROJECT_SOURCE_DIR = < projectname >_SOURCE_DIR)
a)内部构建与外部构建(在CMakeLists.txt所在目录下,有两种执行cmake的方法)
b)第一种方法是内部构建,第二种方法是外部构建。上述两种方法中,最大不同在于cmake与make的工作路径不同。
c)内部构建:cmake生成的中间文件和可执行文件都会存放在项目目录中
d)外部构建:中间文件与可执行文件都存放在build目录中
e)推荐使用外部构建的方法:能够最大限度的保持了代码目录的整洁,生成、编译与安装是不同于项目目录的其他目录中,在外部构建方法下,PROJECT_SOURCE_DIR指向目录与内部构建相同,为CMakeLists.txt所在根目录;而PROJECT_BINARY_DIR不同,它指向CMakeLists.txt所在根目录下的build目录。
用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。
指定链接目标文件时需要链接的外部库,效果类似于gcc编译参数-L
,解决外部库依赖的问题。
a)语法格式
b)基本用法
IF (expression), expression不为:空,0,N,NO,OFF,FALSE,NOTFOUND或< var >_NOTFOUND,为真;
IF (not exp), 与上面相反;
IF (var1 AND var2)
IF (var1 OR var2)
IF (COMMAND cmd) 如果cmd确实是命令并可调用,为真;
IF (EXISTS dir) 如果目录存在,为真;
IF (EXISTS file) 如果文件存在,为真;
IF (file1 IS_NEWER_THAN file2),当file1比file2新,或file1/file2中有一个不存在时为真,文件名需使用全路径;
IF (IS_DIRECTORY dir) 当dir是目录时,为真;
IF (DEFINED var) 如果变量被定义,为真;
IF (var MATCHES regex) 此处var可以用var名,也可以用${var};
IF (string MATCHES regex) 当给定变量或字符串能匹配正则表达式regex时,为真;