Subversion Repositories DevTools

Rev

Rev 229 | Go to most recent revision | Details | 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
52
            );
53
 
54
#-------------------------------------------------------------------------------
55
# Function        : BuildVersionCSharp
56
#
57
# Description     : Generate a C# versionn information file to allow
58
#                   insertion of data into an assembly
59
#
60
# Inputs          : $FileName           - Output filename (Optional)
61
#
62
# Returns         :
63
#
64
sub BuildVersionCSharp
65
{
66
    my ( $fname ) = @_;
67
    $fname = 'AssemblyVersionInfo.cs' unless $fname;
68
 
69
    if ( $Clobber )                             # clobber mode ?
70
    {
71
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
72
        return;
73
    }
74
 
75
    #
76
    #   Determine the build version
77
    #
78
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
79
    my $vstring = "$major.$minor.$patch.$build";
80
 
81
 
82
    my $fh = ConfigurationFile::New( "$Srcdir/$fname", '--Type=CSharp' );
83
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
84
                       "CSharp Assembly Version Definition" );
85
 
86
    $fh->Write( "\n" );
87
    $fh->Write( "using System.Reflection;\n" );
88
    $fh->Write( "using System.Runtime.CompilerServices;\n" );
89
    $fh->Write( "\n" );
90
    $fh->Write( "[assembly: AssemblyCompany(\"ERG Group\")]\n" );
91
    $fh->Write( "[assembly: AssemblyProduct(\"$BUILDNAME_PACKAGE\")]\n" );
92
    $fh->Write( "[assembly: AssemblyCopyright(\"ERG Group $CurrentYear\")]\n" );
93
    $fh->Write( "[assembly: AssemblyTrademark(\"\")]\n" );
94
    $fh->Write( "\n");
95
    $fh->Comment( "\n");
96
    $fh->Comment( "Version information for an assembly consists of the following four values:\n");
97
    $fh->Comment( "\n");
98
    $fh->Comment( "     Major Version   -ERG:Major\n");
99
    $fh->Comment( "     Minor Version  - ERG:Minor\n");
100
    $fh->Comment( "     Build Number   - ERG:Patch\n");
101
    $fh->Comment( "     Revision       - ERG:Build Number\n");
102
    $fh->Comment( "\n");
103
    $fh->Write( "\n");
104
    $fh->Write( "[assembly: AssemblyVersion(\"$vstring\")]\n" );
105
    $fh->Write( "\n");
106
 
107
    $fh->Close();
108
}
109
 
