首页 > 其他分享 >Meson构建系统(一)

Meson构建系统(一)

时间:2024-02-02 16:01:04浏览次数:23  
标签:meson 20 14 Sep 系统 构建 Meson root

关于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 exit

Commands:
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 project
configure Change project options
dist Generate release archive
install Install the project
introspect Introspect project
init Create a new project
test Run tests
wrap Wrap tools
subprojects Manage subprojects
help Print help of a subcommand
rewrite Modify the project definition
compile

接下来我们要使用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: 1

Found 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 命令行和句法
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/u010074726/article/details/108695256

 

标签:meson,20,14,Sep,系统,构建,Meson,root
From: https://www.cnblogs.com/im18620660608/p/18003326

相关文章

  • WMS仓储管理系统的作用是什么?
    随着科技的飞速发展和市场竞争的加剧,仓储企业面临着越来越多的挑战和机遇。为了提高产品的性能和质量,同时节约成本、提高运营效率,数字化建设成为了仓储企业的核心需求。而WMS仓储管理系统的应用,更是企业数字化建设的重中之重。WMS仓储管理系统通过数字化技术手段,实现了仓库作业的全......
  • 质量管理QMS系统实施的好处是什么?
    质量管理QMS系统实施的好处是什么? 每个企业都在做质量提升的工作,很多质量人也在为“提升”二字所奔波。然而,如何做好质量管理?在这之前必须要了解质量管理的核心是什么? 对于产品制造商而言,质量管理一直是让其头痛的一个问题,质量问题究其原因还是由人为的。所以,质量管理的核心就是......
  • linux系统mysql下载安装(二进制下载)
    最近在重新学习测试的基础知识,刚好学到数据库这一章,打算搭建一套linux系统上搭建mysql的服务端,简单做个记录,今天主要了解了二进制下载CentOs默认使用的软件包管理器是yum,我是用的是CentOs7,执行安装命令为:sudoyuminstallmysql-server,但是在安装的时候遇到问题,提示“没有可用软......
  • 推荐系统实现原理介绍
    1:推荐系统简易架构图2:推荐引擎流程图Mixer系统的用户推荐就是按照上面流程实现,接下来分别介绍各个功能3:索引内容1:索引目的是提供高效查询索引内容就是将内容生产索引文件,目的是提高查询速度,不可能每个请求过来都把所有的数据查出来,然后过滤、计算特征、排序、最后将排在前......
  • Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询
    1概况本文展示如何使用FlinkCDC+Iceberg+Doris构建实时湖仓一体的联邦查询分析,Doris1.1版本提供了Iceberg的支持,本文主要展示Doris和Iceberg怎么使用,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。2系统架构我们整理架构图如下,   1.首先我们从Mysq......
  • Apache Doris 整合 FLINK CDC + Iceberg 构建实时湖仓一体的联邦查询
    1概况本文展示如何使用FlinkCDC+Iceberg+Doris构建实时湖仓一体的联邦查询分析,Doris1.1版本提供了Iceberg的支持,本文主要展示Doris和Iceberg怎么使用,大家按照步骤可以一步步完成。完整体验整个搭建操作的过程。2系统架构我们整理架构图如下,   1.首先我们从Mysq......
  • 混合攻击流量对系统安全性的综合评估
    很多针对安全设备的测试仅仅针对安全设备本身的防护,比如防御的漏洞攻击行为、恶意代码是否足够多,能否抵御大流量的L23层DDoS或者应用层的DDoS攻击,却没有考虑是否防御攻击时,一并阻止了正常的业务流量。以下图为例,当为了防御DDoS攻击,限制了某个源IP地址最多只允许10个TCP连接,假如内......
  • Linux系统编程49 信号 - sigprocmask() 设置信号集当中信号的mask信号屏蔽字
    sigprocmask():虽然我不知道信号什么时候来,但是我可以决定什么时候响应信号信号集:NAMEsigemptyset,sigfillset,sigaddset,sigdelset,sigismember-POSIXsignalsetoperationsSYNOPSIS#include<signal.h>intsigemptyset(sigset_t*set);清空信号集intsigfi......
  • GreatSQL荣获2023 InfoQ“技术生态构建奖” 助力行业变革之路
    1月31日,InfoQ极客传媒合作伙伴年度盛典在北京举办,围绕“有被Q到”主题精彩展开。GreatSQL受邀参会,与诸多IT行业伙伴相聚一堂,共筑开发者生态,共话技术前沿与商业创新。会议期间,InfoQ为全国技术行业做出突出贡献的企业和项目进行了颁奖。GreatSQL开源数据库社区凭借在开源......
  • 【思考待定】系统的权限如何管理呢?
    1  思考最近在整理我的个人系统,系统最重要的也是比较复杂的就是权限控制:权限基本分两大类:资源权限和数据权限。资源权限:比如页面、菜单、按钮呀、接口都属于资源权限数据权限:比如仅自己、仅部门等,操作数据的范围权限而一个系统从全局的视角来看的话,从上到下的话我想的是......