Subversion Repositories DevTools

Rev

Rev 6177 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
227 dpurdie 1
########################################################################
6177 dpurdie 2
# COPYRIGHT - VIX IP PTY LTD ("VIX"). ALL RIGHTS RESERVED.
227 dpurdie 3
#
4
# Module name   : jats.sh
5
# Module type   : Makefile system
6
# Compiler(s)   : n/a
7
# Environment(s): jats
8
#
9
# Description   : Provide varions functions used by the BuildVersion
10
#                 directive.
11
#
12
#                 Use only within buildlib.pl as this package assumes
13
#                 a great deal about its environment.
14
#
15
#......................................................................#
16
 
255 dpurdie 17
require 5.006_001;
227 dpurdie 18
use strict;
19
use warnings;
20
 
21
our $Clobber;
22
our $CurrentYear;
23
our $CurrentTime;
24
our $Srcdir;
25
our $BuildVersion;
26
our $BUILDNAME;
27
our $BUILDNAME_PACKAGE;
28
our $BUILDNAME_VERSION;
29
our $BUILDNAME_PROJECT;
30
 
31
package BuildVersion;
32
use JatsError;
33
use JatsSystem;
34
use JatsVersionUtils;
267 dpurdie 35
use ConfigurationFile;
289 dpurdie 36
use FileUtils;
227 dpurdie 37
 
283 dpurdie 38
#
39
#   Package Interface
40
#
41
use base qw(Exporter);
42
our @EXPORT = qw( BuildVersionC
227 dpurdie 43
              BuildVersionCdefs
44
              BuildVersionCSharp
45
              BuildVersionWinRC
229 dpurdie 46
              BuildVersionProperties
289 dpurdie 47
              BuildVersionDelphi
315 dpurdie 48
              BuildVersionVB
227 dpurdie 49
            );
50
 
377 dpurdie 51
################################################################################
52
#   The following strings have been obtained from Simon Davey in an email
53
#   to David Purdie dated Monday, 16 January 2012 3:40 PM
54
#
55
#   Note: At 'init' time, the $CurrentDate is not valid
56
#         It must be injected later
57
#
58
my $CompanyName = 'Vix IP Pty Ltd';
59
my $Copyright = $CompanyName;                   # Will have $CurrentDate appended
60
my $Trademark = $CompanyName;
61
#
62
################################################################################
63
 
227 dpurdie 64
#-------------------------------------------------------------------------------
65
# Function        : BuildVersionCSharp
66
#
67
# Description     : Generate a C# versionn information file to allow
68
#                   insertion of data into an assembly
69
#
70
# Inputs          : $FileName           - Output filename (Optional)
71
#
72
# Returns         :
73
#
74
sub BuildVersionCSharp
75
{
76
    my ( $fname ) = @_;
77
    $fname = 'AssemblyVersionInfo.cs' unless $fname;
78
 
247 dpurdie 79
    #
80
    #   Store the files location for use at runtime
81
    #   It will be a file that is 'known' to JATS
82
    #
83
    $fname = ::BuildAddKnownFile ( $Srcdir, $fname );
84
    return if ( $Clobber );      # clobber mode ?
289 dpurdie 85
    Message ("Creating C# Version File: $fname" );
227 dpurdie 86
 
87
    #
88
    #   Determine the build version
89
    #
359 dpurdie 90
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersionClean($BUILDNAME_VERSION);
227 dpurdie 91
    my $vstring = "$major.$minor.$patch.$build";
92
 
93
 
247 dpurdie 94
    my $fh = ConfigurationFile::New( $fname, '--Type=CSharp' );
227 dpurdie 95
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
96
                       "CSharp Assembly Version Definition" );
97
 
98
    $fh->Write( "\n" );
99
    $fh->Write( "using System.Reflection;\n" );
100
    $fh->Write( "using System.Runtime.CompilerServices;\n" );
101
    $fh->Write( "\n" );
377 dpurdie 102
    $fh->Write( "[assembly: AssemblyCompany(\"$CompanyName\")]\n" );
227 dpurdie 103
    $fh->Write( "[assembly: AssemblyProduct(\"$BUILDNAME_PACKAGE\")]\n" );
377 dpurdie 104
    $fh->Write( "[assembly: AssemblyCopyright(\"$Copyright $CurrentYear\")]\n" );
105
    $fh->Write( "[assembly: AssemblyTrademark(\"$Trademark\")]\n" );
227 dpurdie 106
    $fh->Write( "\n");
107
    $fh->Comment( "\n");
108
    $fh->Comment( "Version information for an assembly consists of the following four values:\n");
109
    $fh->Comment( "\n");
377 dpurdie 110
    $fh->Comment( "     Major Version   -VIX:Major\n");
111
    $fh->Comment( "     Minor Version  - VIX:Minor\n");
