Subversion Repositories DevTools

Rev

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) 1998-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:
11
#       This is a wrapper script to simplify access to the jats
12
#       build system
13
#
14
# Usage:        jats build | make | install | help | ...
15
#
229 dpurdie 16
# Package: PACKAGE_TAG
17
# Version: VERSION_TAG
227 dpurdie 18
#......................................................................#
19
 
261 dpurdie 20
require 5.008_002;
227 dpurdie 21
use strict;
22
use warnings;
23
 
24
use Cwd;
25
use File::Copy;
26
use Getopt::Long qw(:config require_order);     # Stop on non-option
27
use Pod::Usage;                                 # For help support
28
use FindBin;                                    # Determine the current directory
29
use lib "$FindBin::Bin/LIB";                    # Allow JATS libraries
30
use Config;
31
use Sys::Hostname;                              # For hostname
32
 
33
use JatsError;                                  # Common error reporting
34
use DescPkg;                                    # Package Descriptor processing
35
use JatsSystem;                                 # System call interface
245 dpurdie 36
use JatsBuildFiles;                             # Parse Build Files
227 dpurdie 37
 
229 dpurdie 38
my $GBE_VERSION = "VERSION_TAG";                # Will be re-written when released
245 dpurdie 39
my $GBE_NOT_RELEASED = "RELEASE_TAG";           # Will be re-written when released
227 dpurdie 40
my $opr_done;
41
my $opt_here = 0;
42
my $BUILD_FILE      = "build.pl";
43
my @BUILD_FILE_ALT  = qw(auto.pl build_test.pl);
44
my $BUILD_FILE_SET;
45
my $RESULT = 0;
46
my $PSPLIT = ':';                               # Win/Unix path splitter
47
my $TIMER = time;
48
my $opt_time = 0;
49
my $opt_help = 0;
50
my $opt_locate = 0;
51
my $opt_locate_file;
245 dpurdie 52
my $opt_locate_package;
227 dpurdie 53
my $opt_dir;
54
my $opt_java;
277 dpurdie 55
my $opt_export_vars = 1;
227 dpurdie 56
my $result;
57
 
58
#
59
#   Grab a copy of ALL the environment variable that will be used
60
#   This will simplify the script a great deal
61
#
62
 
279 dpurdie 63
our $GBE_JATS_VERSION   = $ENV{'GBE_JATS_VERSION'}   || '';
227 dpurdie 64
our $GBE_JATS_SANE      = $ENV{'GBE_JATS_SANE'}      || 0;
279 dpurdie 65
our $GBE_CORE           = $ENV{'GBE_CORE'}           || '';
66
our $GBE_BIN            = $ENV{'GBE_BIN'}            || '';
67
our $GBE_CONFIG         = $ENV{'GBE_CONFIG'}         || '';
68
our $GBE_DPLY           = $ENV{'GBE_DPLY'}           || '';
69
our $GBE_DPKG           = $ENV{'GBE_DPKG'}           || '';
70
our $GBE_DPKG_STORE     = $ENV{'GBE_DPKG_STORE'}     || '';
71
our $GBE_DPKG_LOCAL     = $ENV{'GBE_DPKG_LOCAL'}     || '';
72
our $GBE_DPKG_CACHE     = $ENV{'GBE_DPKG_CACHE'}     || '';
73
our $GBE_DPKG_SBOX      = $ENV{'GBE_DPKG_SBOX'}      || '';
74
our $GBE_SANDBOX        = $ENV{'GBE_SANDBOX'}        || '';
75
our $GBE_PERL           = $ENV{'GBE_PERL'}           || '';
76
our $GBE_TOOLS          = $ENV{'GBE_TOOLS'}          || '';
77
our $GBE_MACHTYPE       = $ENV{'GBE_MACHTYPE'}       || '';
273 dpurdie 78
our $GBE_HOSTMACH       = $ENV{'GBE_HOSTMACH'}       || $GBE_MACHTYPE;
279 dpurdie 79
our $GBE_PLATFORM       = $ENV{'GBE_PLATFORM'}       || '';
80
our $GBE_BUILDFILTER    = $ENV{'GBE_BUILDFILTER'}    || '';
227 dpurdie 81
our $GBE_DEBUG          = $ENV{'GBE_DEBUG'}          || 0;
82
our $GBE_VERBOSE        = $ENV{'GBE_VERBOSE'}        || 0;
279 dpurdie 83
our $GBE_DRV            = $ENV{'GBE_DRV'}            || '';
84
our $GBE_HOSTNAME       = $ENV{'GBE_HOSTNAME'}       || hostname || '';
85
our $USER               = $ENV{'USER'}               || '';
86
our $PERL5LIB           = $ENV{'PERL5LIB'}           || '';
87
our $JAVA_HOME          = $ENV{'JAVA_HOME'}          || '';
88
our $GBE_ABT            = $ENV{'GBE_ABT'}            || '';
227 dpurdie 89
our $GBE_UNIX           = 1;
90
our $CWD;
91
 
92
#-------------------------------------------------------------------------------
93
#   Clean up some environment variables
245 dpurdie 94
#       GBE_BUILDFILTER - may be space or comma separated list
95
#       GBE_PLATFORM - may be space or comma separated list
96
#       GBE_ABT - may be space or comma separated list
279 dpurdie 97
#       GBE_HOSTNAME - No whitespace
227 dpurdie 98
#
99
$GBE_BUILDFILTER = join (' ', split( /[,\s]+/, $GBE_BUILDFILTER));
100
$GBE_PLATFORM    = join (' ', split( /[,\s]+/, $GBE_PLATFORM));
101
$GBE_ABT         = join (' ', split( /[,\s]+/, $GBE_ABT));
279 dpurdie 102
$GBE_HOSTNAME    =~ s~\s+~~g;
227 dpurdie 103
 
104
#-------------------------------------------------------------------------------
105
#   Parse the user options
106
#   GetOptions has been configured so that it will stop parsing on the first
107
#   non-options. This allows the command syntax to the script to have options
108
#   that are directed to this script before the command keyword, and command
109
#   options to the subcommand to be after the keyword.
110
#
111
$result = GetOptions (
261 dpurdie 112
            "help|h:+"          => \$opt_help,
113
            "manual:3"          => \$opt_help,
114
            "verbose|v:+"       => \$GBE_VERBOSE,
115
            "debug:+"           => \$GBE_DEBUG,
227 dpurdie 116
            "cd|changedir=s"    => \$opt_dir,
117
            "locate"            => \$opt_locate,
118
            "locatefile=s"      => \$opt_locate_file,
245 dpurdie 119
            "locatepkg=s"       => \$opt_locate_package,
227 dpurdie 120
            "here"              => \$opt_here,
121
            "time"              => \$opt_time,
122
            "b|buildfile=s"     => \&opts_buildfile,
245 dpurdie 123
            "java=s"            => \$opt_java,
227 dpurdie 124
            "version=s",        => \&opts_version,
125
            "platform:s",       => sub{ opts_extend( \$GBE_PLATFORM, @_ )},
126
            "buildfilter:s"     => sub{ opts_extend( \$GBE_BUILDFILTER, @_ )},
127
            "abt:s"             => sub{ opts_extend( \$GBE_ABT, @_ )},
277 dpurdie 128
            "exportvars!"       => \$opt_export_vars,
227 dpurdie 129
            );
130
 
131
#
132
#   Configure the error reporting process now that we have the user options
133
#
134
ErrorConfig( 'name'    => 'JATS',
135
             'debug'   => $GBE_DEBUG,
136
             'verbose' => $GBE_VERBOSE );
137
#
138
#   Post process some of the options
139
#
140
Error ("Options not parsed. Use -help for help") unless $result;
263 dpurdie 141
Verbose3 ('ARGS', @ARGV);
227 dpurdie 142
 
143
#
144
#   Option Helper Routine
145
#   Save alternate buildfile. Flag that it has been set
146
#
147
sub opts_buildfile
148
{
283 dpurdie 149
    my ($junk, $bf) = @_;
150
    $BUILD_FILE = $bf;
227 dpurdie 151
    $BUILD_FILE_SET = 1;
152
    Verbose ("Use alternate buildfile: $BUILD_FILE");
283 dpurdie 153
    return;
227 dpurdie 154
}
155
 
156
#
157
#   Options Helper Routine
158
#   Collect a space/comma delimited list and replace/append to string
159
#   Allows the string to be reset
160
#   Use of a +" will append to existing value
161
#
162
#       arg1 - Ref to string to store data
163
#       arg2 - Option name
164
#       arg3 - Option value
165
#
166
sub opts_extend
167
{
168
    my( $ref, $name, $value) = @_;
169
    if ( $value )
170
    {
171
        $value =~ s/,/ /g;
172
        $value = ${$ref} . ' ' . $value
173
            if ( $value =~ s/\+/ /g );
174
        $value =~ s/^\s+//;
175
        $value =~ s/\s+/ /;
176
    }
177
    ${$ref} = $value;
283 dpurdie 178
    return;
227 dpurdie 179
}
180
 
181
#
182
#   Options Helper routine
183
#   Collect --version=version, then stop processing of the command line
184
#   This will simulate a '--'
185
#
186
sub opts_version
187
{
283 dpurdie 188
    my ($junk, $vn) = @_;
189
    $GBE_JATS_VERSION = $vn;
190
    die("!FINISH\n");
227 dpurdie 191
}
192
 
193
################################################################################
194
#
195
#   Ensure that essential environment variables are present and that they
196
#   do not contain spaces.
197
#
198
ReportError('Set env-var GBE_PERL (typically "/usr/bin/perl")')   unless ( $GBE_PERL );
229 dpurdie 199
ReportError('Set env-var GBE_DPKG (typically "/devl/dpkg_archive")') unless ( $GBE_DPKG );
200
ReportError('Set env-var GBE_CORE (typically "/devl/dpkg_archive/PACKAGE_TAG/VERSION_TAG")')  unless ( $GBE_CORE );
279 dpurdie 201
ReportError('Hostname cannot be determined') unless ( $GBE_HOSTNAME );
227 dpurdie 202
 
229 dpurdie 203
################################################################################
204
#
205
#   Warn if using a version of perl that is newer than expected
206
#   The 'require' does a lower limit test
207
#
283 dpurdie 208
if ( ! $GBE_JATS_SANE )
209
{
210
    Warning ("Perl Version may not be compatible",
211
             "Jats has been tested with: 5.8.8",
212
             "This version is: $]",
213
            ) if ( $] > 5.010000 );
227 dpurdie 214
 
283 dpurdie 215
    Warning ("The PDK, as used by some deployed packages does not work with this version of perl.",
216
             "ERG only has a licence for PDK V5 and this only works with Perl 5.6 and 5.8",
217
             "This version is: $]",
218
            ) if ( $] > 5.009000 );
219
}
229 dpurdie 220
 
221
#
222
#   Warn if this is not an active state release
223
#
224
#   Would be nice, but I can't figure out how to do it - yet
225
#   The following does not work on all platforms
226
#
227
#unless ( $ActivePerl::VERSION )
228
#{
229
#    Warning ("Perl does not appear to be an ActiveState Release", "Jats may not function as expected");
230
#}
231
#else
232
#{
233
#    Verbose ("ActiveState Version: $ActivePerl::VERSION");
234
#}
235
 
227 dpurdie 236
################################################################################
229 dpurdie 237
#
245 dpurdie 238
#   Warn if this version of JATS is not correctly versioned
229 dpurdie 239
#   Users should be using correctly versioned copies of JATS. These come
240
#   from dpkg_archive.
241
#
231 dpurdie 242
Warning ("*** Unofficial version of JATS ***")
243 dpurdie 243
    if ( ! $GBE_JATS_SANE && $GBE_NOT_RELEASED );
229 dpurdie 244
 
245
################################################################################
227 dpurdie 246
#   If running with cygwin then warn if the CYGWIN environment variable
247
#   contains "tty". tty mode causes some strange behaviour such as:
248
#       1) Non flushing of perl scripts under some conditions (eg:create_dpkg)
249
#
250
if ( $ENV{'CYGWIN'} && $ENV{'CYGWIN'} =~ m/tty/ )
251
{
252
    Warning ("The CYGWIN variable contains \"tty\".",
253
             "This can cause strange behaviour with interactive scripts");
254
}
255
 
256
#
257
#   Remove CDPATH - this breaks things when cygwin is running
258
#   even if we are not running under cygwin perl
259
#
260
delete $ENV{'CDPATH'};
261
 
262
 
263
################################################################################
264
#   Sanitize GBE_CORE and others for internal Perl use
265
#   It may contain \ to be added to PATH but within perl is needs /
266
#
267
$PERL5LIB =~ tr~\\/~/~s;
268
 
269
TestDirectoryConfig( 'GBE_CORE' );
270
TestDirectoryConfig( 'GBE_BIN' );
271
TestDirectoryConfig( 'GBE_PERL' );
272
TestDirectoryConfig( 'GBE_DPLY' );
273
TestDirectoryConfig( 'GBE_DPKG' );
274
TestDirectoryConfig( 'GBE_DPKG_CACHE' );
275
TestDirectoryConfig( 'GBE_DPKG_LOCAL' );
276
TestDirectoryConfig( 'GBE_DPKG_STORE' );
277
TestDirectoryConfig( 'GBE_DPKG_SBOX' );
278
TestDirectoryConfig( 'GBE_SANDBOX' );
279
 
280
################################################################################
281
#   Setup the Machine Type
282
#
283
#   GBE_MACHTYPE is used to determine the BIN directory from which JATS will
284
#   pull local binary executables from. The directory must exist.
285
#
286
#   We need GBE_MACHTYPE to be correctly defined by the user
287
#   This is machine specific and should be done in jats.sh/jats.bat
288
#
289
unless ( $GBE_MACHTYPE )
290
{
291
    $GBE_MACHTYPE = 'win32' if ( $^O eq "cygwin" );
292
    $GBE_MACHTYPE = 'win32' if ( $^O eq "MSWin32" );
293
    $GBE_MACHTYPE = 'win32' if ( $^O eq "win95" );
294
    Verbose ("Setting GBE_MACHTYPE: $GBE_MACHTYPE") ;
295
}
296
 
297
ReportError ('Set env-var GBE_MACHTYPE (typically "win32")') unless ( $GBE_MACHTYPE );
298
ErrorDoExit();
299
 
300
if ( $GBE_MACHTYPE eq 'win32' )
301
{
302
    $PSPLIT = ';';
303
    $GBE_UNIX = 0;
304
}
305
 
