问题描述
在Windows中,我可以在构建DLL之后将包含构建版本的信息压入或更新到DLL中,作为部署之前的后处理步骤。
Linux共享对象文件中似乎没有这种功能。 看来我在构建时需要将其包括在内。
我如何让介子自动将当前存储库状态的git commit ID放入文本文件,以便可以在源代码中引用它?最后,我希望.so文件“知道”自己的版本,并将其记录为操作的一部分(例如),或者可以从该库的已发布API返回该字符串。
我了解介子具有“生成”功能,但是我无法遵循在线手册中的用法。
解决方法
您可以使用 vcs_tag 命令:
git_version_h = vcs_tag(command : ['git','describe','--tags'],input : 'git_version.h.in',output :'git_version.h')
此命令在构建时检测修订控制提交信息 并将其放置在指定的输出文件中。该文件保证 在每个版本上都是最新的。
您应在代码库中为 git-version.h.in 提供 @VCS_TAG @ ,该值将替换为git commit id(命令结果),替换字符串可以更改-请参阅文档。
该文件将放置在同一相对目录中已配置的内部版本目录中,以便在替换 input 时使用 output ,例如您可以从 git_version.h.in 所在的目录中包含 git_version.h 。
请注意,
您必须将返回值添加到该构建目标的源中。没有这些,Meson将不知道构建目标的顺序
例如
executable('myprog','myprog.c',git_version_h
)
更新 这是工作示例项目:
$ cd vcs_sample
$ find
.
./dir
./dir/meson.build
./dir/git_version.h.in
./meson.build
./main.c
$ cat meson.build
project('vcs_sample','c')
subdir('dir')
executable('myvcs',vcs_dep,'main.c')
$ cat main.c
#include "stdio.h"
#include "dir/git_version.h"
int main(int argc,char* argv [])
{
printf("git version = " MY_GIT_VERSION "\n");
return 0;
}
$ cat dir/meson.build
vcs_dep=vcs_tag(input:'git_version.h.in',output:'git_version.h',replace_string:'@GIT_VERSION@')
$ cat dir/git_version.h.in
#define MY_GIT_VERSION "@GIT_VERSION@"
构建/运行
$ meson build/
$ ninja -C build/
$ ./build/myvcs
git version = R0.1.1+
如果我们查看生成的忍者文件,我们会注意到它有效,因为 dir 被添加到了编译器的包含路径:
build myvcs@exe/main.c.o: c_COMPILER ../main.c || dir/git_version.h
DEPFILE = myvcs@exe/main.c.o.d
ARGS = -Imyvcs@exe -I. -I.. -Idir -fdiagnostics-color=always <...>