使用Meson自动获取并写入软件版本信息

Meson构建工具使用技巧

Posted by wszqkzqk on January 14, 2023
本文字数:1077

Meson是GNOME社区目前主要使用的构建工具,也是Vala语言的推荐构建工具。Meson采用了类似于Python的语法,很多配置相比其他构建工具更简洁。

本文简要介绍在Meson作为构建系统的Vala程序中如何获取程序的版本号。

原理

对于C/C++这样预处理功能完善的语言,可以直接在Meson中传递-D编译参数定义含有版本信息的宏,进而方便地在程序中获取版本信息。

然而,Vala的预处理功能较弱,定义的内容仅有条件编译功能,无法包含具体的版本信息,因此这一方法并不适用。

我们在这里需要用到的是Meson内置的文件处理功能,利用Meson内置的vcs_pkg()函数,根据输入文件生成具有版本信息的Vala源代码。

同时,Meson项目的版本号也可以通过git命令获取。这样,无论是项目还是编译所得的程序的版本号均可以由git的tag得到,不用手动更改多处的版本信息。

操作

输入文件

首先需要新建一个用于输入的version.vala.in文件,供Meson读取。在该文件中可以写入有关版本的信息,然后用@VCS_TAG@代表版本信息的字符串值。以最简单的情况为例,定义一个字符串常量VERSION并用其表示版本号:

const string VERSION = "@VCS_TAG@";

当然,根据实际情况,可以将其放入namespace中,或者定义更多较为详细的函数来获取版本。

替换设置

然后,在src目录下的meson.build文件中加入有关版本说明文件的信息,使用Meson内建的vcs_tag()函数即可:

version_file = vcs_tag(
   command: ['git', 'describe', '--tags'],
     input: 'version.vala.in',
    output: 'version.vala'
)

这表示读取version.vala.in,并将其中的@VCS_TAG@直接替换为从command命令中得到的版本信息,再将所得的文件输出到version.vala中。

注意,这里的version.vala生成在构建目录下,而非src目录中,因此不能将其直接添加到源代码文件列表中。而vcs_tag()返回的则是生成的新文件的路径对象,因此直接将version_file添加到源代码文件列表中即可在构建时使用。

项目版本号配置

类似,整个项目的版本号也可以通过git命令获取。只需要在传递project()函数的参数时将version的值写为run_command('git', 'describe', '--tags').stdout().strip()即可。