Meson与Ninja

Posted 蓝天居士

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Meson与Ninja相关的知识,希望对你有一定的参考价值。

本文部分内容参考:

meson ninja 简介_旺仔小馒头づ的博客-CSDN博客

Meson首页、文档和下载 - 构建系统 - OSCHINA - 中文开源技术交流社区

Ninja首页、文档和下载 - 小而快的构建系统 - OSCHINA - 中文开源技术交流社区

特此致谢!

一、简介

1. Meson简介

Meson是用Python语言开发的构建工具,编译需要Ninja(用C++实现)命令。Meson 旨在开发最具可用性和快速的构建系统。Meson提供简单但强大的声明式语言用来描述构建。原生支持最新的工具和框架,如 Qt5 、代码覆盖率、单元测试和预编译头文件等。利用一组优化技术来快速编译代码,包括增量编译和完全编译。

Meson是一个跨平台的构建系统,设计为尽可能的快速和用户友好。它支持许多语言和编译器,包括GCC、Clang和Visual Studio。其生成定义是以一种简单的非图灵完备的DSL编写的。

2. Ninja简介

Ninja是Google的一名程序员推出的注重速度的构建工具。一般在Unix/Linux上的程序通过 make/makefile机制来构建编译,而Ninja则通过将编译任务并行组织,从而大大提高了构建速度。

Ninja的目标是成为汇编程序。构建系统在需要做出决策时变得缓慢。当您处于编辑 - 编译周期时,您希望它尽可能快 - 您希望构建系统执行必要的最少工作以确定需要立即构建的内容。

Ninja包含描述任意依赖图所需的最基本功能,它缺乏语法使得无法表达复杂的决策;相反,Ninja旨在与生成其输入文件的单独程序一起使用。生成器程序(如 ./configure在autotools项目中找到的)可以分析系统依赖性并尽可能多地做出尽可能多的决策,以便增量构建保持快速。超越自动工具,甚至构建时决定。比如 “应该使用哪个编译器标志?” 或 “应该构建调试或发布模式二进制文件?”属于.ninja文件生成器。

再次重申,Ninja比其它构建系统更快,因为它非常简单。但必须告诉Ninja在创建项目.ninja文件时要做什么。

二、构建、编译和安装

1. 使用Meson进行构建(build)

通过meson build命令进行系统构建。meson build(相当于configure),会在build目录下生成build.ninja文件(相当于Makefile)和compile_command.json文件。

前提:使用meson构建前相应的源码需要存在meson.build构建描述文件。

2. 使用Ninja进行编译

构建完成后需要编译,使用ninja -C build(相当于make)命令进行编译。

3. 使用Ninja进行安装

编译完成后需要安装,使用ninja -C build install(相当于make install)命令进行安装。

Meson / Ninja 构建系统 - 如何在卸载时运行自定义脚本?

【中文标题】Meson / Ninja 构建系统 - 如何在卸载时运行自定义脚本?【英文标题】:Meson / Ninja build system - How to run custom script at Uninstall? 【发布时间】:2021-06-15 06:35:19 【问题描述】:

Meson/Ninja 提供了一种在安装时运行脚本的简单方法。 例如,这一行将告诉 Meson 运行 glib-compile-schemas 命令来编译 Linux 上的 GSettings(系统配置选项)。

meson.add_install_script('glib-compile-schemas', schemas_dir) (该命令会在用户执行ninja install时自动运行)

如何告诉 Meson 在卸载时运行自定义命令? 在这种特定情况下,我想删除(或至少重置为默认值)GSettings 中的键值对。要重置它们,我发现命令是gsettings reset-recursively <path>(在终端测试成功)。

【问题讨论】:

【参考方案1】:

添加自定义卸载脚本是still being discussed,它是很久以前提出的,但尚未实施。看起来这个任务通常留给包管理器(因此也留给相应的打包脚本)。

但我同意,在 meson install 命令的情况下存在一些不合逻辑的不对称性。作为一种解决方法,您可以创建自己的目标:

 run_target('my-uninstall', command : ['scripts/uninstall.sh'])

当然,缺点是它应该被显式调用,不能覆盖、附加或重命名内部卸载目标,并且脚本应该具有可执行权限。

然而,内部保留的uninstall target 确实会还原所有显式安装操作:

Meson 允许您通过调用 卸载目标。这将删除作为一部分安装的所有文件 安装。请注意,这不会恢复原始文件。 这也是 不会撤消自定义安装脚本所做的更改(因为它们可以 进行任意安装操作)。

【讨论】:

非常感谢您的准确回复并抽出时间分享您的知识!!我想此时我将创建一个自定义 uninstall.py 脚本,该脚本将执行 ninja uninstall 以及其他自定义命令 我不认为这是可能的,介子和忍者已经有卸载目标,可以恢复所有安装操作,但显然,不恢复从 add_install_script() 中完成的任何操作,检查这个mesonbuild.com/Release-notes-for-0-38-0.html(顶部) 解决方案(等待官方 Meson 功能):我创建了一个名为 uninstall.sh 的 bash 脚本,它调用 sudo ninja uninstall 并负责其他需要执行的自定义操作。我测试了它并且它有效。感谢您帮助我更好地理解问题。 好的,我明白了,正好相反,我很高兴它有帮助!

以上是关于Meson与Ninja的主要内容,如果未能解决你的问题,请参考以下文章

Meson 和 NInja 构建系统:指定二进制文件的存储位置

为啥使用 Meson / Ninja 生成的二进制文件比普通 valac 编译的要大得多?

Travis-ci windows meson+ninja build install (python 坏了)

将外部 DPVS 应用程序(使用 Makefile)与使用 Meson 构建的 DPDK 链接

在介子中指定忍者版本?

使用介子/忍者构建需要多次执行才能完成