112
    $fh->Comment( "     Build Number   - VIX:Patch\n");
113
    $fh->Comment( "     Revision       - VIX:Build Number\n");
227 dpurdie 114
    $fh->Comment( "\n");
115
    $fh->Write( "\n");
116
    $fh->Write( "[assembly: AssemblyVersion(\"$vstring\")]\n" );
117
    $fh->Write( "\n");
118
 
119
    $fh->Close();
120
}
121
 
122
#-------------------------------------------------------------------------------
123
# Function        : BuildVersionWinRC
124
#
125
# Description     : Create a Windows RC file to describe the build version
126
#                   This file may be used directly
127
#
128
# Inputs          : $FileName           - Output filename (Optional)
267 dpurdie 129
#                   @opts               - Options
130
#                           --Definitions
131
#                           --Icon=path
132
#                           --Comment=text
133
#                           --Description=text
134
#                           --Product=text
135
#                           --Version=text          (Internal Use)
136
#                           --PkgName=text          (Internal Use)
137
#                           --ToolUse               (Internal Use)
138
# Returns         : Nothing
227 dpurdie 139
#
140
sub BuildVersionWinRC
141
{
267 dpurdie 142
    my ( $fname, @opts ) = @_;
143
    my $icon;
144
    my $defs;
145
    my $product = '';
146
    my $version = $BUILDNAME_VERSION || '';
147
    my $pkg_name = $BUILDNAME_PACKAGE || '';
148
    my $comment = "Build Date: $CurrentTime";
149
    my $description = '';
150
    my $used_by_tool = '';
151
 
152
    #
153
    #   Process options
154
    #
155
    foreach ( @opts )
156
    {
157
        if ( m~^--Icon=(.+)~ ) {
158
            $icon = $1;
159
        } elsif ( m~^--Definitions~ ) {
160
            $defs = 1;
161
        } elsif ( m~^--Comment=(.+)~ ) {
162
            $comment = $1;
163
        } elsif ( m~^--Description=(.+)~ ) {
164
            $description = $1;
165
        } elsif ( m~^--Product=(.+)~ ) {
166
            $product = $1;
167
        } elsif ( m~^--Version=(.+)~ ) {
168
            $version = $1;
169
        } elsif ( m~^--PkgName=(.+)~ ) {
170
            $pkg_name = $1;
171
        } elsif ( m~^--ToolUse~ ) {
172
            $used_by_tool = 1;
173
        } else {
174
            Error ("WinRC Style Version. Unknown option: $_");
175
        }
176
    }
177
 
178
    #
179
    #   Setup defaults
180
    #
227 dpurdie 181
    $fname = 'version.rc' unless $fname;
267 dpurdie 182
    Error ("WinRC: No Build Version provided") unless ( $version );
183
    Error ("WinRC: No Build Package Name provided") unless ( $pkg_name );
227 dpurdie 184
 
185
    #
247 dpurdie 186
    #   Store the files location for use at runtime
187
    #   It will be a file that is 'known' to JATS
188
    #
267 dpurdie 189
    unless ( $used_by_tool  )
190
    {
191
        $fname = ::BuildAddKnownFile ( $Srcdir, $fname );
192
        return if ( $Clobber );      # clobber mode ?
193
    }
194
 
247 dpurdie 195
    Message ("Creating Windows Resource File: $fname" );
267 dpurdie 196
 
247 dpurdie 197
    #
227 dpurdie 198
    #   Determine the build version
199
    #
359 dpurdie 200
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersionClean($version);
227 dpurdie 201
    my $product_version = "$major, $minor, $patch, $build";
202
 
203
 
204
    #
205
    #   Create the file
206
    #
247 dpurdie 207
    my $fh = ConfigurationFile::New( $fname, '--Type=C++' );
227 dpurdie 208
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
209
                       "Windows Resource Version Definition" );
210
 
211
    sub prc
212
    {
213
        return "@_\n";
214
    }
215
 
216
    sub pdefs
217
    {
218
        my ($arg, $val) = @_;
267 dpurdie 219
        Error ("Undefined value for $arg") unless ( defined $val );
227 dpurdie 220
        return "#define $arg \"$val\\0\"\n";
221
    }
222
 
223
    sub pdef
224
    {
225
        my ($arg, $val) = @_;
267 dpurdie 226
        Error ("Undefined value for $arg") unless ( defined $val );
227 dpurdie 227
        return "#define $arg $val\n";
228
    }
229
 
230
    $fh->Write(prc     (""));
231
    $fh->Write(pdefs   ("RC_STR_EMPTY"         , "" ));
377 dpurdie 232
    $fh->Write(pdefs   ("RC_STR_COMPANY"       , $CompanyName ));
267 dpurdie 233
    $fh->Write(pdefs   ("RC_STR_PRODUCTNAME"   , $product ));
