Meson(The Meson Build System)是个元构建系统,类似的构建系统有 CMakeMeson 一般和 ninja 组合使用。ninja 是构建系统,类似于 makeMeson 生成 ninja 所需要的 build.ninja 文件,ninja 调用编译工具链(例如:gcc),最后编译生成可执行文件或者库。

1 需求

  • Python 3
  • Ninja:类似于Make一样的构建系统,Meson 是元构建系统,生成 build.ninja 文件。

Ubuntu:

sudo apt-get install -y python3 python3-pip python3-setuptools \
                        python3-wheel ninja-build

只有在使用Ninja后端时才需要Ninja。Meson还可以生成本机的Visual Studio(VS)和Xcode项目文件。

2 安装

2.1 使用包管理器安装Meson

Ubuntu:

sudo apt-get install -y meson

2.2 使用 Python 安装

需求:pip3

接收最新版 Mesonbuild 的最佳方式。

作为本地用户安装(推荐):

pip3 install --user meson

Install as root:

sudo pip3 install meson

2.3 从源代码安装

需求: git

Meson 可以直接从克隆的 git 仓库运行。

git clone https://github.com/mesonbuild/meson.git /path/to/sourcedir

3 编译 Meson 项目

Meson的最常见用例是在您正在开发的代码库上编译代码。采取的步骤非常简单。

cd /path/to/source/root      # 1. 进入项目文件夹,项目文件夹必须要有 meson.build 文件
meson setup builddir         # 2. 创建一个单独的构建目录builddir,并在其中生成构建文件
cd builddir && meson compile # 3. 进入构建目录,进行编译(实际等同于 ninja -j 8)
# cd builddir && meson compile 或者 meson compile -C builddir 其中 -C表示在编译前切换到 builddir目录

需要注意的是,您需要创建一个单独的构建目录。Meson不允许在源树内构建源代码。所有构建产物都存储在构建目录中。这使您可以同时拥有多个具有不同配置的构建树。这样生成的文件不会意外添加到版本控制中。

要在更改代码后重新编译,只需输入 meson compile。构建命令始终相同。您可以对源代码和构建系统文件进行任意更改,Meson会检测到这些更改并执行正确的操作。如果要构建优化的二进制文件,只需在运行 Meson 时使用参数 –buildtype=debugoptimized。建议您保留一个用于非优化构建的构建目录,另一个用于优化构建。要编译任何给定的配置,只需进入相应的构建目录并运行 meson compile。

Meson会自动添加编译器标志以启用调试信息和编译器警告(例如 -g 和 -Wall)。这意味着用户无需处理它们,而可以专注于编码。

4 Meson语法

Meson 语法格式 meson [command] [arguments] [options]

4.1 Meson命令

命令 描述
setup 配置项目
configure 更改项目选项
dist 生成发布归档
install 安装项目
introspect 项目内省
init 创建新项目
test 运行测试
wrap Wrap 工具
subprojects 管理子项目
rewrite 修改项目定义
compile 构建项目
devenv 在开发环境中运行命令
env2mfile 将当前环境转换为交叉或本地文件
help 打印子命令的帮助

如果未指定命令,则默认为setup命令。可以使用 meson COMMAND --help 查看每个命令的具体选项参数。默认情况下,Meson 生成一个调试构建,它开启基本警告和调试信息(在生成的构建文件中会添加编译选项 -g 和 -Wall),并禁用编译器优化。

4.2 Meson setup命令选项

Alt text

setup 命令需要一个 builddir 和一个 srcdir 参数。如果没有给出 srcdir,Meson 将根据 pwd 和 meson.build 的位置推断 srcdir。

例如:meson .,默认使用 setup 命令,当前目录为构建目录builddir,srcdir自动推导为构建目录的上一级。

4.2.1 –buildtype

你可以使用 –buildtype 命令行参数指定不同类型的构建。它可以有以下值之一。

含义
plain 不使用额外的构建标志,甚至对编译器警告也是如此,对发行版打包者和其他需要自己指定所有参数的情况很有用
debug 生成调试信息,但结果未优化,这是默认设置
debugoptimized 生成调试信息,并优化代码(在大多数编译器上意味着 -g -O2)
release 完全优化,不生成调试信息

Alt text

最后会显示 User defined options

4.2.1 –backend

默认情况下,Meson 将使用 Ninja 后端构建你的项目。如果你希望使用任何其他后端,你需要在配置时传递相应的参数。例如,这是如何使用 Meson 生成 Visual Studio 解决方案的示例。

meson setup --backend=vs 然后你可以用 Visual Studio 以通常的方式打开并编译生成的解决方案。可以通过 `meson setup --help | grep backend` 获取后端列表。

4.3 Meson compile命令选项

Alt text

meson compile -C builddir -j 8:表示编译前切换到 builddir 目录,使用8个处理器工作进行编译。

4.4 Meson install命令选项

Alt text

meson compile -C builddir:表示切换到 builddir 目录,安装。

5 故障排除

常见问题:

meson setup builddir
bash: /usr/bin/meson: No such file or directory

描述:Python pip模块安装的默认安装前缀未包含在您的shell环境PATH中。Python pip安装模块的默认前缀位于/usr/local下。

解决方法:可以通过更改默认的shell环境PATH来解决此问题,以包括/usr/local/bin。

注意:还有其他解决此问题的方法,如使用符号链接或将二进制文件复制到默认路径,但这些方法不建议也不受支持,因为它们可能破坏软件包管理的互操作性。

6 作为发行版打包者使用 Meson

Linux发行版的打包者通常希望完全控制使用的构建标志。Meson原生支持这种用例。以下是构建和安装Meson项目所需的命令:

cd /path/to/source/root
meson --prefix /usr --buildtype=plain builddir -Dc_args=... -Dcpp_args=... -Dc_link_args=... -Dcpp_link_args=...
meson compile -C builddir
meson test -C builddir
DESTDIR=/path/to/staging/root meson install -C builddir

–buildtype=plain命令行开关告诉Meson不向命令行添加自己的标志,使打包者完全控制使用的标志。

这种方法与其他构建系统非常相似。唯一的区别是DESTDIR变量作为环境变量传递,而不作为meson install的参数。

由于Linux发行版的构建始终从头开始,您可能考虑在您的软件包中启用统一构建,因为它们更快并生成更高质量的代码。但是,一些项目可能不支持启用统一构建,因此是否使用统一构建应由打包者根据具体情况决定。

参考

参考1:Quickstart Guide

参考2:Manual:Running Meson

参考3:Manual:Command-line commands