首页 > 其他分享 >Meson 入门指南之一

Meson 入门指南之一

时间:2024-01-24 11:35:44浏览次数:37  
标签:指南 meson 入门 lib static build 构建 Meson

相关站点

Meson 介绍

Meson 的简介

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

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

Meson 的另个一主要设计目的是为现代编程工具提供优秀的支持和最好的实现。这包括一些特性如:单元测试(unit testing)、代码覆盖率报告(code coverage reporting)、头文件预编译(precompiled headers)。用户不需要寻找第三方宏指令(third party macros)或编写 Shell 脚本来实现这些特性,Meson 可以开箱即用。Meson 相比 CMake 来说,不仅仅支持 C/C++,还支持多种编程语言。

如今,很多项目都由 CMake 转向到了 Meson,例如 DPDKMapnik

Ninja 的简介

项目开发中一般将 Meson 和 Ninja 配合使用,Meson 负责构建项目依赖关系,Ninja 负责编译代码。Ninja 是一个轻量的构建系统,主要关注构建的速度。它与其他构建系统的区别主要在于两个方面:一是 Ninja 被设计成需要一个输入文件的形式,这个输入文件则由高级别的构建系统生成;二是 Ninja 被设计成尽可能快速执行构建的工具。

Meson 的特性

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

Meson 的依赖

Meson 是依赖 Python 与 Ninja 实现的,依赖的版本如下:

  • Python (version 3.6 or newer)
  • Ninja (version 1.8.2 or newer)

Meson 安装

Windows 平台

  • a)在 Meson GitHub Releases 网站下载 Windows 版的安装程序,如 meson-0.60.3-64.msi

  • b)双击 meson-0.60.3-64.msi 安装程序,按默认选项直接安装 Meson

  • c)在系统的 开始菜单栏 里,找到 Visual Studio 开发人员工具(

    Native Tools Command Prompt for VS xxxx
    

    ),双击运行后,在 CMD 窗口内执行以下命令查看 Meson 和 Ninja 的版本

    > meson --version
    0.60.3
    
    > ninja --version
    1.10.2
    

Debian/Ubuntu

# apt install -y meson ninja-build

Fedora/CentOS

# yum install -y meson ninja-build

# 或者

# dnf install -y meson ninja-build

通过 PyPi 安装

Meson 可以直接通过 PyPi 安装,但必须确保使用的是 Python3 的 pip,安装命令如下:

# pip3 install meson ninja

或者使用标准的 Python 命令安装 Meson

# 安装meson
# python3 -m pip install meson

# 安装ninja
# python3 -m pip install ninja

Meson 运行

注意

若使用的是 Windows 平台,则需要在 Visual Studio 开发人员工具(Native Tools Command Prompt for VS xxxx)里执行 Meson 的命令,这是因为 C/C++ 编译器只会在该工具上运行。

  • 通过 Mesonn 初始化新的 C/C++ 项目,并使用 Meson 构建项目
# 创建一个新目录来保存项目文件
$ mkdir meson_project

# 进入项目目录
$ cd meson_project

# 使用Meson初始化并构建一个新的C/C++项目,会自动生成"meson.build"配置文件和C/C++源文件
$ meson init --name meson_project --build

# 项目构建完成后,默认的构建目录是build,可以直接运行构建生成的可执行文件
$ build/meson_project
  • 当项目代码发生变更后,可以进入 build 目录重新构建代码
# 进入build目录
$ cd build

# 重新构建代码
$ meson compile
  • Meson 项目的顶层目录结构如下
meson_project
├── build               # Meson的构建目录
├── meson.build         # Meson的配置文件
└── meson_project.c     # C/C++源文件

Meson 指定编译参数

通过 meson configure 命令可以查看 Meson 内置的编译参数、默认值以及可选值

# 进入Meson项目的根目录
$ cd meson_project

# 查看Meson的编译参数
$ meson configure

Meson 项目可以通过 meson_options.txt 配置文件来增加项目特有的编译参数,如:

option('tests', type: 'boolean', value: true,
	description: 'build unit tests')
option('use_hpet', type: 'boolean', value: false,
	description: 'use HPET timer in EAL')

Meson 还支持在生成项目编译配置时,通过 -D 指定编译参数

# 进入Meson项目的根目录
$ cd meson_project

# 指定编译参数,生成输出目录
$ meson build -Dprefix=/usr -Dtests=disabled

# 进入输出目录
$ cd build

# 编译代码
$ ninja -j8

Meson 打印编译信息

通过 --verbose 参数,Messon 和 Ninja 可以打印详细的编译信息,包括编译项目时,执行的所有命令

