深入教程
在本教程中,我们设置了一个包含多个目标、单元测试和目标间依赖关系的项目。我们的主要产品是一个名为 foo 的共享库,它用 C++11
编写。我们将忽略源文件的内容,因为从构建定义的角度来看它们并不重要。该库使用 GLib
库,因此我们需要正确检测和链接它。我们还使生成的库可安装。
源代码树包含三个子目录 src
、include
和 test
,它们分别包含项目的源代码、头文件和单元测试。
为了启动,这里是顶层 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
搜索结果为