Qt 在编译时生成包含 Git 哈希的头文件,并使用文件强制重建

qt generate header file containing git hash at compile time and force rebuild using files

本文关键字:文件 重建 编译 哈希 Git 包含 Qt      更新时间:2023-10-16

我想出了如何在编译时生成包含 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