open-zwave/cpp/build/windows/GIT-VS-VERSION-GEN.bat

305 lines
7.9 KiB
Batchfile

@ECHO OFF
SETLOCAL
REM Script for generation of rc VERSIONINFO & StringFileInfo
REM ====================
REM Installation Variables
REM ====================
:: VERSION_FILE - Untracked file to be included in packaged source releases.
:: it should contain a single line in the format:
:: $Project_Name VERSION $tag (ie: Foobar VERSION v1.0.0-alpha0)
SET VERSION_FILE=GIT-VS-VERSION-FILE
:: DEFAULT_VERSION - Version string to be processed when neither Git nor a
:: packed version file is available.
SET DEFAULT_VERSION=v1.4.0-NoGit
:: COUNT_PATCHES_FROM - Determines which tag to count the number of patches from
:: for the final portion of the digital version number.
:: Valid values are:
:: major - count from earliest Major.0.0* tag.
:: minor - count from earliest Major.Minor.0* tag.
:: fix - count from earliest Major.Minor.Fix tag.
SET COUNT_PATCHES_FROM=fix
:: USES_PRERELEASE_TAGS - numeric bool value to determine if GET_GIT_PATCHES
:: function should read the number of patches in the format of
:: (Default) 1 - Major.Minor.Fix-Stage#-'CommitCount'
:: 0 - Major.Minor.Fix-'CommitCount'
SET USE_PRERELEASE_TAGS=1
:: --------------------
:CHECK_ARGS
:: --------------------
:: Console output only.
IF [%1] == [] GOTO START
IF "%~1" == "--help" GOTO USAGE
IF "%~1" == "--quiet" SET fQUIET=1& SHIFT
IF "%~1" == "--force" SET fFORCE=1& SHIFT
:: Un-documented switch
IF "%~1" == "--test" GOTO TEST
IF EXIST %~1\NUL (
:: %1 is a path
SET CACHE_FILE=%~s1\%VERSION_FILE%
SHIFT
)
IF [%~nx1] NEQ [] (
:: %1 is a file
SET HEADER_OUT_FILE=%~fs1
SHIFT
)
:: This should always be the last argument.
IF [%1] NEQ [] GOTO USAGE
:: Some basic sanity checks.
IF DEFINED fQUIET (
IF NOT DEFINED HEADER_OUT_FILE GOTO USAGE
)
IF DEFINED CACHE_FILE (
SET CACHE_FILE=%CACHE_FILE:\\=\%
IF NOT DEFINED HEADER_OUT_FILE GOTO USAGE
)
GOTO START
:: --------------------
:USAGE
:: --------------------
ECHO usage: [--help] ^| ^| [--quiet] [--force] [CACHE PATH] [OUT FILE]
ECHO.
ECHO When called without arguments version information writes to console.
ECHO.
ECHO --help - displays this output.
ECHO.
ECHO --quiet - Suppress console output.
ECHO --force - Ignore cached version information.
ECHO CACHE PATH - Path for non-tracked file to store git-describe version.
ECHO OUT FILE - Path to writable file that is included in the project's rc file.
ECHO.
ECHO Version information is expected to be in the format: vMajor.Minor.Fix[-stage#]
ECHO Where -stage# is alpha, beta, or rc. ( example: v1.0.0-alpha0 )
ECHO.
ECHO Example pre-build event:
ECHO CALL $(SolutionDir)..\scripts\GIT-VS-VERSION-GEN.bat "$(IntDir)\" "$(SolutionDir)..\src\gen-versioninfo.h"
ECHO.
GOTO END
REM ===================
REM Entry Point
REM ===================
:START
ECHO.
CALL :INIT_VARS
CALL :GET_VERSION_STRING
IF DEFINED fGIT_AVAILABLE (
IF DEFINED fLEAVE_NOW GOTO END
IF DEFINED CACHE_FILE (
CALL :CHECK_CACHE
)
)
IF DEFINED fLEAVE_NOW GOTO END
CALL :SET_BUILD_PARTS
CALL :PREP_OUT
CALL :WRITE_OUT
GOTO END
REM ====================
REM FUNCTIONS
REM ====================
:: --------------------
:INIT_VARS
:: --------------------
:: The following variables are used for the final version output.
:: String Version: Major.Minor.Fix.Stage#[.Patches.SHA1[.dirty]]
SET strFILE_VERSION=
:: Digital Version: Major, Minor, Fix, Patches
SET nbMAJOR_PART=0
SET nbMINOR_PART=0
SET nbFIX_PART=0
SET nbPATCHES_PART=0
:: VERSIONINFO VS_FF_ flags
SET fPRIVATE=0
SET fPATCHED=0
SET fPRE_RELEASE=0
:: Supporting StringFileInfo - not used for clean release builds.
SET strPRIVATE_BUILD=
SET strCOMMENT=
GOTO :EOF
:: --------------------
:GET_VERSION_STRING
:: --------------------
:: Precedence is Git, VERSION_FILE, then DEFAULT_VERSION.
:: Check if git is available by testing git describe.
CALL git describe>NUL 2>&1
IF NOT ERRORLEVEL 1 (
SET fGIT_AVAILABLE=1
:: Parse git version string
CALL :PARSE_GIT_STRING
) ELSE (
:: Use the VERSION_FILE if it exists.
IF EXIST "%VERSION_FILE%" (
FOR /F "tokens=3" %%A IN (%VERSION_FILE%) DO (
SET strFILE_VERSION=%%A
)
) ELSE (
:: Default to the DEFAULT_VERSION
SET strFILE_VERSION=%DEFAULT_VERSION%
)
)
SET strFILE_VERSION=%strFILE_VERSION:~1%
SET strFILE_VERSION=%strFILE_VERSION:-=.%
GOTO :EOF
:: --------------------
:PARSE_GIT_STRING
:: --------------------
FOR /F "tokens=*" %%A IN ('"git describe --long --tags --dirty "') DO (
SET strFILE_VERSION=%%A
)
echo %strFILE_VERSION%
:: If HEAD is dirty then this is not part of an official build and even if a
:: commit hasn't been made it should still be marked as dirty and patched.
SET tmp=
GOTO :EOF
:: --------------------
:CHECK_CACHE
:: --------------------
:: Exit early if a cached git built version matches the current version.
IF DEFINED HEADER_OUT_FILE (
IF EXIST "%HEADER_OUT_FILE%" (
IF [%fFORCE%] EQU [1] DEL "%CACHE_FILE%"
IF EXIST "%CACHE_FILE%" (
FOR /F "tokens=*" %%A IN (%CACHE_FILE%) DO (
IF "%%A" == "%strFILE_VERSION%" (
IF NOT DEFINED fQUIET (
ECHO Build version is assumed unchanged from: %strFILE_VERSION%.
)
SET fLEAVE_NOW=1
)
)
)
)
ECHO %strFILE_VERSION%> "%CACHE_FILE%"
)
GOTO :EOF
:: --------------------
:SET_BUILD_PARTS
:: --------------------
:: The min version is X.Y.Z and the max is X.Y.Z.Stage#.Commits.SHA.dirty
:: strTMP_STAGE_PART is a holder for anything past 'X.Y.Z.'.
FOR /F "tokens=1,2,3,* delims=." %%A IN ("%strFile_Version%") DO (
SET nbMAJOR_PART=%%A
SET nbMINOR_PART=%%B
SET nbFIX_PART=%%C
SET strTMP_STAGE_PART=%%D
)
GOTO :EOF
:: --------------------
:PREP_OUT
:: --------------------
SET csvFILE_VERSION=%nbMAJOR_PART%,%nbMINOR_PART%,%nbFIX_PART%,%nbPATCHES_PART%
SET hexFILE_VERSION=
CALL :SET_HEX
IF NOT %fPRIVATE% EQU 0 SET fPRIVATE=VS_FF_PRIVATEBUILD
IF NOT %fPATCHED% EQU 0 SET fPATCHED=VS_FF_PATCHED
IF NOT %fPRE_RELEASE% EQU 0 SET fPRE_RELEASE=VS_FF_PRERELEASE
GOTO :EOF
:: --------------------
:SET_HEX
:: --------------------
:: Iterate Major, Minor, Fix, Patches as set in csvFILEVERSION and convert to
:: hex while appending to the hexFILE_VERION string to give a padded 32bit
:: end result. ie: v1.0.1.34 = 0x0001000000010022
SET hex_values=0123456789ABCDEF
FOR /F "tokens=1-4 delims=," %%A IN ("%csvFILE_VERSION%") DO (
CALL :int2hex %%A
CALL :int2hex %%B
CALL :int2hex %%C
CALL :int2hex %%D
)
SET hexFILE_VERSION=0x%hexFILE_VERSION%
SET hex_values=
GOTO :EOF
:int2hex
SETLOCAL ENABLEDELAYEDEXPANSION
SET /A pad=4
SET /A iVal=%1
:hex_loop
SET /A pad=%pad% - 1
SET /A hVal=%iVal% %% 16
SET hVal=!hex_values:~%hVal%,1!
SET hex_word=%hVal%%hex_word%
SET /A iVal=%iVal% / 16
IF %iVal% GTR 0 GOTO hex_loop
:hex_pad_loop
FOR /L %%A in (1,1,%pad%) DO SET hex_word=0!hex_word!
ENDLOCAL& SET hexFILE_VERSION=%hexFILE_VERSION%%hex_word%
GOTO :EOF
:: --------------------
:WRITE_OUT
:: --------------------
:: HEADER_OUT falls through to CON_OUT which checks for the QUIET flag.
IF DEFINED HEADER_OUT_FILE (
CALL :OUT_HEADER
) ELSE (
IF NOT DEFINED TESTING (
CALL :CON_OUT
) ELSE (
CALL :TEST_OUT
)
)
GOTO :EOF
:: --------------------
:OUT_HEADER
:: --------------------
ECHO unsigned short ozw_vers_major = %nbMAJOR_PART%; >> "%HEADER_OUT_FILE%"
ECHO unsigned short ozw_vers_minor = %nbMINOR_PART%; >> "%HEADER_OUT_FILE%"
ECHO unsigned short ozw_vers_revision = %nbFIX_PART%; >> "%HEADER_OUT_FILE%"
ECHO char ozw_version_string[] = "%strFILE_VERSION%\0"; >> "%HEADER_OUT_FILE%"
SET nbMAJOR_PART=0
SET nbMINOR_PART=0
SET nbFIX_PART=0
SET nbPATCHES_PART=0
:: --------------------
:CON_OUT
:: --------------------
IF DEFINED fQUIET GOTO :EOF
ECHO Version String: %strFILE_VERSION%
ECHO Digital Version ID: %csvFILE_VERSION%
ECHO Hex Version ID: %hexFILE_VERSION%
GOTO :EOF
:: --------------------
:END
:: --------------------