# 进入输出目录
$ cd build

# 编译代码
$ meson compile --verbose

# 或者

# 编译代码
$ ninja --verbose

Meson 实战应用案例

构建可执行项目

注意

若使用的是 Windows 平台,则需要在 Visual Studio 开发人员工具(Native Tools Command Prompt for VS xxxx)里执行 Meson 的命令,这是因为 C/C++ 编译器只会在该工具上运行。

第一步:创建项目,目录结构如下,点击下载完整的案例代码

meson_demo
├── main.c
└── meson.build

main.c 的文件内容

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Hello World!\n");
    return 0;
}

meson.build 的文件内容

project('meson_demo', 'c')
exe = executable('main', 'main.c')
  • 第二步:构建项目
# 进入项目目录
$ meson_demo

# 生成构建目录,build是构建目录的名称,可以自定义
$ meson build   # 或者 meson setup build

# 进入构建目录
$ cd build

# 编译项目代码
$ ninja

# 运行可执行文件
$ ./main

Meson 配置文件(meson.build)的说明如下:

  • project('meson_demo', 'c'):指定项目名称和编程语言的类型
  • exe = executable('main', 'main.c'):指定可执行文件的文件名和入口源文件

构建静态库项目

注意

若使用的是 Windows 平台,则需要在 Visual Studio 开发人员工具(Native Tools Command Prompt for VS xxxx)里执行 Meson 的命令,这是因为 C/C++ 编译器只会在该工具上运行。

  • 第一步:创建静态库的项目,目录结构如下,点击下载完整的案例代码
static_lib_project
├── meson.build
└── src
    ├── static_lib.c
    └── static_lib.h

static_lib.h 的文件内容

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

static_lib.c 的文件内容

#include <stdio.h>
#include "static_lib.h"

void info_print()
{
    printf("hello static library\n");
}

meson.build 的文件内容

project('static_lib_project', 'c')
static_library('static_lib', 'src/static_lib.c')
  • 第二步:构建项目
# 进入项目目录
$ cd static_lib_project

# 生成构建目录,build是构建目录的名称,可以自定义
$ meson build   # 或者 meson setup build

# 进入构建目录
$ cd build

# 编译项目代码
$ ninja

# 项目成功编译后,会生成静态库文件"libstatic_lib.a“ 
$ ls -al
drwxr-xr-x. 6 clay clay 4096 08月 12 21:05 .
drwxr-xr-x. 4 clay clay   46 08月 12 10:13 ..
-rw-r--r--. 1 clay clay 2972 08月 12 10:13 build.ninja
-rw-r--r--. 1 clay clay  430 08月 12 10:13 compile_commands.json
-rw-r--r--. 1 clay clay 3564 08月 12 21:05 libstatic_lib.a
drwxr-xr-x. 2 clay clay   31 08月 12 21:05 libstatic_lib.a.p
drwxr-xr-x. 2 clay clay 4096 08月 12 10:13 meson-info
drwxr-xr-x. 2 clay clay   26 08月 12 10:13 meson-logs
drwxr-xr-x. 2 clay clay 4096 08月 12 10:13 meson-private
-rw-r--r--. 1 clay clay  808 08月 12 21:05 .ninja_deps
-rw-r--r--. 1 clay clay  152 08月 12 21:05 .ninja_log

Meson 配置文件(meson.build)的说明如下:

  • project('static_lib_project', 'c'):指定项目名称和编程语言的类型
  • static_library('static_lib', 'src/static_lib.c'):指定静态库文件的文件名和入口源文件

构建加载第三方静态库的可执行项目

注意

若使用的是 Windows 平台,则需要在 Visual Studio 开发人员工具(Native Tools Command Prompt for VS xxxx)里执行 Meson 的命令,这是因为 C/C++ 编译器只会在该工具上运行。

  • 第一步:创建静态库的项目,目录结构如下,点击下载完整的案例代码
load_static_lib_project
├── meson.build
└── src
    ├── include
    │   └── static_lib.h
    ├── lib
    │   └── libstatic_lib.a
    └── main.c

static_lib.h 的文件内容

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

main.c 的文件内容

#include <stdio.h>
#include "static_lib.h"
 
int main(int argc, char *argv[]) {
        info_print();
        return 0;
}

meson.build 的文件内容

project('load_static_lib_project', 'c')
libs=meson.get_compiler('c').find_library('static_lib', dirs : join_paths(meson.source_root(),'src/lib'))
executable('load_static_lib', 'src/main.c', dependencies : libs, include_directories : 'src/include')
  • 第二步:构建项目
