Subversion Repositories DevTools

Rev

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

Rev Author Line No. Line
227 dpurdie 1
#! perl
2
########################################################################
3
# Copyright ( C ) 2004 ERG Limited, All rights reserved
4
#
5
# Module name   : jats.sh
6
# Module type   : Makefile system
7
# Compiler(s)   : n/a
8
# Environment(s): jats
9
#
10
# Description   : Provide varions functions used by the BuildVersion
11
#                 directive.
12
#
13
#                 Use only within buildlib.pl as this package assumes
14
#                 a great deal about its environment.
15
#
16
# Usage:
17
#
18
# Version   Who      Date        Description
19
#
20
#......................................................................#
21
 
22
require 5.6.1;
23
use strict;
24
use warnings;
25
 
26
our $Clobber;
27
our $CurrentYear;
28
our $CurrentTime;
29
our $Srcdir;
30
our $BuildVersion;
31
our $BUILDNAME;
32
our $BUILDNAME_PACKAGE;
33
our $BUILDNAME_VERSION;
34
our $BUILDNAME_PROJECT;
35
 
36
package BuildVersion;
37
use JatsError;
38
use JatsSystem;
39
use JatsVersionUtils;
40
 
41
our (@ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $VERSION);
42
use Exporter;
43
 
44
$VERSION = 1.00;
45
@ISA = qw(Exporter);
46
 
47
# Symbols to autoexport (:DEFAULT tag)
48
@EXPORT = qw( BuildVersionC
49
              BuildVersionCdefs
50
              BuildVersionCSharp
51
              BuildVersionWinRC
229 dpurdie 52
              BuildVersionProperties
227 dpurdie 53
            );
54
 
55
#-------------------------------------------------------------------------------
56
# Function        : BuildVersionCSharp
57
#
58
# Description     : Generate a C# versionn information file to allow
59
#                   insertion of data into an assembly
60
#
61
# Inputs          : $FileName           - Output filename (Optional)
62
#
63
# Returns         :
64
#
65
sub BuildVersionCSharp
66
{
67
    my ( $fname ) = @_;
68
    $fname = 'AssemblyVersionInfo.cs' unless $fname;
69
 
70
    if ( $Clobber )                             # clobber mode ?
71
    {
72
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
73
        return;
74
    }
75
 
76
    #
77
    #   Determine the build version
78
    #
79
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
80
    my $vstring = "$major.$minor.$patch.$build";
81
 
82
 
83
    my $fh = ConfigurationFile::New( "$Srcdir/$fname", '--Type=CSharp' );
84
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
85
                       "CSharp Assembly Version Definition" );
86
 
87
    $fh->Write( "\n" );
88
    $fh->Write( "using System.Reflection;\n" );
89
    $fh->Write( "using System.Runtime.CompilerServices;\n" );
90
    $fh->Write( "\n" );
91
    $fh->Write( "[assembly: AssemblyCompany(\"ERG Group\")]\n" );
92
    $fh->Write( "[assembly: AssemblyProduct(\"$BUILDNAME_PACKAGE\")]\n" );
93
    $fh->Write( "[assembly: AssemblyCopyright(\"ERG Group $CurrentYear\")]\n" );
94
    $fh->Write( "[assembly: AssemblyTrademark(\"\")]\n" );
95
    $fh->Write( "\n");
96
    $fh->Comment( "\n");
97
    $fh->Comment( "Version information for an assembly consists of the following four values:\n");
98
    $fh->Comment( "\n");
99
    $fh->Comment( "     Major Version   -ERG:Major\n");
100
    $fh->Comment( "     Minor Version  - ERG:Minor\n");
101
    $fh->Comment( "     Build Number   - ERG:Patch\n");
102
    $fh->Comment( "     Revision       - ERG:Build Number\n");
103
    $fh->Comment( "\n");
104
    $fh->Write( "\n");
105
    $fh->Write( "[assembly: AssemblyVersion(\"$vstring\")]\n" );
106
    $fh->Write( "\n");
107
 
108
    $fh->Close();
109
}
110
 
