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()
即可。