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

时间:2014-11-20 14:07:13

标签: c++ git qt makefile

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

此命令在qmake run执行并且运行良好:

DEFINES += GIT_CURRENT_SHA1=$(shell git describe)

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

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

VARIABLE = $(shell cd ../../project/ ; git describe)
DEFINES = -DGIT_CURRENT_SHA1=$(VARIABLE)

由于阴影构建不存在于git存储库目录中,因此如何获得正确的路径存在问题。我需要cd到项目,然后从那里运行git describe。

所以有两个子问题:

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

或者有人知道更好的事情吗?

由于

更新1

好的我发现如何将shell代码插入到Makefile定义变量中,需要引用它:

DEFINES += GIT_CURRENT_SHA1="$(shell cd ../../project/ ; git describe)"

但问题是如何将项目路径传递给它(由于阴影构建等)

更新2

好的还发现了怎么做..

DEFINES += GIT_CURRENT_SHA1="$(shell git -C \""$$_PRO_FILE_PWD_"\" describe)"

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

2 个答案:

答案 0 :(得分:4)

好的,似乎我在一段时间后找到了解决方案。 只需将此添加到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 hash更改时,存在使用来自GIT_CURRENT_SHA1宏的值的那些文件不会自动重建的问题。

答案 1 :(得分:0)

对于 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;
    }
    // ...
}