一、Meson编译项目——快速开始
Meson(The Meson Build System)是个元构建系统,类似的构建系统有 CMake
。Meson
一般和 ninja
组合使用。ninja
是构建系统,类似于 make
。Meson
生成 ninja
所需要的 build.ninja
文件,ninja
调用编译工具链(例如:gcc),最后编译生成可执行文件或者库。
1 需求
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命令选项
setup 命令需要一个 builddir 和一个 srcdir 参数。如果没有给出 srcdir,Meson 将根据 pwd 和 meson.build 的位置推断 srcdir。
例如:meson .
,默认使用 setup
命令,当前目录为构建目录builddir,srcdir自动推导为构建目录的上一级。
4.2.1 –buildtype
你可以使用 –buildtype 命令行参数指定不同类型的构建。它可以有以下值之一。
值 | 含义 |
---|---|
plain | 不使用额外的构建标志,甚至对编译器警告也是如此,对发行版打包者和其他需要自己指定所有参数的情况很有用 |
debug | 生成调试信息,但结果未优化,这是默认设置 |
debugoptimized | 生成调试信息,并优化代码(在大多数编译器上意味着 -g -O2) |
release | 完全优化,不生成调试信息 |
最后会显示 User defined options
。
4.2.1 –backend
默认情况下,Meson 将使用 Ninja 后端构建你的项目。如果你希望使用任何其他后端,你需要在配置时传递相应的参数。例如,这是如何使用 Meson 生成 Visual Studio 解决方案的示例。
meson setup
4.3 Meson compile命令选项
meson compile -C builddir -j 8
:表示编译前切换到 builddir
目录,使用8个处理器工作进行编译。
4.4 Meson install命令选项
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发行版的构建始终从头开始,您可能考虑在您的软件包中启用统一构建,因为它们更快并生成更高质量的代码。但是,一些项目可能不支持启用统一构建,因此是否使用统一构建应由打包者根据具体情况决定。