C++ 将qt中的git哈希打印为编译时创建的宏

C++ 将qt中的git哈希打印为编译时创建的宏,c++,git,qt,makefile,C++,Git,Qt,Makefile,我需要获取编译时(make,而不是qmake)使用的git commit(打印它并在我的about对话框中使用)的信息。 可以为此使用git descripe命令。 我需要多平台的解决方案(至少是Windows Linux),我成功地在Windows和Linux上运行的qnake上获得git哈希 此命令在qmake运行时执行,运行良好: DEFINES += GIT_CURRENT_SHA1=$(shell git describe) 然而,我需要在编译时执行git Descripte,因为q

我需要获取编译时(make,而不是qmake)使用的git commit(打印它并在我的about对话框中使用)的信息。 可以为此使用git descripe命令。 我需要多平台的解决方案(至少是Windows Linux),我成功地在Windows和Linux上运行的qnake上获得git哈希

此命令在qmake运行时执行,运行良好:

DEFINES += GIT_CURRENT_SHA1=$(shell git describe)
然而,我需要在编译时执行git Descripte,因为qmake不是每次编译时都运行的,因此会有旧的提交散列

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

VARIABLE = $(shell cd ../../project/ ; git describe)
DEFINES = -DGIT_CURRENT_SHA1=$(VARIABLE)
由于影子构建不在git存储库目录中,所以存在如何获得正确路径的问题。我需要cd到project,然后从那里运行git Descripte

因此有两个子问题:

  • 如何从Qt.pro文件向Makefile添加代码
  • 如何将正确的路径传递给git descripe命令
或者有人知道更好的吗

谢谢

更新1

好的,我找到了如何将shell代码插入Makefile define变量,需要在其周围加引号:

DEFINES += GIT_CURRENT_SHA1="$(shell cd ../../project/ ; git describe)"
但问题是如何将项目路径传递给它(由于阴影构建等)

更新2

好的,我也知道怎么做了

DEFINES += GIT_CURRENT_SHA1="$(shell git -C \""$$_PRO_FILE_PWD_"\" describe)"
但是有一个大问题-如何强制使用GIT_CURRENT_SHA1宏重建文件
我正在考虑一些额外的头文件,我每次都必须生成它,并将其包含在我需要的地方。

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

DEFINES += GIT_CURRENT_SHA1="\\\"$(shell git -C \""$$_PRO_FILE_PWD_"\" describe)\\\""
此定义将在生成生成的Makefile时刷新。无需每次都运行qmake

用法简单:

label->setText(QString("Version: %1").arg(GIT_CURRENT_SHA1));

但有一个问题是,当GIT哈希更改时,使用GIT_CURRENT_SHA1宏中的值的文件不会自动重建

对于Qt 5.14,.pro文件中的以下行适用于我:

GIT_HASH="\\\"$$system(git -C \""$$_PRO_FILE_PWD_"\" rev-parse --short HEAD)\\\""
GIT_BRANCH="\\\"$$system(git -C \""$$_PRO_FILE_PWD_"\" rev-parse --abbrev-ref HEAD)\\\""
BUILD_TIMESTAMP="\\\"$$system(date -u +\""%Y-%m-%dT%H:%M:%SUTC\"")\\\""
DEFINES += GIT_HASH=$$GIT_HASH GIT_BRANCH=$$GIT_BRANCH BUILD_TIMESTAMP=$$BUILD_TIMESTAMP
在您的代码中,您可以像这样检查修订:

int main(int argc, char *argv[])
{
    QStringList args;
    for (int i = 0; i < argc; i++)
        args << QString(argv[i]);

    if (args.contains("-v") || args.contains("--version")) {
        qDebug() << QString("branch: %1, version: %2, built_at: %3").arg(GIT_BRANCH).arg(GIT_HASH).arg(BUILD_TIMESTAMP);
        return 0;
    }
    // ...
}
intmain(intargc,char*argv[])
{
QStringList-args;
对于(int i=0;iargs对于任何考虑这种方法的人来说,请注意,每当修订哈希发生更改时,它都会破坏您的GCC预编译头。这是因为更改预定义宏会使以前编译的头无效。@EmileCormier换句话说,它可能会重新编译(我现在不记得它是如何工作的)一切..请随意添加更好的解决方案:)它还特定于Make,因此不适用于Visual Studio。它不适用于我。QString为空。它打印“版本:”。