111
#-------------------------------------------------------------------------------
112
# Function        : BuildVersionWinRC
113
#
114
# Description     : Create a Windows RC file to describe the build version
115
#                   This file may be used directly
116
#
117
# Inputs          : $FileName           - Output filename (Optional)
118
#
119
# Returns         :
120
#
121
sub BuildVersionWinRC
122
{
123
    my ( $fname ) = @_;
124
    $fname = 'version.rc' unless $fname;
125
 
126
    if ( $Clobber )                             # clobber mode ?
127
    {
128
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
129
        return;
130
    }
131
 
132
    #
133
    #   Determine the build version
134
    #
135
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
136
    my $product_version = "$major, $minor, $patch, $build";
137
 
138
 
139
    #
140
    #   Create the file
141
    #
142
    my $fh = ConfigurationFile::New( "$Srcdir/$fname", '--Type=C++' );
143
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
144
                       "Windows Resource Version Definition" );
145
 
146
    sub prc
147
    {
148
        return "@_\n";
149
    }
150
 
151
    sub pdefs
152
    {
153
        my ($arg, $val) = @_;
154
        return "#define $arg \"$val\\0\"\n";
155
    }
156
 
157
    sub pdef
158
    {
159
        my ($arg, $val) = @_;
160
        return "#define $arg $val\n";
161
    }
162
 
163
    $fh->Write(prc     (""));
164
#    $fh->Write(prc     ("#include \"afxres.h\""));
165
#    $fh->Write(prc     (""));
166
    $fh->Write(prc     (""));
167
    $fh->Write(pdefs   ("RC_STR_EMPTY"         , "" ));
168
    $fh->Write(pdefs   ("RC_STR_COMPANY"       , "ERG Group" ));
169
    $fh->Write(pdefs   ("RC_STR_PRODUCTNAME"   , "ERG Group test" ));
170
    $fh->Write(pdefs   ("RC_STR_COMMENT"       , "Build Date: $CurrentTime" ));
171
    $fh->Write(pdefs   ("RC_STR_DESCRIPTION"   , "From: $BUILDNAME_PACKAGE" ));
172
    $fh->Write(pdefs   ("RC_STR_NAME"          , $BUILDNAME_PACKAGE ));
173
    $fh->Write(pdefs   ("RC_STR_VERSION"       , $product_version ));
174
    $fh->Write(pdef    ("RC_NUM_VERSION"       , $product_version ));
175
    $fh->Write(pdefs   ("RC_STR_COPYRIGHT"     , "Copyright ERG Group $CurrentYear" ));
176
    $fh->Write(prc     ('#ifdef _DEBUG'));
177
    $fh->Write(pdefs   ("RC_STR_SPECIAL"       , "Debug Version" ));
178
    $fh->Write(prc     ('#else'));
179
    $fh->Write(pdefs   ("RC_STR_SPECIAL"       , "Production Version" ));
180
    $fh->Write(prc     ('#endif'));
181
    $fh->Write(prc     (""));
182
 
183
    $fh->Write(prc     (''));
184
    $fh->Write(prc     ('VS_VERSION_INFO VERSIONINFO'));
185
    $fh->Write(prc     (' FILEVERSION      RC_NUM_VERSION'));
186
    $fh->Write(prc     (' PRODUCTVERSION   RC_NUM_VERSION'));
187
    $fh->Write(prc     (' FILEFLAGSMASK 0x3fL'));
188
    $fh->Write(prc     ('#ifdef _DEBUG'));
189
    $fh->Write(prc     (' FILEFLAGS 0x1L'));
190
    $fh->Write(prc     ('#else'));
191
    $fh->Write(prc     (' FILEFLAGS 0x0L'));
192
    $fh->Write(prc     ('#endif'));
193
    $fh->Write(prc     (' FILEOS 0x40004L'));
194
    $fh->Write(prc     (' FILETYPE 0x1L'));
195
    $fh->Write(prc     (' FILESUBTYPE 0x0L'));
196
    $fh->Write(prc     ('BEGIN'));
197
    $fh->Write(prc     ('    BLOCK "StringFileInfo"'));
198
    $fh->Write(prc     ('    BEGIN'));
199
    $fh->Write(prc     ('        BLOCK "0c0904b0"'));
200
    $fh->Write(prc     ('        BEGIN'));
201
    $fh->Write(prc     ('            VALUE "Comments",         RC_STR_COMMENT'));
202
    $fh->Write(prc     ('            VALUE "CompanyName",      RC_STR_COMPANY'));
203
    $fh->Write(prc     ('            VALUE "FileDescription",  RC_STR_DESCRIPTION'));
204
    $fh->Write(prc     ('            VALUE "FileVersion",      RC_STR_VERSION'));
205
    $fh->Write(prc     ('            VALUE "InternalName",     RC_STR_NAME'));
