Linux 在.so中嵌入git提交ID
在Windows中,作为部署前的后处理步骤,我可以在构建DLL后将信息(包括构建版本)添加或更新到DLL中 Linux共享对象文件中似乎没有这样的功能。 看起来我需要在构建时包含这个 如何让meson自动将当前存储库状态的git提交ID放入文本文件中,以便在源代码中引用该ID?最后,我希望.so文件“知道”自己的版本,并将(例如)记录该版本作为其操作的一部分,或者可以从该库的已发布API返回该字符串 我知道介子具有“生成”功能,但我无法从在线手册中了解如何使用它。您可以使用命令:Linux 在.so中嵌入git提交ID,linux,meson-build,Linux,Meson Build,在Windows中,作为部署前的后处理步骤,我可以在构建DLL后将信息(包括构建版本)添加或更新到DLL中 Linux共享对象文件中似乎没有这样的功能。 看起来我需要在构建时包含这个 如何让meson自动将当前存储库状态的git提交ID放入文本文件中,以便在源代码中引用该ID?最后,我希望.so文件“知道”自己的版本,并将(例如)记录该版本作为其操作的一部分,或者可以从该库的已发布API返回该字符串 我知道介子具有“生成”功能,但我无法从在线手册中了解如何使用它。您可以使用命令: git_ver
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替换(命令的结果),替换字符串可以更改-请参阅文档
该文件将被放置在同一相对目录中配置的构建目录中,以便在替换输入时使用输出,例如,您可以从git_version.h.in所在的目录中包含git_version.h
请注意
必须将返回值添加到该生成目标的源。没有这一点,介子就不知道构建目标的顺序
e、 g
更新
以下是工作示例项目:
$ 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+
如果我们查看生成的ninja文件,我们会注意到这一点,因为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 <...>
构建myvcs@exe/main.c.o:c|u编译器../main.c||dir/git|u version.h
DEPFILE=myvcs@exe/主干舷
ARGS=-Imyvcs@exe-我-我-Idir-FDDiagnostics颜色=始终
输出目录中会出现git version.txt
文件。源文件如何知道路径以便#包含它
?它将被放置在输入文件所在的同一相对目录中。e、 g.如果您将它放在src/generated目录中,并将其配置为build/so,那么它将被放在build/src/generated目录中,因此在源文件中可以假定它位于src/generated,您可以直接从git_version.in所在的目录中包含git-version.txt(或者在本例中更好地称为git_version.h)“git_version.h”,因为在#include
路径上找不到build.debug/
(或两者中的任何一个)。它不“只是在那里找到它”。我不遵循“直接从git_version.h.in所在的目录中包含它”" ... 它与*.in文件不在同一目录中,在输出目录中也没有任何东西可以让它看起来。@JDługosz我用最小工作项目进行了更新,它显示了我的意思“直接包含它…”嗯,有一个带有自己的介子的子目录。构建文件似乎是关键。那么为什么不使用像mainmeson.build
这样的输出目录呢?
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 <...>