显示编译二进制文件的git提交源

显示编译二进制文件的git提交源,git,makefile,autotools,Git,Makefile,Autotools,我正在C/C++程序中使用autotools和git 我希望我的程序能够显示它是从哪个commit编译的。例如,它将显示: $ myprog --version Binary compiled from commit 9ddb505 在bash中,很容易确定当前提交: COMMIT=$(git log -1 --pretty='%h') 但此语法在Makefile.am文件中无效 假设我有一个非常简单的Makefile.am: bin_PROGRAMS = myprog myprog_SOU

我正在C/C++程序中使用autotools和git

我希望我的程序能够显示它是从哪个commit编译的。例如,它将显示:

$ myprog --version
Binary compiled from commit 9ddb505
在bash中,很容易确定当前提交:

COMMIT=$(git log -1 --pretty='%h')
但此语法在Makefile.am文件中无效

假设我有一个非常简单的Makefile.am:

bin_PROGRAMS = myprog
myprog_SOURCES = main.c
myprog_CPPFLAGS = -Wall -DGIT_COMMIT=\"??SOMETHING??\"
COMMIT=\"$(shell git log -1 --pretty='%h')\"
考虑到提交名称在每次调用
make
时必须是最新的,如何将正确的提交值传递给源代码


编辑 我也尝试过(在Makefile.am中):

但此语法会在automake中生成错误:

src/Makefile.am:3:警告:shell git日志-1--pretty='%h':非POSIX 变量名src/Makefile.am:3:(可能是GNUmake扩展名)

,并用Vim的语法(filetype=automake)将其涂成红色

解决方案是直接传递这一行以包含在最终的Makefile中,但是如何在Makefile.am中实现这一点呢?我试图避开
$
符号,但没有成功。

添加

GITVERSION:= $(shell git log -1 --pretty='%h')
到您的Makefile和

-DGITVERSION="\"${GITVERSION}\""

您可以在代码中使用GITVERSION,我想对您来说,缺少的链接似乎是Make中的shell cmd

您可以在Makefile中执行以下操作:

GIT_MSG=\"$(shell git log -1 --pretty='%h')\"
CFLAGS=-Wall -DGIT_COMMIT=$(GIT_MSG)
然后在C/C++源文件中使用
GIT\u COMMIT
作为宏

附言:

将以下内容用于类似于
master-1399ff4

GIT_MSG=\"$(shell echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`, ")\"

如果您的git repo有标签,请使用git Descripte打印标签。

在Makefile.am中使用此选项

AM_CXXFLAGS = -DGIT_VERSION="\"$(shell git log -1 --pretty='%h')\""
你仍然会得到警告

Makefile.am:14: warning: shell git log -1 --pretty='%h': non-POSIX variable name
Makefile.am:14: (probably a GNU make extension)
通过以下方式使其消失:

AM_INIT_AUTOMAKE(-Wno-portability)

在configure.am中

1。标签发布2。对于带标签的DAG,
git descripe
将更加简洁,通过
git rev parse@
可以更直接地获得相同的结果。纯粹的美学,让季节来品味。对于自动工具,可以很容易地为GitIt采用它不起作用,因为我正在使用automake Makefile.am,请参阅我的editIt不起作用,因为我正在使用automake Makefile.am,请参阅我的edit@yolenoyer1)尝试使用git descripe2)查看ideasOk,它正在工作:我在编辑中没有意识到,这只是一个警告。谢谢