# 进入项目目录
$ cd load_static_lib_project

# 生成构建目录,build是构建目录的名称,可以自定义
$ meson build   # 或者 meson setup build

# 进入构建目录
$ cd build

# 编译项目代码
$ ninja

# 运行可执行文件
$ ./load_static_lib

Meson 配置文件(meson.build)的说明如下:

  • 第一行:指定项目名称和编程语言的类型
  • 第二行:指定静态库文件的名称和所在目录的路径,文件名称不需要加”lib” 前缀
  • 第三行:指定可执行文件的文件名、入口源文件、静态库的头文件所在目录的路径

参考博客

标签:指南,meson,入门,lib,static,build,构建,Meson
From: https://www.cnblogs.com/RioTian/p/17984286

相关文章

  • # WinDbg学习一(入门)
    前言一直在零零散散的摸索WinDbg知识,但是总是不成体系,所以下定决心整理出来。简介WinDbg是一个调试器,可用于分析故障转储、调试实时用户模式和内核模式代码,以及检查CPU寄存器和内存。那么为什么不用VS呢,一个是VS安装在开发环境上,主要用于源码级调试,生产环境调试比较困难,另外......
  • php入门学习-4
      1、文件操作函数     (1)php访问文件或文件夹相关函数      filetype()//可以输出相关文件类型,如:dir/file/link        e.g.        echofiletype('C:\WINDOWS');//dir        echof......
  • CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南
    一、背景介绍CDP系统提供了强大的标签和群体的构建能力,面对海量数据的标签和群体,我们采用了Bitmap+ClickHouse的存储与计算方案。详细内容可以参考之前文章。有了群体之后,它们被广泛的应用到支付,消金,财富,营销等各种核心业务的用户拉新,交易转化,促活等核心链路中。而人群应用方式......
  • CDP技术系列(三):百万级QPS的人群命中服务接口性能优化指南
    一、背景介绍CDP系统提供了强大的标签和群体的构建能力,面对海量数据的标签和群体,我们采用了Bitmap+ClickHouse的存储与计算方案。详细内容可以参考之前文章。有了群体之后,它们被广泛的应用到支付,消金,财富,营销等各种核心业务的用户拉新,交易转化,促活等核心链路中。而人群应用方式中,基......
  • Java开发者的Python快速进修指南:探索15种独特的Python特殊方法
    概述在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们。举个例子,我们可以实现特殊方法__len__(),然后通过使用内置函数len()来获取对象的长度。同样地,一些特殊方法的调用是隐式的,比如在使用for循环时,实际上是......
  • c++学习由浅入深刷题指南
    新手村任何一个伟大的目标,都有一个微不足道的开始。洛谷的第一个任务勇敢的迈出第一步,了解下语言和洛谷。跟着书本和老师走,不会难的。P1000P1001P1421P1425顺序与分支计算机的智能性开始得以体现,因为计算机能够根据不同的条件选择了。P1422P1085P1089P1909循环!......
  • OCaml入门-值与函数
    Ocaml使用;;来确认一个表达式的结束举例:#50*50;;-:int=2500OCaml告诉我们50*50的结果是int可以用x为常量50*50命名,注意这里x的值不可以被修改#letx=50*50;;-:valx:int=2500使用let...in...来定义局部变量,在下面这个例子中,y=5......
  • 基础入门
    命令行参数funcmain(){fmt.Println(strings.Join(os.Args[1:],""))}os.Args变量是一个字符串(string)的切片(slice),os.Args的第一个元素:os.Args[0],是命令本身的名字;其它的元素则是程序启动时传给它的参数。类型和数据结构Go语言主要有四种类型的声明语句:var、const、ty......
  • 搭建互联网医疗平台:构建智慧医院APP的开发指南
    本文将从技术层面出发,为大家提供构建互联网医疗平台、打造智慧医院APP的详细开发指南。 一、确定需求与功能在开始开发之前,首先需要明确智慧医院APP的需求与功能。这包括患者预约挂号、在线咨询、病历查看、医疗报告查询等功能。二、选择合适的开发框架与技术选择合适的开发框架对......
  • kettle从入门到精通 第三十三课 再谈 kettle 表输出 分区/分片
    1、之前第九章有讲过kettle表输出步骤,里面有简单的提到过表输出步骤里面的表分区设置,这里详细介绍下。 表分区数据:选择此选项可根据“分区”字段中指定的日期字段的值将数据拆分到多个表中。选择此选项后,数据将插入到表中,这些表的名称遵循<targettable>_<dateformat>模式,如t......