206
    $fh->Write(prc     ('            VALUE "LegalCopyright",   RC_STR_COPYRIGHT'));
207
    $fh->Write(prc     ('            VALUE "LegalTrademarks",  RC_STR_EMPTY'));
208
    $fh->Write(prc     ('            VALUE "OriginalFilename", RC_STR_NAME'));
209
    $fh->Write(prc     ('            VALUE "PrivateBuild",     RC_STR_EMPTY'));
210
    $fh->Write(prc     ('            VALUE "ProductName",      RC_STR_PRODUCTNAME'));
211
    $fh->Write(prc     ('            VALUE "ProductVersion",   RC_STR_VERSION'));
212
    $fh->Write(prc     ('            VALUE "SpecialBuild",     RC_STR_SPECIAL'));
213
    $fh->Write(prc     ('        END'));
214
    $fh->Write(prc     ('    END'));
215
    $fh->Write(prc     ('        BLOCK "VarFileInfo"'));
216
    $fh->Write(prc     ('        BEGIN'));
217
    $fh->Write(prc     ('            VALUE "Translation", 0xc09, 1200'));
218
    $fh->Write(prc     ('        END'));
219
    $fh->Write(prc     ('END'));
220
    $fh->Write(prc     (''));
221
 
222
    $fh->Close();
223
 
224
}
225
 
226
#-------------------------------------------------------------------------------
227
# Function        : BuildVersionC
228
#
229
# Description     : Create a "C" style version.c and version.h file
230
#
231
# Inputs          : $Prefix         - Text to prefix generated variables with
232
#                                     Used to avoid namespace conflicts
233
#                   $Type           - Type of version to create
234
#                                     Only allowed value is 'array'
235
#
236
# Returns         :
237
#
238
 
239
sub BuildVersionC
240
{
241
    my( $Prefix, $Type ) = @_;
242
    my $ver;
243
 
244
    if ( $Clobber )                             # clobber mode ?
245
    {
246
        #
247
        #   Clobber common version.c and version.h
248
        #
249
        System( "$::GBE_BIN/rm -f $Srcdir/version.c $Srcdir/version.h" );
250
        return;
251
    }
252
 
253
    #
254
    #   Default prefix is none
255
    #   Set to a defined, bet empty, string
256
    #
257
    $Prefix = "" if ( ! defined( $Prefix ) );
258
    $Type   = "" if ( ! defined( $Type ) );
259
 
260
    #   src/version.c
261
    #..
262
    open( VERSIONC, ">$Srcdir/version.c" ) ||
263
        Error( "cannot create $Srcdir/version.c" );
264
 
265
    print VERSIONC
266
        "/* Please do not edit this file.\n" .
267
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
268
        " */\n" .
269
        "#include \"version.h\"\n";
270
 
271
    print VERSIONC
272
        "\n" .
273
        "static char what[] = \"@(#) $BUILDNAME $::CurrentDate ERG\";\n" .
274
        "\n";
275
 
276
 
277
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
278
    if ( $Type eq "array" )
279
    {                                           # new style
280
        print VERSIONC
281
           "static const char *pkgarray[] = \n" .
282
           "{\n";
283
 
284
        foreach $ver ( @PACKAGEVERS   ) {
285
            print VERSIONC "    \"$ver\",\n";
286
        }
287
 
288
        print VERSIONC
289
           "    0\n",
290
           "};\n\n";
291
 
292
        print VERSIONC
293
           "\nconst char *\n$Prefix"."VersionString(void)\n" .
294
           "{\n".
295
           "    return \"$BUILDNAME\";\n" .
296
           "}\n" .
297
           "\nconst char **\n$Prefix"."PkgStrings(void)\n" .
298
           "{\n".
299
           "    return pkgarray;\n" .
300
           "}\n" .
301
           "\nconst char *\n$Prefix"."GetModuleInfo(void)\n" .
302
           "{\n" .
303
           "    return \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\";\n" .
304
           "}\n";
305
    }
306
    else
307
    {                                           # old style
308
        print VERSIONC
309
           "\nconst char *\n$Prefix"."VersionString(void)\n" .
310
           "{\n".
311
           "    return \"$BUILDNAME @PACKAGEVERS\";\n" .
312
           "}\n" .
313
           "\nconst char *\n$Prefix"."GetModuleInfo(void)\n" .
314
           "{\n" .
315
           "    return \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\";\n" .
316
           "}\n";
317
    }
318
    close VERSIONC;
319
 
320
#   src/version.h
321
#..
322
    open( VERSIONH, ">$Srcdir/version.h" ) ||
323
        Error( "cannot create $Srcdir/version.h" );
324
 
325
    print VERSIONH
326
        "#ifndef VERSION_H_INCLUDED\n" .
327
        "#define VERSION_H_INCLUDED\n" .
328
        "/* Please do not edit this file.\n" .
329
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
330
        " */\n\n" .
331
        "#define BUILDNAME     \"$BUILDNAME\"\n" .
332
        "#define BUILDDATE     \"$::CurrentTime\"\n" .
333
        "\n";
334
 
335
    print VERSIONH
336
        "#ifdef __cplusplus\n" .
337
        "    extern \"C\" {           /* force C calling convention when using C++ */\n" .
338
        "#endif\n" .
339
        "\n";
340
 
341
    if ( $Type eq "array" )
342
    {                                           # extended interface
343
        print VERSIONH
344
        "extern const char **  $Prefix"."PkgStrings(void);\n";
345
    }
346
    print VERSIONH
347
        "extern const char *   $Prefix"."VersionString(void);\n".
348
        "extern const char *   $Prefix"."GetModuleInfo(void);\n";
349
 
350
    print VERSIONH
351
        "\n" .
352
        "#ifdef __cplusplus\n" .
353
        "    } /* extern \"C\" */\n" .
354
        "#endif\n" .
355
        "\n";
356
 
357
    print VERSIONH
358
        "\n#endif /*VERSION_H_INCLUDED*/\n";
359
    close VERSIONH;
360
}
361
 
