Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在.so中嵌入git提交ID_Linux_Meson Build - Fatal编程技术网

Linux 在.so中嵌入git提交ID

Linux 在.so中嵌入git提交ID,linux,meson-build,Linux,Meson Build,在Windows中,作为部署前的后处理步骤,我可以在构建DLL后将信息(包括构建版本)添加或更新到DLL中 Linux共享对象文件中似乎没有这样的功能。 看起来我需要在构建时包含这个 如何让meson自动将当前存储库状态的git提交ID放入文本文件中,以便在源代码中引用该ID?最后,我希望.so文件“知道”自己的版本,并将(例如)记录该版本作为其操作的一部分,或者可以从该库的已发布API返回该字符串 我知道介子具有“生成”功能,但我无法从在线手册中了解如何使用它。您可以使用命令: git_ver

在Windows中,作为部署前的后处理步骤,我可以在构建DLL后将信息(包括构建版本)添加或更新到DLL中

Linux共享对象文件中似乎没有这样的功能。 看起来我需要在构建时包含这个

如何让meson自动将当前存储库状态的git提交ID放入文本文件中,以便在源代码中引用该ID?最后,我希望.so文件“知道”自己的版本,并将(例如)记录该版本作为其操作的一部分,或者可以从该库的已发布API返回该字符串

我知道介子具有“生成”功能,但我无法从在线手册中了解如何使用它。

您可以使用命令:

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我用最小工作项目进行了更新,它显示了我的意思“直接包含它…”嗯,有一个带有自己的
介子的
子目录。构建
文件似乎是关键。那么为什么不使用像main
meson.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 <...>