CMake入门3——更多指令的使用

基本语法规则

从前面的几个例子中,我们使用了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时,要设置的两个目录是相对应的。

待续……

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值