如何在构建前在 .h 文件中设置 git 版本?

How to set git version in .h file before build?

我正在使用 make 构建我的应用程序,我想在构建所有内容时设置一个变量,包含 git 版本。

我的偏好是在 Makefile 内完成这一切,因此我不依赖于任何外部脚本。我正在尝试以下操作:

build:
    CFLAGS=$(CFLAGS) -DBUILD=$(dotnet-gitversion /showvariable FullSemVer)

target: build
    cc $(CFLAGS) object.o -o name

这不起作用,因为没有设置变量。我怎样才能让它工作?

另一个解决方案是做这样的事情:

build:
    ./update-version.sh

target: build
    cc object.o -o name

其中 ./update-version.sh 将调用 dotnet-gitversion 并“物理地”更新设置了 BUILD 指令的文件。但这意味着我需要一个外部脚本。

现在的问题是最好的方法是什么? (是否还有其他解决方案?)

我建议您执行类似以下操作:

生成文件:

GIT_VERSION := $(dotnet-gitversion /showvariable FullSemVer)

git_version.h : git_version.$(GIT_VERSION).h
   ln -s $@ $^

git_version.$(GIT_VERSION).h :
    rm git_version.*.h  #get rid of any obsolete git versions
    echo "#define BUILD $(GIT_VERSION)" > $@

至于为什么这样做:

  1. 如果您将值作为 -D 定义为 target.c 并构建 target.o,它将在第一时间获得正确的版本它是建立的。但是如果 git 版本被更新,并且你重建,你可能不会重建 target.o,因为 target.c 没有改变,并且 target.o 将被认为是最新的。因此它将持有一个过时的值。

  2. 如果您尝试仅使用 git_version.h 来执行此操作,例如:

git_version.h :
   echo "#define GIT_VERSION $(GIT_VERSION)" > $@

然后你运行陷入同样的​​问题(如果version.h存在,会认为是最新的,不会在GIT_VERSION变化时重建。

  1. 如果你尝试上面的方法,但是 version.h 被声明为 .PHONY,那么它会 总是 重建 version.h(和任何东西这取决于它),无论 git 版本是否更改(这将导致不必要的构建)。

注意:感谢@Andreas 第一个提出这种方法的人