234
    $fh->Write(pdefs   ("RC_STR_COMMENT"       , $comment ));
235
    $fh->Write(pdefs   ("RC_STR_DESCRIPTION"   , $description ));
236
    $fh->Write(pdefs   ("RC_STR_NAME"          , $pkg_name ));
227 dpurdie 237
    $fh->Write(pdefs   ("RC_STR_VERSION"       , $product_version ));
238
    $fh->Write(pdef    ("RC_NUM_VERSION"       , $product_version ));
377 dpurdie 239
    $fh->Write(pdefs   ("RC_STR_COPYRIGHT"     , $Copyright . ' ' . $::CurrentYear ));
240
    $fh->Write(pdefs   ("RC_STR_TRADEMARK"     , $Trademark ));
227 dpurdie 241
    $fh->Write(prc     ('#ifdef _DEBUG'));
242
    $fh->Write(pdefs   ("RC_STR_SPECIAL"       , "Debug Version" ));
243
    $fh->Write(prc     ('#else'));
244
    $fh->Write(pdefs   ("RC_STR_SPECIAL"       , "Production Version" ));
245
    $fh->Write(prc     ('#endif'));
246
    $fh->Write(prc     (""));
247
 
263 dpurdie 248
    unless ( $defs )
249
    {
269 dpurdie 250
        $fh->Write(prc     ('#define VS_VERSION_INFO     1'));
263 dpurdie 251
        $fh->Write(prc     (''));
252
        $fh->Write(prc     ('VS_VERSION_INFO VERSIONINFO'));
253
        $fh->Write(prc     (' FILEVERSION      RC_NUM_VERSION'));
254
        $fh->Write(prc     (' PRODUCTVERSION   RC_NUM_VERSION'));
255
        $fh->Write(prc     (' FILEFLAGSMASK 0x3fL'));
256
        $fh->Write(prc     ('#ifdef _DEBUG'));
257
        $fh->Write(prc     (' FILEFLAGS 0x1L'));
258
        $fh->Write(prc     ('#else'));
259
        $fh->Write(prc     (' FILEFLAGS 0x0L'));
260
        $fh->Write(prc     ('#endif'));
261
        $fh->Write(prc     (' FILEOS 0x40004L'));
262
        $fh->Write(prc     (' FILETYPE 0x1L'));
263
        $fh->Write(prc     (' FILESUBTYPE 0x0L'));
264
        $fh->Write(prc     ('BEGIN'));
265
        $fh->Write(prc     ('    BLOCK "StringFileInfo"'));
266
        $fh->Write(prc     ('    BEGIN'));
267
        $fh->Write(prc     ('        BLOCK "0c0904b0"'));
268
        $fh->Write(prc     ('        BEGIN'));
269
        $fh->Write(prc     ('            VALUE "Comments",         RC_STR_COMMENT'));
270
        $fh->Write(prc     ('            VALUE "CompanyName",      RC_STR_COMPANY'));
271
        $fh->Write(prc     ('            VALUE "FileDescription",  RC_STR_DESCRIPTION'));
272
        $fh->Write(prc     ('            VALUE "FileVersion",      RC_STR_VERSION'));
273
        $fh->Write(prc     ('            VALUE "InternalName",     RC_STR_NAME'));
274
        $fh->Write(prc     ('            VALUE "LegalCopyright",   RC_STR_COPYRIGHT'));
377 dpurdie 275
        $fh->Write(prc     ('            VALUE "LegalTrademarks",  RC_STR_TRADEMARK'));
263 dpurdie 276
        $fh->Write(prc     ('            VALUE "OriginalFilename", RC_STR_NAME'));
277
        $fh->Write(prc     ('            VALUE "PrivateBuild",     RC_STR_EMPTY'));
278
        $fh->Write(prc     ('            VALUE "ProductName",      RC_STR_PRODUCTNAME'));
279
        $fh->Write(prc     ('            VALUE "ProductVersion",   RC_STR_VERSION'));
280
        $fh->Write(prc     ('            VALUE "SpecialBuild",     RC_STR_SPECIAL'));
281
        $fh->Write(prc     ('        END'));
282
        $fh->Write(prc     ('    END'));
283
        $fh->Write(prc     ('        BLOCK "VarFileInfo"'));
284
        $fh->Write(prc     ('        BEGIN'));
285
        $fh->Write(prc     ('            VALUE "Translation", 0xc09, 1200'));
286
        $fh->Write(prc     ('        END'));
287
        $fh->Write(prc     ('END'));
288
        $fh->Write(prc     (''));
227 dpurdie 289
 
263 dpurdie 290
        if ( $icon )
291
        {
292
        $fh->Write(prc     (''));
293
        $fh->Write(prc     ('/////////////////////////////////////////////////////////////////////////////'));
294
        $fh->Write(prc     ('//'));
295
        $fh->Write(prc     ('// Icon'));
296
        $fh->Write(prc     ('//'));
297
        $fh->Write(prc     ('// Icon with lowest ID value placed first to ensure application icon'));
298
        $fh->Write(prc     ('// remains consistent on all systems.'));
299
        $fh->Write(prc     ("101       ICON    DISCARDABLE     \"$icon\""));
300
        $fh->Write(prc     (''));
301
        }
235 dpurdie 302
    }