110
#-------------------------------------------------------------------------------
111
# Function        : BuildVersionWinRC
112
#
113
# Description     : Create a Windows RC file to describe the build version
114
#                   This file may be used directly
115
#
116
# Inputs          : $FileName           - Output filename (Optional)
117
#
118
# Returns         :
119
#
120
sub BuildVersionWinRC
121
{
122
    my ( $fname ) = @_;
123
    $fname = 'version.rc' unless $fname;
124
 
125
    if ( $Clobber )                             # clobber mode ?
126
    {
127
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
128
        return;
129
    }
130
 
131
    #
132
    #   Determine the build version
133
    #
134
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
135
    my $product_version = "$major, $minor, $patch, $build";
136
 
137
 
138
    #
139
    #   Create the file
140
    #
141
    my $fh = ConfigurationFile::New( "$Srcdir/$fname", '--Type=C++' );
142
    $fh->HeaderSimple( "buildlib (Version $BuildVersion)",
143
                       "Windows Resource Version Definition" );
144
 
145
    sub prc
146
    {
147
        return "@_\n";
148
    }
149
 
150
    sub pdefs
151
    {
152
        my ($arg, $val) = @_;
153
        return "#define $arg \"$val\\0\"\n";
154
    }
155
 
156
    sub pdef
157
    {
158
        my ($arg, $val) = @_;
159
        return "#define $arg $val\n";
160
    }
161
 
162
    $fh->Write(prc     (""));
163
#    $fh->Write(prc     ("#include \"afxres.h\""));
164
#    $fh->Write(prc     (""));
165
    $fh->Write(prc     (""));
166
    $fh->Write(pdefs   ("RC_STR_EMPTY"         , "" ));
167
    $fh->Write(pdefs   ("RC_STR_COMPANY"       , "ERG Group" ));
168
    $fh->Write(pdefs   ("RC_STR_PRODUCTNAME"   , "ERG Group test" ));
169
    $fh->Write(pdefs   ("RC_STR_COMMENT"       , "Build Date: $CurrentTime" ));
170
    $fh->Write(pdefs   ("RC_STR_DESCRIPTION"   , "From: $BUILDNAME_PACKAGE" ));
171
    $fh->Write(pdefs   ("RC_STR_NAME"          , $BUILDNAME_PACKAGE ));
172
    $fh->Write(pdefs   ("RC_STR_VERSION"       , $product_version ));
173
    $fh->Write(pdef    ("RC_NUM_VERSION"       , $product_version ));
174
    $fh->Write(pdefs   ("RC_STR_COPYRIGHT"     , "Copyright ERG Group $CurrentYear" ));
175
    $fh->Write(prc     ('#ifdef _DEBUG'));
176
    $fh->Write(pdefs   ("RC_STR_SPECIAL"       , "Debug Version" ));
177
    $fh->Write(prc     ('#else'));
178
    $fh->Write(pdefs   ("RC_STR_SPECIAL"       , "Production Version" ));
179
    $fh->Write(prc     ('#endif'));
180
    $fh->Write(prc     (""));
181
 
182
    $fh->Write(prc     (''));
183
    $fh->Write(prc     ('VS_VERSION_INFO VERSIONINFO'));
184
    $fh->Write(prc     (' FILEVERSION      RC_NUM_VERSION'));
185
    $fh->Write(prc     (' PRODUCTVERSION   RC_NUM_VERSION'));
186
    $fh->Write(prc     (' FILEFLAGSMASK 0x3fL'));
187
    $fh->Write(prc     ('#ifdef _DEBUG'));
188
    $fh->Write(prc     (' FILEFLAGS 0x1L'));
189
    $fh->Write(prc     ('#else'));
190
    $fh->Write(prc     (' FILEFLAGS 0x0L'));
191
    $fh->Write(prc     ('#endif'));
192
    $fh->Write(prc     (' FILEOS 0x40004L'));
193
    $fh->Write(prc     (' FILETYPE 0x1L'));
194
    $fh->Write(prc     (' FILESUBTYPE 0x0L'));
195
    $fh->Write(prc     ('BEGIN'));
196
    $fh->Write(prc     ('    BLOCK "StringFileInfo"'));
197
    $fh->Write(prc     ('    BEGIN'));
198
    $fh->Write(prc     ('        BLOCK "0c0904b0"'));
199
    $fh->Write(prc     ('        BEGIN'));
200
    $fh->Write(prc     ('            VALUE "Comments",         RC_STR_COMMENT'));
201
    $fh->Write(prc     ('            VALUE "CompanyName",      RC_STR_COMPANY'));
202
    $fh->Write(prc     ('            VALUE "FileDescription",  RC_STR_DESCRIPTION'));
203
    $fh->Write(prc     ('            VALUE "FileVersion",      RC_STR_VERSION'));
204
    $fh->Write(prc     ('            VALUE "InternalName",     RC_STR_NAME'));
205
    $fh->Write(prc     ('            VALUE "LegalCopyright",   RC_STR_COPYRIGHT'));
206
    $fh->Write(prc     ('            VALUE "LegalTrademarks",  RC_STR_EMPTY'));
207
    $fh->Write(prc     ('            VALUE "OriginalFilename", RC_STR_NAME'));
208
    $fh->Write(prc     ('            VALUE "PrivateBuild",     RC_STR_EMPTY'));
209
    $fh->Write(prc     ('            VALUE "ProductName",      RC_STR_PRODUCTNAME'));
210
    $fh->Write(prc     ('            VALUE "ProductVersion",   RC_STR_VERSION'));
211
    $fh->Write(prc     ('            VALUE "SpecialBuild",     RC_STR_SPECIAL'));
212
    $fh->Write(prc     ('        END'));
213
    $fh->Write(prc     ('    END'));
214
    $fh->Write(prc     ('        BLOCK "VarFileInfo"'));
215
    $fh->Write(prc     ('        BEGIN'));
216
    $fh->Write(prc     ('            VALUE "Translation", 0xc09, 1200'));
217
    $fh->Write(prc     ('        END'));
218
    $fh->Write(prc     ('END'));
219
    $fh->Write(prc     (''));
220
 
221
    $fh->Close();
222
 
223
}
224
 
