refactor(windows): Use 14.0-style versioning

Moves all version construction to use VERSION.md and
TIER.md and reduces intermediate file usage, so we can
present sensible versions across the project.
This commit is contained in:
Marc Durdin 2020-03-18 13:49:33 +11:00
parent 2121f5ea94
commit eade8c34f3
24 changed files with 1126 additions and 271 deletions

View file

@ -26,8 +26,8 @@ prereq:
#
cd $(FVROOT)\src\inst
$(PROGRAM)\buildtools\mkver -v -u download.in download.mak $(ROOT)\src\desktop\version.txt
$(PROGRAM)\buildtools\mkver -v -u ..\localedef.dtd.in ..\xml\localedef.dtd $(ROOT)\src\desktop\version.txt
$(MKVER_U) download.in download.mak
$(MKVER_U) ..\localedef.dtd.in ..\xml\localedef.dtd
#
# Build FirstVoices keyboards fv_all.kmp

View file

@ -21,6 +21,9 @@
# . "$(dirname "$THIS_SCRIPT")/../resources/build/build-utils.sh"
# # END STANDARD BUILD SCRIPT INCLUDE
#
# Note: keep changes to version, tier and tag determination in sync with mkver (windows/src/buildutils/mkver)
#
function die () {
# TODO: consolidate this with fail() from shellHelperFunctions.sh
@ -48,7 +51,7 @@ function findVersion() {
VERSION_MINOR="${BASH_REMATCH[2]}"
VERSION_PATCH="${BASH_REMATCH[3]}"
VERSION_RELEASE="$VERSION_MAJOR.$VERSION_MINOR"
} || {
} || {
echo "Invalid VERSION.md file: expected major.minor.patch";
exit 1;
}
@ -58,7 +61,7 @@ function findVersion() {
#
# Build a tag to append to the version string. This is not assigned
# to the version number used in the projects but may be used as a
# to the version number used in the projects but may be used as a
# display string and in TeamCity configuration
#
@ -66,7 +69,7 @@ function findVersion() {
VERSION_TAG="-$TIER"
else
VERSION_TAG=
fi
fi
if [ -z "${TEAMCITY_VERSION-}" ]; then
# Local dev machine, not TeamCity
@ -112,7 +115,7 @@ function printBuildNumberForTeamCity() {
else
# For alpha/beta builds, for now we don't append the
# version tag as buildNumber is used in the delivery
# of the build version. We may improve this in the
# of the build version. We may improve this in the
# future.
echo "##teamcity[buildNumber '$VERSION']"
fi
@ -166,7 +169,7 @@ function exportEnvironmentDefinitionScript() {
}
# Detect if this script is running from within Xcode. Obviously, this assumes we don't have other definitions
# for these variables... but they're set within Xcode during its runs. As a result, they're not the wisest thing for
# for these variables... but they're set within Xcode during its runs. As a result, they're not the wisest thing for
# someone else to intentionally use, so this check seems reasonable.
#
# https://gist.github.com/gdavis/6670468 has a representative copy of a standard Xcode environment variable setup.

View file

@ -23,14 +23,6 @@ engine/keyman64/Keyman64.res
engine/keymanx64/keymanx64.res
engine/mcompile/Release/
# Version metadata
version.txt
buildtools/version.txt
desktop/version.txt
developer/version.txt
engine/version.txt
support/version.txt
# These are built from corresponding manifest.in and version.in
**/manifest.xml
**/version.rc

View file

@ -248,7 +248,8 @@ SIGNCODE=@$(ROOT)\src\buildtools\signtime.bat signtool.exe $(SC_PFX_SHA1) $(SC_P
PLATFORM=Win32
#
# mkver commands
# mkver commands. mkver determines tag from the local build environment variables
# in the same way as /resources/build/build-utils.sh.
#
MKVER_APP=$(PROGRAM)\buildtools\mkver
@ -259,9 +260,15 @@ MKVER_VERSION_TXT=$(VERSION_TXT_PATH)\version.txt
MKVER_VERSION_TXT=..\version.txt
!ENDIF
MKVER_TIER_MD=$(KEYMAN_ROOT)\TIER.md
MKVER_VERSION_MD=$(KEYMAN_ROOT)\VERSION.md
MKVER_TAG
MKVER_COMMON_PARAMS=-tier "$(MKVER_TIER_MD)" -version "$(MKVER_VERSION_MD)"
# Update a version.rc file
MKVER_V=$(MKVER_APP) -v $(MKVER_VERSION_TXT)
MKVER_V=$(MKVER_APP) $(MKVER_COMMON_PARAMS) -v $(MKVER_VERSION_TXT) version.in version.rc
# Update a manifest.xml file
MKVER_M=$(MKVER_APP) -m $(MKVER_VERSION_TXT)
# Token replacement for all other file types; pattern: $(MKVER_U) <f.in> <f.out> $(MKVER_VERSION_TXT)
MKVER_U=$(MKVER_APP) -v -u
MKVER_M=$(MKVER_APP) $(MKVER_COMMON_PARAMS) -m manifest.in manifest.xml
# Token replacement for all other file types; pattern: $(MKVER_U) <f.in> <f.out>
MKVER_U=$(MKVER_APP) $(MKVER_COMMON_PARAMS) -u

View file

@ -223,16 +223,8 @@ global-versions: mkver-app
# Build our root version.txt
cd $(ROOT)\src
# We use the version from VERSION.md
$(MKVER_APP) -c $(ROOT)\src\version.txt -r $(KEYMAN_ROOT)\VERSION.md
$(MKVER_U) $(ROOT)\src\global\inc\keymanversion_build.in $(ROOT)\src\global\inc\keymanversion_build.h $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\global\delphi\general\keymanversion_build.in $(ROOT)\src\global\delphi\general\keymanversion_build.inc $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\buildtools\version.in $(ROOT)\src\buildtools\version.txt $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\developer\version.in $(ROOT)\src\developer\version.txt $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\desktop\version.in $(ROOT)\src\desktop\version.txt $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\engine\version.in $(ROOT)\src\engine\version.txt $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\support\version.in $(ROOT)\src\support\version.txt $(ROOT)\src\version.txt
$(MKVER_U) $(ROOT)\src\global\inc\keymanversion_build.in $(ROOT)\src\global\inc\keymanversion_build.h
$(MKVER_U) $(ROOT)\src\global\delphi\general\keymanversion_build.in $(ROOT)\src\global\delphi\general\keymanversion_build.inc
build-tools: global-versions
cd $(ROOT)\src\buildtools\devtools

View file

@ -9,7 +9,6 @@ build: copydebug
clean:
cd $(ROOT)\src\buildtools\inst
-del copydebug.mak
-del copytointernalftp.mak
-del srcbackup.mak
copydebug:
@ -22,22 +21,17 @@ copydebug:
-del $(ROOT)\src\tds_file.txt
cd $(ROOT)\src\buildtools\inst
$(PROGRAM)\buildtools\mkver -v -u copydebug.in copydebug.mak $(ROOT)\src\developer\version.txt
$(MKVER_U) copydebug.in copydebug.mak
$(MAKE) -fcopydebug.mak
uploadsymbols:
cd $(ROOT)\src\buildtools\inst
$(PROGRAM)\buildtools\mkver -v -u copydebug.in copydebug.mak $(ROOT)\src\developer\version.txt
$(MKVER_U) copydebug.in copydebug.mak
$(MAKE) -fcopydebug.mak uploadsymbols
srcbackup:
cd $(ROOT)\src\buildtools\inst
$(PROGRAM)\buildtools\mkver -v -u $(ROOT)\src\buildtools\inst\srcbackup.in srcbackup.mak $(ROOT)\src\developer\version.txt
$(MKVER_U) $(ROOT)\src\buildtools\inst\srcbackup.in srcbackup.mak
make -fsrcbackup.mak
copytointernalftp:
cd $(ROOT)\src\buildtools\inst
$(PROGRAM)\buildtools\mkver -v -u $(ROOT)\src\buildtools\inst\copytointernalftp.in copytointernalftp.mak $(ROOT)\src\developer\version.txt
make -fcopytointernalftp.mak
!include ..\..\Target.mak

View file

@ -22,7 +22,11 @@ unit Main; // I3308
interface
uses WinApi.Windows, System.Classes, System.SysUtils, TagFunctions;
uses
WinApi.Windows,
System.Classes,
System.SysUtils,
TagFunctions;
procedure Run;
@ -30,22 +34,17 @@ implementation
uses
WinApi.ActiveX,
System.RegularExpressions,
System.Win.ComObj,
Xml.XMLIntf,
Xml.XMLDoc;
Xml.XMLDoc,
// This is the default build number used when doing a build outside of CI, and is
// appended to the release version found in resources/version.md
const
S_DebugBuildVersion = '9999';
Keyman.System.KeymanVersionInfo;
procedure WriteHelp; forward;
type
TMKVerMode = (mmUnknown, mmSetRootVersionFromVersionMd, mmWriteVersionedFile, mmWriteManifestFile);
var
FMode: TMKVerMode = mmUnknown;
BuildVersion, ResourceMdFilename: string;
RootTemplateFileName, TemplateFileName, ResourceFileName: string;
UpdateFiles: TStringList;
TMKVerMode = (mmUnknown, mmWriteVersionedFile, mmWriteManifestFile, mmWriteVersionRc);
const
TAG_FILEVERSION = 1;
@ -72,88 +71,113 @@ var
('"CompanyName",', '"FileDescription",', '"FileVersion",', '"InternalName",', '"LegalCopyright",',
'"LegalTradmarks",', '"OriginalFilename",', '"ProductName",', '"ProductVersion",', '"Comments",');
function Init: Boolean;
function ConstructVersionTag(const tier: string): string;
var
TEAMCITY_VERSION, TEAMCITY_PR_NUMBER: string;
begin
// This matches the algorithm found in /resources/build/build-utils.sh
if (tier = 'alpha') or (tier = 'beta') then
Result := '-'+tier
else
Result := '';
TEAMCITY_VERSION := GetEnvironmentVariable('TEAMCITY_VERSION');
if TEAMCITY_VERSION <> '' then
begin
// Local dev machine, not TeamCity
Result := Result + '-local';
end
else
begin
// On TeamCity; are we running a pull request build or a master/beta/stable build?
TEAMCITY_PR_NUMBER := GetEnvironmentVariable('TEAMCITY_PR_NUMBER');
if TEAMCITY_PR_NUMBER <> '' then
begin
// Note TEAMCITY_PR_NUMBER can also be 'master', 'beta', or 'stable-x.y'
// This indicates we are running a Test build.
if TRegEx.IsMatch(TEAMCITY_PR_NUMBER, '^(master|beta|stable(-[0-9]+\.[0-9]+)?)$') then
begin
Result := Result + '-test';
end
else
Result := Result + '-test-'+TEAMCITY_PR_NUMBER;
end;
end;
end;
function Init(var FMode: TMKVerMode; var TemplateFileName: string; UpdateFiles: TStringList; var VersionInfo: TKeymanVersionInfo): Boolean;
var
s: string;
n: Integer;
version, tier, tag: string;
begin
Result := False;
FMode := mmUnknown;
s := LowerCase(ParamStr(1));
if s = '-c' then
n := 1;
s := ParamStr(n);
while s <> '' do
begin
RootTemplateFileName := ParamStr(2);
if SameText(ParamStr(3), '-r') then
if s = '-u' then
begin
FMode := mmSetRootVersionFromVersionMd;
ResourceMdFilename := ParamStr(4);
FMode := mmWriteVersionedFile;
UpdateFiles.AddPair(ParamStr(n+1), ParamStr(n+2));
Inc(n,3);
end
else if s = '-v' then
begin
FMode := mmWriteVersionRc;
TemplateFileName := ParamStr(n+1);
UpdateFiles.AddPair(ParamStr(n+2), ParamStr(n+3));
Inc(n,4);
end
else if s = '-m' then
begin
FMode := mmWriteManifestFile;
UpdateFiles.AddPair(ParamStr(n+1), ParamStr(n+2));
Inc(n,3);
end
else if s = '-version' then
begin
version := ParamStr(n+1);
Inc(n,2);
end
else if s = '-tier' then
begin
tier := ParamStr(n+1);
Inc(n,2);
end
else
Exit;
end
else if s = '-v' then
begin
FMode := mmWriteVersionedFile;
n := 2;
while ParamStr(n) = '-u' do begin Inc(n); UpdateFiles.Add(ParamStr(n)+'='+ParamStr(n+1)); Inc(n,2); end;
TemplateFileName := ParamStr(n);
if TemplateFileName = '' then Exit;
ResourceFileName := ParamStr(n+1);
if ResourceFileName = '' then ResourceFileName := 'version.rc';
end
else if s = '-m' then
begin
n := 2;
FMode := mmWriteManifestFile;
TemplateFileName := ParamStr(n);
if TemplateFileName = '' then Exit;
ResourceFileName := 'manifest.xml';
end
else
Exit;
// Unrecognised parameter
Exit(False);
s := ParamStr(n);
end;
if FMode = mmUnknown then
Exit(False);
tag := ConstructVersionTag(tier);
VersionInfo := BuildKeymanVersionInfo(version, tier, tag);
Result := True;
end;
function GetCommaValue(var t: string): Integer;
var
n: Integer;
begin
if t = '' then raise Exception.Create('Cannot find valid PRODUCTVERSION.');
n := Pos(',', t); if n = 0 then n := Length(t) + 1;
Result := StrToInt(Copy(t, 1, n-1));
Delete(t, 1, n);
end;
// Version number format:
//
// 5.1.22.0
// 5 is major
// 1 is minor
// 22 is build
// 0 is reserved for later use
//
procedure UpdateResource;
procedure UpdateResource(const template, fin, fout: string; VersionInfo: TKeymanVersionInfo);
var
i: Integer;
ProductVersion, FileFlags, StringCompanyName: string;
StringCompanyName: string;
StringLegalCopyright, StringLegalTrademarks: string;
StringProductName, StringProductVersion: string;
xml: IXMLDocument;
StringProductName: string;
begin
writeln('Updating file version');
with TStringList.Create do
try
LoadFromFile(TemplateFileName);
LoadFromFile(template);
for i := 0 to Count - 1 do
case GetTagValue(Strings[i], 1, PredefTags) of
TAG_PRODUCTVERSION: ProductVersion := GetTag(Strings[i], 2);
TAG_FILEFLAGS: FileFlags := GetTag(Strings[i], 2);
TAG_VALUE:
case GetTagValue(Strings[i], 2, StringTags) of
TAG2_COMPANYNAME: StringCompanyName := GetTag(Strings[i], 3);
@ -175,95 +199,59 @@ begin
// I'm free!!! I'm free!!! I'm finally free!! Thank God almighty I'm free at last! (end).
StringProductVersion := ProductVersion;
for i := 1 to Length(StringProductVersion) do
if StringProductVersion[i] = ',' then StringProductVersion[i] := '.';
with TStringList.Create do
try
LoadFromFile(fin);
if ResourceFileName = 'manifest.xml' then
begin
xml := LoadXMLDocument(ChangeFileExt(ResourceFileName, '.in'));
xml.DocumentElement.ChildNodes['assemblyIdentity'].Attributes['version'] := StringProductVersion;
xml.SaveToFile(ResourceFileName);
xml := nil;
end
else
begin
StringProductVersion := '"' + StringProductVersion + '\0"';
with TStringList.Create do
try
LoadFromFile(ChangeFileExt(ResourceFileName, '.in'));
for i := 0 to Count - 1 do
case GetTagValue(Strings[i], 1, PredefTags) of
TAG_FILEVERSION: Strings[i] := UpdateTag(Strings[i], 2, ProductVersion);
TAG_PRODUCTVERSION: Strings[i] := UpdateTag(Strings[i], 2, ProductVersion);
TAG_FILEFLAGS: Strings[i] := UpdateTag(Strings[i], 2, FileFlags);
TAG_VALUE:
case GetTagValue(Strings[i], 2, StringTags) of
TAG2_COMPANYNAME: Strings[i] := UpdateTag(Strings[i], 3, StringCompanyName);
TAG2_FILEDESCRIPTION: ;
TAG2_FILEVERSION: Strings[i] := UpdateTag(Strings[i], 3, StringProductVersion);
TAG2_INTERNALNAME: ;
TAG2_LEGALCOPYRIGHT: Strings[i] := UpdateTag(Strings[i], 3, StringLegalCopyright);
TAG2_LEGALTRADEMARKS: Strings[i] := UpdateTag(Strings[i], 3, StringLegalTrademarks);
TAG2_ORIGINALFILENAME: ;
TAG2_PRODUCTNAME: Strings[i] := UpdateTag(Strings[i], 3, StringProductName);
TAG2_PRODUCTVERSION: Strings[i] := UpdateTag(Strings[i], 3, StringProductVersion);
TAG2_COMMENTS: ;
end;
end;
SaveToFile(ResourceFileName);
finally
Free;
end;
for i := 0 to Count - 1 do
case GetTagValue(Strings[i], 1, PredefTags) of
TAG_FILEVERSION: Strings[i] := UpdateTag(Strings[i], 2, VersionInfo.VersionRc);
TAG_PRODUCTVERSION: Strings[i] := UpdateTag(Strings[i], 2, VersionInfo.VersionRc);
TAG_VALUE:
case GetTagValue(Strings[i], 2, StringTags) of
TAG2_COMPANYNAME: Strings[i] := UpdateTag(Strings[i], 3, StringCompanyName);
TAG2_FILEDESCRIPTION: ;
TAG2_FILEVERSION: Strings[i] := UpdateTag(Strings[i], 3, '"'+VersionInfo.VersionWin+'\0"');
TAG2_INTERNALNAME: ;
TAG2_LEGALCOPYRIGHT: Strings[i] := UpdateTag(Strings[i], 3, StringLegalCopyright);
TAG2_LEGALTRADEMARKS: Strings[i] := UpdateTag(Strings[i], 3, StringLegalTrademarks);
TAG2_ORIGINALFILENAME: ;
TAG2_PRODUCTNAME: Strings[i] := UpdateTag(Strings[i], 3, StringProductName);
TAG2_PRODUCTVERSION: Strings[i] := UpdateTag(Strings[i], 3, '"'+VersionInfo.VersionWin+'\0"');
TAG2_COMMENTS: ;
end;
end;
SaveToFile(fout);
finally
Free;
end;
end;
procedure UpdateFile(const fin, fout: string);
procedure UpdateManifest(const fin, fout: string; VersionInfo: TKeymanVersionInfo);
var
xml: IXMLDocument;
begin
xml := LoadXMLDocument(fin);
xml.DocumentElement.ChildNodes['assemblyIdentity'].Attributes['version'] := VersionInfo.VersionWin;
xml.SaveToFile(fout);
xml := nil;
end;
procedure UpdateFile(const fin, fout: string; VersionInfo: TKeymanVersionInfo);
var
tfi, tfo: TextFile;
ProductVersion, s: string;
ProductVersionNum, ProductVersionCvs: string;
i, n: Integer;
v: Integer;
s: string;
FGUID: array[0..9] of string;
g: TGUID;
ProductReleaseMajor, ProductReleaseMinor, ProductRelease: string;
begin
for i := 0 to 9 do
begin
CreateGUID(g);
FGUID[i] := GUIDToString(g);
end;
ProductVersion := '';
writeln('Updating file version for '+fin);
with TStringList.Create do
try
LoadFromFile(TemplateFileName);
for i := 0 to Count - 1 do
case GetTagValue(Strings[i], 1, PredefTags) of
TAG_PRODUCTVERSION: ProductVersion := GetTag(Strings[i], 2);
end;
finally
Free;
end;
if ProductVersion = '' then Exit;
ProductVersionNum := ProductVersion;
ProductVersionCvs := ProductVersion;
for i := 1 to Length(ProductVersion) do
begin
if ProductVersion[i] = ',' then ProductVersion[i] := '.';
if ProductVersionCvs[i] = ',' then ProductVersionCvs[i] := '-';
end;
ProductRelease := ProductVersion;
i := Pos('.', ProductRelease, Pos('.', ProductRelease)+1);
if i > 0 then
Delete(ProductRelease, i, MaxInt);
ProductReleaseMajor := Copy(ProductRelease, 1, Pos('.', ProductRelease)-1);
ProductReleaseMinor := Copy(ProductRelease, Pos('.', ProductRelease)+1, MAXINT);
AssignFile(tfi, fin);
AssignFile(tfo, fout);
@ -274,13 +262,27 @@ begin
begin
readln(tfi, s);
s := StringReplace(s, '$VERSIONNUM', ProductVersionNum, [rfReplaceAll]);
s := StringReplace(s, '$VERSIONCVS', ProductVersionCvs, [rfReplaceAll]);
s := StringReplace(s, '$VERSION', ProductVersion, [rfReplaceAll]);
// Current replacements
s := StringReplace(s, '$Version', VersionInfo.Version, [rfReplaceAll]);
s := StringReplace(s, '$VersionWin', VersionInfo.VersionWin, [rfReplaceAll]);
s := StringReplace(s, '$VersionRelease', VersionInfo.VersionRelease, [rfReplaceAll]);
s := StringReplace(s, '$VersionMajor', IntToStr(VersionInfo.VersionMajor), [rfReplaceAll]);
s := StringReplace(s, '$VersionMinor', IntToStr(VersionInfo.VersionMinor), [rfReplaceAll]);
s := StringReplace(s, '$VersionPatch', IntToStr(VersionInfo.VersionPatch), [rfReplaceAll]);
s := StringReplace(s, '$Tier', VersionInfo.Tier, [rfReplaceAll]);
s := StringReplace(s, '$Tag', VersionInfo.Tag, [rfReplaceAll]);
s := StringReplace(s, '$VersionWithTag', VersionInfo.VersionWithTag, [rfReplaceAll]);
s := StringReplace(s, '$VersionRc', VersionInfo.VersionRc, [rfReplaceAll]);
// Legacy replacements
// TODO(lowpri): replace these with above and eliminate
s := StringReplace(s, '$VERSIONNUM', VersionInfo.VersionRc, [rfReplaceAll]);
s := StringReplace(s, '$VERSION', VersionInfo.VersionWin, [rfReplaceAll]);
s := StringReplace(s, '$RELEASE_MAJOR', IntToStr(VersionInfo.VersionMajor), [rfReplaceAll]);
s := StringReplace(s, '$RELEASE_MINOR', IntToStr(VersionInfo.VersionMinor), [rfReplaceAll]);
s := StringReplace(s, '$RELEASE', VersionInfo.VersionRelease, [rfReplaceAll]);
s := StringReplace(s, '$RELEASE_MAJOR', ProductReleaseMajor, [rfReplaceAll]);
s := StringReplace(s, '$RELEASE_MINOR', ProductReleaseMinor, [rfReplaceAll]);
s := StringReplace(s, '$RELEASE', ProductRelease, [rfReplaceAll]);
n := Pos('$GUID', s);
while n > 0 do
@ -303,77 +305,87 @@ begin
CloseFile(tfo);
end;
procedure WriteRootVersionTemplateFromVersionMd;
begin
with TStringList.Create do
try
LoadFromFile(ResourceMdFilename);
BuildVersion := Strings[0];
finally
Free;
end;
// Transform the string from 1.2 to 1,2 to match version.txt/version.rc format
BuildVersion := StringReplace(BuildVersion, '.', ',', [rfReplaceAll]);
// VERSION.MD has only major.minor.patch, so append ,0 to satisfy Windows
// version patterns
BuildVersion := BuildVersion + ',0';
with TStringList.Create do
try
Add('PRODUCTVERSION '+BuildVersion);
SaveToFile(RootTemplateFileName);
finally
Free;
end;
end;
procedure Run;
var
FMode: TMKVerMode;
TemplateFileName: string;
UpdateFiles: TStringList;
i: Integer;
VersionInfo: TKeymanVersionInfo;
begin
CoInitializeEx(nil, COINIT_APARTMENTTHREADED);
writeln('KMVer: Keyman project version information increment');
FMode := mmUnknown;
UpdateFiles := TStringList.Create;
if not Init then
begin
try
if not Init(FMode, TemplateFileName, UpdateFiles, VersionInfo) then
begin
WriteHelp;
ExitCode := 2;
Exit;
end;
case FMode of
mmWriteVersionedFile:
for i := 0 to UpdateFiles.Count - 1 do
UpdateFile(UpdateFiles.Names[i], UpdateFiles.ValueFromIndex[i], VersionInfo);
mmWriteManifestFile:
UpdateManifest(UpdateFiles.Names[0], UpdateFiles.ValueFromIndex[0], VersionInfo);
mmWriteVersionRc:
UpdateResource(TemplateFileName, UpdateFiles.Names[0], UpdateFiles.ValueFromIndex[0], VersionInfo);
end;
finally
UpdateFiles.Free;
writeln(#13#10+'Usage: kmver -c <root-version.txt> -r <VERSION.md>');
writeln(' or kmver -v [-u f.in f.out]* <template> [version.rc]');
writeln(' -c: Sets the root template version');
writeln(' -r: Use major.minor.patch version data from VERSION.md');
writeln(' -v: Update the version.rc with the template information');
writeln(' -m: Update manifest.xml with the template information');
writeln(' -u: Update file f.in to f.out, replacing (multiple entries okay):');
writeln(' $VERSION 1.2.3.4');
writeln(' $VERSIONNUM 9,0,700,0');
writeln(' $VERSIONCVS 9-0-700-0');
writeln(' $RELEASE 1.2');
writeln(' $GUID# GUID 0-9');
writeln(' $DATE 1 March 2018');
writeln(' template: The source template, usually \keyman\windows\src\<dir>\version.txt');
writeln(' root: The source template, usually \keyman\windows\src\version.txt');
writeln(' version.rc: version.rc file to update');
ExitCode := 2;
Exit;
end;
if FMode = mmSetRootVersionFromVersionMd then
WriteRootVersionTemplateFromVersionMd
else
begin
if UpdateFiles.Count = 0 then
UpdateResource;
for i := 0 to UpdateFiles.Count - 1 do
UpdateFile(UpdateFiles.Names[i], UpdateFiles.Values[UpdateFiles.Names[i]]);
end;
UpdateFiles.Free;
CoUninitialize;
end;
procedure WriteHelp;
begin
writeln;
writeln('Usage: kmver -u f.in f.out [-u f.in f.out...] <common_parameters>');
writeln(' or kmver -v <project-version.in> <app-version.in> <version.rc> <common_parameters>');
writeln(' or kmver -m <manifest.xml> <common_parameters>');
writeln(' -v: Update the version.rc with the template information');
writeln(' -m: Update manifest.xml with the template information');
writeln(' -u: Update file f.in to f.out, replacing (multiple entries okay):');
writeln;
writeln(' Legacy tags (case sensitive):');
writeln(' $VERSION 14.0.2.0');
writeln(' $VERSIONNUM 14,0,2,0');
writeln(' $RELEASE_MAJOR 14');
writeln(' $RELEASE_MINOR 0');
writeln(' $RELEASE 14.0');
writeln(' $GUID# GUID 0-9');
writeln(' $DATE 1 March 2018');
writeln;
writeln(' Current tags (case sensitive):');
writeln(' $Version 14.0.2');
writeln(' $VersionWin 14.0.2.0');
writeln(' $VersionRelease 14.0');
writeln(' $VersionMajor 14');
writeln(' $VersionMinor 0');
writeln(' $VersionPatch 2');
writeln(' $Tier alpha');
writeln(' $Tag -alpha-test-1234');
writeln(' $VersionWithTag 14.0.2-alpha-test-1234');
writeln(' $VersionRc 14,0,2,0');
writeln;
writeln(' project-version.in: The project version template, usually \keyman\windows\src\<dir>\version.in');
writeln(' app-version.in: The app version template, usually \keyman\windows\src\<dir>\<app>\version.in');
writeln(' version.rc: version.rc file to write');
writeln;
writeln('Common Parameters:');
writeln(' -version <VERSION.md> Path to VERSION.md (in root of repo)');
writeln(' -tier <TIER> Current tier (alpha, beta or stable)');
writeln;
writeln('Note: tag is constructed from TEAMCITY_VERSION and TEAMCITY_PR_NUMBER environment variables');
end;
end.

View file

@ -3,7 +3,9 @@ program mkver;
uses
System.SysUtils,
Main in 'Main.pas',
TagFunctions in 'TagFunctions.pas';
TagFunctions in 'TagFunctions.pas',
Keyman.System.KeymanVersionInfo in '..\..\global\delphi\general\Keyman.System.KeymanVersionInfo.pas';
// KeymanVersion in '..\..\global\delphi\general\KeymanVersion.pas';
{$R *.RES}

View file

@ -93,6 +93,7 @@
</DelphiCompile>
<DCCReference Include="Main.pas"/>
<DCCReference Include="TagFunctions.pas"/>
<DCCReference Include="..\..\global\delphi\general\Keyman.System.KeymanVersionInfo.pas"/>
<BuildConfiguration Include="Debug">
<Key>Cfg_2</Key>
<CfgParent>Base</CfgParent>
@ -145,9 +146,783 @@
<Platform value="Win32">True</Platform>
<Platform value="Win64">False</Platform>
</Platforms>
<Deployment Version="3">
<DeployFile LocalName="$(BDS)\Redist\osx32\libcgunwind.1.0.dylib" Class="DependencyModule">
<Platform Name="OSX32">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libcgunwind.1.0.dylib" Class="DependencyModule">
<Platform Name="iOSSimulator">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="$(BDS)\Redist\iossimulator\libpcre.dylib" Class="DependencyModule">
<Platform Name="iOSSimulator">
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployFile LocalName="mkver.exe" Configuration="Debug" Class="ProjectOutput">
<Platform Name="Win32">
<RemoteName>mkver.exe</RemoteName>
<Overwrite>true</Overwrite>
</Platform>
</DeployFile>
<DeployClass Name="AdditionalDebugSymbols">
<Platform Name="OSX32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidClassesDexFile">
<Platform Name="Android">
<RemoteDir>classes</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>classes</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidFileProvider">
<Platform Name="Android">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\xml</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidGDBServer">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiFile">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeArmeabiv7aFile">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidLibnativeMipsFile">
<Platform Name="Android">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\mips</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidServiceOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashImageDef">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStyles">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="AndroidSplashStylesV21">
<Platform Name="Android">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values-v21</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Colors">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_DefaultAppIcon">
<Platform Name="Android">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon144">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-ldpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_LauncherIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon24">
<Platform Name="Android">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-mdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon36">
<Platform Name="Android">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-hdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon48">
<Platform Name="Android">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon72">
<Platform Name="Android">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_NotificationIcon96">
<Platform Name="Android">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xxxhdpi</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage426">
<Platform Name="Android">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-small</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage470">
<Platform Name="Android">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-normal</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage640">
<Platform Name="Android">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-large</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_SplashImage960">
<Platform Name="Android">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\drawable-xlarge</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="Android_Strings">
<Platform Name="Android">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>res\values</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DebugSymbols">
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyFramework">
<Platform Name="OSX32">
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
<Extensions>.framework</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="DependencyModule">
<Platform Name="OSX32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.dll;.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="DependencyPackage">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX32">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
<Extensions>.dylib</Extensions>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
<Extensions>.bpl</Extensions>
</Platform>
</DeployClass>
<DeployClass Name="File">
<Platform Name="Android">
<Operation>0</Operation>
</Platform>
<Platform Name="Android64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>0</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX32">
<Operation>0</Operation>
</Platform>
<Platform Name="OSX64">
<Operation>0</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1024x768">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1536x2048">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1668">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch1668x2388">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2048x1536">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2048x2732">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2224">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2388x1668">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch2732x2048">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPad_Launch768x1024">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1125">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1136x640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1242">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1242x2688">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1334">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch1792">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2208">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2436">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch2688x1242">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch320">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch640x1136">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch750">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="iPhone_Launch828">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectAndroidManifest">
<Platform Name="Android">
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceDebug">
<Platform Name="iOSDevice32">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<RemoteDir>..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectiOSDeviceResourceRules"/>
<DeployClass Name="ProjectiOSEntitlements"/>
<DeployClass Name="ProjectiOSInfoPList"/>
<DeployClass Name="ProjectiOSResource">
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOSXDebug"/>
<DeployClass Name="ProjectOSXEntitlements"/>
<DeployClass Name="ProjectOSXInfoPList"/>
<DeployClass Name="ProjectOSXResource">
<Platform Name="OSX32">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<RemoteDir>Contents\Resources</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Required="true" Name="ProjectOutput">
<Platform Name="Android">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Android64">
<RemoteDir>library\lib\arm64-v8a</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice32">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSDevice64">
<Operation>1</Operation>
</Platform>
<Platform Name="iOSSimulator">
<Operation>1</Operation>
</Platform>
<Platform Name="Linux64">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX32">
<Operation>1</Operation>
</Platform>
<Platform Name="OSX64">
<Operation>1</Operation>
</Platform>
<Platform Name="Win32">
<Operation>0</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectOutput_Android32">
<Platform Name="Android64">
<RemoteDir>library\lib\armeabi-v7a</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="ProjectUWPManifest">
<Platform Name="Win32">
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo150">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<DeployClass Name="UWP_DelphiLogo44">
<Platform Name="Win32">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
<Platform Name="Win64">
<RemoteDir>Assets</RemoteDir>
<Operation>1</Operation>
</Platform>
</DeployClass>
<ProjectRoot Platform="iOSDevice64" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Win64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSDevice32" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Linux64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Win32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX32" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="Android" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="OSX64" Name="$(PROJECTNAME)"/>
<ProjectRoot Platform="iOSSimulator" Name="$(PROJECTNAME).app"/>
<ProjectRoot Platform="Android64" Name="$(PROJECTNAME)"/>
</Deployment>
</BorlandProject>
<ProjectFileVersion>12</ProjectFileVersion>
</ProjectExtensions>
<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
<Import Project="$(MSBuildProjectName).deployproj" Condition="Exists('$(MSBuildProjectName).deployproj')"/>
</Project>

View file

@ -1,5 +1,5 @@
#
# Mkver Makefile
# Stockeditor Makefile
#
!include ..\..\Defines.mak

View file

@ -1,6 +1,3 @@
PRODUCTVERSION $VERSIONNUM
FILEFLAGS 0x0L
VALUE "CompanyName", "SIL International\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "Keyman is a registered trademark of SIL International\0"

View file

@ -112,7 +112,7 @@ bightml_images: dirs
install:
cd $(ROOT)\src\desktop\help
$(PROGRAM)\buildtools\mkver -v -u install.in install.mak $(ROOT)\src\desktop\version.txt
$(MKVER_U) install.in install.mak
$(MAKE) -finstall.mak install
-del /Q install.mak

View file

@ -1,6 +1,3 @@
PRODUCTVERSION $VERSIONNUM
FILEFLAGS 0x0L
VALUE "CompanyName", "SIL International\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "Keyman is a registered trademark of SIL International\0"

View file

@ -2,11 +2,11 @@
# imsample Makefile
#
VERSION_TXT_PATH=..\..
!include ..\..\..\Defines.mak
build: dirs
# version.res target assumes version.txt in parent folder so use this line below instead
$(ROOT)\bin\buildtools\mkver -v ..\..\version.txt
build: dirs version.res
$(MSBUILD) imsample.sln $(MSBUILD_BUILD)
$(COPY) imsample.dll $(PROGRAM)\developer

View file

@ -1,6 +1,3 @@
PRODUCTVERSION $VERSIONNUM
FILEFLAGS 0x0L
VALUE "CompanyName", "SIL International\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "Keyman is a registered trademark of SIL International\0"

View file

@ -27,7 +27,7 @@ msm:
# Copy files for installation
#
$(PROGRAM)\buildtools\mkver -v -u download.in download.mak $(ROOT)\src\developer\version.txt
$(MKVER_U) download.in download.mak
#
# Make the installation archive

View file

@ -1,6 +1,3 @@
PRODUCTVERSION $VERSIONNUM
FILEFLAGS 0x0L
VALUE "CompanyName", "SIL International\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "Keyman is a registered trademark of SIL International\0"

View file

@ -117,8 +117,7 @@ begin
{$MESSAGE HINT 'Support proxies'}
o.Release := 'keyman-14.0.22-alpha-local';
//o.Release := 'release-'+SKeymanVersionWithTag;
o.Release := 'release-'+CKeymanVersionInfo.VersionWithTag;
FClient := SentryClientClass.Create(o, kscfCaptureExceptions in FFlags);
FClient.OnAfterEvent := ClientAfterEvent;

View file

@ -0,0 +1,58 @@
unit Keyman.System.KeymanVersionInfo;
interface
{$I keymanversioninfo.inc}
function BuildKeymanVersionInfo(const Version, Tier, Tag: string): TKeymanVersionInfo;
implementation
uses
System.SysUtils,
System.RegularExpressions;
type
EKeymanVersionInfo = class(Exception);
function BuildKeymanVersionInfo(const Version, Tier, Tag: string): TKeymanVersionInfo;
const
S_Regex_Version = '^(\d+)\.(\d+)\.(\d+)$';
S_E_InvalidVersion = 'Invalid version tag %0:s (Tier=%1:s, Tag=%2:s)';
S_E_InvalidTier = 'Invalid tier tag %1:s (Version=%0:s, Tag=%2:s)';
S_Format_Release = '%d.%d';
S_Format_Win = '%d.%d.%d.0';
S_Format_Rc = '%d,%d,%d,0';
var
m: TMatch;
vmajor, vminor, vpatch: Integer;
begin
m := TRegEx.Match(Version, S_Regex_Version);
if not m.Success then
raise EKeymanVersionInfo.CreateFmt(S_E_InvalidVersion, [Version, Tier, Tag]);
if (Tier <> 'alpha') and (Tier <> 'beta') and (Tier <> 'stable') then
raise EKeymanVersionInfo.CreateFmt(S_E_InvalidTier, [Version, Tier, Tag]);
// Tag may be more variable, so we won't try and limit it here
vmajor := StrToInt(m.Groups[1].Value);
vminor := StrToInt(m.Groups[2].Value);
vpatch := StrToInt(m.Groups[3].Value);
Result.Version := Version;
Result.VersionWin := Format(S_Format_Win, [vmajor, vminor, vpatch]);
Result.VersionRelease := Format(S_Format_Release, [vmajor, vminor]);
Result.VersionMajor := vmajor;
Result.VersionMinor := vminor;
Result.VersionPatch := vpatch;
Result.Tier := Tier;
Result.Tag := Tag;
Result.VersionWithTag := Version;
if Tag <> '' then
Result.VersionWithTag := Result.VersionWithTag + '-' + Tag;
Result.VersionRc := Format(S_Format_Rc, [vmajor, vminor, vpatch]);
end;
end.

View file

@ -22,6 +22,8 @@ interface
// We should not need to add to these hard-coded version numbers for future versions, unless
// we have a back-compat need to refer to a specific version.
{$I KeymanVersionInfo.inc}
const
SKeymanVersion130 = '13.0';
SKeymanVersion120 = '12.0';

View file

@ -0,0 +1,16 @@
type
TKeymanVersionInfo = record
// These fields match fields in /resources/build/build-utils.sh
Version: string; // 14.0.2
VersionWin: string; // 14.0.2.0
VersionRelease: string; // 14.0
VersionMajor: Integer; // 14
VersionMinor: Integer; // 0
VersionPatch: Integer; // 2
Tier: string; // alpha, beta or stable
Tag: string; // Tier + Pull Request + Location of build [-alpha|-beta][-test[-1234]][-local]
VersionWithTag: string; // 14.0.2-alpha-test-1234 or 14.0.2-beta-local or 14.0.2
// These fields are useful only for Windows apps
VersionRc: string; // 14,0,2,0
end;

View file

@ -3,3 +3,21 @@
KeymanVersion_Major = $RELEASE_MAJOR;
KeymanVersion_Minor = $RELEASE_MINOR;
// Keyman Version Information
KeymanVersionInfo: TKeymanVersionInfo = (
// These fields match fields in /resources/build/build-utils.sh
Version: '$Version';
VersionWin: '$VersionWin';
VersionRelease: '$VersionRelease';
VersionMajor: $VersionMajor;
VersionMinor: $VersionMinor;
VersionPatch: $VersionPatch;
Tier: '$Tier';
Tag: '$Tag';
VersionWithTag: '$VersionWithTag';
// These fields are useful only for Windows apps
VersionRc: '$VersionRc'
);

View file

@ -5,7 +5,7 @@
build: mkver-app
cd $(ROOT)\src\global\help
$(PROGRAM)\buildtools\mkver -v -u version.in version.out $(ROOT)\src\developer\version.txt
$(MKVER_U) version.in version.out
clean:
-del version.out

View file

@ -1,6 +1,3 @@
PRODUCTVERSION $VERSIONNUM
FILEFLAGS 0x0L
VALUE "CompanyName", "SIL International\0"
VALUE "LegalCopyright", "© SIL International\0"
VALUE "LegalTrademarks", "Keyman is a registered trademark of SIL International\0"