303
 
304
 
227 dpurdie 305
    $fh->Close();
306
}
307
 
308
#-------------------------------------------------------------------------------
309
# Function        : BuildVersionC
310
#
311
# Description     : Create a "C" style version.c and version.h file
312
#
289 dpurdie 313
# Inputs          : $FileName       - Output filename (Optional)
314
#                                     If provided it will be 'known' to all
315
#                                     of jats. Done for backward compatability
316
#                   $Prefix         - Text to prefix generated variables with
227 dpurdie 317
#                                     Used to avoid namespace conflicts
318
#                   $Type           - Type of version to create
319
#                                     Only allowed value is 'array'
320
#
321
# Returns         :
322
#
323
 
324
sub BuildVersionC
325
{
289 dpurdie 326
    my( $FileName, $Prefix, $Type ) = @_;
227 dpurdie 327
    my $ver;
328
 
289 dpurdie 329
    #
330
    #   Default name of the file
331
    #   Don't allow the user to play with the extension
332
    #   If the user provided a filename It will be a file that is 'known' to JATS
333
    #   
334
    my $bname = defined($FileName) ? StripExt($FileName) : 'version';
227 dpurdie 335
 
289 dpurdie 336
    my $fname_c = ::BuildAddKnownFile ( $Srcdir, $bname . '.c', !defined($FileName) );
337
    my $fname_h = ::BuildAddKnownFile ( $Srcdir, $bname . '.h', !defined($FileName) );
338
 
339
    return if ( $Clobber );      # clobber mode ?
340
    Message ("Creating C Version File: $fname_c" );
341
 
227 dpurdie 342
    #
343
    #   Default prefix is none
344
    #   Set to a defined, bet empty, string
345
    #
346
    $Prefix = "" if ( ! defined( $Prefix ) );
347
    $Type   = "" if ( ! defined( $Type ) );
348
 
349
    #   src/version.c
350
    #..
289 dpurdie 351
    open( VERSIONC, '>', $fname_c ) ||
352
        Error( "cannot create $fname_c" );
227 dpurdie 353
 
354
    print VERSIONC
355
        "/* Please do not edit this file.\n" .
356
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
357
        " */\n" .
358
        "#include \"version.h\"\n";
359
 
360
    print VERSIONC
361
        "\n" .
377 dpurdie 362
        "static char what[] = \"@(#) $BUILDNAME $::CurrentDate $CompanyName\";\n" .
227 dpurdie 363
        "\n";
364
 
7372 dpurdie 365
    print VERSIONC
366
       "const char *\n$Prefix"."GetWhatString(void)\n" .
367
       "{\n".
368
       "    return what;\n" .
369
       "}\n";
227 dpurdie 370
 
371
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
372
    if ( $Type eq "array" )
373
    {                                           # new style
374
        print VERSIONC
375
           "static const char *pkgarray[] = \n" .
376
           "{\n";
377
 
378
        foreach $ver ( @PACKAGEVERS   ) {
379
            print VERSIONC "    \"$ver\",\n";
380
        }
381
 
382
        print VERSIONC
383
           "    0\n",
384
           "};\n\n";
385
 
386
        print VERSIONC
387
           "\nconst char *\n$Prefix"."VersionString(void)\n" .
388
           "{\n".
389
           "    return \"$BUILDNAME\";\n" .
390
           "}\n" .
391
           "\nconst char **\n$Prefix"."PkgStrings(void)\n" .
392
           "{\n".
393
           "    return pkgarray;\n" .
394
           "}\n" .
395
           "\nconst char *\n$Prefix"."GetModuleInfo(void)\n" .
396
           "{\n" .
397
           "    return \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\";\n" .
398
           "}\n";
399
    }
400
    else
401
    {                                           # old style
402
        print VERSIONC
403
           "\nconst char *\n$Prefix"."VersionString(void)\n" .
404
           "{\n".
405
           "    return \"$BUILDNAME @PACKAGEVERS\";\n" .
406
           "}\n" .
407
           "\nconst char *\n$Prefix"."GetModuleInfo(void)\n" .
408
           "{\n" .
409
           "    return \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\";\n" .
410
           "}\n";
411
    }
412
    close VERSIONC;
413
 
414
#   src/version.h
415
#..
289 dpurdie 416
    open( VERSIONH, '>', $fname_h ) ||
417
        Error( "cannot create $fname_h" );
227 dpurdie 418
 
419
    print VERSIONH
420
        "#ifndef VERSION_H_INCLUDED\n" .
421
        "#define VERSION_H_INCLUDED\n" .
422
        "/* Please do not edit this file.\n" .
423
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
424
        " */\n\n" .
425
        "#define BUILDNAME     \"$BUILDNAME\"\n" .
426
        "#define BUILDDATE     \"$::CurrentTime\"\n" .
427
        "\n";
428
 
429
    print VERSIONH
430
        "#ifdef __cplusplus\n" .
431
        "    extern \"C\" {           /* force C calling convention when using C++ */\n" .
432
        "#endif\n" .
433
        "\n";
434
 
435
    if ( $Type eq "array" )
436
    {                                           # extended interface
437
        print VERSIONH
438
        "extern const char **  $Prefix"."PkgStrings(void);\n";
439
    }
440
    print VERSIONH
441
        "extern const char *   $Prefix"."VersionString(void);\n".
442
        "extern const char *   $Prefix"."GetModuleInfo(void);\n";
443
 
444
    print VERSIONH
445
        "\n" .
446
        "#ifdef __cplusplus\n" .
447
        "    } /* extern \"C\" */\n" .
448
        "#endif\n" .
449
        "\n";
450
 
451
    print VERSIONH
452
        "\n#endif /*VERSION_H_INCLUDED*/\n";
453
    close VERSIONH;
454
}
455
 