306
################################################################################
307
#   Windows: If the user is running JATS from within the development view
308
#   then they may not provide a drive letter in the full name of GBE_CORE
309
#   For correct operation GBE_CORE needs to be able to run programs and
310
#   scripts from any other drive
311
#
312
#   If GBE_CORE does not have a driver letter - then add one
313
#   Note: Use the CWD before any CD operations
314
#
315
if ( $GBE_MACHTYPE eq 'win32'  && $GBE_CORE !~ m/^\w\:/ )
316
{
317
        my $cwd = getcwd();
318
        $GBE_CORE = substr( $cwd, 0, 2 ) . '/' . $GBE_CORE;
319
        $GBE_CORE =~ s~//~/~g;
320
        Verbose2 ("Setting GBE_CORE drive: $GBE_CORE");
321
}
322
 
323
################################################################################
324
#   Attempt to run JATS from a local cache
325
#   This mechanism allows JATS to be a link to a desired version on a network
326
#   drive, but to have the version transferred locally if required
327
#
229 dpurdie 328
#   The transfer/check is only done on the first invocation of jats. If jats uses
245 dpurdie 329
#   jats to perform functions, then it will not be performed.
229 dpurdie 330
#
245 dpurdie 331
#   If we want to run an alternate version of JATS, then don't attempt to
229 dpurdie 332
#   cache the initial version of JATS.
333
#
227 dpurdie 334
if ( $ENV{GBE_CACHE_JATS} && ! $GBE_JATS_SANE && ! $GBE_JATS_VERSION)
335
{
336
    my $state = "Not Cached: Not running from dpkg_archive";
337
    #
338
    #   Must have the DPKG_ARCHIVE cache
229 dpurdie 339
    #   Must be running from DPKG_ARCHIVE - prevent messing with local copies
227 dpurdie 340
    #
341
    if ( $GBE_DPKG_CACHE )
342
    {
229 dpurdie 343
        #
344
        #   JATS must be running from an archive, otherwise we assume that its
345
        #   a local copy. Detected by:
346
        #       GBE_NOT_RELEASED being set
347
        #       Lack of descpkg file
348
        #
349
        if ( ! $GBE_NOT_RELEASED  && -f "$GBE_CORE/descpkg" )
227 dpurdie 350
        {
229 dpurdie 351
            my ($archive, $package) = LocateJatsVersion( $GBE_VERSION );
352
            if ( $archive )
353
            {
354
                Verbose ("Update cached version of JATS: $GBE_VERSION");
355
                #
356
                #   Attempt to cache the package
357
                #   Need enough JATS environment to run the cache_dpkg utility
358
                #
283 dpurdie 359
                {
360
                    local %ENV = %ENV;
227 dpurdie 361
 
283 dpurdie 362
                    $ENV{GBE_TOOLS} = "$GBE_CORE/TOOLS";
363
                    $ENV{PERL5LIB} = "$GBE_CORE/TOOLS/LIB" ;
364
                    $ENV{GBE_BIN}  = "$GBE_CORE/BIN.$GBE_MACHTYPE";
365
                    $ENV{GBE_VERBOSE}  = $GBE_VERBOSE;
227 dpurdie 366
 
283 dpurdie 367
                    etool ( 'cache_dpkg.pl', $package );
368
                }
227 dpurdie 369
 
229 dpurdie 370
                my $tgt = "$GBE_DPKG_CACHE/$package";
371
                if ( -d $tgt )
372
                {
373
                    Verbose ("Using cached version of JATS: $GBE_VERSION");
374
                    $GBE_CORE = $tgt;
375
                    $state = "Cached";
376
                }
377
                else
378
                {
379
                    $state = "Not Cached: Copy Failure";
380
                }
227 dpurdie 381
            }
382
            else
383
            {
229 dpurdie 384
                $state = "Not Cached: Not found in archives";
227 dpurdie 385
            }
386
        }
387
    }
388
    else
389
    {
390
        $state = "Not Cached: No GBE_DPKG_CACHE";
391
    }
392
 
393
    #
394
    #   Flag JATS having been cached on the machine
395
    #
396
    $ENV{GBE_CACHE_JATS} = $state;
397
}
398
 
399
 
400
################################################################################
401
#   Establish a relationship between GBE_BIN, GBE_TOOLS and GBE_CONFIG
402
#   unless the user has already provided one.
403
#
404
#   Only NEED GBE_CORE - the others will be derived
405
#
406
unless ( $GBE_BIN )
407
{
408
    $GBE_BIN = "$GBE_CORE/BIN.$GBE_MACHTYPE";
409
    Verbose2 ("Setting GBE_BIN: $GBE_BIN");
410
}
411
ReportError ('GBE_MACHTYPE is not valid.',
412
             'There must be a corresponding BIN directory in GBE_CORE',
413
             "GBE_BIN     : $GBE_BIN",
414
             "GBE_MACHTYPE: $GBE_MACHTYPE"
415
             ) unless ( -d $GBE_BIN );
416
 
417
ReportError ('Machine specific binary directory does not appear to setup',
418
             'After JATS is installed the PostInstall script must be run',
419
             "GBE_BIN     : $GBE_BIN"
420
             ) unless ( -x $GBE_BIN . '/sh' || -x $GBE_BIN . '/sh.exe'  );
421
 
422
unless ( $GBE_TOOLS )
423
{
424
    $GBE_TOOLS = "$GBE_CORE/TOOLS";
425
    Verbose2 ("Setting GBE_TOOLS: $GBE_TOOLS");
426
}
427
 
428
unless ( $GBE_CONFIG )
429
{
430
    $GBE_CONFIG = "$GBE_CORE/CFG";
431
    Verbose2 ("Setting GBE_CONFIG: $GBE_CONFIG");
432
}
433
 
434
#
435
#   Extend the PERL5 with our own Module Repository
436
#
437
$PERL5LIB = join( $PSPLIT, split( $PSPLIT, $PERL5LIB), "$GBE_CORE/TOOLS/LIB" );
438
 
439
 
440
################################################################################
441
#   Sanity Test
442
#   The ABT environment requires several parameters to specify the location
443
#   of the Release/Deployment Managers
444
#
445
#   GBE_DM_LOCATION will be set GBE_RM_LOCATION, if not set
446
#
447
#   Only perform the test:
448
#       - On the first invocation of JATS, not nested invocations
449
#       - Based on the EnvVar, not the user option. This will allow a user
450
#         to invoke ABT without the need for these values to be present
451
#
452
if ( ! $GBE_JATS_SANE && $ENV{GBE_RM_LOCATION} && ! $ENV{GBE_DM_LOCATION} )
453
{
454
    $ENV{GBE_DM_LOCATION} = $ENV{GBE_RM_LOCATION};
455
}
456
 
457
if ( ! $GBE_JATS_SANE && $ENV{GBE_ABT} )
458
{
459
    foreach my $var ( qw(GBE_DM_LOCATION GBE_DM_USERNAME GBE_DM_PASSWORD GBE_RM_URL))
460
    {
461
        Warning("Deployment Manager EnvVar may need to be defined: $var") unless ( $ENV{$var} );
462
    }
463
 
464
    foreach my $var ( qw(GBE_RM_LOCATION GBE_RM_USERNAME GBE_RM_PASSWORD GBE_DM_URL))
465
    {
466
        ReportError("Release Manager EnvVar needs to be defined: $var") unless ( $ENV{$var} );
467
    }
468
}
469
 
470
################################################################################
471
#
472
#   Change to the required root directory
473
#       The user may specify a start directory( -c )
474
#
475
change_dir ( $opt_dir );
245 dpurdie 476
 
477
 
478
################################################################################
479
#   Locate the root of the build - if required
480
#   This is used by the autobuild tools to:
481
#       1) Locate the build.pl file for JATS based builds
482
#          The name of the target package can be provided to resolve
483
#          cases of multiple build files.
484
#
485
#       2) Locate the <ProjectName>depends.xml file for ANT based builds
486
#          The name of the buildfile will be specified
487
#          There must be only one file of this name in the tree
488
#
489
#   Note: If only one build file is found, then it will be used
490
#         It will not be sanity tested. This is intentional
491
#         for backward compatability.
492
#
493
if ( $opt_locate || $opt_locate_file || $opt_locate_package )
227 dpurdie 494
{
245 dpurdie 495
    #
496
    #   Allow the user to specify the name of the build file
497
    #   This will be used in ANT builds as the name changes
498
    #   but it can be predetermined
499
    #
227 dpurdie 500
    $opt_locate_file = $BUILD_FILE unless ( $opt_locate_file );
501
 
245 dpurdie 502
    #
503
    #   Create a Build File Scanner object
504
    #   This will be used to locate a suitable build file
505
    #
227 dpurdie 506
    Verbose ("Autolocate the build file: $opt_locate_file");
507
 
245 dpurdie 508
    my $bscanner = BuildFileScanner ( '.', $opt_locate_file );
509
    my $count = $bscanner->locate();
510
 
511
    Error ("Autolocate. Build file not found: $opt_locate_file" )
512
        if ( $count <= 0 );
513
 
227 dpurdie 514
    #
245 dpurdie 515
    #   If multiple build files have been found
516
    #   If $opt_locate_package is set then we can attempt to resolve the package
227 dpurdie 517
    #
245 dpurdie 518
    #   Scan the buildfiles and determine the names of the packages that will
519
    #   be built. This can be used to generate nice error messages
520
    if ( $count > 1 )
521
    {
522
        $bscanner->scan();
523
        $count = $bscanner->match( $opt_locate_package );
524
#DebugDumpData ("Bscan", \$bscanner );
227 dpurdie 525
 
245 dpurdie 526
        my $errmess;
527
        unless ( $opt_locate_package ) {
528
            $errmess = "Use -locatepkg=pkg to resolve required package";
529
 
530
        } elsif ( $count <= 0 ) {
531
            $errmess = "None found that build package: $opt_locate_package";
532
 
533
        } elsif ( $count > 1 ) {
534
            $errmess = "Multiple build files build the required package: $opt_locate_package";
535
        }
536
 
537
        #
538
        #   Pretty error display
539
        #   Display build directory and the package name (mangled)
540
        #
541
        if ( $errmess )
542
        {
543
            Error ("Autolocate. Multiple build files found.",
544
                   $errmess,
545
                   "Build files found in:", $bscanner->formatData() );
546
        }
547
    }
548
 
227 dpurdie 549
    #
245 dpurdie 550
    #   Extract the required build file directory
227 dpurdie 551
    #
245 dpurdie 552
    my $dir = $bscanner->getMatchDir() || '';
553
    Verbose ("Autolocate. Found $count build files: $dir");
227 dpurdie 554
 
555
    #
556
    #   Select the one true build directory
557
    #
245 dpurdie 558
    change_dir ( $dir );
227 dpurdie 559
 
560
    #
561
    #   Kill location scan as we have already located the build file
562
    #
563
    $opt_here = 1;
564
}
565
 
566
################################################################################
567
#   Version redirection
568
#   JATS allows the version of JATS to be used to be specified
569
#   This mechanism operates on the assumption that the required version is
570
#   present in dpkg_archive. If a specific version is required then the bulk
571
#   of this script is bypassed and the arguments passed directly to the required
572
#   target
573
#
574
if ( $GBE_JATS_VERSION && $GBE_JATS_VERSION eq $GBE_VERSION )
575
{
576
    Message("Using current JATS version: $GBE_JATS_VERSION" );
577
    $GBE_JATS_VERSION = undef;
578
}
579
 
580
if ( $GBE_JATS_VERSION )
581
{
582
    #
583
    #   Report any errors detected
584
    #
585
    ErrorDoExit();
586
    Message("Using JATS version: $GBE_JATS_VERSION");
587
 
588
    #
245 dpurdie 589
    #   If we have a cache available, then attempt to transfer the required
590
    #   version into the cache. If we don't have a cache, then don't even try.
229 dpurdie 591
    #
245 dpurdie 592
    if ( $GBE_DPKG_CACHE )
593
    {
594
        #
595
        #   Attempt to locate the desired version in one of the well known
596
        #   package archives. This will give us its package name.
597
        #
598
        my ($archive, $package) = LocateJatsVersion ($GBE_JATS_VERSION);
599
        Error("Cannot find JATS version: $GBE_JATS_VERSION") unless $archive;
229 dpurdie 600
 
245 dpurdie 601
        #
602
        #   Do NOT propagate GBE_JATS_VERSION in the environment
603
        #   This will only cause problem in recursion
604
        #
605
        delete $ENV{GBE_JATS_VERSION};
227 dpurdie 606
 
245 dpurdie 607
        #
608
        #   Attempt to cache the package
609
        #   Need enough JATS environment to run the utility
610
        #
283 dpurdie 611
        {
612
            local %ENV = %ENV;
227 dpurdie 613
 
283 dpurdie 614
            $ENV{PERL5LIB} = $PERL5LIB;
615
            $ENV{GBE_BIN}  = $GBE_BIN;
616
            $ENV{GBE_VERBOSE}  = $GBE_VERBOSE;
617
            $ENV{GBE_TOOLS}  = $GBE_TOOLS;
227 dpurdie 618
 
283 dpurdie 619
            etool ( 'cache_dpkg.pl', $package );
620
        }
245 dpurdie 621
    }
227 dpurdie 622
 
623
    #
229 dpurdie 624
    #   Locate the version of JATS to be run (again)
227 dpurdie 625
    #   It should be in the cache, but it may not be
626
    #
245 dpurdie 627
    my ($archive, $package) = LocateJatsVersion ($GBE_JATS_VERSION);
229 dpurdie 628
    Error("Cannot find JATS version: $GBE_JATS_VERSION") unless $archive;
629
 
630
    $GBE_CORE = "$archive/$package";
227 dpurdie 631
    Verbose2 ("Using alternate version: $GBE_CORE");
632
 
633
    #
634
    #   Run the specified version of JATS
635
    #   Force the required version of GBE_CORE and invoke the wrapper script
636
    #
637
    $ENV{GBE_CORE} = $GBE_CORE;
638
 
639
    Verbose("Use ARGV: @ARGV");
640
    $RESULT = System ($GBE_PERL, "$GBE_CORE/TOOLS/jats.pl", @ARGV );
641
    do_exit();
642
}
643
 
644
################################################################################
645
#   Determine the current directory
646
#   Note: Don't use `pwd`. This sucks for so many reasons including
647
#         the fact that it may not be available until this wrapper
648
#         script has done it job.
649
#
650
$CWD = getcwd();
651
Verbose ("Current Working Directory: $CWD");
652
Warning ("Current working directory contains spaces") if ( $CWD =~ m/\s/ );
653
 
654
 
