将 Qt 中的 Git 哈希打印为编译时创建的宏
print git hash in qt as macro created at compile time
我需要获取有关编译时使用的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
- 此代码编译良好,但文件未创建?请指出错误
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 在VS Code中编译C / C ++时如何禁用自动创建EXE文件?
- 从编译时已知的日历日期创建"std::chrono::time_point"
- 编译时生成应在构造函数中创建的非 constexpr 对象数组
- 在编译时从 c++ 文件创建枚举
- 在编译时而不是运行时创建一个由两个字节组成的值
- 我可以在不创建项目的情况下在Visual Studio 2019中编译和运行HelloWorld.cpp吗?
- 如何在C++中创建自己的编译密钥
- 从"<Base>std::unique_ptr"创建"ClassType<std::unique_ptr>"时出现编译错误<Derived>
- 使用成员函数创建std::函数不会编译
- 有没有办法在 C++17 中创建编译时类型映射以进行类型检查?
- 使用 C++17,如何创建类型到值的编译时图?
- make_unique 不会为创建单一实例进行编译
- 从 PHP 调用已编译的C++可执行文件来创建套接字
- 如何在编译时创建具有函数签名的函数指针
- 编译创建 Eigen::ThreadPoolDevice 对象的代码时出错
- 无法使用CPU后端使用TensorFlow AOT编译创建最终二进制文件
- 通过终端和编译创建项目文件失败,但通过Qt Creator IDE工作正常
- 使用 Visual Studio 编译创建新的客户无休止的编译错误