225
#-------------------------------------------------------------------------------
226
# Function        : BuildVersionC
227
#
228
# Description     : Create a "C" style version.c and version.h file
229
#
230
# Inputs          : $Prefix         - Text to prefix generated variables with
231
#                                     Used to avoid namespace conflicts
232
#                   $Type           - Type of version to create
233
#                                     Only allowed value is 'array'
234
#
235
# Returns         :
236
#
237
 
238
sub BuildVersionC
239
{
240
    my( $Prefix, $Type ) = @_;
241
    my $ver;
242
 
243
    if ( $Clobber )                             # clobber mode ?
244
    {
245
        #
246
        #   Clobber common version.c and version.h
247
        #
248
        System( "$::GBE_BIN/rm -f $Srcdir/version.c $Srcdir/version.h" );
249
        return;
250
    }
251
 
252
    #
253
    #   Default prefix is none
254
    #   Set to a defined, bet empty, string
255
    #
256
    $Prefix = "" if ( ! defined( $Prefix ) );
257
    $Type   = "" if ( ! defined( $Type ) );
258
 
259
    #   src/version.c
260
    #..
261
    open( VERSIONC, ">$Srcdir/version.c" ) ||
262
        Error( "cannot create $Srcdir/version.c" );
263
 
264
    print VERSIONC
265
        "/* Please do not edit this file.\n" .
266
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
267
        " */\n" .
268
        "#include \"version.h\"\n";
269
 
270
    print VERSIONC
271
        "\n" .
272
        "static char what[] = \"@(#) $BUILDNAME $::CurrentDate ERG\";\n" .
273
        "\n";
274
 
275
 
276
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
277
    if ( $Type eq "array" )
278
    {                                           # new style
279
        print VERSIONC
280
           "static const char *pkgarray[] = \n" .
281
           "{\n";
282
 
283
        foreach $ver ( @PACKAGEVERS   ) {
284
            print VERSIONC "    \"$ver\",\n";
285
        }
286
 
287
        print VERSIONC
288
           "    0\n",
289
           "};\n\n";
290
 
291
        print VERSIONC
292
           "\nconst char *\n$Prefix"."VersionString(void)\n" .
293
           "{\n".
294
           "    return \"$BUILDNAME\";\n" .
295
           "}\n" .
296
           "\nconst char **\n$Prefix"."PkgStrings(void)\n" .
297
           "{\n".
298
           "    return pkgarray;\n" .
299
           "}\n" .
300
           "\nconst char *\n$Prefix"."GetModuleInfo(void)\n" .
301
           "{\n" .
302
           "    return \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\";\n" .
303
           "}\n";
304
    }
305
    else
306
    {                                           # old style
307
        print VERSIONC
308
           "\nconst char *\n$Prefix"."VersionString(void)\n" .
309
           "{\n".
310
           "    return \"$BUILDNAME @PACKAGEVERS\";\n" .
311
           "}\n" .
312
           "\nconst char *\n$Prefix"."GetModuleInfo(void)\n" .
313
           "{\n" .
314
           "    return \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\";\n" .
315
           "}\n";
316
    }
317
    close VERSIONC;
318
 
319
#   src/version.h
320
#..
321
    open( VERSIONH, ">$Srcdir/version.h" ) ||
322
        Error( "cannot create $Srcdir/version.h" );
323
 
324
    print VERSIONH
325
        "#ifndef VERSION_H_INCLUDED\n" .
326
        "#define VERSION_H_INCLUDED\n" .
327
        "/* Please do not edit this file.\n" .
328
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
329
        " */\n\n" .
330
        "#define BUILDNAME     \"$BUILDNAME\"\n" .
331
        "#define BUILDDATE     \"$::CurrentTime\"\n" .
332
        "\n";
333
 
334
    print VERSIONH
335
        "#ifdef __cplusplus\n" .
336
        "    extern \"C\" {           /* force C calling convention when using C++ */\n" .
337
        "#endif\n" .
338
        "\n";
339
 
340
    if ( $Type eq "array" )
341
    {                                           # extended interface
342
        print VERSIONH
343
        "extern const char **  $Prefix"."PkgStrings(void);\n";
344
    }
345
    print VERSIONH
346
        "extern const char *   $Prefix"."VersionString(void);\n".
347
        "extern const char *   $Prefix"."GetModuleInfo(void);\n";
348
 
349
    print VERSIONH
350
        "\n" .
351
        "#ifdef __cplusplus\n" .
352
        "    } /* extern \"C\" */\n" .
353
        "#endif\n" .
354
        "\n";
355
 
356
    print VERSIONH
357
        "\n#endif /*VERSION_H_INCLUDED*/\n";
358
    close VERSIONH;
359
}
360
 