456
#-------------------------------------------------------------------------------
457
# Function        : BuildVersionCdefs
458
#
459
# Description     : Generate a "C" style version definitions file
460
#                   This file simply contains definitions
461
#
289 dpurdie 462
# Inputs          : $FileName       - Output filename (Optional)
463
#                                     If provided it will be 'known' to all
464
#                                     of jats. Done for backward compatability
465
#                   $Mode           - File suffix
227 dpurdie 466
#                   $ModePrefix     - Tag for all generated definitions
467
#
468
# Returns         :
469
#
470
 
471
sub BuildVersionCdefs
472
{
289 dpurdie 473
    my ( $FileName, $Mode, $ModePrefix ) = @_;
227 dpurdie 474
 
289 dpurdie 475
    my $fname = defined($FileName) ? $FileName : "version_$Mode.h";
476
    $fname = ::BuildAddKnownFile ( $Srcdir, $fname , ! defined($FileName) );
477
    return if ( $Clobber );      # clobber mode ?
478
    Message ("Creating C Version Defs File: $fname" );
227 dpurdie 479
 
480
    #
481
    #   Generate version_defs.h
482
    #   This file contains ONLY definitions. It may be used by assembler
483
    #   programs (that support a preprocessor) to access version information
484
    #
485
    #   Allow for a user supplied filename fragment that will be used within
486
    #   all the definitions with in the file.
487
    #
359 dpurdie 488
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersionClean($BUILDNAME_VERSION);
227 dpurdie 489
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
490
 
491
    #
492
    #   Base names on a user supplied value or a default
493
    #
494
    my $vtag = uc( "VERSION$ModePrefix" );
495
    my $guard_name = uc($fname);
289 dpurdie 496
       $guard_name =~ tr~\.\/\\~_~s;
227 dpurdie 497
 
289 dpurdie 498
    open( VERSIOND, '>', $fname ) ||
499
        Error( "cannot create $fname" );
227 dpurdie 500
 
501
    print VERSIOND
502
        "#ifndef $guard_name\n" .
503
        "#define $guard_name\n" .
504
        "/* Please do not edit this file.\n" .
505
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
506
        " */\n\n" .
507
        "\n".
508
        "#define ${vtag}_BUILDNAME      \"$BUILDNAME\"\n".
509
        "#define ${vtag}_BUILDDATE      \"$::CurrentTime\"\n".
510
        "\n".
511
        "#define ${vtag}_PACKAGE        \"$BUILDNAME_PACKAGE\"\n".
512
        "#define ${vtag}_VERSION        \"$BUILDNAME_VERSION\"\n".
513
        "#define ${vtag}_MAJOR_STR      \"$major\"\n".
514
        "#define ${vtag}_MINOR_STR      \"$minor\"\n".
515
        "#define ${vtag}_PATCH_STR      \"$patch\"\n".
516
        "#define ${vtag}_BUILD_STR      \"$build\"\n".
517
        "#define ${vtag}_PATCHBUILD_STR \"$raw_patch\"\n".
518
        "#define ${vtag}_PROJECT        \"$BUILDNAME_PROJECT\"\n".
359 dpurdie 519
        "#define ${vtag}_MAJOR          $major\n".
520
        "#define ${vtag}_MINOR          $minor\n".
521
        "#define ${vtag}_PATCH          $patch\n".
522
        "#define ${vtag}_BUILD          $build\n".
523
        "#define ${vtag}_PATCHBUILD     $raw_patch\n".
227 dpurdie 524
        "#define ${vtag}_ALL            \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\"\n".
525
        "#define ${vtag}_BUILDTIME      " . strip_zeros(time()) . "\n".
526
        "\n".
527
        "#endif /* $guard_name */\n";
528
 
529
    close VERSIOND;
530
}
531
 