655
################################################################################
656
#   Setup drive
657
#   This is only required under windows
658
#   Purpose is unclear, but under windows it is required, so lets create one
659
#   if its not present
660
#
661
unless ( $GBE_UNIX )
662
{
663
    unless ( $GBE_DRV )
664
    {
665
        ($GBE_DRV = $CWD ) =~ s~[^:]*$~~;
666
        $GBE_DRV = "c:" if ( $GBE_DRV !~ m/:/ );
667
        Verbose2( "Setting GBE_DRV: $GBE_DRV" );
668
    }
669
}
670
 
671
################################################################################
672
#   Sanity test the main archive variable
673
#   This MUST address one archive
674
#
675
 
676
Error ("GBE_DPKG must not be a path list: $GBE_DPKG")
677
    if ( $GBE_DPKG =~ /$PSPLIT/ );
678
Error ("GBE_DPKG is not a directory : $GBE_DPKG")
679
    unless( -d $GBE_DPKG );
680
 
681
################################################################################
682
#   Sanity test the cache
683
#
684
Error ("GBE_DPKG_CACHE is not a directory : $GBE_DPKG_CACHE")
685
    if ( $GBE_DPKG_CACHE && ! -d $GBE_DPKG_CACHE );
686
 
687
################################################################################
688
#   Sanity test the global store
689
#
690
Error ("GBE_DPKG_STORE is not a directory : $GBE_DPKG_STORE")
691
    if ( $GBE_DPKG_STORE && ! -d $GBE_DPKG_STORE );
692
 
693
Error ("GBE_DPLY is not a directory : $GBE_DPLY")
694
    if ( $GBE_DPLY && ! -d $GBE_DPLY );
695
 
696
########################################################################
697
#
698
#       Locate a local_dpkg_archive directory, by searching from the CWD
699
#       to the root of the file system
700
#
701
unless ( $GBE_DPKG_LOCAL )
702
{
283 dpurdie 703
    ($GBE_DPKG_LOCAL) = scan_for_dir ('local_dpkg_archive');
227 dpurdie 704
}
705
else
706
{
707
    Error ("GBE_DPKG_LOCAL is not a directory : $GBE_DPKG_LOCAL")
708
        unless( -d $GBE_DPKG_LOCAL );
709
}
710
 
711
########################################################################
712
#
713
#       Locate a sandbox_dpkg_archive directory by searching from the CWD
714
#       to the root of the file system
715
#
241 dpurdie 716
#       sandbox_dpkg_archive is a dpkg_archive for packages that are being
717
#       co-developed. Package Versions within the sandbox are ignored
227 dpurdie 718
#
241 dpurdie 719
 
720
#
721
#   Ensure that the user does not set $GBE_SANDBOX or $GBE_DPKG_SBOX
722
#   $GBE_JATS_SANE will be set for multiple invocations, thus it is cleared
723
#   for the first one (unless the user messes with it).
724
#
725
unless ( $GBE_JATS_SANE )
227 dpurdie 726
{
241 dpurdie 727
    Error ("GBE_SANDBOX must not be set by the user") if ( $GBE_SANDBOX );
728
    Error ("GBE_DPKG_SBOX must not be set by the user") if ( $GBE_DPKG_SBOX );
729
 
730
    #
731
    #   The ABT does not use the sandbox
732
    #   It will never be found and will be ignored
733
    #
734
    unless ( $GBE_ABT )
735
    {
277 dpurdie 736
        ($GBE_DPKG_SBOX,$GBE_SANDBOX)  = scan_for_dir ('sandbox_dpkg_archive');
227 dpurdie 737
    }
738
}
739
 
740
########################################################################
741
#
742
#   Ensure that the user has been set
743
#   Under windows USER may not be set, but USERNAME may be
299 dpurdie 744
#   As a last resort, use getlogin data
227 dpurdie 745
#
746
$USER = $ENV{ 'USERNAME' } || '' unless ( $USER );
747
$USER = $ENV{ 'LOGNAME' }  || '' unless ( $USER );
299 dpurdie 748
$USER = getlogin()         || '' unless ( $USER );
227 dpurdie 749
 
299 dpurdie 750
#Debug ("User: ", $USER, $ENV{ 'USERNAME'}, $ENV{ 'LOGNAME' }, getlogin() );
751
 
227 dpurdie 752
################################################################################
753
#   Sanitize the PATH variable
754
#   Some of the Win32 binary tools used by JATS cannot handle lower case Path
755
#   Force an upper case PATH
756
#
757
my $PATH = '';
758
$PATH .= delete( $ENV{ 'Path' } ) if (exists $ENV{ 'Path' });
759
$PATH .= delete( $ENV{ 'path' } ) if (exists $ENV{ 'path' });
760
$PATH .= delete( $ENV{ 'PATH' } ) if (exists $ENV{ 'PATH' });
277 dpurdie 761
$ENV{'PATH'} = $PATH;
227 dpurdie 762
 
763
#
764
#   Windows now defines ComSpec. This is only a problem when programs are
765
#   started up without the use of cmd.exe - like the JATS internal sh.exe
766
#   Correct by deleting the environment variable and forcing it to be uppercase
767
#
768
my $COMSPEC = '';
769
$COMSPEC = delete( $ENV{'COMSPEC'} ) if ( exists $ENV{'COMSPEC'} );
770
 
771
################################################################################
772
#   There is some really ugly interaction between Cygwin, ActiveState Perl 5.8.2
773
#   and xmake. Even if none of the cygwin bits are used within JATS the fact that
774
#   Cygwin is in the path causes problems.
775
#
776
#   Problems seen:
777
#       1) "jats build"     xmake fails with a segment fault. Possibly when
778
#                           displaying an error message
779
#       2) Warnings and messages generated from within Perl don't always appear
780
#          In particular. The output from a Message() within a PLATFORM/xxx file
781
#          does not get displayed.
782
#
783
#   Solution:
784
#       Remove cygwin from the PATH
785
#
786
$PATH =~ s~c:\\cygwin[^;]*;~~ig;
787
 
788
################################################################################
297 dpurdie 789
#   Setup the default JAVA_HOME
790
#   User should specify 1.4, 1.5,1.6 ....
791
#
792
$JAVA_HOME = get_java_home ($opt_java)
793
    if ( $opt_java );
794
PathPrepend ("$JAVA_HOME/bin")
795
    if ( -d $JAVA_HOME );
796
 
797
 
798
################################################################################
227 dpurdie 799
#   Ensure that the PATH contains the PERL executable
800
#   Need to true path to the PERL executable so that the user has access to some
801
#   of the perl utility programs such as pod2html
802
#
299 dpurdie 803
PathPrepend ($Config{'binexp'});
227 dpurdie 804
 
805
################################################################################
806
#   There is more ugliness if GBE_BIN is not in the users path
807
#   I suspect that it something within xmake (under win32) and that it needs
808
#   to be able to find sh within the path - even though its fully pathed
809
#
810
#   Add GBE_BIN to the start of the path to assist in searching
811
#   Also ensure that we pickup our version of utilities instead of random
812
#   versions.
813
#
297 dpurdie 814
PathPrepend ($GBE_BIN);
227 dpurdie 815
 
816
################################################################################
817
#   Clean PATH
818
#       Remove duplicates
819
#       Remove empty elements
820
#       Clean path endings
245 dpurdie 821
#       Place non-existent paths at the end. They will be seen, but not scanned
227 dpurdie 822
#
823
{
824
    my @new_path;
825
    my @non_exist;
826
    my %seen;
827
    foreach ( split $PSPLIT, $PATH )
828
    {
829
        s~[/\\]+$~~;                                # Remove trailing / or \
830
        my $name = ( $GBE_UNIX ) ? $_ : lc ($_);    # Windows is case insensitive
831
        next unless ( $_ );                         # Remove empty elements
832
        next if ( /^\.+$/ );                        # Remove . and ..
833
        next if ( exists $seen{$name} );            # Remove duplicates
834
        if ( -d $_ ) {
835
            push @new_path, $_;                     # Exists
836
        } else {
245 dpurdie 837
            push @non_exist, $_;                    # Place non existent paths at the end
227 dpurdie 838
        }
839
        $seen{$name} = 1;
840
    }
841
    $PATH = join( $PSPLIT, @new_path, @non_exist );
842
}
843
 
844
################################################################################
845
#   Windows: Ensure that cmd.exe is in the users PATH
846
#            If cmd.exe cannot be found then the 'system' command will not work
847
#
848
unless ( $GBE_UNIX )
849
{
850
    my $cmd_found;
851
    foreach ( split $PSPLIT, $PATH )
852
    {
853
        my $file = $_ . "/cmd.exe";
854
        Verbose2 ("Look for: $file");
855
        if ( -x $file  )
856
        {
857
            $cmd_found = 1;
858
            Verbose ("Found: $file");
859
            last;
860
        }
861
    }
862
 
863
    Warning( "Users PATH does not contain \"cmd.exe\"",
864
             "System commands may not work" ) unless $cmd_found;
865
}
866
 
867
################################################################################
868
#   Sanitize the Microsoft Visual Studio environment variables LIB and INCLUDE.
869
#   If these have a trailing \ then the generated makefiles
870
#   will fail. This is impossible to detect and fix within make so do it here
871
#
872
#   Note: JATS no longer allows these environment variables through to the
873
#         makefiles.
874
#
875
unless ( $GBE_UNIX )
876
{
877
    for my $var qw ( LIB INCLUDE )
878
    {
879
        my $evar = $ENV{$var};
880
        if ( $evar )
881
        {
882
            $evar =~ s~\\;~;~g;         # Remove trailing \ from components \; -> ;
883
            $evar =~ s~\\$~~;           # Remove trailing \
884
            $evar =~ s~;$~~;            # Remove trailing ;
885
            $evar =~ s~;;~;~g;          # Remove empty items ;;
886
            $ENV{$var} = $evar;
887
        }
888
    }
889
}
890
 
891
################################################################################
297 dpurdie 892
#   Update the environment variables used by JATS, unless requested otherwise.
227 dpurdie 893
#
277 dpurdie 894
#   If JATS is being used to startup build daemons, then we don't want to
895
#   export many of the calculated values into the environment. In particular
896
#   GBE_CORE, GBE_BIN, GBE_CONFIG and GBE_TOOLS must not be exported as it will
897
#   prevent the daemon from picking up the 'current' version of JATS
898
#
899
#
287 dpurdie 900
 
277 dpurdie 901
if ( $opt_export_vars )
902
{
903
    $ENV{'PATH'}              = $PATH;
904
    $ENV{'GBE_VERSION'}       = $GBE_VERSION;
905
    $ENV{'GBE_CORE'}          = $GBE_CORE;
906
    $ENV{'GBE_BIN'}           = $GBE_BIN;
907
    $ENV{'GBE_CONFIG'}        = $GBE_CONFIG;
908
    $ENV{'GBE_DPLY'}          = $GBE_DPLY;
909
    $ENV{'GBE_DPKG'}          = $GBE_DPKG;
910
    $ENV{'JATS_HOME'}         = $GBE_DPKG;
911
    $ENV{'GBE_DPKG_CACHE'}    = $GBE_DPKG_CACHE;
912
    $ENV{'GBE_DPKG_STORE'}    = $GBE_DPKG_STORE;
913
    $ENV{'GBE_DPKG_LOCAL'}    = $GBE_DPKG_LOCAL;
914
    $ENV{'GBE_SANDBOX'}       = $GBE_SANDBOX;
915
    $ENV{'GBE_DPKG_SBOX'}     = $GBE_DPKG_SBOX;
916
    $ENV{'GBE_PERL'}          = $GBE_PERL;
917
    $ENV{'GBE_TOOLS'}         = $GBE_TOOLS;
918
    $ENV{'GBE_MACHTYPE'}      = $GBE_MACHTYPE;
919
    $ENV{'GBE_HOSTMACH'}      = $GBE_HOSTMACH;
920
    $ENV{'GBE_PLATFORM'}      = $GBE_PLATFORM;
921
    $ENV{'GBE_DRV'}           = $GBE_DRV;
922
    $ENV{'PERL5LIB'}          = $PERL5LIB;
923
    $ENV{'JAVA_HOME'}         = $JAVA_HOME if ($JAVA_HOME);
924
    $ENV{'GBE_JATS_SANE'}     = 1;
925
}
287 dpurdie 926
else
927
{
928
    #
929
    #   Delete, from the environment, values that are related to selecting
930
    #   the version of JATS being used
931
    #
932
    foreach ( qw( GBE_VERSION GBE_CORE GBE_BIN GBE_CONFIG GBE_TOOLS GBE_DRV PERL5LIB GBE_DPKG_SBOX GBE_SANDBOX GBE_PLATFORM GBE_JATS_SANE ) )
933
    {
934
        delete $ENV{$_};
935
    }
936
}
277 dpurdie 937
 
938
#
939
#   The following don't affect the operation of the build daemons selecting
940
#   the current version of JATS. Some need to be passed through anyway
941
#
227 dpurdie 942
$ENV{'GBE_BUILDFILTER'}   = $GBE_BUILDFILTER;
277 dpurdie 943
$ENV{'GBE_ABT'}           = $GBE_ABT if ($GBE_ABT);
227 dpurdie 944
$ENV{'GBE_DEBUG'}         = $GBE_DEBUG;
945
$ENV{'GBE_VERBOSE'}       = $GBE_VERBOSE;
946
$ENV{'GBE_UNIX'}          = $GBE_UNIX;
947
$ENV{'USER'}              = $USER;
277 dpurdie 948
$ENV{'COMSPEC'}           = $COMSPEC;
279 dpurdie 949
$ENV{'GBE_HOSTNAME'}      = $GBE_HOSTNAME;
227 dpurdie 950
 
951
#-------------------------------------------------------------------------------
297 dpurdie 952
# Function        : PathPrepend
953
#
954
# Description     : Prepend stuff to the PATH
955
#
956
# Inputs          : Items to prepend
957
#
958
# Returns         : Nothing
959
#                   Modifies $PATH
960
#
961
sub PathPrepend
962
{
299 dpurdie 963
    foreach my $el ( @_ )
297 dpurdie 964
    {
299 dpurdie 965
        # Must NOT change the original argument, just a copy of it.
966
        # Don't use $_ as this messes up too
967
        my $item = $el;
297 dpurdie 968
        $item =~ s~/~\\~g unless ( $GBE_UNIX );
969
        $PATH = $item . $PSPLIT . $PATH;
970
    }
971
}
972
 
