显示一个二进制文件是从哪个git提交编译的

3

我正在使用autotools和git来编写C/C++程序。

我希望我的程序能够显示它是从哪个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??\"

如何在每次调用make时将正确的提交值传递给我的源代码?需要注意的是,提交名称必须是最新的。

编辑

我也尝试了在Makefile.am中添加以下内容:

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

但是这个语法在自动化构建中会产生错误:

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

并且在Vim的语法高亮中显示为红色(文件类型为automake)。
解决方案是直接将此行传递给最终的Makefile,但我该如何在Makefile.am中实现呢?我尝试转义$符号,但没有成功。

2
  1. 标记发布版本
  2. 对于已标记的DAG,git describe将更加美观
- Lazy Badger
顺便说一下,使用'git rev-parse @' 可以更直接地获得相同的结果。这只是纯粹的美学问题,根据个人口味来使用即可。 - jthill
Mercurial的makefile适用于autotools,可以轻松地应用于Git。 - Lazy Badger
3个回答

1
我认为你缺少的是Make中的Shell命令。
你可以在你的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打印标签。


它不起作用是因为我正在使用automake Makefile.am,请查看我的编辑。 - yolenoyer

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

将此代码添加到你的 Makefile 中。
-DGITVERSION="\"${GITVERSION}\""

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

它不起作用,因为我正在使用automake Makefile.am,详见我的编辑。 - yolenoyer
1
@yolenoyer - 1)尝试使用git describe 2)请参考https://dev59.com/6VHTa4cB1Zd3GeqPV-4V获取一些想法。 - Lazy Badger
好的,它正在工作:我没有意识到在我的编辑中,那只是一个警告。谢谢。 - yolenoyer

0
在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 文件中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接