532
#-------------------------------------------------------------------------------
229 dpurdie 533
# Function        : BuildVersionProperties
534
#
535
# Description     : Generate a "Java" style version definitions file
536
#                   This is a simple properties file
537
#
538
# Inputs          : $FileName       - Output filename (Optional)
539
#                   $Prefix         - Tag for all generated definitions
540
#
541
# Returns         :
542
#
543
sub BuildVersionProperties
544
{
545
    my ( $fname, $Prefix ) = @_;
546
 
547
    #
548
    #   Default name of the file
549
    #
550
    $fname = 'version.properties' unless $fname;
551
 
552
    #
247 dpurdie 553
    #   Store the files location for use at runtime
554
    #   It will be a file that is 'known' to JATS
555
    #
556
    $fname = ::BuildAddKnownFile ( $Srcdir, $fname );
557
    return if ( $Clobber );      # clobber mode ?
289 dpurdie 558
    Message ("Creating Properties Version File: $fname" );
247 dpurdie 559
 
560
    #
229 dpurdie 561
    #   Generate version properties file
562
    #
563
    #   This file contains ONLY definitions. It may be included by the ANT
564
    #   builds. Its not intended to be imported by the java code
565
 
566
 
567
    #
568
    #   Allow for a user supplied property prefix
569
    #   Not really needed as
570
    #
571
    my $vtag = '';
572
    $vtag = $Prefix . '.' if $Prefix;
573
 
574
 
359 dpurdie 575
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersionClean($BUILDNAME_VERSION);
229 dpurdie 576
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
577
 
578
    #
579
    #   Create properties in the same form as for "C" definitions
580
    #   Note:
581
    #       The 'ALL' is in a format used by other software. Do not change
582
    #
247 dpurdie 583
    open( VERSIOND, ">$fname" ) ||
584
        Error( "cannot create $fname" );
229 dpurdie 585
 
586
    print VERSIOND
587
        "# Please do not edit this file.\n" .
588
        "# It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
589
        "#\n" .
590
        "${vtag}BUILDNAME      = $BUILDNAME\n".
591
        "${vtag}BUILDDATE      = $::CurrentTime\n".
592
        "\n".
593
        "${vtag}PACKAGE        = $BUILDNAME_PACKAGE\n".
594
        "${vtag}VERSION        = $BUILDNAME_VERSION\n".
595
        "${vtag}MAJOR_STR      = $major\n".
596
        "${vtag}MINOR_STR      = $minor\n".
597
        "${vtag}PATCH_STR      = $patch\n".
598
        "${vtag}BUILD_STR      = $build\n".
599
        "${vtag}PATCHBUILD_STR = $raw_patch\n".
600
        "${vtag}PROJECT        = $BUILDNAME_PROJECT\n".
359 dpurdie 601
        "${vtag}MAJOR          = $major\n".
602
        "${vtag}MINOR          = $minor\n".
603
        "${vtag}PATCH          = $patch\n".
604
        "${vtag}BUILD          = $build\n".
605
        "${vtag}PATCHBUILD     = $raw_patch\n".
229 dpurdie 606
        "${vtag}ALL            = $BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\n".
607
        "${vtag}BUILDTIME      = " . strip_zeros(time()) . "\n".
608
        "\n";
609
    #
610
    #   Create a set of definitions for each dependent package
611
    #
612
    print VERSIOND "# Dependent Packages and Versions\n".
613
                   "#\n";
614
 
615
    foreach my $tag ( PackageEntry::GetPackageList() )
616
    {
617
        my ($name, $version, $type) = PackageEntry::GetPackageData($tag);
618
#        push @attributes, "build=\"true\"" if $type =~ /Build/i;
619
        print VERSIOND "${vtag}PACKAGE.$name=$version\n";
620
    }
621
    close VERSIOND;
622
}
623
 