973
#-------------------------------------------------------------------------------
229 dpurdie 974
# Function        : LocateJatsVersion
975
#
245 dpurdie 976
# Description     : Scan archives looking for a specified version of JATS
229 dpurdie 977
#                   Complicated by the name change from core_devl to jats
245 dpurdie 978
#                   that occurred circa version 2.71.7.
229 dpurdie 979
#                   The required version may be in either of the packages
980
#
981
# Inputs          : $version            - Version to locate
982
#
983
# Returns         : undef               - if not found
984
#                   Array of:
985
#                       Repository
986
#                       package/version
987
#
988
sub LocateJatsVersion
989
{
990
    my ($version) = @_;
991
    my $package;
992
    my $path;
993
 
994
    foreach my $archive qw ( GBE_DPKG_LOCAL GBE_DPKG_CACHE GBE_DPKG GBE_DPKG_STORE )
995
    {
996
        no strict 'refs';
997
        $path = ${$archive};
998
        use strict 'refs';
999
        next unless ( $path );
1000
 
1001
        foreach my $package qw( jats core_devl )
1002
        {
1003
            Verbose2( "ExamineDir: $path/$package/$version" );
1004
            if ( -d "$path/$package/$version" )
1005
            {
283 dpurdie 1006
                return $path, "$package/$version";
229 dpurdie 1007
            }
1008
        }
1009
    }
283 dpurdie 1010
    return;
229 dpurdie 1011
}
1012
 
1013
 
