将 Qt 中的 Git 哈希打印为编译时创建的宏

print git hash in qt as macro created at compile time

本文关键字:编译 创建 打印 Qt 中的 Git 哈希      更新时间:2023-10-16

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

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

DEFINES += GIT_CURRENT_SHA1=$(shell git describe)

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

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

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

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

所以有两个子问题:

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

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

谢谢

更新 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?我正在考虑一些额外的头文件,我每次都必须生成它并将其包含在我需要的地方。

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

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

生成生成的生成文件时,将刷新此定义。无需每次都运行 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;
    }
    // ...
}

我遇到了同样的问题,并使用在编译时使用 cmake 执行的 python 脚本解决了它: GitHashExtractor

它提取所有重要变量,如gitHash,tag...并将此数据保存在 version.h 文件中,以便以后在主代码中访问。工作原理基于 git 描述和 cmake 中的附加目标:

set(PROJECT_SOURCES
        [... your files ...]
        GitHashExtractor/firmwareVersion.py
        GitHashExtractor/version.h
)
# START github.com/ni-m/gitHashExtractor
set(VERSION_FILE "./GitHashExtractor/version.h")
set(VERSION_PYTHON "./GitHashExtractor/firmwareVersion.py")
set_property(SOURCE ${VERSION_FILE} PROPERTY SKIP_AUTOGEN ON)
add_custom_command(OUTPUT ${VERSION_FILE}
    COMMAND python ${VERSION_PYTHON} [ARGS] [Qt.h]
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
    COMMENT "Creating ${VERSION_FILE}"
)
# target GitHashExtractor is always built
add_custom_target(GitHashExtractor ALL DEPENDS ${VERSION_FILE})
# END github.com/ni-m/gitHashExtractor