我需要获取有关在编译时使用的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。
所以有两个子问题:
或者有人知道更好的事情吗?
由于
更新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宏重建文件 ?? 我正在考虑一些额外的头文件,我每次都必须生成它并将其包含在我需要的地方。
答案 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;
}
// ...
}