1. Meson是什么
Meson是一个旨在快速构建的编译系统,可以在多平台上构建,支持Linux、Windows和MacOS。不仅支持编译C/C++,还支持D,Fortran,Java,Rust等语言。
Meson基于Python3实现,并依赖Ninja。Meson和Ninja相互配合。Meson 负责构建项目依赖关系,Ninja 进行编译。Ninja也是一个轻量级的编译系统,后面找机会再介绍下Ninja。
Meson的官方网站是:https://mesonbuild.com
2. 安装
-
安装
Python3
和pip3
-
安装
Ninja
apt方式:
$ sudo apt-get install ninja-build
pip3方式:
$ pip3 install ninja
-
安装
Meson
$ pip3 install meson
通过apt方式也可以安装,只有由于源的关系,安装的版本可能比较低,所以还是建议使用
pip3
的方式安装。
3. Hello World
本节我们用Meson来构建一个简单的C语言程序。
-
创建一个C语言hello world程序:
#include <stdio.h> int main(int argc, char **argv) { printf("Hello there.\n"); return 0; }
-
在同目录下创建一个编译脚本
meson.build
:project('tutorial', 'c') executable('demo', 'main.c')
-
设置编译目录(builddir是目录名,编译产生的所有文件都会自动存放在这个目录中):
$ meson setup builddir
执行后系统会打印出工程的配置信息:
The Meson build system Version: 1.0.0 Source dir: /home/xupeng/work/project/tmp/meson Build dir: /home/xupeng/work/project/tmp/meson/builddir Build type: native build Project name: tutorial Project version: undefined C compiler for the host machine: ccache cc (gcc 5.4.0 "cc (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609") C linker for the host machine: cc ld.bfd 2.26.1 Host machine cpu family: x86_64 Host machine cpu: x86_64 Build targets in project: 1
-
进入编译目录中编译代码:
$ cd builddir $ ninja # 或者 $ cd builddir $ meson compile
我们也可以直接在原目录中进行编译:
$ meson compile -C builddir
执行后系统会打印编译信息:
INFO: autodetecting backend as ninja INFO: calculating backend command to run: /usr/bin/ninja [2/2] Linking target demo
-
编译成功后在编译目录生成了目标可执行文件demo:
$ ./demo Hello there.
4. 编译库
前面我们利用Meson编译了一个可执行文件,如果我们需要编译一个so库,只需要将meson.build
调整成:
project('tutorial', 'c')
# 将编译可执行文件的方式改成编译库的方式
# executable('demo', 'main.c')
library('demo', 'main.c')
再次执行meson compile
,在编译目录就会生成目标库libdemo.so
。
5. Meson脚本
Meson的编译配置和脚本都是写在meson.build
中的,所以如果要进行各式各样的编译配置只要完善脚本即可。Meson提供了一系列的语法和API供我们进行更灵活和更强大的配置。
语法方面,因为Meson是基于Python3实现的,所以Meson脚本的语法和Python也非常相似,具体可以参考官网的语法部分 - https://mesonbuild.com/Syntax.html
其他的编译配置和脚本主要还有:
- 编译类型 - 配置编译可执行还是库
- 头文件 - 配置依赖的头文件路径
- 安装 - 配置执行
meson install
之后的安装动作 - 参数 - 配置编译时的入参
- 依赖 - 配置编译时的依赖库
- 线程 - 配置编译时的线程
- 外部命令 - 执行外部shell命令
- 生成 - 代码预配置
- 测试 - 编译并执行单元测试
- 交叉编译 - 交叉编译信息配置
- 编译选项 - 在
meson_options.txt
中进行编译模块的动态配置 - 子工程 - 子工程的配置
可以看到,可配置项还是非常丰富的,具体可以参考官网的手册部分 - https://mesonbuild.com/Manual.html。