362
#-------------------------------------------------------------------------------
363
# Function        : BuildVersionCdefs
364
#
365
# Description     : Generate a "C" style version definitions file
366
#                   This file simply contains definitions
367
#
368
# Inputs          : $Mode           - File suffix
369
#                   $ModePrefix     - Tag for all generated definitions
370
#
371
# Returns         :
372
#
373
 
374
sub BuildVersionCdefs
375
{
376
    my ( $Mode, $ModePrefix ) = @_;
377
    my $fname = "version_$Mode.h";
378
 
379
    if ( $Clobber )                             # clobber mode ?
380
    {
381
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
382
        return;
383
    }
384
 
385
    #
386
    #   Generate version_defs.h
387
    #   This file contains ONLY definitions. It may be used by assembler
388
    #   programs (that support a preprocessor) to access version information
389
    #
390
    #   Allow for a user supplied filename fragment that will be used within
391
    #   all the definitions with in the file.
392
    #
393
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
394
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
395
 
396
    #
397
    #   Base names on a user supplied value or a default
398
    #
399
    my $vtag = uc( "VERSION$ModePrefix" );
400
    my $guard_name = uc($fname);
401
       $guard_name =~ s~\.~_~g;
402
 
403
    open( VERSIOND, ">$Srcdir/$fname" ) ||
404
        Error( "cannot create $Srcdir/$fname" );
405
 
406
    print VERSIOND
407
        "#ifndef $guard_name\n" .
408
        "#define $guard_name\n" .
409
        "/* Please do not edit this file.\n" .
410
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
411
        " */\n\n" .
412
        "\n".
413
        "#define ${vtag}_BUILDNAME      \"$BUILDNAME\"\n".
414
        "#define ${vtag}_BUILDDATE      \"$::CurrentTime\"\n".
415
        "\n".
416
        "#define ${vtag}_PACKAGE        \"$BUILDNAME_PACKAGE\"\n".
417
        "#define ${vtag}_VERSION        \"$BUILDNAME_VERSION\"\n".
418
        "#define ${vtag}_MAJOR_STR      \"$major\"\n".
419
        "#define ${vtag}_MINOR_STR      \"$minor\"\n".
420
        "#define ${vtag}_PATCH_STR      \"$patch\"\n".
421
        "#define ${vtag}_BUILD_STR      \"$build\"\n".
422
        "#define ${vtag}_PATCHBUILD_STR \"$raw_patch\"\n".
423
        "#define ${vtag}_PROJECT        \"$BUILDNAME_PROJECT\"\n".
424
        "#define ${vtag}_MAJOR          " . strip_zeros($major) . "\n".
425
        "#define ${vtag}_MINOR          " . strip_zeros($minor) . "\n".
426
        "#define ${vtag}_PATCH          " . strip_zeros($patch) . "\n".
427
        "#define ${vtag}_BUILD          " . strip_zeros($build) . "\n".
428
        "#define ${vtag}_PATCHBUILD     " . strip_zeros($raw_patch) . "\n".
429
        "#define ${vtag}_ALL            \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\"\n".
430
        "#define ${vtag}_BUILDTIME      " . strip_zeros(time()) . "\n".
431
        "\n".
432
        "#endif /* $guard_name */\n";
433
 
434
    close VERSIOND;
435
}
436
 
