基本语法规则
从前面的几个例子中,我们使用了cmake的几条基本指令,在这里,总结一下:
- cmake由指令、注释和空白字符组成
- 以#开头,到行末尾的是注释
- 形如
指令(参数1 参数2 参数3 ...)
的是指令,参数间使用空格或者分号;
隔开 - 指令不区分大小写,但参数是区分大小写的
- cmake中可以设置变量,变量的引用方式为
${变量名}
- cmake的构建指令为
"cmake path [参数选项]"
;当前我们都使用的是“cmake .”,表示构建当前目录下的项目
内部构建与外部构建
在前面的例子中,danger构建项目后,会发现cmake构建过程中产生的中间文件和项目文件混在一起,多了就不好区分;而且cmake不能跟踪这些中间文件,所以也没有一条可以清除它们的指令。
这样的情况是因为我们使用的是cmake的内部构建,而cmake提供的另外一种称为外部构建的构建方式,可以解决这个问题。
- 内部构建:
in-source build
,在项目的入口配置文件目录下执行“cmake .”时,就是内部构建;这种方式下,生成的临时中间文件就放在了构建目录下,导致和源文件混在一起 - 外部构建:
out-of-source build
,在其他目录下执行cmake构建命令,然后指定入口配置文件的目录,这样就可以将临时文件存放于单独的目录中。比如我们在项目下新建一个build目录,然后在build目录下执行“cmake ..”,那么我们就可以看到构建后的所有临时文件都产生在build目录中,这样就方便我们管理和清理了
例7 外部构建以及"project"
和"message"
指令
首先,我们新建一个项目demo7,其中的源文件和demo6的是一样的,唯一的区别只有demo7根目录下的CMakeLists.txt文件不同,我们添加了几条"message"
指令,这是用来在构建过程中显示消息的。
配置文件的前面部分如下:
# CMake最低版本要求,如果低于3.10.1版本,则构建过程会被终止
cmake_minimum_required(VERSION 3.10.1)
# 项目信息
project(demo7)
message(STATUS "the BINARY dir is ${PROJECT_BINARY_DIR}")
message(STATUS "the SOURCE dir is ${PROJECT_SOURCE_DIR}")
message(STATUS "the BINARY dir is ${demo7_BINARY_DIR}")
message(STATUS "the SOURCE dir is ${demo7_SOURCE_DIR}")
# ... 后面的没有改变,此处省略不显示
因为要采用外部构建的方式,因此我们先新建一个build目录,然后在build目录下执行cmake构建指令。过程如下:
可以从以一个红框中看到外部构建的一般过程。这里我们来看看第二个红框中的输出内容,这就是"message"
指令的输出。
"message"
指令的语法如下:
message([SEND_ERROR | STATUS | FATAL_ERROR] "message" ...)
第一个参数是消息类型,后面的参数是一条或多条要显示的消息。错误类型有3种:
- SEND_ERROR:表示产生错误信息
- STATUS:表示一般的状态信息
- FATAL_ERROR:我们知道肯定是严重错误信息,cmake会立即停止执行
参数个数:
- 一条消息显示指令后可以跟上多条消息,它们会依次连在一起进行显示
我们修改一下前面的配置文件如下:
# CMake最低版本要求,如果低于3.10.1版本,则构建过程会被终止
cmake_minimum_required(VERSION 3.10.1)
# 项目信息
project(demo7)
message(STATUS "------------------------------" "this is " "another message")
message(STATUS "the BINARY dir is ${PROJECT_BINARY_DIR}")
message(STATUS "------------------------------")
message(SEND_ERROR "the SOURCE dir is ${PROJECT_SOURCE_DIR}")
message(STATUS "------------------------------")
message(STATUS "the BINARY dir is ${demo7_BINARY_DIR}")
message(STATUS "------------------------------")
message(FATAL_ERROR "the SOURCE dir is ${demo7_SOURCE_DIR}")
message(STATUS "------------------------------")
在每条消息前后我们用分割线分割开,构建后,可以看到消息显示如下:
第一个红框中的是前两条消息,其中第一条消息的多个消息是连续显示的;第二个红框中的是”SEND_ERROR”类型的错误消息,cmake会提示错误所在的行,然后项目会继续构建;最后一个红框中的是”FATAL_ERROR”类型的消息,cmake首先也输出了错误消息,然后便中止了构建过程。
下面我们来关注一下这个配置文件中在message指令中使用的几个变量:
- ${PROJECT_BINARY_DIR}
- ${PROJECT_SOURCE_DIR}
- ${demo6_BINARY_DIR}
- ${demo6_SOURCE_DIR}
首先, "project"
指令在使用后会定义两个隐式的变量 "PROJECT_BINARY_DIR"
和 "PROJECT_SOURCE_DIR"
。从输出的消息我们也可以看到,前者就是我们执行构建命令时所在的目录,也是我们的中间文件存放的目录;后者就是我们的配置文件和源文件所在的目录。
同时,因为用 "project"
指令将项目名称指定为 "demo7"
,所以这两个变量中的”PROJECT”部分也可以中”demo7来代替。但是,不推荐用这种方式。
另外,当我们使用内部构建时,这两个变量的值是一样的。
最后,这两个值和我们使用cmake-gui时,要设置的两个目录是相对应的。
待续……