将qt中的git hash打印为在编译时创建的宏

nay*_*ana 3 c++ git qt makefile

我需要获取有关在编译时使用的git commit(打印出来并在我的About对话框中使用)的信息(make,而不是qmake)。为此可以使用git describe命令。我需要的解决方案是多平台的(至少是Windows Linux),我设法在Windows和Linux上运行的qnake上成功获取git hash。

此命令在qmake运行时执行,效果很好:

DEFINES += GIT_CURRENT_SHA1=$(shell git describe)
Run Code Online (Sandbox Code Playgroud)

但是我需要在编译时执行git describe,因为qmake并非在每次编译时都运行,因此会有旧的提交哈希。

如果我将此代码添加到由qmake生成的Makefile中,则可以正常工作,但是在运行qmake之后当然消失了:

VARIABLE = $(shell cd ../../project/ ; git describe)
DEFINES = -DGIT_CURRENT_SHA1=$(VARIABLE)
Run Code Online (Sandbox Code Playgroud)

而且由于阴影构建不在git存储库目录内,因此存在如何获取正确路径的问题。我需要CD进行投影,然后从那里运行git describe。

因此,有两个子问题:

  • 如何从Qt .pro文件向Makefile添加代码
  • 如何将正确的路径传递给git describe命令

还是有人知道更好的东西?

谢谢

更新1

好的,我发现了如何将Shell代码插入Makefile定义变量中,并且需要在其周围加上引号:

DEFINES += GIT_CURRENT_SHA1="$(shell cd ../../project/ ; git describe)"
Run Code Online (Sandbox Code Playgroud)

但是问题是如何将项目路径传递到其中(由于阴影生成等)

更新2

好的,还找出了该怎么做。

DEFINES += GIT_CURRENT_SHA1="$(shell git -C \""$$_PRO_FILE_PWD_"\" describe)"
Run Code Online (Sandbox Code Playgroud)

但是有一个大问题-如何强制重建使用GIT_CURRENT_SHA1宏的文件 我正在考虑每次都必须生成一些额外的头文件,并将其包含在需要的地方。

nay*_*ana 5

好的,看来一段时间后我找到了解决方案。只需将其添加到Qt .pro文件中的定义即可。

DEFINES += GIT_CURRENT_SHA1="\\\"$(shell git -C \""$$_PRO_FILE_PWD_"\" describe)\\\""
Run Code Online (Sandbox Code Playgroud)

构建生成的Makefile时将刷新此定义。无需每次都运行qmake。

用法简单:

label->setText(QString("Version: %1").arg(GIT_CURRENT_SHA1));
Run Code Online (Sandbox Code Playgroud)

但是存在一个问题,即当git hash更改时,那些使用GIT_CURRENT_SHA1宏中的值的文件将不会自动重建。