437
#-------------------------------------------------------------------------------
229 dpurdie 438
# Function        : BuildVersionProperties
439
#
440
# Description     : Generate a "Java" style version definitions file
441
#                   This is a simple properties file
442
#
443
# Inputs          : $FileName       - Output filename (Optional)
444
#                   $Prefix         - Tag for all generated definitions
445
#
446
# Returns         :
447
#
448
sub BuildVersionProperties
449
{
450
    my ( $fname, $Prefix ) = @_;
451
 
452
    #
453
    #   Default name of the file
454
    #
455
    $fname = 'version.properties' unless $fname;
456
    if ( $Clobber )                             # clobber mode ?
457
    {
458
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
459
        return;
460
    }
461
 
462
    #
463
    #   Generate version properties file
464
    #
465
    #   This file contains ONLY definitions. It may be included by the ANT
466
    #   builds. Its not intended to be imported by the java code
467
 
468
 
469
    #
470
    #   Allow for a user supplied property prefix
471
    #   Not really needed as
472
    #
473
    my $vtag = '';
474
    $vtag = $Prefix . '.' if $Prefix;
475
 
476
 
477
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
478
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
479
 
480
    #
481
    #   Create properties in the same form as for "C" definitions
482
    #   Note:
483
    #       The 'ALL' is in a format used by other software. Do not change
484
    #
485
    open( VERSIOND, ">$Srcdir/$fname" ) ||
486
        Error( "cannot create $Srcdir/$fname" );
487
 
488
    print VERSIOND
489
        "# Please do not edit this file.\n" .
490
        "# It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
491
        "#\n" .
492
        "${vtag}BUILDNAME      = $BUILDNAME\n".
493
        "${vtag}BUILDDATE      = $::CurrentTime\n".
494
        "\n".
495
        "${vtag}PACKAGE        = $BUILDNAME_PACKAGE\n".
496
        "${vtag}VERSION        = $BUILDNAME_VERSION\n".
497
        "${vtag}MAJOR_STR      = $major\n".
498
        "${vtag}MINOR_STR      = $minor\n".
499
        "${vtag}PATCH_STR      = $patch\n".
500
        "${vtag}BUILD_STR      = $build\n".
501
        "${vtag}PATCHBUILD_STR = $raw_patch\n".
502
        "${vtag}PROJECT        = $BUILDNAME_PROJECT\n".
503
        "${vtag}MAJOR          = " . strip_zeros($major) . "\n".
504
        "${vtag}MINOR          = " . strip_zeros($minor) . "\n".
505
        "${vtag}PATCH          = " . strip_zeros($patch) . "\n".
506
        "${vtag}BUILD          = " . strip_zeros($build) . "\n".
507
        "${vtag}PATCHBUILD     = " . strip_zeros($raw_patch) . "\n".
508
        "${vtag}ALL            = $BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\n".
509
        "${vtag}BUILDTIME      = " . strip_zeros(time()) . "\n".
510
        "\n";
511
    #
512
    #   Create a set of definitions for each dependent package
513
    #
514
    print VERSIOND "# Dependent Packages and Versions\n".
515
                   "#\n";
516
 
517
    foreach my $tag ( PackageEntry::GetPackageList() )
518
    {
519
        my ($name, $version, $type) = PackageEntry::GetPackageData($tag);
520
#        push @attributes, "build=\"true\"" if $type =~ /Build/i;
521
        print VERSIOND "${vtag}PACKAGE.$name=$version\n";
522
    }
523
    close VERSIOND;
524
}
525
 
526
#-------------------------------------------------------------------------------
227 dpurdie 527
# Function        : stip_zeros
528
#
529
# Description     : Remove leading 0's from a string
530
#
531
# Inputs          : A string
532
#
533
# Returns         : A string without leading zeros
534
#
535
sub strip_zeros
536
{
537
    my ($text) = @_;
538
 
539
    $text =~ s~^0*~~;
540
    $text = '0' unless ( $text );
541
    return $text;
542
}
543
 
544
1;