1014
#-------------------------------------------------------------------------------
227 dpurdie 1015
# Function        : TestDirectoryConfig
1016
#
1017
# Description     : Sanity test a user configurable directory or file
1018
#                   Must not contain spaces
1019
#                   Must not be a network drive ie: //computer
1020
#
1021
# Inputs          :
1022
#
1023
# Returns         :
1024
#
1025
sub TestDirectoryConfig
1026
{
1027
    my ($dir) = @_;
1028
 
1029
    no strict 'refs';
1030
    my $val = ${$dir};
1031
 
1032
    if ( $val )
1033
    {
1034
        #
1035
        #   Cleanup the path
1036
        #
1037
        $val =~ tr~\\/~/~s;
1038
        $val =~ s~/+$~~;
255 dpurdie 1039
        $val = '' if ( $val eq '-' || $val eq 'none' );
227 dpurdie 1040
        ${$dir} = $val;
1041
 
1042
        ReportError("$dir path cannot contain spaces: $val") if ( $val =~ m/\s/ );
1043
        ReportError("$dir path cannot be a computer name: $val") if ( $val =~ m~^//~  );
1044
    }
1045
    use strict 'refs';
283 dpurdie 1046
    return;
227 dpurdie 1047
}
1048
 
1049
#-------------------------------------------------------------------------------
1050
# Function        : change_dir
1051
#
1052
# Description     : change directory to the specified directory
1053
#
1054
# Inputs          : $1      - Target directory
1055
#
1056
# Returns         :
1057
#
1058
sub change_dir
1059
{
1060
    my ($dir) = @_;
1061
 
1062
    if ( $dir && $dir !~ m/^\.$/ )
1063
    {
1064
        Verbose ("Changing to JATS build directory: $dir");
1065
        chdir $dir || Error ("Bad change directory: $dir");
1066
    }
1067
 
1068
    #
1069
    #   Reset the CWD
1070
    #   Note: Don't use `pwd`. This sucks for so many reasons including
1071
    #         the fact that it may not be available until this wrapper
1072
    #         script has done it job.
1073
    #
1074
    $CWD = getcwd();
1075
    $CWD =~tr~\\/~/~s;
1076
    Warning ("Current working directory contains spaces") if ( $CWD =~ m/\s/ );
283 dpurdie 1077
    return;
227 dpurdie 1078
}
1079
 
1080
#-------------------------------------------------------------------------------
277 dpurdie 1081
# Function        : scan_for_dir
1082
#
1083
# Description     : Scan from the current directory up to the root
1084
#                   of the current file system looking for a named
1085
#                   directory
1086
#
1087
# Inputs          : $target                 - Directory to locate
1088
#
1089
# Returns         : full_path               - Path of dir
1090
#                   full_dir                - Containng dir
1091
#
1092
 
1093
sub scan_for_dir
1094
{
1095
    my ($target) = @_;
1096
    Verbose2 ("Scan for $target");
1097
 
1098
    my $test_dir = $CWD;
1099
    {
1100
        do
1101
        {
1102
            #
1103
            #   Stop at /home to prevent unix automounter spitting
1104
            #   lots of error messages
1105
            #
1106
            last if ( $test_dir =~ m~/home$~ );
1107
            Verbose2 ("Testing: $test_dir");
1108
 
1109
            my $test_path = $test_dir . '/' . $target;
1110
            if ( -d $test_path )
1111
            {
1112
                Verbose ("Found $target: $test_path");
1113
                return $test_path, $test_dir;
1114
            }
1115
            #
1116
            #   Remove one directory
1117
            #   Terminate the loop when no more can be removed
1118
            #
1119
        } while ( $test_dir =~ s~[/][^/]*$~~ );
1120
    }
1121
    return '','';
1122
}
1123
 
1124
#-------------------------------------------------------------------------------
227 dpurdie 1125
# Function        : get_java_home
1126
#
1127
# Description     : Convert user java option into a full path,or die
1128
#
1129
# Inputs          : User option
1130
#
1131
# Returns         : Full path
1132
#
1133
sub get_java_home
1134
{
1135
    my ($java) = @_;
1136
    my $jv = "JAVA_HOME_$java";
1137
    $jv =~ s~\.~_~g;
1138
 
1139
    unless ( exists($ENV{$jv}) )
1140
    {
1141
        Error ("Unknown JAVA version: $java",
1142
               "Looking for EnvVar: $jv",
1143
               "Example Usage: -java=1.5");
1144
    }
1145
    my $rv = $ENV{$jv};
1146
    unless ( -d $rv )
1147
    {
1148
        Error ("Java home path not found: $jv",
1149
               "Looking for: $rv" );
1150
    }
1151
    return $rv;
1152
}
1153
 
1154
#-------------------------------------------------------------------------------
1155
# Function        : get_version
1156
#
1157
# Description     : Return the version of JATS being run
1158
#                   JATS should be run from a "package"
1159
#                   The package should have a descpkg file
1160
#                   Use this file
1161
#
1162
# Inputs          :
1163
#
1164
# Returns         : A string
1165
#
1166
sub get_version
1167
{
229 dpurdie 1168
    #
1169
    #   The version number is embedded into this script by the release process
1170
    #   The text [V]ERSION_TAG will be replaced by the real version number
245 dpurdie 1171
    #   If this has not occurred then we know that the release is not official
229 dpurdie 1172
    #   Need to be a little bit careful about the tag name
1173
    #
1174
    return ("Unreleased Version. Version tag has not been set")
1175
        if ( $GBE_NOT_RELEASED );
1176
 
227 dpurdie 1177
    return "$GBE_VERSION [ Internal. Not an installed package ]"
1178
        if ( ! -f "$GBE_CORE/descpkg" );
1179
 
1180
    my $rec;
1181
    return $rec->{'VERSION_FULL'}
1182
        if ($rec = ReadDescpkg ( "$GBE_CORE/descpkg" ) );
1183
 
1184
    return "ERROR";
1185
}
1186
 
1187
#-------------------------------------------------------------------------------
1188
# Function        : print_version
1189
#
1190
# Description     :
1191
#
1192
# Inputs          :
1193
#
1194
# Returns         :
1195
#
1196
sub print_version
1197
{
1198
    #
1199
    #   Allow user to specify verboseness as an argument
1200
    #
1201
    foreach  ( @_ )
1202
    {
1203
        $GBE_VERBOSE++ if ( m/^-v/ );
1204
    }
1205
 
1206
    Message get_version();
1207
    Message "Internal: $GBE_VERSION" if ($GBE_VERBOSE);
1208
    $opr_done = 1;
283 dpurdie 1209
    return;
227 dpurdie 1210
}
1211
 
1212
 
1213
#-------------------------------------------------------------------------------
1214
#
1215
#   Give the user a clue
1216
#
1217
sub help
1218
{
1219
    my ($level) = @_;
1220
    $level = $opt_help unless ( $level );
1221
 
1222
    pod2usage(-verbose => 0, -message => "Version: ". get_version())  if ($level == 1 );
261 dpurdie 1223
    pod2usage(-verbose => $level - 1 );
227 dpurdie 1224
}
1225
 
1226
#-------------------------------------------------------------------------------
1227
#
1228
#   Find a JATS build directory
1229
#   Find a JATS build directory based on file $1
1230
#
295 dpurdie 1231
#   Will 'cd' to the build directory
1232
#
227 dpurdie 1233
sub find_jats_dir
1234
{
1235
    #
1236
    #   Autodetect suppressed ?
1237
    #
1238
    return if ( $opt_here );
1239
 
1240
    my (@FILES) = @_;
1241
    push @FILES, @BUILD_FILE_ALT;
1242
 
1243
    my @SEARCH = qw( . .. ../.. ../../.. );
1244
 
1245
    #
1246
    #   Locate the JATS build files
1247
    #   Allow the user to be in a number of parent directories
1248
    #
1249
    for my $ROOTDIR (@SEARCH)
1250
    {
1251
        for my $SUBDIR ( '', '/jats', '/build', '/build/jats' )
1252
        {
1253
            my $DIR = $ROOTDIR . $SUBDIR;
1254
            next unless -d $DIR;
1255
 
283 dpurdie 1256
            for my $FILE ( @FILES)
227 dpurdie 1257
            {
1258
                my $check_file = $DIR . '/' . $FILE;
1259
                Verbose2 ("Check for: $check_file");
1260
                if ( -f $check_file )
1261
                {
1262
                    change_dir ( $DIR );
1263
                    Verbose2 ("Found: $check_file");
1264
                    return;
1265
                }
1266
            }
1267
        }
1268
    }
1269
    Error ("JATS directory not found. Cannot locate: @FILES");
1270
}
1271
 
1272
#-------------------------------------------------------------------------------
1273
#
295 dpurdie 1274
#   Determine the real build file to use
1275
#   Will select from a list of known build files.
227 dpurdie 1276
#
295 dpurdie 1277
sub getBuildFile
227 dpurdie 1278
{
1279
    my $build_file = $BUILD_FILE;
1280
    #
1281
    #   Use an alternative buildfile - if it exists
1282
    #   Do not use this file if the user has specified a buildfile
1283
    #
1284
    unless ( $BUILD_FILE_SET )
1285
    {
1286
        Verbose ("Search for alternate build file");
1287
        foreach my $test_file ( @BUILD_FILE_ALT )
1288
        {
1289
            Verbose2 ("Search for alternate build file: $test_file");
1290
            if ( -f $test_file )
1291
            {
1292
                $build_file = $test_file;
1293
                Message ("=== USING ALTERNATE BUILDFILE: $build_file ===");
1294
                last;
1295
            }
1296
        }
1297
    }
295 dpurdie 1298
   return $build_file;
1299
}
227 dpurdie 1300
 
295 dpurdie 1301
#-------------------------------------------------------------------------------
1302
#
1303
#   Kick off the build process
1304
#
1305
sub build
1306
{
1307
    my $build_file = $BUILD_FILE;
1308
    (my $name = $CWD) =~ s~^.*/~~ ;
1309
    $opr_done = 1;
1310
 
1311
    find_jats_dir($build_file);
1312
    Message ("=== Building $name ===");
1313
    $build_file = getBuildFile();
1314
 
227 dpurdie 1315
    #
1316
    #   Jats/make does not handle file systems with spaces in the path names
1317
    #
1318
    Error('$CWD path cannot contain spaces') if ( $CWD =~ m/\s/ );
1319
 
1320
    $RESULT = System ($GBE_PERL, $build_file, $CWD, "$GBE_TOOLS/buildlib.pl", "--project", @_ );
1321
 
283 dpurdie 1322
    Message ("=== Build $name NOT complete ===") if     ( $RESULT  );
1323
    Message ("=== Build $name complete ===")     unless ( $RESULT );
227 dpurdie 1324
    return $RESULT
1325
}
1326
 
1327
#-------------------------------------------------------------------------------
1328
# Function        : bmake_it
1329
#
1330
# Description     : Combo build and make operations
1331
#
1332
# Inputs          : ...     - COMMANDS or Make arguments.
1333
#                             Key commands are BUILD and INSTALL
1334
#
1335
# Returns         : RESULT code
1336
#
1337
sub bmake_it
1338
{
1339
    my @make_args = @_;
1340
    my $all = 1;
1341
    my $msg;
1342
    $opr_done = 1;
1343
 
1344
    if ( $make_args[0] && $make_args[0] eq 'NOTALL' )
1345
    {
1346
        $all = 0;
1347
        shift @make_args;
1348
    }
1349
    elsif ( $make_args[0] && $make_args[0] eq 'BUILD' )
1350
    {
1351
        Verbose ("Makeit build") ;
1352
        $msg = "Component not built";
1353
        build();
1354
        shift @make_args;
1355
    }
1356
 
1357
    unless ( $RESULT )
1358
    {
1359
        push @make_args, '-default=all' if ( $all );
1360
        Verbose ("Makeit make @make_args") ;
1361
 
1362
        find_jats_dir( "makefile.pl", "Makefile.gbe", $BUILD_FILE );
1363
        Error ("No Makefile.gbe file found") unless ( -f 'Makefile.gbe' );
1364
 
1365
        etool ( 'jmake.pl', @make_args );
1366
        $msg = "Component not made";
1367
        @make_args = ();
1368
    }
1369
 
1370
 
1371
    Verbose ("Makeit Result: $RESULT") ;
1372
    Error ( $msg ) if ( $RESULT );
1373
    return  if ( $RESULT );
1374
}
1375
 
1376
#-------------------------------------------------------------------------------
1377
# Function        : dev_expand
1378
#
1379
# Description     : Expand the users arguments to the "debug/prod" command
1380
#                   "debug/prod" builds and packages debug stuff
1381
#
1382
#                   Ignore make options.
1383
#
1384
# Inputs          : target
1385
#                   Argument list
1386
#
1387
# Returns         : expanded argument list
1388
#
1389
sub dev_expand
1390
{
1391
    my @resultd;
1392
    my @resultp;
1393
    my @args;
1394
    my @opts;
1395
 
1396
    #
1397
    #   Remove options from the argument list
1398
    #
1399
    foreach ( @_ )
1400
    {
1401
        if ( m~=~ || m~^-~ ) {
1402
            push @opts, $_;
1403
        } else {
1404
            push @args, $_;
1405
        }
1406
    }
1407
 
1408
    my $target = shift @args;
1409
    my @cmd = $target;
1410
    if ( $#args < 0 )
1411
    {
1412
        push @cmd, "package_$target";
1413
    }
1414
    else
1415
    {
1416
        foreach ( @args )
1417
        {
1418
            push @resultd, $_ . "_$target";
1419
            push @resultp, $_ . "_package_$target";
1420
            @cmd = ();
1421
        }
1422
    }
1423
 
1424
    return (@cmd, @resultd, @resultp, @opts);
1425
}
1426
 
1427
#-------------------------------------------------------------------------------
1428
# Function        : install_pkg
1429
#
1430
# Description     : Install the built package into local_dpkg_archive
1431
#                   This will make it available for use, without populating the
1432
#                   global archive
1433
#
1434
#                   This is done through an external utility to maintain
1435
#                   consistent interface
1436
#
1437
sub install_pkg
1438
{
1439
 
1440
    find_jats_dir($BUILD_FILE, "build.xml" );
1441
    etool ( 'create_dpkg.pl', '-archive=local', '-quiet', '-override',  @_ );
1442
}
1443
 
1444
#-------------------------------------------------------------------------------
1445
# Function        : create_dpkg
1446
#
1447
# Description     : Install a package into the main dpkg_archive
1448
#                   This is done through an external utility to maintain
1449
#                   consistent interface
1450
#
1451
#                   This function is simply an easy way to access the utility
1452
 
1453
sub create_dpkg
1454
{
1455
    find_jats_dir($BUILD_FILE, "build.xml" );
1456
    etool ( 'create_dpkg.pl',  @_ );
1457
}
1458
 
1459
#-------------------------------------------------------------------------------
1460
# Function        : etool
1461
#
1462
# Description     : Invoke an external tool program written in PERL
1463
#
1464
# Arguments       : $1  Name of the program to run
1465
#                       With optional .pl suffix
1466
#                   $2+ Program arguments
1467
#
1468
sub etool
1469
{
1470
    my $command = shift;
1471
    my $cmd;
1472
    my @etool_path = ( "$ENV{'GBE_TOOLS'}",
1473
                       "$ENV{'GBE_TOOLS'}/DEPLOY",
1474
                       "$ENV{'GBE_TOOLS'}/LOCAL" );
1475
    if ( $command )
1476
    {
1477
        #
1478
        #   Locate a potential tool
1479
        #   These will have the user name or a .pl extension
1480
        #
1481
        ETOOL_SEARCH:
1482
        foreach my $ext ( '', '.pl' )
1483
        {
1484
            foreach my $dir ( @etool_path )
1485
            {
297 dpurdie 1486
                $cmd = "$dir/jats_$command$ext";
1487
                last ETOOL_SEARCH if ( -f $cmd );
1488
 
227 dpurdie 1489
                $cmd = "$dir/$command$ext";
1490
                last ETOOL_SEARCH if ( -f $cmd );
1491
            }
1492
            $cmd='';
1493
        }
1494
 
1495
        Error ("Tool not found: $command", "Search path:", @etool_path) unless $cmd;
1496
        $RESULT = System ( $GBE_PERL, $cmd, @_ );
1497
    }
1498
    else
1499
    {
1500
        #
1501
        #   Display on the .pl commands
1502
        #
1503
        display_commands("Available Tools", \@etool_path, ['*.pl'] );
1504
    }
1505
 
1506
    $opr_done = 1;
1507
}
1508
 
1509
#-------------------------------------------------------------------------------
1510
# Function        : ebin
1511
#
1512
# Description     : Invoke an external JATS provided binary
1513
#                   within the JATS toolset
1514
#
1515
# Arguments       : $1  Name of the program to run
1516
#                   $2+ Program arguments
1517
#
1518
sub ebin
1519
{
1520
    my $command = shift;
1521
    my $cmd;
1522
    my @ebin_path = ( "$GBE_BIN" );
1523
 
1524
    if ( $command )
1525
    {
1526
        #
1527
        #   Locate a potential executable
1528
        #   This
1529
        #
1530
        ETOOL_SEARCH:
1531
        foreach my $ext ( '', '.exe', '.sh' )
1532
        {
1533
            foreach my $dir ( @ebin_path )
1534
            {
1535
                $cmd = "$dir/$command$ext";
1536
                last ETOOL_SEARCH if ( -f $cmd );
1537
            }
1538
            $cmd='';
1539
        }
1540
 
1541
        Error ("Program not found: $command", "Search path:", @ebin_path) unless $cmd;
1542
        $RESULT = System ( $cmd, @_ );
1543
    }
1544
    else
1545
    {
1546
        #
1547
        #   Display a list of programs
1548
        #
1549
        display_commands("Available Programs", \@ebin_path, ['*'] );
1550
    }
1551
 
1552
    $opr_done = 1;
1553
}
1554
 
1555
#-------------------------------------------------------------------------------
1556
# Function        : eprog
1557
#
1558
# Description     : Invoke an external program
1559
#                   Will detect local .pl files and execute them
1560
#                   Will detect local .jar files and execute them
229 dpurdie 1561
#                   Will detect local .bat files and execute them
227 dpurdie 1562
#
1563
# Arguments       : $1  Name of the program to run
1564
#                   $2+ Program arguments
1565
#
1566
sub eprog
1567
{
229 dpurdie 1568
    Verbose ("eprog: @_");
227 dpurdie 1569
    my $name = shift @_;
1570
    Error ("eprog. No program specified") unless ( $name );
1571
 
229 dpurdie 1572
    $name .= ".pl"     if ( -f "${name}.pl" );
1573
    $name .= ".jar"    if ( -f "${name}.jar" );
1574
    $name .= ".bat"    if ( -f "${name}.bat" );
227 dpurdie 1575
 
229 dpurdie 1576
    #
245 dpurdie 1577
    #   On Windows programs in the CWD will be found
1578
    #   Mimic this behaviour on Unix
229 dpurdie 1579
    #
1580
    $name = "./$name" if ( $name !~ m~/~ && -f "./$name");
1581
 
227 dpurdie 1582
    if ( $name =~ m~\.pl$~ ) {
1583
        $RESULT = System ( $GBE_PERL, $name, @_ );
1584
 
1585
    } elsif ( $name =~  m~\.jar$~ ) {
1586
        $RESULT = System ( "$JAVA_HOME/bin/java", '-jar', $name, @_);
1587
 
1588
    } else {
229 dpurdie 1589
        #
1590
        #   Ensure .bat files are pathed with \, and not / characters
1591
        #   The windows command interpreter does not like /
1592
        #
1593
        $name =~ s~/~\\~g if ( $name =~ m~\.bat$~ );
1594
 
227 dpurdie 1595
        $RESULT = System ( $name, @_ );
1596
    }
1597
 
1598
    $opr_done = 1;
1599
}
1600
 
1601
#-------------------------------------------------------------------------------
1602
# Function        : display_commands
1603
#
1604
# Description     : Display a list of commands from a specified list of dirs
1605
#                   Internal helper function
1606
#
1607
# Inputs          : $title      - Display header
1608
#                   $ref_path   - Ref to an array that contains the search path
1609
#                   $ref_ext    - Ref to an array of valid patterns
1610
#
1611
# Returns         : Nothing
1612
#
1613
sub display_commands
1614
{
1615
    my ( $title, $ref_path, $ref_ext ) = @_;
1616
 
1617
    #
1618
    #   Display a list of commands
1619
    #
1620
    my %list;
1621
    foreach ( @$ref_path )
1622
    {
1623
        foreach my $ext ( @$ref_ext )
1624
        {
1625
            foreach my $file (  glob( "$_/$ext") )
1626
            {
1627
                $file =~ s~.*/~~ unless $GBE_VERBOSE;
1628
                $list{$file} = 1;
1629
            }
1630
        }
1631
    }
1632
 
1633
    my $count = 0;
1634
    my $limit = $GBE_VERBOSE ? 1 : 3;
1635
    print "$title:\n";
1636
    foreach ( sort keys %list )
1637
    {
1638
        printf "%-26s", $_;
1639
        print "\n" if ( !( ++$count % $limit) );
1640
    }
1641
}
1642
 
1643
#-------------------------------------------------------------------------------
1644
# Function        : run_ant
1645
#
1646
# Description     : Invoke ant
1647
#                   If the current directory looks like an ERG build system, then
1648
#                   create and maintain an auto.xml file. Otherwise simply invoke ant
1649
#
1650
# Inputs          : $1+ program arguments
1651
#
1652
sub run_ant
1653
{
1654
    my $JAVA_HOME = $ENV{JAVA_HOME} || Error ("JAVA_HOME is not defined in the environment");
1655
    my $ANT_HOME  = $ENV{ANT_HOME}  || Error ("ANT_HOME is not defined in the environment" );
1656
 
1657
    #
1658
    #   Detect an ERG formatted build
1659
    #   This will have two files <projectname>.xml and <projectname>depends.xml
1660
    #   Create the 'auto.xml' file only if its not present
1661
    #
1662
    my @ant_arg;
1663
    my @flist;
1664
    my $basename = '';
235 dpurdie 1665
    my $scanner = '*depends.xml';
227 dpurdie 1666
 
1667
    #
1668
    #   Use specified build file to resolve multiple names
1669
    #   Strip any trailing depends.xml to make it user friendly
1670
    #
1671
    if ( $BUILD_FILE_SET )
1672
    {
1673
        $basename = $BUILD_FILE;
1674
        $basename =~ s~\.xml$~~;
1675
        $basename =~ s~depends$~~;
235 dpurdie 1676
        $scanner = "${basename}depends.xml";
227 dpurdie 1677
        Verbose ("Using buildfile: $basename");
1678
    }
1679
 
235 dpurdie 1680
    my @buildlist = glob($scanner);
227 dpurdie 1681
    foreach ( @buildlist )
1682
    {
1683
        if ( m/(.+)depends.xml/ )
1684
        {
1685
            my $pname = $1;
1686
            push @flist, $pname if ( -f "$pname.xml" );
1687
        }
1688
    }
1689
 
1690
    if ( $#flist >= 0 )
1691
    {
1692
        Error ("Multiple depends.xml files found:", @flist,
297 dpurdie 1693
               "Use 'jats -buildfile=name ant ...' to resolve") if ( $#flist > 0 );
227 dpurdie 1694
 
1695
        my $depend = "$flist[0]depends.xml";
1696
        @ant_arg = ('-f', "$flist[0].xml");
1697
 
1698
        Message ("Ant using projectfiles: $flist[0].xml");
1699
 
1700
        #
1701
        #   Check for depends.xml newer than auto.xml.
1702
        #
1703
        my $auto_timestamp   = (stat('auto.xml'))[9] || 0;
1704
        my $depend_timestamp = (stat($depend))[9];
1705
        if ( $depend_timestamp > $auto_timestamp )
1706
        {
1707
            Message ("Creating: auto.xml");
1708
            copy( $depend, 'auto.xml' );
1709
            chmod 0777, 'auto.xml';
1710
        }
1711
    }
1712
    elsif ( $BUILD_FILE_SET  )
1713
    {
1714
        Error ("Specified build file pair not found:", $basename, $basename . "depends.xml");
1715
    }
1716
 
1717
    #
1718
    #   The ant provided startup scripts don't return an exit code under
1719
    #   windows. Invoke ant directly
1720
    #
1721
    launch_ant ( $JAVA_HOME, $ANT_HOME, @ant_arg, @_ );
1722
    $opr_done = 1;
1723
}
1724
 
1725
#-------------------------------------------------------------------------------
1726
# Function        : run_abt
1727
#
1728
# Description     : Invoke auto build tool (older form)
1729
#                   Options for the ABT
1730
#                       --Java=x.x
1731
#                   Invoke ANT for the ABT using a specified version of Java
1732
#                   Do not play with the user environment.
297 dpurdie 1733
#                   Don't stick java path into environment
227 dpurdie 1734
#
1735
# Inputs          : $1+ program arguments
1736
#
1737
sub run_abt
1738
{
279 dpurdie 1739
    my $ABT_JAVA = 'JAVA_HOME_1_6';         # Default version for the ABT
227 dpurdie 1740
    my $JAVA_HOME = $ENV{$ABT_JAVA};
1741
    my $ANT_HOME  = $ENV{ANT_HOME};
1742
    my @abt_arg;
239 dpurdie 1743
    my $buildfile = 'build.xml';
227 dpurdie 1744
 
1745
    ErrorConfig( 'name'    => 'JATS ABT' );
1746
 
1747
    #
239 dpurdie 1748
    #   Use the user specified buildfile
1749
    #
1750
    $buildfile = $BUILD_FILE
1751
        if ( $BUILD_FILE_SET );
1752
 
1753
    #
227 dpurdie 1754
    #   Extract known options
1755
    #
1756
    foreach  ( @_ )
1757
    {
1758
        if ( m/-java=(.*)/ ) {
1759
            $JAVA_HOME = get_java_home($1);
239 dpurdie 1760
 
1761
        } elsif ( m/^-buildfile=(.+)/ ) {
1762
            $buildfile = $1;
1763
 
227 dpurdie 1764
        } else {
1765
            push @abt_arg, $_;
1766
        }
1767
    }
1768
 
1769
    Error ("$ABT_JAVA is not defined in the environment") unless $JAVA_HOME;
1770
    Error ("ANT_HOME is not defined in the environment" ) unless $ANT_HOME;
239 dpurdie 1771
    Error ("Ant buildfile not found: $buildfile" ) unless (-f $buildfile);
227 dpurdie 1772
 
1773
    #
239 dpurdie 1774
    #   Insert correct build file arguments
1775
    #
279 dpurdie 1776
    push @abt_arg, '-buildfile', $buildfile;
1777
 
1778
    #
1779
    #   Add current directory as java library directory, but only if
1780
    #   it contains JAR files.
1781
    #
1782
    push @abt_arg, '-lib', $CWD
1783
        if ( glob ('*.jar') );
239 dpurdie 1784
 
1785
    #
227 dpurdie 1786
    #   Use the ant-launcher to invoke ant directly
1787
    #
1788
    launch_ant ( $JAVA_HOME, $ANT_HOME, @abt_arg );
1789
    $opr_done = 1;
1790
}
1791
 
1792
#-------------------------------------------------------------------------------
1793
# Function        : launch_ant
1794
#
1795
# Description     : Start ANT - with sanity checking
1796
#
1797
# Inputs          : JAVA_HOME
1798
#                   ANT_HOME
1799
#                   @user_args
1800
#
1801
# Returns         : Result Code
1802
#
1803
sub launch_ant
1804
{
1805
    my ($JAVA_HOME, $ANT_HOME, @user_args ) = @_;
1806
 
1807
    Error ("Directory not found: $JAVA_HOME") unless ( -d "$JAVA_HOME" );
1808
    Error ("Program not found: $JAVA_HOME/bin/java") unless ( -e "$JAVA_HOME/bin/java" || -e "$JAVA_HOME/bin/java.exe" );
1809
    Error ("Jar not found: $ANT_HOME/lib/ant-launcher.jar") unless ( -e "$ANT_HOME/lib/ant-launcher.jar" );
1810
    Error ("Directory not found: $ANT_HOME") unless ( -d "$ANT_HOME" );
1811
    Error ("Directory not found: $ANT_HOME/lib") unless ( -d "$ANT_HOME/lib" );
1812
 
1813
    #
1814
    #   Use the ant-launcher to invoke ant directly
1815
    #
1816
    $RESULT = System ( "$JAVA_HOME/bin/java",
1817
                       "-classpath","$ANT_HOME/lib/ant-launcher.jar",
1818
                       "-Dant.home=$ANT_HOME",
1819
                       "org.apache.tools.ant.launch.Launcher",
1820
                       "-lib","$ANT_HOME/lib",
1821
                       @user_args
1822
                       );
1823
 
1824
   return $RESULT;
1825
}
1826
 
1827
 
1828
#-------------------------------------------------------------------------------
1829
#
1830
#   Cleanup the sandbox
1831
#   Perform a "make clobber" then a "build clobber"
1832
#
1833
sub clobber
1834
{
1835
    Message ("=== Removing ======");
1836
    find_jats_dir( $BUILD_FILE );
295 dpurdie 1837
    my $build_file = getBuildFile();
1838
 
227 dpurdie 1839
 
1840
    #
1841
    #   Run a "make clobber" to clean out "everything"
1842
    #
1843
    etool ( 'jmake.pl', 'clobber' )
1844
        if ( -f "Makefile.gbe" );
1845
 
295 dpurdie 1846
    if ( -f $build_file )
227 dpurdie 1847
    {
295 dpurdie 1848
        System ( $GBE_PERL, $build_file, $CWD, "$GBE_TOOLS/buildlib.pl", 'clobber' );
227 dpurdie 1849
    }
1850
    else
1851
    {
1852
        Error ("Cannot clobber. No buildfile found");
1853
    }
1854
 
1855
    Message ("=== Remove complete ===");
1856
    $opr_done = 1;
1857
}
1858
 
1859
#-------------------------------------------------------------------------------
1860
#
1861
#   Dumpout relevant parts of the environment
1862
#
1863
sub dump_vars
1864
{
1865
    $opr_done = 1;
1866
 
1867
    #
1868
    #   Allow user to specify verboseness as an argument
1869
    #
1870
    foreach  ( @_ )
1871
    {
1872
        $GBE_VERBOSE++ if ( m/^-v/ )
1873
    }
1874
 
1875
    #   Display an array separated list, one entry per line, with dir sanity check
1876
    sub alist
1877
    {
1878
        my ($text, @var) = @_;
1879
        my $sep = "=";
1880
        for ( @var )
1881
        {
1882
            my $valid = ( -d $_ || -f $_ ) ? " " : "*";
1883
            printf "%-17s%s%s%s\n", $text, $sep, $valid, $_;
1884
            $text = "";
1885
            $sep = " ";
1886
        }
1887
    }
1888
 
1889
    #   Display a ';' or ':' separated list, one entry per line
1890
    sub dlist
1891
    {
1892
        my ($text, $var) = @_;
1893
        alist( $text, split $PSPLIT, $var || " " );
1894
    }
1895
 
1896
    # Simple print of name and variable
1897
    sub pvar
1898
    {
1899
        my ($text, $data) = @_;
1900
        printf "%-17s= %s\n", $text, $data;
1901
    }
1902
 
1903
    # Print of name and variable of directory with sanity check
1904
    sub dvar
1905
    {
1906
        my ($text, $data) = @_;
1907
        my $valid = ( ! $data || -d $data || -f $data ) ? " " : "*";
1908
        printf "%-17s=%s%s\n", $text, $valid, $data;
1909
    }
1910
 
1911
    # Display a variable extracted from the environment
1912
    sub penv
1913
    {
1914
        my ($var) = @_;
1915
        pvar $var, $ENV{$var} || '';
1916
    }
1917
 
1918
    # Display a variable extracted from the environment with dir sanity check
1919
    sub denv
1920
    {
1921
        my ($var) = @_;
1922
        dvar $var, $ENV{$var} || '';
1923
    }
1924
 
1925
    #
1926
    #   Complete environment dump
1927
    #
1928
    if ( $GBE_VERBOSE > 1 )
1929
    {
1930
        Message ("Complete environment dump");
1931
        foreach my $var ( sort keys(%ENV) )
1932
        {
1933
            penv  $var;
1934
        }
1935
        return;
1936
    }
1937
 
1938
    pvar    "Version"         , get_version();
1939
    penv    "GBE_SCRIPT";
1940
    pvar    "GBE_DEBUG"       , $GBE_DEBUG;
1941
    pvar    "GBE_VERBOSE"     , $GBE_VERBOSE;
1942
    pvar    "GBE_MACHTYPE"    , $GBE_MACHTYPE;
273 dpurdie 1943
    pvar    "GBE_HOSTMACH"    , $GBE_HOSTMACH;
227 dpurdie 1944
    pvar    "GBE_UNIX"        , $GBE_UNIX;
1945
    pvar    "GBE_DRV"         , $GBE_DRV;
1946
    dvar    "GBE_PERL"        , $GBE_PERL;
1947
    dvar    "GBE_CORE"        , $GBE_CORE;
1948
    dvar    "GBE_BIN"         , $GBE_BIN;
1949
    dvar    "GBE_TOOLS"       , $GBE_TOOLS;
1950
    dvar    "GBE_CONFIG"      , $GBE_CONFIG;
1951
    penv    "GBE_CACHE_JATS";
1952
    dlist   "GBE_SANDBOX"     , $GBE_SANDBOX;
1953
    dlist   "GBE_DPKG_STORE"  , $GBE_DPKG_STORE;
1954
    dlist   "GBE_DPKG"        , $GBE_DPKG;
1955
    dlist   "GBE_DPKG_CACHE"  , $GBE_DPKG_CACHE;
1956
    dlist   "GBE_DPKG_LOCAL"  , $GBE_DPKG_LOCAL;
1957
    dlist   "GBE_DPKG_SBOX"   , $GBE_DPKG_SBOX;
1958
    dlist   "GBE_DPLY"        , $GBE_DPLY;
1959
    pvar    "GBE_PLATFORM"    , $GBE_PLATFORM;
1960
    pvar    "GBE_BUILDFILTER" , $GBE_BUILDFILTER;
1961
    pvar    "GBE_ABT"         , $GBE_ABT;
1962
 
1963
    denv    "GBE_VIEWBASE";
281 dpurdie 1964
    pvar    "GBE_HOSTNAME"    , $GBE_HOSTNAME;
227 dpurdie 1965
    dvar    "CWD"             , $CWD;
1966
    pvar    "BUILD_FILE"      , $BUILD_FILE;
1967
 
1968
    penv    "COMSPEC";
1969
    penv    "SHELL";
1970
    pvar    "USER"            , $USER;
1971
    dlist   "PATH"            , $PATH;
1972
 
1973
    #
1974
    #   Display variables used by various "known" toolsets
1975
    #   These do cause grief sometime, so only do it for verbose
1976
    #
1977
    if ( $GBE_VERBOSE )
1978
    {
1979
        print "\nPerl Environment\n";
1980
        pvar  "VERSION"         ,$];
1981
        penv  "PERL5SHELL";
1982
        penv  "PERL5OPT";
1983
        dlist "PERL5LIB"        ,$ENV{'PERL5LIB'};
1984
        alist "INC"             ,@INC;
1985
 
1986
        print "\nJava Environment\n";
283 dpurdie 1987
        foreach my $var ( sort grep ( {/^JAVA_HOME/ } keys %ENV) )
227 dpurdie 1988
        {
1989
            denv  $var;
1990
        }
1991
        denv  "ANT_HOME";
1992
        denv  "JATS_HOME";
1993
        dlist "CLASSPATH"       ,$ENV{'CLASSPATH'};
1994
    }
1995
 
1996
    if ( $GBE_VERBOSE || $GBE_ABT )
1997
    {
1998
        print "\nRelease Manager Environment\n";
1999
        penv    "GBE_RM_LOCATION";
2000
        penv    "GBE_RM_USERNAME";
2001
        penv    "GBE_RM_PASSWORD";
2002
        penv    "GBE_RM_URL";
2003
        penv    "GBE_DM_LOCATION";
2004
        penv    "GBE_DM_USERNAME";
2005
        penv    "GBE_DM_PASSWORD";
2006
        penv    "GBE_DM_URL";
2007
    }
297 dpurdie 2008
 
2009
    if ( $GBE_VERBOSE || $ENV{GBE_SVN_URL} )
2010
    {
2011
        print "\nSubVersion (Experimental)\n";
2012
        penv    "GBE_SVN_PATH";
2013
        penv    "GBE_SVN_URL";
2014
        penv    "GBE_SVN_USERNAME";
2015
        penv    "GBE_SVN_PASSWORD";
2016
    }
227 dpurdie 2017
 
2018
    if ( $GBE_VERBOSE && ! $GBE_UNIX)
2019
    {
2020
        print "\nWindows Environment\n";
2021
        denv  "TEMP";
2022
        denv  "TMP";
2023
 
2024
        print "\nMicrosoft Studio Variables\n";
2025
        denv  "PROGRAMFILES";
2026
        denv  "WINDIR";
2027
        denv  "MSVCDir";
2028
 
2029
        print "\nMicroTec Compiler Variables\n";
2030
        denv "MRI_68K";
2031
        denv "MRI_CF";
2032
        denv "VISIONCLICK";
2033
 
2034
        print "\nPCLint Variables\n";
2035
        denv "PCLINT";
2036
        penv "LINTPACKAGE";
2037
    }
2038
}
2039
 
2040
#-------------------------------------------------------------------------------
2041
# Function        : do_exit
2042
#
2043
# Description     : Common exit point so that time information can be displayed
2044
#
2045
# Inputs          : Optional exit code
2046
#
2047
# Returns         :
2048
#
2049
sub do_exit
2050
{
2051
    my ($ecode) = @_;
2052
 
2053
    $RESULT = $ecode if ( $ecode );
2054
 
2055
    #..
2056
    #   Determine the runtime
2057
    #
2058
    if ( $opt_time )
2059
    {
2060
        my ($TIMEU, $TIMES) = times;
2061
        $TIMER = time - $TIMER;
2062
        my ($m, $s );
2063
 
2064
        $m = int($TIMER / 60);
2065
        $s = $TIMER - ($m * 60);
2066
 
2067
        Message ( "Times: Real: $m:$s, User: $TIMEU, System: $TIMES");
2068
    }
2069
    #.
2070
    #   Make sure that any important exit code is passed to the user
2071
    #
2072
    Verbose ("ExitCode: $RESULT");
2073
    exit $RESULT;
2074
}
2075
 
2076
########################################################################
2077
#
2078
#   Main body of the script
2079
#
2080
#   Process help and manual options
2081
#       Done after all the setup to ensure that the PATH is correct
2082
#       Done before bombout to give user a chance
2083
#
2084
help() if $opt_help;
2085
ErrorDoExit();  # Exit if any error in setup
2086
ErrorConfig( 'on_exit'    => \&do_exit );
2087
 
2088
#
231 dpurdie 2089
#   Reset operational flags.
2090
#   May have been used by setup
2091
#
2092
$opr_done = 0;
2093
$RESULT = 0;
2094
 
2095
#
227 dpurdie 2096
#   Process user commands
2097
#
263 dpurdie 2098
my $cmd = shift @ARGV || help(1);
227 dpurdie 2099
 
263 dpurdie 2100
help(1)                                 if ( $cmd =~ m/^help$/);
227 dpurdie 2101
dump_vars(@ARGV)                        if ( $cmd =~ m/^var/ );
2102
print_version(@ARGV)                    if ( $cmd =~ m/^ver/ );
2103
 
2104
clobber                                 if ( $cmd =~ m/^clobber$/ );
2105
build    (@ARGV)                        if ( $cmd =~ m/^build$/ );
2106
 
2107
bmake_it ('NOTALL', @ARGV)              if ( $cmd =~ m/^[x]*make$/ );
2108
bmake_it (@ARGV)                        if ( $cmd =~ m/^go$/ );
2109
bmake_it (dev_expand('debug', @ARGV) )  if ( $cmd =~ m/^debug$/ );
2110
bmake_it (dev_expand('prod', @ARGV) )   if ( $cmd =~ m/^prod$/ );
2111
bmake_it ("clean", @ARGV)               if ( $cmd =~ m/^clean$/ );
2112
bmake_it ("rebuild", @ARGV)             if ( $cmd =~ m/^rebuild$/ );
2113
bmake_it ('BUILD', @ARGV)               if ( $cmd =~ m/^all$/ );
2114
bmake_it ($cmd, @ARGV )                 if ( $cmd =~ m/^run_unit_tests/ );
2115
 
2116
install_pkg(@ARGV)                      if ( $cmd =~ m/^install$/ );
2117
create_dpkg(@ARGV)                      if ( $cmd =~ m/^create_dpkg$/ );
2118
 
2119
ebin  (@ARGV)                           if ( $cmd =~ m/^ebin/ );
2120
etool (@ARGV)                           if ( $cmd =~ m/^etool/ );
2121
eprog (@ARGV)                           if ( $cmd =~ m/^eprog$/ );
2122
run_ant (@ARGV)                         if ( $cmd =~ m/^ant$/ );
2123
run_abt (@ARGV)                         if ( $cmd =~ m/^abt$/ );
2124
 
299 dpurdie 2125
etool ('cache_dpkg', @ARGV)                         if ( $cmd =~ m/^dpkg/ );
2126
etool ('gen_msprojects', @ARGV)                     if ( $cmd =~ m/^gen_msproject/ );
2127
etool ('jats_ccrelease.pl', @ARGV)                  if ( $cmd =~ m/^cbuild/ );
2128
etool ('jats_ccrelease.pl', @ARGV)                  if ( $cmd =~ m/^release/ );
2129
etool ('jats_ccrelease.pl', '-extractfiles' ,@ARGV) if ( $cmd =~ m/^extractf/ );
2130
etool ('jats_ccrelease.pl', '-extract' ,@ARGV)      if (!$opr_done && $cmd =~ m/^extract/ );
2131
etool ('jats_label', @ARGV)                         if ( $cmd =~ m/^label$/ );
2132
etool ('jats_sandbox', @ARGV)                       if ( $cmd =~ m/^sandbox$/ );
227 dpurdie 2133
 
2134
etool ($cmd, @ARGV)                     unless ($opr_done); # Pass to etool if not known
2135
 
2136
do_exit();
2137
#.
2138
 
2139
#-------------------------------------------------------------------------------
2140
#   Documentation
2141
#
2142
 
2143
=pod
2144
 
2145
=head1 NAME
2146
 
2147
jats - JATS utility interface tool
2148
 
2149
=head1 SYNOPSIS
2150
 
277 dpurdie 2151
 Usage: jats [opts] command [cmd-options]
227 dpurdie 2152
 
2153
 Where opts:
261 dpurdie 2154
    -h, -h -h, -man=[n] - Help messages with increasing verbosity
227 dpurdie 2155
    -cd dir             - Change to specified directory
2156
    -b file             - Use alternate build file
261 dpurdie 2157
    -verbose[=n]        - Verbose operation
2158
    -debug[=n]          - Enable debug mode of JATS scripts
227 dpurdie 2159
    -here               - Disable JATS auto locate of build.pl
2160
    -locate             - Locate build.pl file and change to directory
245 dpurdie 2161
    -locatepkg=pkg      - Locate build.pl. Resolve multiple files via pkg
227 dpurdie 2162
    -locatefile=file    - Locate specified file and change to directory
2163
    -platform=[name]    - Set GBE_PLATFORM to name   (=+ to append)
2164
    -buildfilter=[xxx]  - Set GBE_BUILDFILTER to xxx (=+ to append)
2165
    -abt=[xxx]          - Set GBE_ABT to xxx (=+ to append)
2166
    -java=version       - Alters java version used (1.4, 1.5)
2167
    -time               - Time build and compile times
2168
    -version=xxx        - Use specified version of JATS
277 dpurdie 2169
    -[no]exportvars     - Export sanitised JATS EnvVars (default)
227 dpurdie 2170
 
2171
 Where command is one of:
2172
    build               - Rebuild the sandbox and makefiles
2173
    make                - Make one or more components
2174
    ant                 - Invoke an ant build
2175
    abt [-java=xxx]     - Invoke the auto build tool
2176
    install             - Install package into local_dpkg_archive
2177
    help                - Display help message
2178
    vars                - Display JATS related environment variables
2179
 
2180
    create_dpkg         - Install a package into main dpkg_archive
2181
    label               - Labelling functions
2182
    release             - Build a release from a clearcase label
2183
    extract             - Extract a release from a clearcase label
2184
    dpkg_cache          - Maintain a dpkg cache
2185
    gen_msproject       - Generate MSVC project files
299 dpurdie 2186
    sandbox             - Run Sanbox utility
2187
 
227 dpurdie 2188
    etool name          - Run internal tool
2189
    eprog name          - Run external tool
2190
    ebin name           - Run JATS binary tool
2191
 
2192
 Shortcut commands. Composites of basic commands
2193
    all [opt]           - Same as a "build" and "make all"
2194
    go  [opt]           - Same as a "make all"
2195
    debug [tgt]         - Same as "make debug package_debug"
2196
    prod  [tgt]         - Same as "make prod package_prod"
2197
    clean               - Same as "make clean"
2198
    clobber             - Same as "build clobber"
2199
    *                   - Unknown commands are treated as arguments to etool
2200
 
2201
 Where [cmd-options] are command specific.
2202
 Try "jats command -help" for details
2203
 
2204
=head1 OPTIONS
2205
 
2206
=over 8
2207
 
2208
=item B<-help>
2209
 
2210
Print a brief help message and exits.
2211
 
2212
=item B<-help -help>
2213
 
2214
Print a detailed help message with an explanation for each option.
2215
 
261 dpurdie 2216
=item B<-man[=n]>
227 dpurdie 2217
 
2218
Prints the manual page and exits.
2219
 
261 dpurdie 2220
If a numeric manual level is provide then it will be used to control the
2221
verbosity of help provided. This should be inthe range of 1 to 3.
2222
 
227 dpurdie 2223
=item B<-b file> B<-buildfile file>
2224
 
2225
This option modifies the operation of the "build" command. The command will
2226
use the specified file instead of the normal build.pl file.
2227
 
2228
=item B<-cd dir> B<-changedir dir>
2229
 
2230
This option will change to specified directory before the command is invoked.
2231
 
261 dpurdie 2232
=item B<--verbose[=n]>
227 dpurdie 2233
 
2234
This option will increase the level of verbosity of the JATS command and command
261 dpurdie 2235
invoked by the JATS shell.
227 dpurdie 2236
 
261 dpurdie 2237
If an argument is provided, then it will be used to set the level, otherwise the
2238
existing level will be incremented. This option may be specified multiple times.
227 dpurdie 2239
 
261 dpurdie 2240
=item B<-debug[=n]>
2241
 
227 dpurdie 2242
This option will increase the level of debug output of the JATS command and command
261 dpurdie 2243
invoked by the JATS shell.
227 dpurdie 2244
 
261 dpurdie 2245
If an argument is provided, then it will be used to set the level, otherwise the
2246
existing level will be incremented. This option may be specified multiple times.
2247
 
227 dpurdie 2248
=item B<-here>
2249
 
2250
This option will disable the "autolocate" mechanism of the JATS shell script.
2251
 
2252
By default JATS will "hunt" for a suitable "build.pl" or "makefile.pl" before
2253
executing a build or a make command. JATS will look in the following directories
2254
for a  suitable file. Under some conditions this mechanism is not useful.
2255
 
2256
By default JATS will hunt in the following directories: "." "jats" "build/
2257
jats" ".." "../.." and "../../..".
2258
 
2259
=item B<-locate>
2260
 
2261
This option will cause the JATS wrapper script to locate the build.pl file and
2262
then change to that directory. This allows users to locate the build root of
2263
a project and then issue other JATS commands.
2264
 
2265
If the B<-c> option is also specified then searching will start in the specified
2266
directory.
2267
 
2268
If an alternate build file is specified with the B<-b> option then that filename
2269
will be used in the location process.
2270
 
2271
This option implies a B<-here>. No further scanning will be done.
2272
 
2273
Exactly one build file must be located. If more than buildfile is located then
2274
the locations of the build files is displayed and JATS will terminate.
2275
 
245 dpurdie 2276
 
2277
=item B<-locatepkg=packagename>
2278
 
2279
This option is similar to the B<-locate> option, but it allows the required
2280
build files to be located by ensuring that the required buildfile builds the
2281
specified package.
2282
 
2283
There are two forms in which the B<packagename> can be specified. It can be
2284
specified as a full package name and vesrion, or as a package name and the
2285
project suffix. ie: jats-api.1.0.0000.cr or jats-api.cr
2286
 
227 dpurdie 2287
=item B<-locatefile=file>
2288
 
2289
This option is similar to the B<-locate> option, but it allows the name of the
2290
file to be located to be specified.
2291
 
2292
=item B<-platform=[name]>
2293
 
2294
This option will set the JATS specific environment variable GBE_PLATFORM to
2295
the specified name. The existing value of GBE_PLATFORM may be extended by
2296
using "=+".
2297
 
2298
In practice the GBE_PLATFORM variable is of little use. The same effect can be
2299
achieved directly with make targets or with GBE_BUILDFILTER.
2300
 
2301
=item B<-buildfilter=[xxx]>
2302
 
2303
This option will set the JATS specific environment variable GBE_BUILDFILTER to
2304
the specified name. The existing value of GBE_BUILDFILTER may be extended by
2305
using "=+".
2306
 
2307
This option may be used to limit the initial build, and subsequent "make" to a
2308
limited set of platforms.
2309
 
2310
=item B<-abt=[xxx]>
2311
 
2312
This option will set the JATS specific environment variable GBE_ABT to
2313
the specified name The existing value of GBE_ABT may be extended by
2314
using "=+"..
2315
 
2316
This option is used to pass arguments directly to some tools within the
2317
(ABT) Auto Build Tool framework, or to indicate that the build is being
2318
performed within the ABT framework.
2319
 
2320
=item B<-java=version>
2321
 
2322
This option will override the default java version used by the ant builds and
2323
passed to the underlying programs. The path to the Java SDK is determined from
2324
the environment using the version string replacing the '.' with '_'
2325
 
2326
eg: -java=1.5, will examine the environment for JAVA_HOME_1_5 and will set
2327
JAVA_HOME to that value. It will not setup the users PATH or classpath.
2328
 
2329
=item B<-time>
2330
 
2331
When this option is enabled the JATS script will report the runtime of the
2332
underlying, invoked, command.
2333
 
2334
=item B<-version=xxx>
2335
 
2336
When this option is invoked JATS will attempt to use the specified version to
2337
perform all processing. JATS will search the GBE_DPKG_LOCAL, GBE_DPKG_CACHE,
2338
GBE_DPKG, GBE_DPKG_STORE in order to locate the specified version of the package.
2339
 
2340
The entire command line will be passed to the JATS wrapper script within that
2341
version. This bypasses the jats.bat or jats.sh startup scripts.
2342
 
277 dpurdie 2343
JATS will attempt to transfer the target version to the local cache in an
2344
attempt to improve performance.
227 dpurdie 2345
 
277 dpurdie 2346
=item B<-[no]exportvars>
227 dpurdie 2347
 
277 dpurdie 2348
The default operation is to export sanitised and calculated values to the
2349
programs running under JATS. The use of NoExportVars will prevent JATS from
2350
exporting modified EnvVars into the environment. This may be required by
2351
processes, such as the build daemons that need to pick up the current version of
2352
JATS on the fly and not have it fixed when the daemon is started.
227 dpurdie 2353
 
2354
=back
2355
 
2356
=head1 ARGUMENTS
2357
 
2358
=head2 Basic Commands
2359
 
2360
The following commands are invoked directly by the JATS script to wrap the build
2361
tools in a controlled manner.
2362
 
2363
=over 8
2364
 
2365
=item B<build>
2366
 
2367
Build or rebuild the sandbox and makefiles.
2368
 
2369
This command must be used before the component can be "made" and when the
2370
contents of the "buildpl" file change. It is a common mistake to use the "build"
2371
command to much.
2372
 
2373
The script will hunt for a suitable build.pl file before running the build and
2374
make subcommands.
2375
 
2376
The build process has a large number of options. Use "JATS build help" to
2377
display the complete list.
2378
 
2379
=item B<make>
2380
 
2381
Make one or more components
2382
 
2383
This command will invoke a suitable "make" program on the makefile found in
2384
the current directory. This makefile should have been generated by JATS.
2385
 
2386
The make process has a large number of options. Use "JATS make help" to
2387
display the complete list.
2388
 
2389
=item B<ant>
2390
 
2391
This command will use ANT to build a component. JATS will determine the
2392
build.xml file to use with the following algorithm.
2393
 
2394
    If the files called <Project>depends.xml and <Project>.xml exist then JATS
2395
    will create an 'auto.xml' from the depends file, if one does not already
2396
    exist or is older than the depends.xml file and then use the <Project>.xml
2397
    file as the ant build file.
2398
 
2399
    Otherwise ant is invoked and it will expect a build.xml file.
2400
 
2401
If multiple <Project>depends.xml and <Project>.xml file pairs are found the
2402
command will fail. This can be resolved through the use of the -buildfile=name
2403
option.
2404
 
2405
Ant is invoked with the version of Java specified with the -Java=x.x option.
2406
 
2407
=item B<abt>
2408
 
2409
This command is used to invoke the Auto Build Tool. It will invoke ANT on the
2410
build.xml file in the current directory in such  manner as to not affect the
239 dpurdie 2411
environment of the programs running under ANT.
227 dpurdie 2412
 
245 dpurdie 2413
The remained of the command line is passed to the ABT, with the exception of
239 dpurdie 2414
the options:
2415
 
2416
=over 8
2417
 
2418
=item * -java=x.x. This is used to control the version of Java used by the
227 dpurdie 2419
ABT. The default is 1.5.
2420
 
239 dpurdie 2421
=item * -buildfile=name. This is used to provide a different build file to ant.
2422
The default build file is 'build.xml'.
2423
 
2424
=back
2425
 
227 dpurdie 2426
=item B<install>
2427
 
2428
This command will install a generated "package" into the local_dpkg_archive
2429
directory. This allows a group of packages to be tested before being published
2430
into the global dpkg_archive.
2431
 
2432
NOTE. This command is no longer needed. The "build" process will place a
2433
shortcut in the local_dpkg_archive to a components "pkg" directory. Other
2434
components will utilize this shortcut directly and pickup the package without
2435
the user needing to "install" the package - a step that can be forgotten.
2436
 
2437
=item B<help>
2438
 
2439
Display the basic help message.
2440
 
2441
=item B<vars [-v]>
2442
 
2443
This command will display all the JATS related environment variables in a
2444
readable form.
2445
 
2446
Additional information will be displayed if an argument of "-v" is provided.
2447
 
2448
=back
2449
 
2450
=head2 Extended Commands
2451
 
2452
The following commands support the build environment. They are supplemental to
2453
the build environment. They are implemented as extensions to the basic JATS
2454
command scripts.
2455
 
2456
=over 8
2457
 
2458
=item B<create_dpkg>
2459
 
2460
This command will install a generated package into main dpkg_archive. This
2461
command should not be used directly by a user as it does not ensure that package
2462
has been created in a repeatable manner - use "jats release".
2463
 
2464
=item B<label>
2465
 
2466
This command provides a number of useful labelling mechanisms to assist in the
2467
labeling of source code.
2468
 
2469
=item B<release>, B<cbuild>
2470
 
2471
This command allows a package to be built and released, given a Clearcase label.
2472
This is the desired release mechanism.
2473
 
2474
The command has two main uses:
2475
 
2476
=over 8
2477
 
2478
=item 1
2479
 
2480
Build a package for release. The process will ensure that the build is
2481
controlled and repeatable.
2482
 
2483
=item 2
2484
 
2485
Rebuild a package for test or debugging purposes.
2486
 
2487
=back
2488
 
2489
=item B<extract>
2490
 
2491
This is the same as "release -extract"
2492
 
2493
 
2494
=item B<dpkg_cache>
2495
 
2496
This utility provides a number of commands to maintain the local cache of
245 dpurdie 2497
dpkg_archive.
227 dpurdie 2498
 
2499
=item B<gen_msproject>
2500
 
2501
This utility will generate a set of Microsoft Studio (Version 6) project and
2502
workspace files to encapsulate the JATS build. The resultant project allows VS
2503
to be used as an editor, source browser, debugger and build tool. JATS is
2504
still used to perform the build.
2505
 
2506
=item B<etool name>
2507
 
2508
This command allows any JATS extension program to be run. The programs will by
2509
found in the JATS TOOLS directory.
2510
 
2511
=item B<eprog name>
2512
 
2513
This command allows any JATS extension program to be run.
2514
If the program end in .pl, then it will be run within a perl interpreter.
2515
If the program end in .jar, then it will be run under a java interpreter.
2516
 
2517
=item B<ebin name>
2518
 
2519
This command allows any JATS support program to be run. The programs will by
2520
found in the JATS BIN directory for the current platform. This command allows
2521
a user script to access many of the machine independent utilities in a simple
2522
manner.
2523
 
2524
Example: "JATS ebin ls" - will provide a "real" ls on all platforms.
2525
 
2526
Example: "JATS ebin sh" - will start up the shell used by make.
2527
 
2528
=back
2529
 
2530
=head2 Command Shortcuts
2531
 
2532
The following commands are user shortcuts to the basic commands. The are basic
2533
commands run in sequence.
2534
 
2535
=over 8
2536
 
2537
=item B<all [make_opts]>
2538
 
2539
This command is the same as running the command "build" and "make all".
2540
It will build a component with a single command.
2541
 
2542
If "make_opts" is not present then "make all" is used.
2543
 
2544
If "make_opts" is present then they are passed to the "make" command. In this
2545
manner is it possible to build a WIN32 component of package with a single
2546
command.
2547
 
2548
=item B<go [make_opts]>
2549
 
2550
This command is similar to the "all" shortcut, but it does not "build" the
2551
sandbox. It may be used where the sandbox has already been prepared.
2552
 
2553
=item B<debug [target]>
2554
 
2555
This command is the same as running "make debug package_debug". It will make and
2556
package all the debug components of a sandbox.
2557
 
2558
If any additional arguments are provided to the B<dev> command then they will be
2559
treated as make targets and the commands will be expanded to make and package
2560
the specified debug versions of the names platforms. Make options cannot be
2561
passed in this manner.
2562
 
2563
Example: "JATS dev GAK" will create and package the debug parts for the
2564
GAK_MOS68K and GAK_MOSCF.
2565
 
2566
=item B<prod [target]>
2567
 
2568
This command is the same as running "make prod package_prod". It will make and
2569
package all the debug components of a sandbox.
2570
 
2571
If any additional arguments are provided to the B<prod> command then they will be
2572
treated as make targets and the commands will be expanded to make and package
2573
the specified debug versions of the names platforms. Make options cannot be
2574
passed in this manner.
2575
 
2576
Example: "JATS prod GAK" will create and package the production parts for the
2577
GAK_MOS68K and GAK_MOSCF.
2578
 
2579
=item B<clean>
2580
 
2581
This is the same as "make clean".
2582
 
2583
=item B<clobber>
2584
 
2585
This is the same as "build clobber"
2586
 
2587
=item B<else>
2588
 
2589
Commands that are not known to the JATS wrapper script are passed to etool.
2590
 
2591
ie: "JATS xxxx" is is the same as "JATS etool xxxx".
2592
 
2593
=back
2594
 
2595
=head1 DESCRIPTION
2596
 
2597
JATS is a wrapper script. It provides:
2598
 
2599
=over 8
2600
 
2601
=item *
2602
 
2603
A controlled and satirized environment to all the build tools.
2604
 
2605
=item *
2606
 
2607
The same command interface on all supported machines: Windows, Solaris and
2608
Linux.
2609
 
2610
=item *
2611
 
2612
Provides a framework for extending the build environment toolset.
2613
 
2614
=back
2615
 
2616
=head1 Installation of the startup script
2617
 
2618
The JATS wrapper script is invoked via a machine specific script. This is B<JATS.
2619
BAT> under Windows and B<JATS.SH> under Unix platforms. The startup script
2620
contains sufficient information to startup the main, and common, JATS
2621
program. The script specifies the environment on the machine and should not
2622
affect the target build environment. It also isolates the JATS version changes
2623
from the user.
2624
 
2625
This script is intended to be user configured. It should be copied into the
2626
users path and modified. It is intended that the script will not change from
2627
version to version of JATS.
2628
 
2629
=head2  Environment variables
2630
 
255 dpurdie 2631
Environmant varibales that specify a path may be set to '-', or 'none' in order
2632
to force an undefined path.
2633
 
227 dpurdie 2634
=over 8
2635
 
2636
=item GBE_MACHTYPE
2637
 
2638
This specifies the machine that the script is running on. This is fixed within
2639
the startup script.
2640
 
273 dpurdie 2641
=item GBE_HOSTMACH
2642
 
2643
This is a copy of GBE_MACHTYPE.
2644
Unlike GBE_MACHTYPE, this copy is not modified by makefiles.
2645
 
227 dpurdie 2646
=item GBE_PERL
2647
 
2648
This specifies the full path the to B<ActiveState> perl binary.
2649
 
2650
=item GBE_CORE
2651
 
2652
This specifies the path the to B<JATS> installation.
2653
 
2654
=item GBE_CACHE_JATS
2655
 
2656
When set to a non zero value will force JATS to transfer a working copy to the
2657
local dpkg_archive. This will speed up the build process because the utilities
2658
will be run from a local drive; not a network drive.
2659
 
2660
This will only operate if JATS is run from dpkg_archive.
2661
 
2662
=item GBE_DPKG_STORE (optional)
2663
 
2664
This is the global read-only archive store. It will only be used to source
2665
packages after all other archive stores have been examined. The GBE_DPKG_STORE
2666
is intended to provide a read-only or remote repository within a global
2667
environment.
2668
 
2669
=item GBE_DPKG
2670
 
2671
This is the official archive. Some tools will publish packages directly to this
2672
archive.
2673
 
2674
=item GBE_DPKG_CACHE (optional)
2675
 
2676
This the path to a local package archive cache. This is used to speed access to
2677
main repository. The cache should be on the users local machine and not a network
2678
drive.
2679
 
2680
=item GBE_DPKG_LOCAL (optional)
2681
 
2682
This the path to a group wide local package archive. This may be used to store
2683
non-official packages that are under test or development.
2684
 
2685
=item GBE_DPKG_SBOX (optional)
2686
 
2687
This the path to a sandbox specific package archive. This may be used to store
2688
non-official packages that are under test or development within the current sandbox.
2689
 
2690
The archive is located by searching from the current directory to the root of
2691
the filesystem for a directory called 'sandbox_dpkg_archive'.
2692
 
2693
It is intended that a group of packages that are being developed in the same
2694
sandbox will share the same sandbox_dpkg_archive.
2695
 
2696
Jats will ignore the version number when dealing with packages in GBE_DPKG_SBOX.
2697
This is done to simplify the publishing and consuming of packages in the sandbox.
2698
 
2699
This should not be set by a user. It will be calculated by JATS and passed to
245 dpurdie 2700
JATS tools and utilities.
227 dpurdie 2701
 
2702
=item GBE_SANDBOX (optional)
2703
 
2704
This the path to a sandbox base directory. It is intended that a group of
2705
packages that are being developed in the same sandbox will share the same
2706
sandbox_dpkg_archive.
2707
 
2708
This should not be set by a user. It will be calculated by JATS and passed to
245 dpurdie 2709
JATS tools and utilities.
227 dpurdie 2710
 
2711
=item GBE_DPLY (optional)
2712
 
2713
This the path to the deployment archive.
2714
This archive is NOT used when searching for packages, but it will be used when
2715
publishing special deployment package. This is not the norm.
2716
 
2717
This variable may be set on a per-project basis.
2718
 
2719
=item GBE_PLATFORM (deprecated)
2720
 
2721
This specifies the names of platforms that will be built and made. This should
2722
be empty. Use B<GBE_BUILDFILTER> to provide better control.
2723
 
2724
=item GBE_BUILDFILTER (desirable)
2725
 
2726
This is a filter string that specifies which platforms to create makefiles
2727
for. This variable is used to prevent JATS from creating Solaris and Linux
2728
targets on a Windows machine and visa-versa.
2729
 
2730
=item GBE_JATS_VERSION (optional)
2731
 
2732
Specifies the version of JATS that the user will use. This is the same as
2733
specifying the -version=xx.xx.xx option on the command line, but because it is
2734
in the environment the required version will be used by all invocations of JATS.
2735
 
2736
=item GBE_ABT (optional)
2737
 
2738
Used by the Auto Build Tool to indicate that the build is being performed by the
2739
ABT. When set the build environment will be modified to suite the ABT. Some
2740
operations may be relaxed.
2741
 
2742
=item GBE_VIEWBASE (optional)
2743
 
2744
Used by the 'release' utility to provide a user configurable base directory for
2745
the creation of static views.
2746
 
2747
=item GBE_RM_LOCATION (optional)
2748
 
2749
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
245 dpurdie 2750
Specifies the location of the Release Manager Database. This is a database url
227 dpurdie 2751
of the form jdbc:subprotocol:subname as used by java.sql.DriverManager.getConnection()
2752
 
2753
Example: jdbc:oracle:thin:@auperaora03:1521:RELEASEM
2754
 
2755
=item GBE_RM_USERNAME (optional)
2756
 
2757
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
2758
Specifies a USERNAME with access to the Release Manager Database.
2759
 
2760
=item GBE_RM_PASSWORD (optional)
2761
 
2762
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
2763
Specifies a PASSWORD to be used in conjunction with GBE_RM_USERNAME to access
2764
the Release Manager Database.
2765
 
2766
=item GBE_RM_URL (optional)
2767
 
2768
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
2769
Specifies the base URL of RElease Manager
2770
 
2771
=item GBE_DM_LOCATION (optional)
2772
 
2773
Similar to GBE_RM_LOCATION, but is used to access the Deployment Manager Database.
2774
If GBE_DM_LOCATION is not provided, then GBE_RM_LOCATION will be used.
2775
 
2776
=item GBE_DM_USERNAME (optional)
2777
 
2778
Similar to GBE_RM_USERNAME, but is used to access the Deployment Manager Database.
2779
 
2780
=item GBE_DM_PASSWORD (optional)
2781
 
2782
Similar to GBE_RM_PASSWORD, but is used to access the Deployment Manager Database.
2783
 
2784
=item GBE_DM_URL (optional)
2785
 
2786
Similar to GBE_DM_URL, but is used to access the Deployment Manager Database.
2787
 
297 dpurdie 2788
=item GBE_SVN_URL (optional)
2789
 
2790
Specifies the URL of the Subversion repository that can be used by some JATS
2791
commands. The URL should contain the protocol, the repository host and the path to
2792
the root of the the repository, but not the name of the repository. ie:
2793
 
2794
svn://auperaws996vm21
2795
 
2796
=item GBE_SVN_PATH (optional)
2797
 
2798
If provided this will be used to locate the 'svn' utility used by the SubVersion
2799
suport functions. If not provided, then the utilities assume that 'svn' is in the
2800
users PATH.
2801
 
2802
=item GBE_SVN_USERNAME (optional)
2803
 
2804
Subversion repository crediantials. If provided it will be used, otherwise the
2805
native svn credential mechanism will be used.
2806
 
2807
=item GBE_SVN_PASSWORD (optional)
2808
 
2809
Subversion repository crediantials. If provided it will be used, otherwise the
2810
native svn credential mechanism will be used.
2811
 
275 dpurdie 2812
=item GBE_MAKE_TYPE (internal)
2813
 
2814
This EnvVar is set when a Makefile is being procssed by 'make'. The value
2815
indicates the type of the build. It will be either P(Production), D(debug)
2816
or C(Common).
2817
 
2818
=item GBE_MAKE_TARGET (internal)
2819
 
2820
This EnvVar is set when a Makefile is being procssed by 'make'. The value
2821
is set current target platform name.
2822
 
2823
=item GBE_MAKE_CFG (internal)
2824
 
2825
This EnvVar is set when a Makefile is being procssed by 'make'. The value
285 dpurdie 2826
is set to the path of the parsed makefile.pl data gathered when the makefile
275 dpurdie 2827
was created.
2828
 
2829
=item GBE_MAKE_CMD (internal)
2830
 
2831
This EnvVar is set when a Makefile is being procssed by 'make'. The value
2832
is set current make command being processed.
2833
 
297 dpurdie 2834
=item GBE_HOSTNAME
279 dpurdie 2835
 
2836
This EnvVar is the name of the current host. It is available to be used within
2837
scripts that need to stamp build files.
2838
 
227 dpurdie 2839
=back
2840
 
2841
=head1  dpkg_archive
2842
 
2843
B<dpkg_archive> is the common package repository. This is on a shared network drive
2844
and as such affects the build speed. JATS supports three mechanisms to supplement
2845
dpkg_archive, as described below. The archive search order is:
2846
 
2847
=over
2848
 
2849
=item GBE_DPKG_LOCAL    (User local store)
2850
 
2851
=item GBE_DPKG_CACHE    (Machine local cache)
2852
 
2853
=item GBE_DPKG          (Site repository)
2854
 
2855
=item GBE_DPKG_STORE    (Global repository)
2856
 
2857
=back
2858
 
2859
=head2  local dpkg_archive
2860
 
2861
JATS supports a package archive that is local to a project or suite of build
2862
sandboxes. This is the archive used by the B<install> command.
2863
 
2864
The user does not have to do anything to access this archive. The archive is
2865
located by the JATS wrapper script by scanning up the directory tree for a
2866
directory called "local_dpkg_archive". If it is found then it is used as the
2867
preferred source for locating archives. This allows a component to be tested
2868
with a "local" or "fixed" version of another package, before an official
2869
release is made.
2870
 
2871
A local archive may be shared by members of a team by setting the environment
2872
variable B<GBE_DPKG_LOCAL> to the location of a shared drive.
2873
 
2874
=head2  dpkg_archive cache
2875
 
2876
JATS supports a package caching mechanism to reduce network utilization. If
2877
the user specified B<GBE_DPKG_CACHE> exists then that archive is treated as a
2878
cache archive. The various JATS tools work together to maintain the cache.
2879
 
2880
This cache must be setup by the user.
2881
 
2882
=head2  dpkg_archive store
2883
 
2884
JATS supports a global, read-only, package distribution mechanism. If
2885
the user specified B<GBE_DPKG_STORE> exists then that archive is treated as a
2886
global store. The store archive will be searched after all other archives.
2887
 
2888
A global store may be used by members of a global team, in a situation in
2889
which the store is rsync'ed from a central repository.
2890
 
2891
=head1 EXAMPLES
2892
 
2893
=over 8
2894
 
2895
=item   JATS build
2896
 
2897
This will prime the sandbox ready for "make". The command will locate the
2898
build.pl file and process it. This will locate all the external packages and
2899
generate the required makefiles.
2900
 
2901
=item   JATS make
2902
 
2903
This will run the GNU make program over the makefiles generated by the "build"
2904
command. This may be executed in a subdirectory in order to limit the targets
2905
that are "made".
2906
 
2907
B<NOTE:> Do not run "make" without using the JATS wrapper. It will not perform
2908
as expected as the environment will not have been set up correctly.
2909
 
2910
=back
2911
 
2912
=cut
2913