624
#-------------------------------------------------------------------------------
289 dpurdie 625
# Function        : BuildVersionDelphi
626
#
627
# Description     : Create a pascal file in Delphi format
628
#
629
# Inputs          : $FileName       - Output filename (Optional)
630
#                   $Prefix         - Tag for all generated definitions
631
#
632
#
633
# Returns         : 
634
#
635
sub BuildVersionDelphi
636
{
637
    my ( $fname, $Prefix ) = @_;
638
 
639
    #
640
    #   Default name of the file
641
    #
642
    $fname = 'version_defs.pas' unless $fname;
643
    $fname .= '.pas'
644
        unless ( $fname =~ m~\.~ );
645
    my $unit_name = StripDirExt($fname);
646
    Error ("BuildVersion: Delphi Style. Filename \'$unit_name\. not allowed")
647
        if ( $unit_name =~ m~^version$~i );
648
 
649
    #
650
    #   Store the files location for use at runtime
651
    #   It will be a file that is 'known' to JATS
652
    #
653
    $fname = ::BuildAddKnownFile ( $Srcdir, $fname );
654
    return if ( $Clobber );      # clobber mode ?
655
    Message ("Creating Delpi Version File: $fname" );
656
 
657
    #
658
    #   Generate version source file
659
    #   This file contains ONLY constant definitions.
660
 
661
    #
662
    #   Allow for a user supplied property prefix
663
    #   Not really needed as
664
    #
665
    my $vtag = '';
666
    $vtag = $Prefix . '_' if $Prefix;
667
 
668
 
359 dpurdie 669
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersionClean($BUILDNAME_VERSION);
289 dpurdie 670
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
671
 
672
    #
673
    #   Create properties in the same form as for "C" definitions
674
    #   Note:
675
    #       The 'ALL' is in a format used by other software. Do not change
676
    #
677
    sub pstring
678
    {
679
        my ($arg, $val) = @_;
680
        Error ("Undefined value for $arg") unless ( defined $val );
681
        return sprintf ( "%-24s = \'%s\';" , $arg, $val);
682
    }
683
    sub pnum
684
    {
685
        my ($arg, $val) = @_;
686
        Error ("Undefined value for $arg") unless ( defined $val );
359 dpurdie 687
        return sprintf ( "%-24s = %s;" , $arg, $val );
289 dpurdie 688
    }
689
 
690
    my $fh = ConfigurationFile::New( $fname, '--Type=Delphi' );
691
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
692
                       "Delphi Unit Version Definition" );
693
 
694
    $fh->WriteLn(
695
        "unit $unit_name;",
696
        "interface",
697
        "const",
698
        pstring ("${vtag}BUILDNAME",$BUILDNAME),
699
        pstring ("${vtag}BUILDDATE",$::CurrentTime),
700
        '',
701
        pstring ("${vtag}PACKAGE",$BUILDNAME_PACKAGE),
702
        pstring ("${vtag}VERSION",$BUILDNAME_VERSION),
703
        pstring ("${vtag}MAJOR_STR",$major),
704
        pstring ("${vtag}MINOR_STR",$minor),
705
        pstring ("${vtag}PATCH_STR",$patch),
706
        pstring ("${vtag}BUILD_STR",$build),
707
        pstring ("${vtag}PATCHBUILD_STR",$raw_patch),
708
        pstring ("${vtag}PROJECT",$BUILDNAME_PROJECT),
709
        pnum ("${vtag}MAJOR",$major),
710
        pnum ("${vtag}MINOR",$minor),
711
        pnum ("${vtag}PATCH",$patch),
712
        pnum ("${vtag}BUILD",$build),
713
        pnum ("${vtag}PATCHBUILD",$raw_patch),
714
        pstring ("${vtag}ALL","$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS"),
359 dpurdie 715
        pnum ("${vtag}BUILDTIME",strip_zeros(time())),
289 dpurdie 716
        ''
717
        );
718
 
719
    #
720
    #   Create a set of definitions for each dependent package
721
    #
722
    $fh->Comment("Dependent Packages and Versions\n");
723
    $fh->Comment("\n");
724
 
725
    foreach my $tag ( PackageEntry::GetPackageList() )
726
    {
727
        my ($name, $version, $type) = PackageEntry::GetPackageData($tag);
728
        $fh->WriteLn(pstring ("${vtag}PACKAGE_$name", $version));
729
    }
730
    $fh->WriteLn( '',
731
        "implementation",
732
        "end.");
733
 
734
 
735
    $fh->WriteLn();
736
    $fh->Close();
737
}
738
 
