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

Displaying from which git commit a binary was compiled

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

我希望我的程序能够显示它是从哪个提交编译的。例如它会显示:

$ 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??\"

考虑到每次调用 make 时提交名称必须是最新的,我如何才能将正确的提交值传递给我的来源?


编辑

我也试过(在Makefile.am):

COMMIT=\"$(shell git log -1 --pretty='%h')\"

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

src/Makefile.am:3: warning: shell git log -1 --pretty='%h': non-POSIX variable name src/Makefile.am:3: (probably a GNU make extension)

,它用 Vim 的语法(filetype=automake)涂成红色。

解决方案是直接将此行传递到最终的 Makefile 中,但我如何在 Makefile.am 中执行此操作?我试图逃脱 $ 标志,但没有成功。

添加

GITVERSION:= $(shell git log -1 --pretty='%h')

到您的 Makefile 和

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

添加到您的 CPPFLAGS,您可以在代码中使用 GITVERSION

我认为你丢失的 link 似乎是 Make 中的 shell cmd。

你可以在 Makefile 中做:

GIT_MSG=\"$(shell git log -1 --pretty='%h')\"
CFLAGS=-Wall -DGIT_COMMIT=$(GIT_MSG)

然后在 C/C++ 源文件中使用 GIT_COMMIT 作为宏。

P.s.:

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

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

如果您的 git 存储库有标签,则使用 git describe 打印标签。

在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