qt在编译时生成包含git hash的头文件,并使用文件强制重建

时间:2014-11-27 09:28:47

标签: c++ git qt qmake

我想出了如何在编译时生成包含git hash的define宏:

DEFINES += GIT_CURRENT_SHA1="\\\"$(shell git -C \""$$_PRO_FILE_PWD_"\" describe)\\\""

问题是当更改git哈希时,使用GIT_CURRENT_SHA1的文件(mainwindow.cpp正在添加关于对话框的文本)不会自动重建(显然)..

我想在编译时生成包含git hash的头文件 const char * git_hash =“git-hash-etc-etc”;

这个头文件我将包含在mainwindow.cpp中,并希望在标题更改时重新编译它。

我的问题主要是要添加到.pro文件中以从Makefile生成这样的文件?

感谢。

2 个答案:

答案 0 :(得分:3)

仅仅是为了证明我在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

答案 1 :(得分:1)

我们在.pro文件中添加了命令,用于调用批处理文件,使用当前的svn-version创建头文件:

的.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 > Main\svnversion.h
        echo #define SVNVERSION_H >> Main\svnversion.h
        echo. >> Main\svnversion.h
        echo #define SVN_VERSION %%G >> Main\svnversion.h
        echo. >> Main\svnversion.h
        echo #endif // SVNVERSION_H >> Main\svnversion.h
    )
) else (
    echo SVN Version: Default
    echo #ifndef SVNVERSION_H > Main\svnversion.h
    echo #define SVNVERSION_H >> Main\svnversion.h
    echo. >> Main\svnversion.h
    echo #define SVN_VERSION -1 >> Main\svnversion.h
    echo. >> Main\svnversion.h
    echo #endif // SVNVERSION_H >> Main\svnversion.h
)
cd %OLDDIR%
echo SVN Version: Finish