Qt 在编译时生成包含 Git 哈希的头文件,并使用文件强制重建
qt generate header file containing git hash at compile time and force rebuild using files
我想出了如何在编译时生成包含 git 哈希的定义宏:
DEFINES += GIT_CURRENT_SHA1="\"$(shell git -C ""$$_PRO_FILE_PWD_"" describe)\""
问题是,当 git 哈希被更改时,使用 GIT_CURRENT_SHA1 的文件(主窗口.cpp正在向关于对话框添加文本)不会自动重建(显然)。
我想在编译时生成包含 git 哈希的头文件,例如常量字符 *git_hash="git-hash-etc-etc";
这个头文件我会包含在主窗口中.cpp并希望它在标题更改时被重新编译。
我的问题主要是将什么添加到 .pro 文件中才能从 Makefile 生成此类文件?
谢谢。
只是为了证明这个脚本,我用于 Linux 上的 git 版本:
#!/bin/bash
echo "Generating header for git hash" $1 $2
GIT_HEADER="$1/$2"
if [ -z "$2" ]; then
GIT_HEADER="$1/git_version.h"
fi
GIT_VERSION="`git -C "$1" describe`"
if grep --quiet $GIT_VERSION $GIT_HEADER; then
echo "No need to generate new $GIT_HEADER - git hash is unchanged"
exit 0;
fi
echo "git version is:" $GIT_VERSION
echo "#ifndef GIT_VERSION_H" > $GIT_HEADER
echo "#define GIT_VERSION_H" >> $GIT_HEADER
echo "" >> $GIT_HEADER
echo "#define GIT_CURRENT_SHA1 "$GIT_VERSION"" >> $GIT_HEADER
echo "#endif //GIT_VERSION_H" >> $GIT_HEADER
echo "file is generated into" $GIT_HEADER
在 .pro 中:
GITVERSION = git_version.h
versiontarget.target = $$GITVERSION
versiontarget.commands = '$$PWD/git_version.sh "$$PWD" $$GITVERSION'
versiontarget.depends = FORCE
PRE_TARGETDEPS += $$GITVERSION
QMAKE_EXTRA_TARGETS += versiontarget
我们在 .pro 文件中添加了命令,用于调用批处理文件,从而创建具有当前 svn 版本的头文件:
.pro:
SVNVERSION = Main/svnversion.h
versiontarget.target = $$SVNVERSION
versiontarget.commands = '$$PWD/svnversion.bat $$PWD'
versiontarget.depends = FORCE
PRE_TARGETDEPS += $$SVNVERSION
QMAKE_EXTRA_TARGETS += versiontarget
SOURCES += ...
Main/svnversion.h
创建的头文件:
#ifndef SVNVERSION_H
#define SVNVERSION_H
#define SVN_VERSION 2763
#endif // SVNVERSION_H
批处理文件:
@echo off
set OLDDIR=%CD%
cd %1
echo old %OLDDIR% arg %1
echo SVN Version: Begin
svn.exe info > svnversion.tmp
if %ERRORLEVEL% == 0 (
echo SVN Version: Insert
svn info | findstr /B "Revision: " > svnversion.tmp
FOR /F "tokens=2 delims= " %%G IN (svnversion.tmp) DO (
echo #ifndef SVNVERSION_H > Mainsvnversion.h
echo #define SVNVERSION_H >> Mainsvnversion.h
echo. >> Mainsvnversion.h
echo #define SVN_VERSION %%G >> Mainsvnversion.h
echo. >> Mainsvnversion.h
echo #endif // SVNVERSION_H >> Mainsvnversion.h
)
) else (
echo SVN Version: Default
echo #ifndef SVNVERSION_H > Mainsvnversion.h
echo #define SVNVERSION_H >> Mainsvnversion.h
echo. >> Mainsvnversion.h
echo #define SVN_VERSION -1 >> Mainsvnversion.h
echo. >> Mainsvnversion.h
echo #endif // SVNVERSION_H >> Mainsvnversion.h
)
cd %OLDDIR%
echo SVN Version: Finish
相关文章:
- Android 在编译二进制文件时重建静态库
- 自定义构建文件更改不会触发VS 2017中的项目重建
- 每次都会重建多个程序的制作文件,尽管配方"all"被标记为虚假
- CMake:如何在包含的标头更改时自动重建 .obj 文件
- 为什么这个生成文件每次都会重建
- 一次又一次地重建以查看导入的 QML 文件更改
- Cmake和忍者重建不必要的文件
- 如果头文件被更改然后恢复,如何停止/欺骗 cmake 不重建
- 每次将对象文件转储到其他目录中时重建 makefile
- 强制 MS VS2010 在每次构建时重建一个 cpp 文件
- 删除它们后,会自动重建使用-mmd生成的依赖性文件
- 生成文件 - 使用修改后的头文件重建
- 如何获取 Rakefile 以自动重建依赖项文件
- Qt 在编译时生成包含 Git 哈希的头文件,并使用文件强制重建
- 二叉树不会从文件重建
- C++重建删除依赖文件
- openCV-如何从windows 8.1中为github for python下载的.zip文件中重建
- 如何在SWIG文件更改后重建项目
- 将一个文件编码为1/0二进制文件,并在c++中重建原始文件
- 使用GCC依赖文件会导致Make每次都完全重建项目