脚本的软件版本管理

在公司的嵌入式项目中,需要程序在显示软件版本的前提下完成项目构建号自增的功能,每次构建Release版本程序时,构建号自动增加1,公司的标准为,软件版本V1.1.0.132(V X.Y.Z.B),X为大的功能变动或者软件结构重新设计构建时发生变动,Y为新增功能或者重大功能更改时的发布,Z为bug修复发布的小版本,B即为每次构建号,每次构建Release版本时构建号自动加一(而发布Debug版本时不用加一),而且还要考虑到跨平台的情况(当项目在ARM平台下开发编译时考虑构建号自增,在X86平台下不自增)。

【开发环境】

软件的开发环境为QtCreator+Linux(或者Window模拟),因此开发过程中需要考虑区分平台。

【设计策略】
在不同的平台下或不同的构建配置下,【项目】-【构建设置】-【构建步骤】-【qmake详细配置】,根据平台和配置分别编辑【额外的参数】
   ARM+Release: CONFIG+=ARM CONFIG+=release CONFIG-=debug
   ARM+Debug: CONFIG+=ARM CONFIG-=release CONDIG+=debug
   X86+Release: CONFIG+=release CONFIG-=debug
   X86+Debug: CONFIG-=release CONFIG+=debug
   注意:CONFIG和+=之间不能有空格。
 
【qmake】
QtCreator的编译步骤分为qmake+make,其他的可以自定义构建步骤,自己通过脚本定义构建行为,器中qmake主要的责任是生成.pro文件并根据项目结构产生MakeFile作为下一步make的基础,因为make永远是项目构建的核心(当然qmake也是必不可少的,除非你有时间和精力自己编写MakeFile!)这里要特别指出的重要一点:.pro文件也是个灵活的文件,可以加进去很多东西。
 
【.pro文件的配置】
contains(CONFIG,ARM){
    contains(CONFIG,release){
		message("******ARM+release*****");
    
		updateBuildNumber.target=buildnumber
		updateBuildNumber.depends=FORCE
		updateBuildNumber.commands=$$PWD/script/updatebuildnumber.sh $$PWD
    
		updateVersion.target=version.h
		updateVersion.depends=buildnumber
		updateVersion.commands=$$PWD/script/updateversion.sh $$PWD
    
		PRE_TARGETDEPS += buildnumber version.h
		QMAKE_EXTRA_TARGET += updateBuildNumber updateVersion 
	}
	else{
		message("******ARM+debug******");
	}
}
else{
    contains(CONFIG,release){
		message("******X86+release******")
	}
	else{
		message("*******X86+debug******")
	}
}

 

【Wondows平台的配置】

Windows采用简单的处理,直接编辑BAT批量管理脚本,在【项目】-【构建设置】-【构建步骤】中新增构建自定义步骤,commands为该BAT脚本。

@echo off

set dir=%~d0

set /p buildnumber=<%dir%buildnumber
set /a buildnumbernew=buildnumber+1

echo buildnumbernew > %dir%buildnumber

echo #ifndef _VERSION_H_ > version.h
echo #define _VERSION_H_ >> version.h
echo.  >> version.h
echo #define VERSION_MAJOR_NUMBER  1 >> version.h
echo #define VERSION_MEDIUM_NUMBER 0 >> version.h
echo #define VERSION_MINOR_NUMBER 0 >> version.h
echo #define VERSION_BUILD_NUMBER %buildnumbernew% >> version.h
echo.  >> version.h
echo #endif //_VERSION_H_ >> version.h

 

【Linux平台的配置】

updatebuildnumber.sh

#!/bin/bash

cd $1    #$1为脚本的第一个命令参数
echo `pwd`

if [! -r buildnumber ]; then   #读取失败
    rm buildnumber
    echo 0 > buildnumber
else
    cp buildnumber .buildnumberback
    buildnumber=$(cat .buildnumberback)
    let buildnumber=buildnumber+1
    echo $buildnumber
    echo $buildnumber > buildnumber
fi

#cd ..
#buildnumber=$(cat buildnumber)
#
#if(($buildnumber < 10000)); then
#    let buildnumber=buildnumber+1
#    echo buildnumber > buildnumber
#fi

updateversion.sh

#!/bin/bash

cd $1
#cd ..
echo `pwd`

VERSION_MAJOR_NUMBER=$(cat version.mk | grep -E "VERSION_MAJOR_NUMBER" | cut -d = -f 2)

VERSION_MEDIUM_NUMBER=$(cat version.mk | grep -E "VERSION_MEDIUM_NUMBER" | cut -d = -f 2)

VERSION_MINOR_NUMBER=$(cat version.mk | grep -E "VERSION_MINOR_NUMBER" | cut -d = -f 2)

VERSION_BUILD_NUMBER=$(cat buildnumber)

echo "#ifndef VERSION_H" > version.h
echo "#define VERSION_H" >> version.h
echo "" >> version.h
echo "#define VERSION_MAJOR_NUMBER $VERSION_MAJOR_NUMBER" >> version.h
echo "#define VERSION_MEDIUM_NUMBER $VERSION_MEDIUM_NUMBER" >> version.h
echo "#define VERSION_MINOR_NUMBER $VERSION_MINOR_NUMBER" >> version.h
echo "#define VERSION_BUILD_NUMBER $VERSION_BUILD_NUMBER" >> version.h
echo "" >> version.h
echo "#define VERSION QString("V %1.%2.%3.%4").arg(VERSION_MAJOR_NUMBER).arg(VERSION_MEDIUM_NUMBER)" >> version.h
echo " .arg(VERSION_MINOR_NUMBER).arg(VERSION_BUILD_NUMBER)" >> version.h
echo "" >> version.h
echo "#endif //VERSION_H" >> version.h

 

 

原文地址:https://www.cnblogs.com/ingy0923/p/8620818.html