361
#-------------------------------------------------------------------------------
362
# Function        : BuildVersionCdefs
363
#
364
# Description     : Generate a "C" style version definitions file
365
#                   This file simply contains definitions
366
#
367
# Inputs          : $Mode           - File suffix
368
#                   $ModePrefix     - Tag for all generated definitions
369
#
370
# Returns         :
371
#
372
 
373
sub BuildVersionCdefs
374
{
375
    my ( $Mode, $ModePrefix ) = @_;
376
    my $fname = "version_$Mode.h";
377
 
378
    if ( $Clobber )                             # clobber mode ?
379
    {
380
        System( "$::GBE_BIN/rm -f $Srcdir/$fname" );
381
        return;
382
    }
383
 
384
    #
385
    #   Generate version_defs.h
386
    #   This file contains ONLY definitions. It may be used by assembler
387
    #   programs (that support a preprocessor) to access version information
388
    #
389
    #   Allow for a user supplied filename fragment that will be used within
390
    #   all the definitions with in the file.
391
    #
392
    my ($major, $minor, $patch, $build, $raw_patch) = SplitVersion($BUILDNAME_VERSION);
393
    my @PACKAGEVERS = PackageEntry::GetPackageVersionList();
394
 
395
    #
396
    #   Base names on a user supplied value or a default
397
    #
398
    my $vtag = uc( "VERSION$ModePrefix" );
399
    my $guard_name = uc($fname);
400
       $guard_name =~ s~\.~_~g;
401
 
402
    open( VERSIOND, ">$Srcdir/$fname" ) ||
403
        Error( "cannot create $Srcdir/$fname" );
404
 
405
    print VERSIOND
406
        "#ifndef $guard_name\n" .
407
        "#define $guard_name\n" .
408
        "/* Please do not edit this file.\n" .
409
        " * It was auto-generated by Buildlib ($BuildVersion) on $::CurrentTime\n" .
410
        " */\n\n" .
411
        "\n".
412
        "#define ${vtag}_BUILDNAME      \"$BUILDNAME\"\n".
413
        "#define ${vtag}_BUILDDATE      \"$::CurrentTime\"\n".
414
        "\n".
415
        "#define ${vtag}_PACKAGE        \"$BUILDNAME_PACKAGE\"\n".
416
        "#define ${vtag}_VERSION        \"$BUILDNAME_VERSION\"\n".
417
        "#define ${vtag}_MAJOR_STR      \"$major\"\n".
418
        "#define ${vtag}_MINOR_STR      \"$minor\"\n".
419
        "#define ${vtag}_PATCH_STR      \"$patch\"\n".
420
        "#define ${vtag}_BUILD_STR      \"$build\"\n".
421
        "#define ${vtag}_PATCHBUILD_STR \"$raw_patch\"\n".
422
        "#define ${vtag}_PROJECT        \"$BUILDNAME_PROJECT\"\n".
423
        "#define ${vtag}_MAJOR          " . strip_zeros($major) . "\n".
424
        "#define ${vtag}_MINOR          " . strip_zeros($minor) . "\n".
425
        "#define ${vtag}_PATCH          " . strip_zeros($patch) . "\n".
426
        "#define ${vtag}_BUILD          " . strip_zeros($build) . "\n".
427
        "#define ${vtag}_PATCHBUILD     " . strip_zeros($raw_patch) . "\n".
428
        "#define ${vtag}_ALL            \"$BUILDNAME_PACKAGE ($BUILDNAME_VERSION.$BUILDNAME_PROJECT) @PACKAGEVERS\"\n".
429
        "#define ${vtag}_BUILDTIME      " . strip_zeros(time()) . "\n".
430
        "\n".
431
        "#endif /* $guard_name */\n";
432
 
433
    close VERSIOND;
434
}
435
 
436
#-------------------------------------------------------------------------------
437
# Function        : stip_zeros
438
#
439
# Description     : Remove leading 0's from a string
440
#
441
# Inputs          : A string
442
#
443
# Returns         : A string without leading zeros
444
#
445
sub strip_zeros
446
{
447
    my ($text) = @_;
448
 
449
    $text =~ s~^0*~~;
450
    $text = '0' unless ( $text );
451
    return $text;
452
}
453
 
454
1;