C++ 将qt中的git哈希打印为编译时创建的宏
我需要获取编译时(make,而不是qmake)使用的git commit(打印它并在我的about对话框中使用)的信息。 可以为此使用git descripe命令。 我需要多平台的解决方案(至少是Windows Linux),我成功地在Windows和Linux上运行的qnake上获得git哈希 此命令在qmake运行时执行,运行良好: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
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命令
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;i args对于任何考虑这种方法的人来说,请注意,每当修订哈希发生更改时,它都会破坏您的GCC预编译头。这是因为更改预定义宏会使以前编译的头无效。@EmileCormier换句话说,它可能会重新编译(我现在不记得它是如何工作的)一切..请随意添加更好的解决方案:)它还特定于Make,因此不适用于Visual Studio。它不适用于我。QString为空。它打印“版本:”。