315 dpurdie 739
#-------------------------------------------------------------------------------
740
# Function        : BuildVersionVB
741
#
742
# Description     : Create a VB6 file in Basic format
743
#
744
# Inputs          : $FileName       - Output filename (Optional)
745
#                   $Prefix         - Tag for all generated definitions
746
#
747
#
748
# Returns         : 
749
#
750
sub BuildVersionVB
751
{
752
    my ( $fname, $Prefix ) = @_;
289 dpurdie 753
 
315 dpurdie 754
    #
755
    #   Default name of the file
756
    #
757
    $fname = 'version.bas' unless $fname;
758
    $fname .= '.bas'
759
        unless ( $fname =~ m~\.~ );
760
 
761
    #
762
    #   Store the files location for use at runtime
763
    #   It will be a file that is 'known' to JATS
764
    #
765
    $fname = ::BuildAddKnownFile ( $Srcdir, $fname );
766
    return if ( $Clobber );      # clobber mode ?
767
    Message ("Creating Visual Basic Version File: $fname" );
768
 
769
    #
770
    #   Generate version source file
771
    #   This file contains ONLY constant definitions.
772
 
773
    #
774
    #   Allow for a user supplied property prefix
775
    #   Not really needed as
776
    #
777
    my $vtag = '';
778
    $vtag = $Prefix . '_' if $Prefix;
779
 
780
 
359 dpurdie 781
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersionClean($BUILDNAME_VERSION);
315 dpurdie 782
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
783
 
784
    #
785
    #   Create properties in the same form as for "C" definitions
786
    #   Note:
787
    #       The 'ALL' is in a format used by other software. Do not change
788
    #
789
    sub pvbstring
790
    {
791
        my ($arg, $val) = @_;
792
        Error ("Undefined value for $arg") unless ( defined $val );
793
        return sprintf ( "Public Const %-24s = \"%s\"" , $arg, $val);
794
    }
795
    sub pvbnum
796
    {
797
        my ($arg, $val) = @_;
798
        Error ("Undefined value for $arg") unless ( defined $val );
359 dpurdie 799
        return sprintf ( "Public Const %-24s = %s" , $arg, $val );
315 dpurdie 800
    }
801
 
802
    my $fh = ConfigurationFile::New( $fname, '--Type=Basic' );
803
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
804
                       "Visual Basic Version Definition" );
805
 
806
    $fh->WriteLn(
807
        "Attribute VB_Name = \"JatsVersion\"",
808
        '',
809
        pvbstring ("${vtag}BUILDNAME",      $BUILDNAME),
810
        pvbstring ("${vtag}BUILDDATE",      $::CurrentTime),
811
        '',
812
        pvbstring ("${vtag}PACKAGE",        $BUILDNAME_PACKAGE),
813
        pvbstring ("${vtag}VERSION",        $BUILDNAME_VERSION),
814
        pvbstring ("${vtag}MAJOR_STR",      $major),
815
        pvbstring ("${vtag}MINOR_STR",      $minor),
816
        pvbstring ("${vtag}PATCH_STR",      $patch),
817
        pvbstring ("${vtag}BUILD_STR",      $build),
818
        pvbstring ("${vtag}PATCHBUILD_STR", $raw_patch),
819
        pvbstring ("${vtag}PROJECT",        $BUILDNAME_PROJECT),
820
        pvbnum    ("${vtag}MAJOR",          $major),
821
        pvbnum    ("${vtag}MINOR",          $minor),
822
        pvbnum    ("${vtag}PATCH",          $patch),
823
        pvbnum    ("${vtag}BUILD",          $build),
824
        pvbnum    ("${vtag}PATCHBUILD",     $raw_patch),
825
        pvbstring ("${vtag}ALL",            "$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS"),
359 dpurdie 826
        pvbnum    ("${vtag}BUILDTIME",      strip_zeros(time())),
315 dpurdie 827
        ''
828
        );
829
 
830
    #
831
    #   Create a set of definitions for each dependent package
832
    #
833
    $fh->Comment("Dependent Packages and Versions\n");
834
    $fh->Comment("\n");
835
 
836
    foreach my $tag ( PackageEntry::GetPackageList() )
837
    {
838
        my ($name, $version, $type) = PackageEntry::GetPackageData($tag);
363 dpurdie 839
        $fh->WriteLn(pvbstring ("${vtag}PACKAGE_$name", $version));
315 dpurdie 840
    }
841
 
842
    $fh->WriteLn();
843
    $fh->Close();
844
}
845
 
359 dpurdie 846
#-------------------------------------------------------------------------------
847
# Function        : SplitVersionClean
848
#
849
# Description     : Pull apart the Version Number and clean it up
850
#                   Remove leading zeros from components
851
#
852
# Inputs          : $version    - Version Number
853
#
854
# Returns         : A list of:
855
#                       Major, Minor, Patch, Build, RawPatch
856
#                   with leading zeros removed
857
#
858
sub SplitVersionClean
859
{
860
    my ($version) = @_;
861
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($version);
315 dpurdie 862
 
359 dpurdie 863
    return (
864
        strip_zeros($major),
865
        strip_zeros($minor),
866
        strip_zeros($patch),
867
        strip_zeros($build),
868
        strip_zeros($raw_patch)
869
    );
870
}
871
 
289 dpurdie 872
#-------------------------------------------------------------------------------
227 dpurdie 873
# Function        : stip_zeros
874
#
875
# Description     : Remove leading 0's from a string
876
#
877
# Inputs          : A string
878
#
879
# Returns         : A string without leading zeros
880
#
881
sub strip_zeros
882
{
883
    my ($text) = @_;
884
 
885
    $text =~ s~^0*~~;
886
    $text = '0' unless ( $text );
887
    return $text;
888
}
889
 
890
1;