如何在构建前在 .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)" > $@
至于为什么这样做:
如果您将值作为 -D
定义为 target.c 并构建 target.o,它将在第一时间获得正确的版本它是建立的。但是如果 git 版本被更新,并且你重建,你可能不会重建 target.o,因为 target.c 没有改变,并且 target.o 将被认为是最新的。因此它将持有一个过时的值。
如果您尝试仅使用 git_version.h 来执行此操作,例如:
git_version.h :
echo "#define GIT_VERSION $(GIT_VERSION)" > $@
然后你运行陷入同样的问题(如果version.h存在,会认为是最新的,不会在GIT_VERSION变化时重建。
- 如果你尝试上面的方法,但是
version.h
被声明为 .PHONY
,那么它会 总是 重建 version.h(和任何东西这取决于它),无论 git 版本是否更改(这将导致不必要的构建)。
注意:感谢@Andreas 第一个提出这种方法的人
我正在使用 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)" > $@
至于为什么这样做:
如果您将值作为
-D
定义为 target.c 并构建 target.o,它将在第一时间获得正确的版本它是建立的。但是如果 git 版本被更新,并且你重建,你可能不会重建 target.o,因为 target.c 没有改变,并且 target.o 将被认为是最新的。因此它将持有一个过时的值。如果您尝试仅使用 git_version.h 来执行此操作,例如:
git_version.h :
echo "#define GIT_VERSION $(GIT_VERSION)" > $@
然后你运行陷入同样的问题(如果version.h存在,会认为是最新的,不会在GIT_VERSION变化时重建。
- 如果你尝试上面的方法,但是
version.h
被声明为.PHONY
,那么它会 总是 重建 version.h(和任何东西这取决于它),无论 git 版本是否更改(这将导致不必要的构建)。
注意:感谢@Andreas 第一个提出这种方法的人