深入教程

在本教程中,我们设置了一个包含多个目标、单元测试和目标间依赖关系的项目。我们的主要产品是一个名为 foo 的共享库,它用 C++11 编写。我们将忽略源文件的内容,因为从构建定义的角度来看它们并不重要。该库使用 GLib 库,因此我们需要正确检测和链接它。我们还使生成的库可安装。

源代码树包含三个子目录 srcincludetest,它们分别包含项目的源代码、头文件和单元测试。

为了启动,这里是顶层 meson.build 文件。

project('c++ foolib', 'cpp',
  version : '1.0.0',
  license : 'MIT')
add_global_arguments('-DSOME_TOKEN=value', language : 'cpp')
glib_dep = dependency('glib-2.0')

inc = include_directories('include')

subdir('include')
subdir('src')
subdir('test')

pkg_mod = import('pkgconfig')
pkg_mod.generate(libraries : foolib,
                 version : '1.0',
                 name : 'libfoobar',
                 filebase : 'foobar',
                 description : 'A Library to barnicate your foos.')

定义始终从调用 project 函数开始。在其中,您必须指定项目名称和要使用的编程语言,在本例中仅为 C++。我们还指定了两个额外的参数,项目的版本和它所处的许可证。我们的项目版本为 1.0.0,指定为在 MIT 许可证下。

然后我们找到 GLib,它是一个 外部依赖项dependency 函数告诉 Meson 查找库(默认情况下使用 pkg-config)。如果找不到库,Meson 将引发错误并停止处理构建定义。

然后我们添加一个全局编译器参数 -DSOME_TOKEN=value。此标志用于 所有 C++ 源文件编译。无法针对某些目标取消设置它。原因是,如果全局设置随目标而变化,很难跟踪哪些编译器标志正在使用。

由于 include 目录包含头文件,因此我们需要一种方法来告诉编译器将该目录添加到编译器命令行。这可以通过 include_directories 命令来完成,该命令接收一个目录并返回表示该目录的对象。它存储在变量 inc 中,使其在稍后可以访问。

之后是三个 subdir 命令。这些命令指示 Meson 转到指定的子目录,打开其中的 meson.build 文件并执行它。最后几行是一个生成 pkg-config 文件的节。现在我们先跳过它,并在本文档末尾再回来。

我们进入的第一个子目录是 include。在其中,我们有一个要安装的库的头文件。这需要一行。

install_headers('foolib.h')

这将给定的头文件安装到系统的头文件目录。默认情况下为 /[install prefix]/include,但可以通过命令行参数更改。

src 子目录的 Meson 定义很简单。

foo_sources = ['source1.cpp', 'source2.cpp']
foolib = shared_library('foo',
                        foo_sources,
                        include_directories : inc,
                        dependencies : glib_dep,
                        install : true)

在这里,我们只是告诉 Meson 使用给定的源代码构建库。我们还告诉它使用之前存储到变量 inc 中的包含目录。由于该库使用 GLib,因此我们告诉 Meson 使用 dependencies 关键字参数添加所有必要的编译器和链接器标志。它的值为 glib_dep,我们在顶层 meson.build 文件中设置了它。install 参数告诉 Meson 安装结果。与头文件一样,共享库安装到系统的默认位置(通常为 /[install prefix]/lib),但同样可以覆盖。

生成的库存储在变量 foolib 中,就像包含目录存储在之前文件中一样。

Meson 处理完 src 子目录后,它会返回到主 Meson 文件并执行下一行,该行将其移动到 test 子目录中。它的内容如下。

testexe = executable('testexe', 'footest.cpp',
                     include_directories : inc,
                     link_with : foolib)
test('foolib test', testexe)

首先,我们构建一个测试可执行文件,它与主库具有相同的包含目录,并且还链接到新构建的共享库。请注意,您不需要在这里指定 glib_dep 就可以使用构建的库 foolib。如果可执行文件本身使用了 GLib 功能,那么我们当然需要在此处将其添加为关键字参数。

最后,我们定义一个名为 foolib test 的测试。它包括运行我们刚刚构建的二进制文件。如果可执行文件以零返回值退出,则测试被视为通过。非零返回值表示测试失败。

在这一点上,我们可以回到 pkg-config 生成器行。所有共享库都应该提供一个 pkg-config 文件,它解释了如何使用该库。Meson 提供了这个简单的生成器,它应该足以满足大多数简单的项目。您只需要列出一些基本信息,Meson 就会负责生成一个适当的文件。更高级的用户可能希望使用 Meson 的 配置文件生成器系统 创建自己的 pkg-config 文件。

有了这四个文件,我们就完成了。要配置、构建和运行测试套件,我们只需要执行以下命令(从源代码树根目录开始)。

$ meson setup builddir && cd builddir
$ meson compile
$ meson test

然后,要安装项目,您只需要一个命令。

$ meson install

搜索结果为