Meson编译系统

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. 安装

  1. 安装Python3pip3

  2. 安装Ninja

    apt方式:

    $ sudo apt-get install ninja-build
    

    pip3方式:

    $ pip3 install ninja
    
  3. 安装Meson

    $ pip3 install meson 
    

    通过apt方式也可以安装,只有由于源的关系,安装的版本可能比较低,所以还是建议使用pip3的方式安装。

3. Hello World

本节我们用Meson来构建一个简单的C语言程序。

  1. 创建一个C语言hello world程序:

    #include <stdio.h>
    
    int main(int argc, char **argv) {
          
          
      printf("Hello there.\n");
      return 0;
    }
    
  2. 在同目录下创建一个编译脚本meson.build

    project('tutorial', 'c')
    executable('demo', 'main.c')
    
  3. 设置编译目录(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
    
  4. 进入编译目录中编译代码:

    $ 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
    
  5. 编译成功后在编译目录生成了目标可执行文件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

6. 参考连接

猜你喜欢

转载自blog.csdn.net/ZivXu/article/details/128551299