1.3 构建工具
在Linux上有很多C/C++的构建工具,最常用的是make,此外还有cmake、scons等,本书采用的是Boost自带的构建工具b2——boost build v2。它是专门为构建Boost这样的复杂度的软件而开发的构建工具,其功能强大却又灵活方便,可以轻松管理任何规模的软件,我们已经在安装Boost时见识了它的威力。
本节仅对b2进行简略介绍,它的更多功能和使用方式的讲解已经超出了本书的范围。
1.3.1 安装方式
我们需要在安装Boost程序库后再安装b2程序。
在Boost解压缩后的根目录下执行以下命令:
b2默认会被安装到“/usr/local/bin/”目录下。
1.3.2 构建脚本
和make等构建工具一样,b2也使用文本格式的构建脚本来管理代码,其名称通常是“jamfile”或“Jamfile”。此外b2还有一个特殊的“jamroot”文件,它需要放在整个项目的根目录下,用于管理项目树,定义整个项目的构建设置。
例如,本书源代码的目录结构如下:
jamroot文件一般用于定义整个项目里通用的编译参数、包含路径等设置,避免每个子目录里的jamfile重复定义。对于Linux+GCC来说,常用的配置如下:
1.3.3 构建语言
b2使用的构建语言称为bjam,它是一种解释型语言,拥有完整的语法定义,包括变量、分支、循环语句、函数,甚至还包括类,如果读者熟悉shell、awk等脚本语言就会发现它们之间有很多相似之处。
完整地讲解bjam语言将耗费大量篇幅,这里仅介绍一些常用的构建指令(实际上是bjam语言里的函数调用),对比make等同类工具可以看到其语法非常简洁。
构建目标程序e,使用源码xxx.cpp、yyy.cpp和库zzz:
exe e: xxx.cpp yyy.cpp zzz;
构建目标t,并且在编译后自动运行,通常用于单元测试:
unit-test t: xxx.cpp;
定义链接库zzz,它依赖depend_libs:
lib zzz: depend_libs;
需要特别注意一点:bjam是基于token的语言,它使用空格、tab等空白字符来区分语法元素,不仅是单词,即使是“:”“;”这样的标点符号前后也必须要有空格,否则bjam将无法识别标点,导致语法错误。
下面的语句里“:”“;”与前面的单词连在了一起,这是一个典型的错误示例:
1.3.4 构建命令
实际上b2是bjam语言的解释器,它查找当前目录下的jamfile,并向上查找jamroot,解释执行其中的bjam语句,最终完成软件的构建。
常用的b2命令行参数如下:
通常我们直接执行b2就可以完成构建工作,它将构建jamfile中的所有目标,就像make all一样。