我在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:警告:shell git log -1 --pretty ='%h':非POSIX 变量名src / Makefile.am:3 :(可能是GNU make扩展名)
,它用Vim的语法(filetype = automake)用红色着色。
解决方案是直接传递此行以包含在最终的Makefile中,但是如何在Makefile.am中执行此操作?我试图逃脱$
标志,但没有成功。
答案 0 :(得分:1)
添加
GITVERSION:= $(shell git log -1 --pretty='%h')
到您的Makefile和
-DGITVERSION="\"${GITVERSION}\""
到你的CPPFLAGS,你可以在代码中使用GITVERSION
答案 1 :(得分:1)
我认为你缺少的链接似乎是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 repo有任何内容,请使用git describe
打印标记。
答案 2 :(得分: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