Meson构建系统(一)

2024-05-05 06:18
文章标签 系统 构建 meson

本文主要是介绍Meson构建系统(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于Meson的中文参考资料比较少,比较全面的是Meson的官方网站(https://mesonbuild.com/)。本人在学习Meson的过程中,会总结一系列的文章来对Meson进行介绍。第一篇关于Meson的简单学习和使用,将按照如下三个问题展开:

  • 什么是Meson?
  • Meson有什么特点?
  • 如何使用Meson?

一、什么是Meson

Meson(The Meson Build System)是个项目构建系统,如Makefile,automake,CMake...。Meson是一个Python实现的开源项目,其思想是,开发人员花费在构建调试上的每一秒都是浪费,同样等待构建过程直到真正开始编译都是不值得的。

因此,Meson的设计目的是在用户友好的同时不损害性能,Meson提供客户语言(custom language)作为主要工具,用户可以使用它完成项目构建的描述。客户语言的设计目标是简单(simplicity)、清晰(clarity)、简洁(conciseness),其中很多灵感来源于Python语言。

Meson的另个一主要设计目的是为现代编程工具提供优秀的支持和最好的实现。这包括一些特性如:单元测试(unit testing)、代码覆盖率报告(code coverage reporting)、头文件预编译(precompiled headers)。用户不需要寻找三方宏指令(third party macros)或编写shell脚本来实现这些特性,Meson只要开箱即用(work out of the box)。

二、Meson有什么特点

  • 对Linux,macOS,Windows,GCC,Clang,Visual Studio等提供多平台支持
  • 支持的语言包括C,C ++,D,Fortran,Java,Rust
  • 在非常易读且用户友好的非图灵完整DSL中构建定义
  • 适用于许多操作系统和裸机的交叉编译
  • 针对极快的完整和增量构建进行了优化,而不会牺牲正确性
  • 内置的多平台依赖提供程序,可与发行版软件包一起使用
  • 好玩!

以上这些特征均来自官网的介绍,我们在接下来的使用过程中只会涉及部分特性。

三、如何使用Meson

这一章将会包含比较多的使用细节,会在一系列的文章中去完善该部分内容。

3.1 Meson安装

首先是安装Python3.x版本,而且版本尽可能的高,我用的是Python3.5。一般来说安装Python是默认带有pip,但是如果系统缺一些库的话pip会不能成功安装,我踩到zlib的坑(pip3的安装可以参考https://www.cnblogs.com/fyly/p/11112169.html)

具备pip3之后直接安装Meson Ninja

pip3 install meson ninja

这边多出一个Ninja工具,简单介绍一下。Ninja是一个轻量的构建系统,主要关注构建的速度。它与其他构建系统的区别主要在于两个方面:1. Ninja被设计成需要一个输入文件的形式,这个输入文件则由高级别的构建系统生成;2. Ninja被设计成尽可能快速执行构建的工具。

一般将Meson和Ninja配合使用,Meson负责构建项目依赖关系,Ninja进行编译。

3.2 简单的Meson构建样例

本节将会给出几个简单的Meson构建样例,粗略介绍Meson的使用方式。

构建项目首先需要对项目的构建需求进行描述,前面介绍过Meson提供custom language用于描述项目构建需求。

custom language包含诸多部分:变量,数值,字符串,数组,辞典,函数调用,方法调用,控制语句,功能函数,内置对象,返回对象...。暂时不对这些细节进行展开,从简单的示例开始。

a.构建一个可执行项目

创建一个项目目录,包含一个main.c文件

main.c:

#include <stdio.h>int main(void)
{printf("hellow project01\n");return 0;
}

创建Meson构建描述文件meson.build(指定文件名)

meson.build:

project('project01', 'c')
executable("project", 'src/main.c')

项目目录结构:

project01/
├── meson.build
└── src└── main.c

项目构建关系描述完成,接下来就需要通过调用Meson来生成构建目录及构建系统。这就涉及到meson command line的使用,当meson安装完成后可以通过meson -v查看Meson 版本,这就是命令行。

meson -h / --help输出:

usage: meson [-h] {setup,configure,dist,install,introspect,init,test,wrap,subprojects,help,rewrite,compile} ...optional arguments:-h, --help                                                                           show this help message and exitCommands:If no command is specified it defaults to setup command.{setup,configure,dist,install,introspect,init,test,wrap,subprojects,help,rewrite,compile}setup                                                                              Configure the projectconfigure                                                                          Change project optionsdist                                                                               Generate release archiveinstall                                                                            Install the projectintrospect                                                                         Introspect projectinit                                                                               Create a new projecttest                                                                               Run testswrap                                                                               Wrap toolssubprojects                                                                        Manage subprojectshelp                                                                               Print help of a subcommandrewrite                                                                            Modify the project definitioncompile                          

接下来我们要使用setup 命令,它也是meson的默认命令,即 meson xxx 与 meson setup xxx 等价。

在meson.build目录执行

meson setup build

执行后有如下打印:

The Meson build system
Version: 0.55.3
Source dir: /home/yu.xinrong/meson_demo/project01
Build dir: /home/yu.xinrong/meson_demo/project01/build
Build type: native build
Project name: project01
Project version: undefined
C compiler for the host machine: cc (gcc 4.8.5 "cc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39)")
C linker for the host machine: cc ld.bfd 2.25.1-22
Host machine cpu family: x86_64
Host machine cpu: x86_64
Build targets in project: 1Found ninja-1.10.0.git.kitware.jobserver-1 at /usr/bin/ninja
NOTICE: You are using Python 3.5 which is EOL. Start。ing with v0.57, Meson will require Python 3.6 or newer

信息有Meson版本,源码目录和构建目录,一部分构建选项的参数,并且最后提示ninja的存在,可以直接使用ninja编译。

Ninja编译项目:

cd build ninja

编译完成发现build目录中出现project可执行文件。

[root@localhost build]# ls -al
total 28
drwxr-xr-x. 6 root root  180 Sep 20 14:34 .
drwxr-xr-x. 4 root root   49 Sep 20 14:32 ..
-rw-r--r--. 1 root root 2581 Sep 20 14:32 build.ninja
-rw-r--r--. 1 root root  341 Sep 20 14:32 compile_commands.json
drwxr-xr-x. 2 root root  264 Sep 20 14:32 meson-info
drwxr-xr-x. 2 root root   27 Sep 20 14:32 meson-logs
drwxr-xr-x. 2 root root  207 Sep 20 14:32 meson-private
-rw-r--r--. 1 root root  760 Sep 20 14:34 .ninja_deps
-rw-r--r--. 1 root root  131 Sep 20 14:34 .ninja_log
-rwxr-xr-x. 1 root root 9600 Sep 20 14:34 project
drwxr-xr-x. 2 root root   26 Sep 20 14:34 project.p
[root@localhost build]# ./project
hellow project01

b.构建静态库项目

创建库文件项目,目录结构如下

project02
├── meson.build
└── src├── third_lib.c└── third_lib.h

third_lib.c:

#include <stdio.h>
#include "third_lib.h"void info_print()
{printf("hellow third library\n");
}

third_lib.h:

#ifndef _THIRD_LIB_
#define _THIRD_LIB_void info_print();#endif

meson.build:

project('project02', 'c')
static_library('thirdinfo', 'src/third_lib.c')

构建及编译完成后生成静态库libthirdinfo.a:

[root@localhost build]# ls -al
total 20
drwxr-xr-x. 6 root root  194 Sep 20 14:45 .
drwxr-xr-x. 4 root root   49 Sep 20 14:45 ..
-rw-r--r--. 1 root root 2657 Sep 20 14:45 build.ninja
-rw-r--r--. 1 root root  412 Sep 20 14:45 compile_commands.json
-rw-r--r--. 1 root root 3556 Sep 20 14:45 libthirdinfo.a
drwxr-xr-x. 2 root root   31 Sep 20 14:45 libthirdinfo.a.p
drwxr-xr-x. 2 root root  264 Sep 20 14:45 meson-info
drwxr-xr-x. 2 root root   27 Sep 20 14:45 meson-logs
drwxr-xr-x. 2 root root  207 Sep 20 14:45 meson-private
-rw-r--r--. 1 root root  808 Sep 20 14:45 .ninja_deps
-rw-r--r--. 1 root root  150 Sep 20 14:45 .ninja_log

c.构建加载三方库的可执行项目

project03
├── meson.build
└── src├── include│   └── third_lib.h├── main.c└── third└── libthirdinfo.a

此处用的静态库和头文件来自上一步的构建结果。

main.c:

#include <stdio.h>
#include "third_lib.h"int main(void)
{printf("hellow project03\n");info_print();return 0;
}

meson.build:

project('project03', 'c')
libs=meson.get_compiler('c').find_library('thirdinfo', dirs : join_paths(meson.source_root(),'src/third'))
executable('project03', 'src/main.c', dependencies : libs, include_directories : 'src/include')

构建编译之后:

[root@localhost build]# ls -al
total 28
drwxr-xr-x. 6 root root   184 Sep 20 16:34 .
drwxr-xr-x. 4 root root    49 Sep 20 16:34 ..
-rw-r--r--. 1 root root  2774 Sep 20 16:34 build.ninja
-rw-r--r--. 1 root root   368 Sep 20 16:34 compile_commands.json
drwxr-xr-x. 2 root root   264 Sep 20 16:34 meson-info
drwxr-xr-x. 2 root root    27 Sep 20 16:34 meson-logs
drwxr-xr-x. 2 root root   207 Sep 20 16:34 meson-private
-rw-r--r--. 1 root root   800 Sep 20 16:34 .ninja_deps
-rw-r--r--. 1 root root   135 Sep 20 16:34 .ninja_log
-rwxr-xr-x. 1 root root 10144 Sep 20 16:34 project03
drwxr-xr-x. 2 root root    26 Sep 20 16:34 project03.p
[root@localhost build]# ./project03
hellow project03
hellow third library

 

下篇预告:Meson 命令行和句法

 

 

 

这篇关于Meson构建系统(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960976

相关文章

Three.js构建一个 3D 商品展示空间完整实战项目

《Three.js构建一个3D商品展示空间完整实战项目》Three.js是一个强大的JavaScript库,专用于在Web浏览器中创建3D图形,:本文主要介绍Three.js构建一个3D商品展... 目录引言项目核心技术1. 项目架构与资源组织2. 多模型切换、交互热点绑定3. 移动端适配与帧率优化4. 可

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Python利用PySpark和Kafka实现流处理引擎构建指南

《Python利用PySpark和Kafka实现流处理引擎构建指南》本文将深入解剖基于Python的实时处理黄金组合:Kafka(分布式消息队列)与PySpark(分布式计算引擎)的化学反应,并构建一... 目录引言:数据洪流时代的生存法则第一章 Kafka:数据世界的中央神经系统消息引擎核心设计哲学高吞吐

Springboot项目构建时各种依赖详细介绍与依赖关系说明详解

《Springboot项目构建时各种依赖详细介绍与依赖关系说明详解》SpringBoot通过spring-boot-dependencies统一依赖版本管理,spring-boot-starter-w... 目录一、spring-boot-dependencies1.简介2. 内容概览3.核心内容结构4.

Go语言使用net/http构建一个RESTful API的示例代码

《Go语言使用net/http构建一个RESTfulAPI的示例代码》Go的标准库net/http提供了构建Web服务所需的强大功能,虽然众多第三方框架(如Gin、Echo)已经封装了很多功能,但... 目录引言一、什么是 RESTful API?二、实战目标:用户信息管理 API三、代码实现1. 用户数据

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github