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
744
#
745
$USER = $ENV{ 'USERNAME' } || '' unless ( $USER );
746
$USER = $ENV{ 'LOGNAME' }  || '' unless ( $USER );
747
 
748
################################################################################
749
#   Sanitize the PATH variable
750
#   Some of the Win32 binary tools used by JATS cannot handle lower case Path
751
#   Force an upper case PATH
752
#
753
my $PATH = '';
754
$PATH .= delete( $ENV{ 'Path' } ) if (exists $ENV{ 'Path' });
755
$PATH .= delete( $ENV{ 'path' } ) if (exists $ENV{ 'path' });
756
$PATH .= delete( $ENV{ 'PATH' } ) if (exists $ENV{ 'PATH' });
277 dpurdie 757
$ENV{'PATH'} = $PATH;
227 dpurdie 758
 
759
#
760
#   Windows now defines ComSpec. This is only a problem when programs are
761
#   started up without the use of cmd.exe - like the JATS internal sh.exe
762
#   Correct by deleting the environment variable and forcing it to be uppercase
763
#
764
my $COMSPEC = '';
765
$COMSPEC = delete( $ENV{'COMSPEC'} ) if ( exists $ENV{'COMSPEC'} );
766
 
767
################################################################################
768
#   There is some really ugly interaction between Cygwin, ActiveState Perl 5.8.2
769
#   and xmake. Even if none of the cygwin bits are used within JATS the fact that
770
#   Cygwin is in the path causes problems.
771
#
772
#   Problems seen:
773
#       1) "jats build"     xmake fails with a segment fault. Possibly when
774
#                           displaying an error message
775
#       2) Warnings and messages generated from within Perl don't always appear
776
#          In particular. The output from a Message() within a PLATFORM/xxx file
777
#          does not get displayed.
778
#
779
#   Solution:
780
#       Remove cygwin from the PATH
781
#
782
$PATH =~ s~c:\\cygwin[^;]*;~~ig;
783
 
784
################################################################################
297 dpurdie 785
#   Setup the default JAVA_HOME
786
#   User should specify 1.4, 1.5,1.6 ....
787
#
788
$JAVA_HOME = get_java_home ($opt_java)
789
    if ( $opt_java );
790
PathPrepend ("$JAVA_HOME/bin")
791
    if ( -d $JAVA_HOME );
792
 
793
 
794
################################################################################
227 dpurdie 795
#   Ensure that the PATH contains the PERL executable
796
#   Need to true path to the PERL executable so that the user has access to some
797
#   of the perl utility programs such as pod2html
798
#
297 dpurdie 799
PathPrepend ($Config{binexp});
227 dpurdie 800
 
801
################################################################################
802
#   There is more ugliness if GBE_BIN is not in the users path
803
#   I suspect that it something within xmake (under win32) and that it needs
804
#   to be able to find sh within the path - even though its fully pathed
805
#
806
#   Add GBE_BIN to the start of the path to assist in searching
807
#   Also ensure that we pickup our version of utilities instead of random
808
#   versions.
809
#
297 dpurdie 810
PathPrepend ($GBE_BIN);
227 dpurdie 811
 
812
################################################################################
813
#   Clean PATH
814
#       Remove duplicates
815
#       Remove empty elements
816
#       Clean path endings
245 dpurdie 817
#       Place non-existent paths at the end. They will be seen, but not scanned
227 dpurdie 818
#
819
{
820
    my @new_path;
821
    my @non_exist;
822
    my %seen;
823
    foreach ( split $PSPLIT, $PATH )
824
    {
825
        s~[/\\]+$~~;                                # Remove trailing / or \
826
        my $name = ( $GBE_UNIX ) ? $_ : lc ($_);    # Windows is case insensitive
827
        next unless ( $_ );                         # Remove empty elements
828
        next if ( /^\.+$/ );                        # Remove . and ..
829
        next if ( exists $seen{$name} );            # Remove duplicates
830
        if ( -d $_ ) {
831
            push @new_path, $_;                     # Exists
832
        } else {
245 dpurdie 833
            push @non_exist, $_;                    # Place non existent paths at the end
227 dpurdie 834
        }
835
        $seen{$name} = 1;
836
    }
837
    $PATH = join( $PSPLIT, @new_path, @non_exist );
838
}
839
 
840
################################################################################
841
#   Windows: Ensure that cmd.exe is in the users PATH
842
#            If cmd.exe cannot be found then the 'system' command will not work
843
#
844
unless ( $GBE_UNIX )
845
{
846
    my $cmd_found;
847
    foreach ( split $PSPLIT, $PATH )
848
    {
849
        my $file = $_ . "/cmd.exe";
850
        Verbose2 ("Look for: $file");
851
        if ( -x $file  )
852
        {
853
            $cmd_found = 1;
854
            Verbose ("Found: $file");
855
            last;
856
        }
857
    }
858
 
859
    Warning( "Users PATH does not contain \"cmd.exe\"",
860
             "System commands may not work" ) unless $cmd_found;
861
}
862
 
863
################################################################################
864
#   Sanitize the Microsoft Visual Studio environment variables LIB and INCLUDE.
865
#   If these have a trailing \ then the generated makefiles
866
#   will fail. This is impossible to detect and fix within make so do it here
867
#
868
#   Note: JATS no longer allows these environment variables through to the
869
#         makefiles.
870
#
871
unless ( $GBE_UNIX )
872
{
873
    for my $var qw ( LIB INCLUDE )
874
    {
875
        my $evar = $ENV{$var};
876
        if ( $evar )
877
        {
878
            $evar =~ s~\\;~;~g;         # Remove trailing \ from components \; -> ;
879
            $evar =~ s~\\$~~;           # Remove trailing \
880
            $evar =~ s~;$~~;            # Remove trailing ;
881
            $evar =~ s~;;~;~g;          # Remove empty items ;;
882
            $ENV{$var} = $evar;
883
        }
884
    }
885
}
886
 
887
################################################################################
297 dpurdie 888
#   Update the environment variables used by JATS, unless requested otherwise.
227 dpurdie 889
#
277 dpurdie 890
#   If JATS is being used to startup build daemons, then we don't want to
891
#   export many of the calculated values into the environment. In particular
892
#   GBE_CORE, GBE_BIN, GBE_CONFIG and GBE_TOOLS must not be exported as it will
893
#   prevent the daemon from picking up the 'current' version of JATS
894
#
895
#
287 dpurdie 896
 
277 dpurdie 897
if ( $opt_export_vars )
898
{
899
    $ENV{'PATH'}              = $PATH;
900
    $ENV{'GBE_VERSION'}       = $GBE_VERSION;
901
    $ENV{'GBE_CORE'}          = $GBE_CORE;
902
    $ENV{'GBE_BIN'}           = $GBE_BIN;
903
    $ENV{'GBE_CONFIG'}        = $GBE_CONFIG;
904
    $ENV{'GBE_DPLY'}          = $GBE_DPLY;
905
    $ENV{'GBE_DPKG'}          = $GBE_DPKG;
906
    $ENV{'JATS_HOME'}         = $GBE_DPKG;
907
    $ENV{'GBE_DPKG_CACHE'}    = $GBE_DPKG_CACHE;
908
    $ENV{'GBE_DPKG_STORE'}    = $GBE_DPKG_STORE;
909
    $ENV{'GBE_DPKG_LOCAL'}    = $GBE_DPKG_LOCAL;
910
    $ENV{'GBE_SANDBOX'}       = $GBE_SANDBOX;
911
    $ENV{'GBE_DPKG_SBOX'}     = $GBE_DPKG_SBOX;
912
    $ENV{'GBE_PERL'}          = $GBE_PERL;
913
    $ENV{'GBE_TOOLS'}         = $GBE_TOOLS;
914
    $ENV{'GBE_MACHTYPE'}      = $GBE_MACHTYPE;
915
    $ENV{'GBE_HOSTMACH'}      = $GBE_HOSTMACH;
916
    $ENV{'GBE_PLATFORM'}      = $GBE_PLATFORM;
917
    $ENV{'GBE_DRV'}           = $GBE_DRV;
918
    $ENV{'PERL5LIB'}          = $PERL5LIB;
919
    $ENV{'JAVA_HOME'}         = $JAVA_HOME if ($JAVA_HOME);
920
    $ENV{'GBE_JATS_SANE'}     = 1;
921
}
287 dpurdie 922
else
923
{
924
    #
925
    #   Delete, from the environment, values that are related to selecting
926
    #   the version of JATS being used
927
    #
928
    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 ) )
929
    {
930
        delete $ENV{$_};
931
    }
932
}
277 dpurdie 933
 
934
#
935
#   The following don't affect the operation of the build daemons selecting
936
#   the current version of JATS. Some need to be passed through anyway
937
#
227 dpurdie 938
$ENV{'GBE_BUILDFILTER'}   = $GBE_BUILDFILTER;
277 dpurdie 939
$ENV{'GBE_ABT'}           = $GBE_ABT if ($GBE_ABT);
227 dpurdie 940
$ENV{'GBE_DEBUG'}         = $GBE_DEBUG;
941
$ENV{'GBE_VERBOSE'}       = $GBE_VERBOSE;
942
$ENV{'GBE_UNIX'}          = $GBE_UNIX;
943
$ENV{'USER'}              = $USER;
277 dpurdie 944
$ENV{'COMSPEC'}           = $COMSPEC;
279 dpurdie 945
$ENV{'GBE_HOSTNAME'}      = $GBE_HOSTNAME;
227 dpurdie 946
 
947
#-------------------------------------------------------------------------------
297 dpurdie 948
# Function        : PathPrepend
949
#
950
# Description     : Prepend stuff to the PATH
951
#
952
# Inputs          : Items to prepend
953
#
954
# Returns         : Nothing
955
#                   Modifies $PATH
956
#
957
sub PathPrepend
958
{
959
    foreach my $item( @_ )
960
    {
961
        $item =~ s~/~\\~g unless ( $GBE_UNIX );
962
        $PATH = $item . $PSPLIT . $PATH;
963
    }
964
}
965
 
966
#-------------------------------------------------------------------------------
229 dpurdie 967
# Function        : LocateJatsVersion
968
#
245 dpurdie 969
# Description     : Scan archives looking for a specified version of JATS
229 dpurdie 970
#                   Complicated by the name change from core_devl to jats
245 dpurdie 971
#                   that occurred circa version 2.71.7.
229 dpurdie 972
#                   The required version may be in either of the packages
973
#
974
# Inputs          : $version            - Version to locate
975
#
976
# Returns         : undef               - if not found
977
#                   Array of:
978
#                       Repository
979
#                       package/version
980
#
981
sub LocateJatsVersion
982
{
983
    my ($version) = @_;
984
    my $package;
985
    my $path;
986
 
987
    foreach my $archive qw ( GBE_DPKG_LOCAL GBE_DPKG_CACHE GBE_DPKG GBE_DPKG_STORE )
988
    {
989
        no strict 'refs';
990
        $path = ${$archive};
991
        use strict 'refs';
992
        next unless ( $path );
993
 
994
        foreach my $package qw( jats core_devl )
995
        {
996
            Verbose2( "ExamineDir: $path/$package/$version" );
997
            if ( -d "$path/$package/$version" )
998
            {
283 dpurdie 999
                return $path, "$package/$version";
229 dpurdie 1000
            }
1001
        }
1002
    }
283 dpurdie 1003
    return;
229 dpurdie 1004
}
1005
 
1006
 
1007
#-------------------------------------------------------------------------------
227 dpurdie 1008
# Function        : TestDirectoryConfig
1009
#
1010
# Description     : Sanity test a user configurable directory or file
1011
#                   Must not contain spaces
1012
#                   Must not be a network drive ie: //computer
1013
#
1014
# Inputs          :
1015
#
1016
# Returns         :
1017
#
1018
sub TestDirectoryConfig
1019
{
1020
    my ($dir) = @_;
1021
 
1022
    no strict 'refs';
1023
    my $val = ${$dir};
1024
 
1025
    if ( $val )
1026
    {
1027
        #
1028
        #   Cleanup the path
1029
        #
1030
        $val =~ tr~\\/~/~s;
1031
        $val =~ s~/+$~~;
255 dpurdie 1032
        $val = '' if ( $val eq '-' || $val eq 'none' );
227 dpurdie 1033
        ${$dir} = $val;
1034
 
1035
        ReportError("$dir path cannot contain spaces: $val") if ( $val =~ m/\s/ );
1036
        ReportError("$dir path cannot be a computer name: $val") if ( $val =~ m~^//~  );
1037
    }
1038
    use strict 'refs';
283 dpurdie 1039
    return;
227 dpurdie 1040
}
1041
 
1042
#-------------------------------------------------------------------------------
1043
# Function        : change_dir
1044
#
1045
# Description     : change directory to the specified directory
1046
#
1047
# Inputs          : $1      - Target directory
1048
#
1049
# Returns         :
1050
#
1051
sub change_dir
1052
{
1053
    my ($dir) = @_;
1054
 
1055
    if ( $dir && $dir !~ m/^\.$/ )
1056
    {
1057
        Verbose ("Changing to JATS build directory: $dir");
1058
        chdir $dir || Error ("Bad change directory: $dir");
1059
    }
1060
 
1061
    #
1062
    #   Reset the CWD
1063
    #   Note: Don't use `pwd`. This sucks for so many reasons including
1064
    #         the fact that it may not be available until this wrapper
1065
    #         script has done it job.
1066
    #
1067
    $CWD = getcwd();
1068
    $CWD =~tr~\\/~/~s;
1069
    Warning ("Current working directory contains spaces") if ( $CWD =~ m/\s/ );
283 dpurdie 1070
    return;
227 dpurdie 1071
}
1072
 
1073
#-------------------------------------------------------------------------------
277 dpurdie 1074
# Function        : scan_for_dir
1075
#
1076
# Description     : Scan from the current directory up to the root
1077
#                   of the current file system looking for a named
1078
#                   directory
1079
#
1080
# Inputs          : $target                 - Directory to locate
1081
#
1082
# Returns         : full_path               - Path of dir
1083
#                   full_dir                - Containng dir
1084
#
1085
 
1086
sub scan_for_dir
1087
{
1088
    my ($target) = @_;
1089
    Verbose2 ("Scan for $target");
1090
 
1091
    my $test_dir = $CWD;
1092
    {
1093
        do
1094
        {
1095
            #
1096
            #   Stop at /home to prevent unix automounter spitting
1097
            #   lots of error messages
1098
            #
1099
            last if ( $test_dir =~ m~/home$~ );
1100
            Verbose2 ("Testing: $test_dir");
1101
 
1102
            my $test_path = $test_dir . '/' . $target;
1103
            if ( -d $test_path )
1104
            {
1105
                Verbose ("Found $target: $test_path");
1106
                return $test_path, $test_dir;
1107
            }
1108
            #
1109
            #   Remove one directory
1110
            #   Terminate the loop when no more can be removed
1111
            #
1112
        } while ( $test_dir =~ s~[/][^/]*$~~ );
1113
    }
1114
    return '','';
1115
}
1116
 
1117
#-------------------------------------------------------------------------------
227 dpurdie 1118
# Function        : get_java_home
1119
#
1120
# Description     : Convert user java option into a full path,or die
1121
#
1122
# Inputs          : User option
1123
#
1124
# Returns         : Full path
1125
#
1126
sub get_java_home
1127
{
1128
    my ($java) = @_;
1129
    my $jv = "JAVA_HOME_$java";
1130
    $jv =~ s~\.~_~g;
1131
 
1132
    unless ( exists($ENV{$jv}) )
1133
    {
1134
        Error ("Unknown JAVA version: $java",
1135
               "Looking for EnvVar: $jv",
1136
               "Example Usage: -java=1.5");
1137
    }
1138
    my $rv = $ENV{$jv};
1139
    unless ( -d $rv )
1140
    {
1141
        Error ("Java home path not found: $jv",
1142
               "Looking for: $rv" );
1143
    }
1144
    return $rv;
1145
}
1146
 
1147
#-------------------------------------------------------------------------------
1148
# Function        : get_version
1149
#
1150
# Description     : Return the version of JATS being run
1151
#                   JATS should be run from a "package"
1152
#                   The package should have a descpkg file
1153
#                   Use this file
1154
#
1155
# Inputs          :
1156
#
1157
# Returns         : A string
1158
#
1159
sub get_version
1160
{
229 dpurdie 1161
    #
1162
    #   The version number is embedded into this script by the release process
1163
    #   The text [V]ERSION_TAG will be replaced by the real version number
245 dpurdie 1164
    #   If this has not occurred then we know that the release is not official
229 dpurdie 1165
    #   Need to be a little bit careful about the tag name
1166
    #
1167
    return ("Unreleased Version. Version tag has not been set")
1168
        if ( $GBE_NOT_RELEASED );
1169
 
227 dpurdie 1170
    return "$GBE_VERSION [ Internal. Not an installed package ]"
1171
        if ( ! -f "$GBE_CORE/descpkg" );
1172
 
1173
    my $rec;
1174
    return $rec->{'VERSION_FULL'}
1175
        if ($rec = ReadDescpkg ( "$GBE_CORE/descpkg" ) );
1176
 
1177
    return "ERROR";
1178
}
1179
 
1180
#-------------------------------------------------------------------------------
1181
# Function        : print_version
1182
#
1183
# Description     :
1184
#
1185
# Inputs          :
1186
#
1187
# Returns         :
1188
#
1189
sub print_version
1190
{
1191
    #
1192
    #   Allow user to specify verboseness as an argument
1193
    #
1194
    foreach  ( @_ )
1195
    {
1196
        $GBE_VERBOSE++ if ( m/^-v/ );
1197
    }
1198
 
1199
    Message get_version();
1200
    Message "Internal: $GBE_VERSION" if ($GBE_VERBOSE);
1201
    $opr_done = 1;
283 dpurdie 1202
    return;
227 dpurdie 1203
}
1204
 
1205
 
1206
#-------------------------------------------------------------------------------
1207
#
1208
#   Give the user a clue
1209
#
1210
sub help
1211
{
1212
    my ($level) = @_;
1213
    $level = $opt_help unless ( $level );
1214
 
1215
    pod2usage(-verbose => 0, -message => "Version: ". get_version())  if ($level == 1 );
261 dpurdie 1216
    pod2usage(-verbose => $level - 1 );
227 dpurdie 1217
}
1218
 
1219
#-------------------------------------------------------------------------------
1220
#
1221
#   Find a JATS build directory
1222
#   Find a JATS build directory based on file $1
1223
#
295 dpurdie 1224
#   Will 'cd' to the build directory
1225
#
227 dpurdie 1226
sub find_jats_dir
1227
{
1228
    #
1229
    #   Autodetect suppressed ?
1230
    #
1231
    return if ( $opt_here );
1232
 
1233
    my (@FILES) = @_;
1234
    push @FILES, @BUILD_FILE_ALT;
1235
 
1236
    my @SEARCH = qw( . .. ../.. ../../.. );
1237
 
1238
    #
1239
    #   Locate the JATS build files
1240
    #   Allow the user to be in a number of parent directories
1241
    #
1242
    for my $ROOTDIR (@SEARCH)
1243
    {
1244
        for my $SUBDIR ( '', '/jats', '/build', '/build/jats' )
1245
        {
1246
            my $DIR = $ROOTDIR . $SUBDIR;
1247
            next unless -d $DIR;
1248
 
283 dpurdie 1249
            for my $FILE ( @FILES)
227 dpurdie 1250
            {
1251
                my $check_file = $DIR . '/' . $FILE;
1252
                Verbose2 ("Check for: $check_file");
1253
                if ( -f $check_file )
1254
                {
1255
                    change_dir ( $DIR );
1256
                    Verbose2 ("Found: $check_file");
1257
                    return;
1258
                }
1259
            }
1260
        }
1261
    }
1262
    Error ("JATS directory not found. Cannot locate: @FILES");
1263
}
1264
 
1265
#-------------------------------------------------------------------------------
1266
#
295 dpurdie 1267
#   Determine the real build file to use
1268
#   Will select from a list of known build files.
227 dpurdie 1269
#
295 dpurdie 1270
sub getBuildFile
227 dpurdie 1271
{
1272
    my $build_file = $BUILD_FILE;
1273
    #
1274
    #   Use an alternative buildfile - if it exists
1275
    #   Do not use this file if the user has specified a buildfile
1276
    #
1277
    unless ( $BUILD_FILE_SET )
1278
    {
1279
        Verbose ("Search for alternate build file");
1280
        foreach my $test_file ( @BUILD_FILE_ALT )
1281
        {
1282
            Verbose2 ("Search for alternate build file: $test_file");
1283
            if ( -f $test_file )
1284
            {
1285
                $build_file = $test_file;
1286
                Message ("=== USING ALTERNATE BUILDFILE: $build_file ===");
1287
                last;
1288
            }
1289
        }
1290
    }
295 dpurdie 1291
   return $build_file;
1292
}
227 dpurdie 1293
 
295 dpurdie 1294
#-------------------------------------------------------------------------------
1295
#
1296
#   Kick off the build process
1297
#
1298
sub build
1299
{
1300
    my $build_file = $BUILD_FILE;
1301
    (my $name = $CWD) =~ s~^.*/~~ ;
1302
    $opr_done = 1;
1303
 
1304
    find_jats_dir($build_file);
1305
    Message ("=== Building $name ===");
1306
    $build_file = getBuildFile();
1307
 
227 dpurdie 1308
    #
1309
    #   Jats/make does not handle file systems with spaces in the path names
1310
    #
1311
    Error('$CWD path cannot contain spaces') if ( $CWD =~ m/\s/ );
1312
 
1313
    $RESULT = System ($GBE_PERL, $build_file, $CWD, "$GBE_TOOLS/buildlib.pl", "--project", @_ );
1314
 
283 dpurdie 1315
    Message ("=== Build $name NOT complete ===") if     ( $RESULT  );
1316
    Message ("=== Build $name complete ===")     unless ( $RESULT );
227 dpurdie 1317
    return $RESULT
1318
}
1319
 
1320
#-------------------------------------------------------------------------------
1321
# Function        : bmake_it
1322
#
1323
# Description     : Combo build and make operations
1324
#
1325
# Inputs          : ...     - COMMANDS or Make arguments.
1326
#                             Key commands are BUILD and INSTALL
1327
#
1328
# Returns         : RESULT code
1329
#
1330
sub bmake_it
1331
{
1332
    my @make_args = @_;
1333
    my $all = 1;
1334
    my $msg;
1335
    $opr_done = 1;
1336
 
1337
    if ( $make_args[0] && $make_args[0] eq 'NOTALL' )
1338
    {
1339
        $all = 0;
1340
        shift @make_args;
1341
    }
1342
    elsif ( $make_args[0] && $make_args[0] eq 'BUILD' )
1343
    {
1344
        Verbose ("Makeit build") ;
1345
        $msg = "Component not built";
1346
        build();
1347
        shift @make_args;
1348
    }
1349
 
1350
    unless ( $RESULT )
1351
    {
1352
        push @make_args, '-default=all' if ( $all );
1353
        Verbose ("Makeit make @make_args") ;
1354
 
1355
        find_jats_dir( "makefile.pl", "Makefile.gbe", $BUILD_FILE );
1356
        Error ("No Makefile.gbe file found") unless ( -f 'Makefile.gbe' );
1357
 
1358
        etool ( 'jmake.pl', @make_args );
1359
        $msg = "Component not made";
1360
        @make_args = ();
1361
    }
1362
 
1363
 
1364
    Verbose ("Makeit Result: $RESULT") ;
1365
    Error ( $msg ) if ( $RESULT );
1366
    return  if ( $RESULT );
1367
}
1368
 
1369
#-------------------------------------------------------------------------------
1370
# Function        : dev_expand
1371
#
1372
# Description     : Expand the users arguments to the "debug/prod" command
1373
#                   "debug/prod" builds and packages debug stuff
1374
#
1375
#                   Ignore make options.
1376
#
1377
# Inputs          : target
1378
#                   Argument list
1379
#
1380
# Returns         : expanded argument list
1381
#
1382
sub dev_expand
1383
{
1384
    my @resultd;
1385
    my @resultp;
1386
    my @args;
1387
    my @opts;
1388
 
1389
    #
1390
    #   Remove options from the argument list
1391
    #
1392
    foreach ( @_ )
1393
    {
1394
        if ( m~=~ || m~^-~ ) {
1395
            push @opts, $_;
1396
        } else {
1397
            push @args, $_;
1398
        }
1399
    }
1400
 
1401
    my $target = shift @args;
1402
    my @cmd = $target;
1403
    if ( $#args < 0 )
1404
    {
1405
        push @cmd, "package_$target";
1406
    }
1407
    else
1408
    {
1409
        foreach ( @args )
1410
        {
1411
            push @resultd, $_ . "_$target";
1412
            push @resultp, $_ . "_package_$target";
1413
            @cmd = ();
1414
        }
1415
    }
1416
 
1417
    return (@cmd, @resultd, @resultp, @opts);
1418
}
1419
 
1420
#-------------------------------------------------------------------------------
1421
# Function        : install_pkg
1422
#
1423
# Description     : Install the built package into local_dpkg_archive
1424
#                   This will make it available for use, without populating the
1425
#                   global archive
1426
#
1427
#                   This is done through an external utility to maintain
1428
#                   consistent interface
1429
#
1430
sub install_pkg
1431
{
1432
 
1433
    find_jats_dir($BUILD_FILE, "build.xml" );
1434
    etool ( 'create_dpkg.pl', '-archive=local', '-quiet', '-override',  @_ );
1435
}
1436
 
1437
#-------------------------------------------------------------------------------
1438
# Function        : create_dpkg
1439
#
1440
# Description     : Install a package into the main dpkg_archive
1441
#                   This is done through an external utility to maintain
1442
#                   consistent interface
1443
#
1444
#                   This function is simply an easy way to access the utility
1445
 
1446
sub create_dpkg
1447
{
1448
    find_jats_dir($BUILD_FILE, "build.xml" );
1449
    etool ( 'create_dpkg.pl',  @_ );
1450
}
1451
 
1452
#-------------------------------------------------------------------------------
1453
# Function        : etool
1454
#
1455
# Description     : Invoke an external tool program written in PERL
1456
#
1457
# Arguments       : $1  Name of the program to run
1458
#                       With optional .pl suffix
1459
#                   $2+ Program arguments
1460
#
1461
sub etool
1462
{
1463
    my $command = shift;
1464
    my $cmd;
1465
    my @etool_path = ( "$ENV{'GBE_TOOLS'}",
1466
                       "$ENV{'GBE_TOOLS'}/DEPLOY",
1467
                       "$ENV{'GBE_TOOLS'}/LOCAL" );
1468
    if ( $command )
1469
    {
1470
        #
1471
        #   Locate a potential tool
1472
        #   These will have the user name or a .pl extension
1473
        #
1474
        ETOOL_SEARCH:
1475
        foreach my $ext ( '', '.pl' )
1476
        {
1477
            foreach my $dir ( @etool_path )
1478
            {
297 dpurdie 1479
                $cmd = "$dir/jats_$command$ext";
1480
                last ETOOL_SEARCH if ( -f $cmd );
1481
 
227 dpurdie 1482
                $cmd = "$dir/$command$ext";
1483
                last ETOOL_SEARCH if ( -f $cmd );
1484
            }
1485
            $cmd='';
1486
        }
1487
 
1488
        Error ("Tool not found: $command", "Search path:", @etool_path) unless $cmd;
1489
        $RESULT = System ( $GBE_PERL, $cmd, @_ );
1490
    }
1491
    else
1492
    {
1493
        #
1494
        #   Display on the .pl commands
1495
        #
1496
        display_commands("Available Tools", \@etool_path, ['*.pl'] );
1497
    }
1498
 
1499
    $opr_done = 1;
1500
}
1501
 
1502
#-------------------------------------------------------------------------------
1503
# Function        : ebin
1504
#
1505
# Description     : Invoke an external JATS provided binary
1506
#                   within the JATS toolset
1507
#
1508
# Arguments       : $1  Name of the program to run
1509
#                   $2+ Program arguments
1510
#
1511
sub ebin
1512
{
1513
    my $command = shift;
1514
    my $cmd;
1515
    my @ebin_path = ( "$GBE_BIN" );
1516
 
1517
    if ( $command )
1518
    {
1519
        #
1520
        #   Locate a potential executable
1521
        #   This
1522
        #
1523
        ETOOL_SEARCH:
1524
        foreach my $ext ( '', '.exe', '.sh' )
1525
        {
1526
            foreach my $dir ( @ebin_path )
1527
            {
1528
                $cmd = "$dir/$command$ext";
1529
                last ETOOL_SEARCH if ( -f $cmd );
1530
            }
1531
            $cmd='';
1532
        }
1533
 
1534
        Error ("Program not found: $command", "Search path:", @ebin_path) unless $cmd;
1535
        $RESULT = System ( $cmd, @_ );
1536
    }
1537
    else
1538
    {
1539
        #
1540
        #   Display a list of programs
1541
        #
1542
        display_commands("Available Programs", \@ebin_path, ['*'] );
1543
    }
1544
 
1545
    $opr_done = 1;
1546
}
1547
 
1548
#-------------------------------------------------------------------------------
1549
# Function        : eprog
1550
#
1551
# Description     : Invoke an external program
1552
#                   Will detect local .pl files and execute them
1553
#                   Will detect local .jar files and execute them
229 dpurdie 1554
#                   Will detect local .bat files and execute them
227 dpurdie 1555
#
1556
# Arguments       : $1  Name of the program to run
1557
#                   $2+ Program arguments
1558
#
1559
sub eprog
1560
{
229 dpurdie 1561
    Verbose ("eprog: @_");
227 dpurdie 1562
    my $name = shift @_;
1563
    Error ("eprog. No program specified") unless ( $name );
1564
 
229 dpurdie 1565
    $name .= ".pl"     if ( -f "${name}.pl" );
1566
    $name .= ".jar"    if ( -f "${name}.jar" );
1567
    $name .= ".bat"    if ( -f "${name}.bat" );
227 dpurdie 1568
 
229 dpurdie 1569
    #
245 dpurdie 1570
    #   On Windows programs in the CWD will be found
1571
    #   Mimic this behaviour on Unix
229 dpurdie 1572
    #
1573
    $name = "./$name" if ( $name !~ m~/~ && -f "./$name");
1574
 
227 dpurdie 1575
    if ( $name =~ m~\.pl$~ ) {
1576
        $RESULT = System ( $GBE_PERL, $name, @_ );
1577
 
1578
    } elsif ( $name =~  m~\.jar$~ ) {
1579
        $RESULT = System ( "$JAVA_HOME/bin/java", '-jar', $name, @_);
1580
 
1581
    } else {
229 dpurdie 1582
        #
1583
        #   Ensure .bat files are pathed with \, and not / characters
1584
        #   The windows command interpreter does not like /
1585
        #
1586
        $name =~ s~/~\\~g if ( $name =~ m~\.bat$~ );
1587
 
227 dpurdie 1588
        $RESULT = System ( $name, @_ );
1589
    }
1590
 
1591
    $opr_done = 1;
1592
}
1593
 
1594
#-------------------------------------------------------------------------------
1595
# Function        : display_commands
1596
#
1597
# Description     : Display a list of commands from a specified list of dirs
1598
#                   Internal helper function
1599
#
1600
# Inputs          : $title      - Display header
1601
#                   $ref_path   - Ref to an array that contains the search path
1602
#                   $ref_ext    - Ref to an array of valid patterns
1603
#
1604
# Returns         : Nothing
1605
#
1606
sub display_commands
1607
{
1608
    my ( $title, $ref_path, $ref_ext ) = @_;
1609
 
1610
    #
1611
    #   Display a list of commands
1612
    #
1613
    my %list;
1614
    foreach ( @$ref_path )
1615
    {
1616
        foreach my $ext ( @$ref_ext )
1617
        {
1618
            foreach my $file (  glob( "$_/$ext") )
1619
            {
1620
                $file =~ s~.*/~~ unless $GBE_VERBOSE;
1621
                $list{$file} = 1;
1622
            }
1623
        }
1624
    }
1625
 
1626
    my $count = 0;
1627
    my $limit = $GBE_VERBOSE ? 1 : 3;
1628
    print "$title:\n";
1629
    foreach ( sort keys %list )
1630
    {
1631
        printf "%-26s", $_;
1632
        print "\n" if ( !( ++$count % $limit) );
1633
    }
1634
}
1635
 
1636
#-------------------------------------------------------------------------------
1637
# Function        : run_ant
1638
#
1639
# Description     : Invoke ant
1640
#                   If the current directory looks like an ERG build system, then
1641
#                   create and maintain an auto.xml file. Otherwise simply invoke ant
1642
#
1643
# Inputs          : $1+ program arguments
1644
#
1645
sub run_ant
1646
{
1647
    my $JAVA_HOME = $ENV{JAVA_HOME} || Error ("JAVA_HOME is not defined in the environment");
1648
    my $ANT_HOME  = $ENV{ANT_HOME}  || Error ("ANT_HOME is not defined in the environment" );
1649
 
1650
    #
1651
    #   Detect an ERG formatted build
1652
    #   This will have two files <projectname>.xml and <projectname>depends.xml
1653
    #   Create the 'auto.xml' file only if its not present
1654
    #
1655
    my @ant_arg;
1656
    my @flist;
1657
    my $basename = '';
235 dpurdie 1658
    my $scanner = '*depends.xml';
227 dpurdie 1659
 
1660
    #
1661
    #   Use specified build file to resolve multiple names
1662
    #   Strip any trailing depends.xml to make it user friendly
1663
    #
1664
    if ( $BUILD_FILE_SET )
1665
    {
1666
        $basename = $BUILD_FILE;
1667
        $basename =~ s~\.xml$~~;
1668
        $basename =~ s~depends$~~;
235 dpurdie 1669
        $scanner = "${basename}depends.xml";
227 dpurdie 1670
        Verbose ("Using buildfile: $basename");
1671
    }
1672
 
235 dpurdie 1673
    my @buildlist = glob($scanner);
227 dpurdie 1674
    foreach ( @buildlist )
1675
    {
1676
        if ( m/(.+)depends.xml/ )
1677
        {
1678
            my $pname = $1;
1679
            push @flist, $pname if ( -f "$pname.xml" );
1680
        }
1681
    }
1682
 
1683
    if ( $#flist >= 0 )
1684
    {
1685
        Error ("Multiple depends.xml files found:", @flist,
297 dpurdie 1686
               "Use 'jats -buildfile=name ant ...' to resolve") if ( $#flist > 0 );
227 dpurdie 1687
 
1688
        my $depend = "$flist[0]depends.xml";
1689
        @ant_arg = ('-f', "$flist[0].xml");
1690
 
1691
        Message ("Ant using projectfiles: $flist[0].xml");
1692
 
1693
        #
1694
        #   Check for depends.xml newer than auto.xml.
1695
        #
1696
        my $auto_timestamp   = (stat('auto.xml'))[9] || 0;
1697
        my $depend_timestamp = (stat($depend))[9];
1698
        if ( $depend_timestamp > $auto_timestamp )
1699
        {
1700
            Message ("Creating: auto.xml");
1701
            copy( $depend, 'auto.xml' );
1702
            chmod 0777, 'auto.xml';
1703
        }
1704
    }
1705
    elsif ( $BUILD_FILE_SET  )
1706
    {
1707
        Error ("Specified build file pair not found:", $basename, $basename . "depends.xml");
1708
    }
1709
 
1710
    #
1711
    #   The ant provided startup scripts don't return an exit code under
1712
    #   windows. Invoke ant directly
1713
    #
1714
    launch_ant ( $JAVA_HOME, $ANT_HOME, @ant_arg, @_ );
1715
    $opr_done = 1;
1716
}
1717
 
1718
#-------------------------------------------------------------------------------
1719
# Function        : run_abt
1720
#
1721
# Description     : Invoke auto build tool (older form)
1722
#                   Options for the ABT
1723
#                       --Java=x.x
1724
#                   Invoke ANT for the ABT using a specified version of Java
1725
#                   Do not play with the user environment.
297 dpurdie 1726
#                   Don't stick java path into environment
227 dpurdie 1727
#
1728
# Inputs          : $1+ program arguments
1729
#
1730
sub run_abt
1731
{
279 dpurdie 1732
    my $ABT_JAVA = 'JAVA_HOME_1_6';         # Default version for the ABT
227 dpurdie 1733
    my $JAVA_HOME = $ENV{$ABT_JAVA};
1734
    my $ANT_HOME  = $ENV{ANT_HOME};
1735
    my @abt_arg;
239 dpurdie 1736
    my $buildfile = 'build.xml';
227 dpurdie 1737
 
1738
    ErrorConfig( 'name'    => 'JATS ABT' );
1739
 
1740
    #
239 dpurdie 1741
    #   Use the user specified buildfile
1742
    #
1743
    $buildfile = $BUILD_FILE
1744
        if ( $BUILD_FILE_SET );
1745
 
1746
    #
227 dpurdie 1747
    #   Extract known options
1748
    #
1749
    foreach  ( @_ )
1750
    {
1751
        if ( m/-java=(.*)/ ) {
1752
            $JAVA_HOME = get_java_home($1);
239 dpurdie 1753
 
1754
        } elsif ( m/^-buildfile=(.+)/ ) {
1755
            $buildfile = $1;
1756
 
227 dpurdie 1757
        } else {
1758
            push @abt_arg, $_;
1759
        }
1760
    }
1761
 
1762
    Error ("$ABT_JAVA is not defined in the environment") unless $JAVA_HOME;
1763
    Error ("ANT_HOME is not defined in the environment" ) unless $ANT_HOME;
239 dpurdie 1764
    Error ("Ant buildfile not found: $buildfile" ) unless (-f $buildfile);
227 dpurdie 1765
 
1766
    #
239 dpurdie 1767
    #   Insert correct build file arguments
1768
    #
279 dpurdie 1769
    push @abt_arg, '-buildfile', $buildfile;
1770
 
1771
    #
1772
    #   Add current directory as java library directory, but only if
1773
    #   it contains JAR files.
1774
    #
1775
    push @abt_arg, '-lib', $CWD
1776
        if ( glob ('*.jar') );
239 dpurdie 1777
 
1778
    #
227 dpurdie 1779
    #   Use the ant-launcher to invoke ant directly
1780
    #
1781
    launch_ant ( $JAVA_HOME, $ANT_HOME, @abt_arg );
1782
    $opr_done = 1;
1783
}
1784
 
1785
#-------------------------------------------------------------------------------
1786
# Function        : launch_ant
1787
#
1788
# Description     : Start ANT - with sanity checking
1789
#
1790
# Inputs          : JAVA_HOME
1791
#                   ANT_HOME
1792
#                   @user_args
1793
#
1794
# Returns         : Result Code
1795
#
1796
sub launch_ant
1797
{
1798
    my ($JAVA_HOME, $ANT_HOME, @user_args ) = @_;
1799
 
1800
    Error ("Directory not found: $JAVA_HOME") unless ( -d "$JAVA_HOME" );
1801
    Error ("Program not found: $JAVA_HOME/bin/java") unless ( -e "$JAVA_HOME/bin/java" || -e "$JAVA_HOME/bin/java.exe" );
1802
    Error ("Jar not found: $ANT_HOME/lib/ant-launcher.jar") unless ( -e "$ANT_HOME/lib/ant-launcher.jar" );
1803
    Error ("Directory not found: $ANT_HOME") unless ( -d "$ANT_HOME" );
1804
    Error ("Directory not found: $ANT_HOME/lib") unless ( -d "$ANT_HOME/lib" );
1805
 
1806
    #
1807
    #   Use the ant-launcher to invoke ant directly
1808
    #
1809
    $RESULT = System ( "$JAVA_HOME/bin/java",
1810
                       "-classpath","$ANT_HOME/lib/ant-launcher.jar",
1811
                       "-Dant.home=$ANT_HOME",
1812
                       "org.apache.tools.ant.launch.Launcher",
1813
                       "-lib","$ANT_HOME/lib",
1814
                       @user_args
1815
                       );
1816
 
1817
   return $RESULT;
1818
}
1819
 
1820
 
1821
#-------------------------------------------------------------------------------
1822
#
1823
#   Cleanup the sandbox
1824
#   Perform a "make clobber" then a "build clobber"
1825
#
1826
sub clobber
1827
{
1828
    Message ("=== Removing ======");
1829
    find_jats_dir( $BUILD_FILE );
295 dpurdie 1830
    my $build_file = getBuildFile();
1831
 
227 dpurdie 1832
 
1833
    #
1834
    #   Run a "make clobber" to clean out "everything"
1835
    #
1836
    etool ( 'jmake.pl', 'clobber' )
1837
        if ( -f "Makefile.gbe" );
1838
 
295 dpurdie 1839
    if ( -f $build_file )
227 dpurdie 1840
    {
295 dpurdie 1841
        System ( $GBE_PERL, $build_file, $CWD, "$GBE_TOOLS/buildlib.pl", 'clobber' );
227 dpurdie 1842
    }
1843
    else
1844
    {
1845
        Error ("Cannot clobber. No buildfile found");
1846
    }
1847
 
1848
    Message ("=== Remove complete ===");
1849
    $opr_done = 1;
1850
}
1851
 
1852
#-------------------------------------------------------------------------------
1853
#
1854
#   Dumpout relevant parts of the environment
1855
#
1856
sub dump_vars
1857
{
1858
    $opr_done = 1;
1859
 
1860
    #
1861
    #   Allow user to specify verboseness as an argument
1862
    #
1863
    foreach  ( @_ )
1864
    {
1865
        $GBE_VERBOSE++ if ( m/^-v/ )
1866
    }
1867
 
1868
    #   Display an array separated list, one entry per line, with dir sanity check
1869
    sub alist
1870
    {
1871
        my ($text, @var) = @_;
1872
        my $sep = "=";
1873
        for ( @var )
1874
        {
1875
            my $valid = ( -d $_ || -f $_ ) ? " " : "*";
1876
            printf "%-17s%s%s%s\n", $text, $sep, $valid, $_;
1877
            $text = "";
1878
            $sep = " ";
1879
        }
1880
    }
1881
 
1882
    #   Display a ';' or ':' separated list, one entry per line
1883
    sub dlist
1884
    {
1885
        my ($text, $var) = @_;
1886
        alist( $text, split $PSPLIT, $var || " " );
1887
    }
1888
 
1889
    # Simple print of name and variable
1890
    sub pvar
1891
    {
1892
        my ($text, $data) = @_;
1893
        printf "%-17s= %s\n", $text, $data;
1894
    }
1895
 
1896
    # Print of name and variable of directory with sanity check
1897
    sub dvar
1898
    {
1899
        my ($text, $data) = @_;
1900
        my $valid = ( ! $data || -d $data || -f $data ) ? " " : "*";
1901
        printf "%-17s=%s%s\n", $text, $valid, $data;
1902
    }
1903
 
1904
    # Display a variable extracted from the environment
1905
    sub penv
1906
    {
1907
        my ($var) = @_;
1908
        pvar $var, $ENV{$var} || '';
1909
    }
1910
 
1911
    # Display a variable extracted from the environment with dir sanity check
1912
    sub denv
1913
    {
1914
        my ($var) = @_;
1915
        dvar $var, $ENV{$var} || '';
1916
    }
1917
 
1918
    #
1919
    #   Complete environment dump
1920
    #
1921
    if ( $GBE_VERBOSE > 1 )
1922
    {
1923
        Message ("Complete environment dump");
1924
        foreach my $var ( sort keys(%ENV) )
1925
        {
1926
            penv  $var;
1927
        }
1928
        return;
1929
    }
1930
 
1931
    pvar    "Version"         , get_version();
1932
    penv    "GBE_SCRIPT";
1933
    pvar    "GBE_DEBUG"       , $GBE_DEBUG;
1934
    pvar    "GBE_VERBOSE"     , $GBE_VERBOSE;
1935
    pvar    "GBE_MACHTYPE"    , $GBE_MACHTYPE;
273 dpurdie 1936
    pvar    "GBE_HOSTMACH"    , $GBE_HOSTMACH;
227 dpurdie 1937
    pvar    "GBE_UNIX"        , $GBE_UNIX;
1938
    pvar    "GBE_DRV"         , $GBE_DRV;
1939
    dvar    "GBE_PERL"        , $GBE_PERL;
1940
    dvar    "GBE_CORE"        , $GBE_CORE;
1941
    dvar    "GBE_BIN"         , $GBE_BIN;
1942
    dvar    "GBE_TOOLS"       , $GBE_TOOLS;
1943
    dvar    "GBE_CONFIG"      , $GBE_CONFIG;
1944
    penv    "GBE_CACHE_JATS";
1945
    dlist   "GBE_SANDBOX"     , $GBE_SANDBOX;
1946
    dlist   "GBE_DPKG_STORE"  , $GBE_DPKG_STORE;
1947
    dlist   "GBE_DPKG"        , $GBE_DPKG;
1948
    dlist   "GBE_DPKG_CACHE"  , $GBE_DPKG_CACHE;
1949
    dlist   "GBE_DPKG_LOCAL"  , $GBE_DPKG_LOCAL;
1950
    dlist   "GBE_DPKG_SBOX"   , $GBE_DPKG_SBOX;
1951
    dlist   "GBE_DPLY"        , $GBE_DPLY;
1952
    pvar    "GBE_PLATFORM"    , $GBE_PLATFORM;
1953
    pvar    "GBE_BUILDFILTER" , $GBE_BUILDFILTER;
1954
    pvar    "GBE_ABT"         , $GBE_ABT;
1955
 
1956
    denv    "GBE_VIEWBASE";
281 dpurdie 1957
    pvar    "GBE_HOSTNAME"    , $GBE_HOSTNAME;
227 dpurdie 1958
    dvar    "CWD"             , $CWD;
1959
    pvar    "BUILD_FILE"      , $BUILD_FILE;
1960
 
1961
    penv    "COMSPEC";
1962
    penv    "SHELL";
1963
    pvar    "USER"            , $USER;
1964
    dlist   "PATH"            , $PATH;
1965
 
1966
    #
1967
    #   Display variables used by various "known" toolsets
1968
    #   These do cause grief sometime, so only do it for verbose
1969
    #
1970
    if ( $GBE_VERBOSE )
1971
    {
1972
        print "\nPerl Environment\n";
1973
        pvar  "VERSION"         ,$];
1974
        penv  "PERL5SHELL";
1975
        penv  "PERL5OPT";
1976
        dlist "PERL5LIB"        ,$ENV{'PERL5LIB'};
1977
        alist "INC"             ,@INC;
1978
 
1979
        print "\nJava Environment\n";
283 dpurdie 1980
        foreach my $var ( sort grep ( {/^JAVA_HOME/ } keys %ENV) )
227 dpurdie 1981
        {
1982
            denv  $var;
1983
        }
1984
        denv  "ANT_HOME";
1985
        denv  "JATS_HOME";
1986
        dlist "CLASSPATH"       ,$ENV{'CLASSPATH'};
1987
    }
1988
 
1989
    if ( $GBE_VERBOSE || $GBE_ABT )
1990
    {
1991
        print "\nRelease Manager Environment\n";
1992
        penv    "GBE_RM_LOCATION";
1993
        penv    "GBE_RM_USERNAME";
1994
        penv    "GBE_RM_PASSWORD";
1995
        penv    "GBE_RM_URL";
1996
        penv    "GBE_DM_LOCATION";
1997
        penv    "GBE_DM_USERNAME";
1998
        penv    "GBE_DM_PASSWORD";
1999
        penv    "GBE_DM_URL";
2000
    }
297 dpurdie 2001
 
2002
    if ( $GBE_VERBOSE || $ENV{GBE_SVN_URL} )
2003
    {
2004
        print "\nSubVersion (Experimental)\n";
2005
        penv    "GBE_SVN_PATH";
2006
        penv    "GBE_SVN_URL";
2007
        penv    "GBE_SVN_USERNAME";
2008
        penv    "GBE_SVN_PASSWORD";
2009
    }
227 dpurdie 2010
 
2011
    if ( $GBE_VERBOSE && ! $GBE_UNIX)
2012
    {
2013
        print "\nWindows Environment\n";
2014
        denv  "TEMP";
2015
        denv  "TMP";
2016
 
2017
        print "\nMicrosoft Studio Variables\n";
2018
        denv  "PROGRAMFILES";
2019
        denv  "WINDIR";
2020
        denv  "MSVCDir";
2021
 
2022
        print "\nMicroTec Compiler Variables\n";
2023
        denv "MRI_68K";
2024
        denv "MRI_CF";
2025
        denv "VISIONCLICK";
2026
 
2027
        print "\nPCLint Variables\n";
2028
        denv "PCLINT";
2029
        penv "LINTPACKAGE";
2030
    }
2031
}
2032
 
2033
#-------------------------------------------------------------------------------
2034
# Function        : do_exit
2035
#
2036
# Description     : Common exit point so that time information can be displayed
2037
#
2038
# Inputs          : Optional exit code
2039
#
2040
# Returns         :
2041
#
2042
sub do_exit
2043
{
2044
    my ($ecode) = @_;
2045
 
2046
    $RESULT = $ecode if ( $ecode );
2047
 
2048
    #..
2049
    #   Determine the runtime
2050
    #
2051
    if ( $opt_time )
2052
    {
2053
        my ($TIMEU, $TIMES) = times;
2054
        $TIMER = time - $TIMER;
2055
        my ($m, $s );
2056
 
2057
        $m = int($TIMER / 60);
2058
        $s = $TIMER - ($m * 60);
2059
 
2060
        Message ( "Times: Real: $m:$s, User: $TIMEU, System: $TIMES");
2061
    }
2062
    #.
2063
    #   Make sure that any important exit code is passed to the user
2064
    #
2065
    Verbose ("ExitCode: $RESULT");
2066
    exit $RESULT;
2067
}
2068
 
2069
########################################################################
2070
#
2071
#   Main body of the script
2072
#
2073
#   Process help and manual options
2074
#       Done after all the setup to ensure that the PATH is correct
2075
#       Done before bombout to give user a chance
2076
#
2077
help() if $opt_help;
2078
ErrorDoExit();  # Exit if any error in setup
2079
ErrorConfig( 'on_exit'    => \&do_exit );
2080
 
2081
#
231 dpurdie 2082
#   Reset operational flags.
2083
#   May have been used by setup
2084
#
2085
$opr_done = 0;
2086
$RESULT = 0;
2087
 
2088
#
227 dpurdie 2089
#   Process user commands
2090
#
263 dpurdie 2091
my $cmd = shift @ARGV || help(1);
227 dpurdie 2092
 
263 dpurdie 2093
help(1)                                 if ( $cmd =~ m/^help$/);
227 dpurdie 2094
dump_vars(@ARGV)                        if ( $cmd =~ m/^var/ );
2095
print_version(@ARGV)                    if ( $cmd =~ m/^ver/ );
2096
 
2097
clobber                                 if ( $cmd =~ m/^clobber$/ );
2098
build    (@ARGV)                        if ( $cmd =~ m/^build$/ );
2099
 
2100
bmake_it ('NOTALL', @ARGV)              if ( $cmd =~ m/^[x]*make$/ );
2101
bmake_it (@ARGV)                        if ( $cmd =~ m/^go$/ );
2102
bmake_it (dev_expand('debug', @ARGV) )  if ( $cmd =~ m/^debug$/ );
2103
bmake_it (dev_expand('prod', @ARGV) )   if ( $cmd =~ m/^prod$/ );
2104
bmake_it ("clean", @ARGV)               if ( $cmd =~ m/^clean$/ );
2105
bmake_it ("rebuild", @ARGV)             if ( $cmd =~ m/^rebuild$/ );
2106
bmake_it ('BUILD', @ARGV)               if ( $cmd =~ m/^all$/ );
2107
bmake_it ($cmd, @ARGV )                 if ( $cmd =~ m/^run_unit_tests/ );
2108
 
2109
install_pkg(@ARGV)                      if ( $cmd =~ m/^install$/ );
2110
create_dpkg(@ARGV)                      if ( $cmd =~ m/^create_dpkg$/ );
2111
 
2112
ebin  (@ARGV)                           if ( $cmd =~ m/^ebin/ );
2113
etool (@ARGV)                           if ( $cmd =~ m/^etool/ );
2114
eprog (@ARGV)                           if ( $cmd =~ m/^eprog$/ );
2115
run_ant (@ARGV)                         if ( $cmd =~ m/^ant$/ );
2116
run_abt (@ARGV)                         if ( $cmd =~ m/^abt$/ );
2117
 
2118
etool ('cache_dpkg', @ARGV)                     if ( $cmd =~ m/^dpkg/ );
2119
etool ('gen_msprojects', @ARGV)                 if ( $cmd =~ m/^gen_msproject/ );
263 dpurdie 2120
etool ('jats_ccrelease.pl', @ARGV)              if ( $cmd =~ m/^cbuild/ );
2121
etool ('jats_ccrelease.pl', @ARGV)              if ( $cmd =~ m/^release/ );
2122
etool ('jats_ccrelease.pl', '-extract' ,@ARGV)  if ( $cmd =~ m/^extract/ );
227 dpurdie 2123
etool ('jats_label', @ARGV)                     if ( $cmd =~ m/^label$/ );
2124
etool ('jats_sandbox', @ARGV)                   if ( $cmd =~ m/^sandbox$/ );
2125
 
2126
etool ($cmd, @ARGV)                     unless ($opr_done); # Pass to etool if not known
2127
 
2128
do_exit();
2129
#.
2130
 
2131
#-------------------------------------------------------------------------------
2132
#   Documentation
2133
#
2134
 
2135
=pod
2136
 
2137
=head1 NAME
2138
 
2139
jats - JATS utility interface tool
2140
 
2141
=head1 SYNOPSIS
2142
 
277 dpurdie 2143
 Usage: jats [opts] command [cmd-options]
227 dpurdie 2144
 
2145
 Where opts:
261 dpurdie 2146
    -h, -h -h, -man=[n] - Help messages with increasing verbosity
227 dpurdie 2147
    -cd dir             - Change to specified directory
2148
    -b file             - Use alternate build file
261 dpurdie 2149
    -verbose[=n]        - Verbose operation
2150
    -debug[=n]          - Enable debug mode of JATS scripts
227 dpurdie 2151
    -here               - Disable JATS auto locate of build.pl
2152
    -locate             - Locate build.pl file and change to directory
245 dpurdie 2153
    -locatepkg=pkg      - Locate build.pl. Resolve multiple files via pkg
227 dpurdie 2154
    -locatefile=file    - Locate specified file and change to directory
2155
    -platform=[name]    - Set GBE_PLATFORM to name   (=+ to append)
2156
    -buildfilter=[xxx]  - Set GBE_BUILDFILTER to xxx (=+ to append)
2157
    -abt=[xxx]          - Set GBE_ABT to xxx (=+ to append)
2158
    -java=version       - Alters java version used (1.4, 1.5)
2159
    -time               - Time build and compile times
2160
    -version=xxx        - Use specified version of JATS
277 dpurdie 2161
    -[no]exportvars     - Export sanitised JATS EnvVars (default)
227 dpurdie 2162
 
2163
 Where command is one of:
2164
    build               - Rebuild the sandbox and makefiles
2165
    make                - Make one or more components
2166
    ant                 - Invoke an ant build
2167
    abt [-java=xxx]     - Invoke the auto build tool
2168
    install             - Install package into local_dpkg_archive
2169
    help                - Display help message
2170
    vars                - Display JATS related environment variables
2171
 
2172
    create_dpkg         - Install a package into main dpkg_archive
2173
    label               - Labelling functions
2174
    release             - Build a release from a clearcase label
2175
    extract             - Extract a release from a clearcase label
2176
    dpkg_cache          - Maintain a dpkg cache
2177
    gen_msproject       - Generate MSVC project files
2178
    etool name          - Run internal tool
2179
    eprog name          - Run external tool
2180
    ebin name           - Run JATS binary tool
2181
 
2182
 Shortcut commands. Composites of basic commands
2183
    all [opt]           - Same as a "build" and "make all"
2184
    go  [opt]           - Same as a "make all"
2185
    debug [tgt]         - Same as "make debug package_debug"
2186
    prod  [tgt]         - Same as "make prod package_prod"
2187
    clean               - Same as "make clean"
2188
    clobber             - Same as "build clobber"
2189
    *                   - Unknown commands are treated as arguments to etool
2190
 
2191
 Where [cmd-options] are command specific.
2192
 Try "jats command -help" for details
2193
 
2194
=head1 OPTIONS
2195
 
2196
=over 8
2197
 
2198
=item B<-help>
2199
 
2200
Print a brief help message and exits.
2201
 
2202
=item B<-help -help>
2203
 
2204
Print a detailed help message with an explanation for each option.
2205
 
261 dpurdie 2206
=item B<-man[=n]>
227 dpurdie 2207
 
2208
Prints the manual page and exits.
2209
 
261 dpurdie 2210
If a numeric manual level is provide then it will be used to control the
2211
verbosity of help provided. This should be inthe range of 1 to 3.
2212
 
227 dpurdie 2213
=item B<-b file> B<-buildfile file>
2214
 
2215
This option modifies the operation of the "build" command. The command will
2216
use the specified file instead of the normal build.pl file.
2217
 
2218
=item B<-cd dir> B<-changedir dir>
2219
 
2220
This option will change to specified directory before the command is invoked.
2221
 
261 dpurdie 2222
=item B<--verbose[=n]>
227 dpurdie 2223
 
2224
This option will increase the level of verbosity of the JATS command and command
261 dpurdie 2225
invoked by the JATS shell.
227 dpurdie 2226
 
261 dpurdie 2227
If an argument is provided, then it will be used to set the level, otherwise the
2228
existing level will be incremented. This option may be specified multiple times.
227 dpurdie 2229
 
261 dpurdie 2230
=item B<-debug[=n]>
2231
 
227 dpurdie 2232
This option will increase the level of debug output of the JATS command and command
261 dpurdie 2233
invoked by the JATS shell.
227 dpurdie 2234
 
261 dpurdie 2235
If an argument is provided, then it will be used to set the level, otherwise the
2236
existing level will be incremented. This option may be specified multiple times.
2237
 
227 dpurdie 2238
=item B<-here>
2239
 
2240
This option will disable the "autolocate" mechanism of the JATS shell script.
2241
 
2242
By default JATS will "hunt" for a suitable "build.pl" or "makefile.pl" before
2243
executing a build or a make command. JATS will look in the following directories
2244
for a  suitable file. Under some conditions this mechanism is not useful.
2245
 
2246
By default JATS will hunt in the following directories: "." "jats" "build/
2247
jats" ".." "../.." and "../../..".
2248
 
2249
=item B<-locate>
2250
 
2251
This option will cause the JATS wrapper script to locate the build.pl file and
2252
then change to that directory. This allows users to locate the build root of
2253
a project and then issue other JATS commands.
2254
 
2255
If the B<-c> option is also specified then searching will start in the specified
2256
directory.
2257
 
2258
If an alternate build file is specified with the B<-b> option then that filename
2259
will be used in the location process.
2260
 
2261
This option implies a B<-here>. No further scanning will be done.
2262
 
2263
Exactly one build file must be located. If more than buildfile is located then
2264
the locations of the build files is displayed and JATS will terminate.
2265
 
245 dpurdie 2266
 
2267
=item B<-locatepkg=packagename>
2268
 
2269
This option is similar to the B<-locate> option, but it allows the required
2270
build files to be located by ensuring that the required buildfile builds the
2271
specified package.
2272
 
2273
There are two forms in which the B<packagename> can be specified. It can be
2274
specified as a full package name and vesrion, or as a package name and the
2275
project suffix. ie: jats-api.1.0.0000.cr or jats-api.cr
2276
 
227 dpurdie 2277
=item B<-locatefile=file>
2278
 
2279
This option is similar to the B<-locate> option, but it allows the name of the
2280
file to be located to be specified.
2281
 
2282
=item B<-platform=[name]>
2283
 
2284
This option will set the JATS specific environment variable GBE_PLATFORM to
2285
the specified name. The existing value of GBE_PLATFORM may be extended by
2286
using "=+".
2287
 
2288
In practice the GBE_PLATFORM variable is of little use. The same effect can be
2289
achieved directly with make targets or with GBE_BUILDFILTER.
2290
 
2291
=item B<-buildfilter=[xxx]>
2292
 
2293
This option will set the JATS specific environment variable GBE_BUILDFILTER to
2294
the specified name. The existing value of GBE_BUILDFILTER may be extended by
2295
using "=+".
2296
 
2297
This option may be used to limit the initial build, and subsequent "make" to a
2298
limited set of platforms.
2299
 
2300
=item B<-abt=[xxx]>
2301
 
2302
This option will set the JATS specific environment variable GBE_ABT to
2303
the specified name The existing value of GBE_ABT may be extended by
2304
using "=+"..
2305
 
2306
This option is used to pass arguments directly to some tools within the
2307
(ABT) Auto Build Tool framework, or to indicate that the build is being
2308
performed within the ABT framework.
2309
 
2310
=item B<-java=version>
2311
 
2312
This option will override the default java version used by the ant builds and
2313
passed to the underlying programs. The path to the Java SDK is determined from
2314
the environment using the version string replacing the '.' with '_'
2315
 
2316
eg: -java=1.5, will examine the environment for JAVA_HOME_1_5 and will set
2317
JAVA_HOME to that value. It will not setup the users PATH or classpath.
2318
 
2319
=item B<-time>
2320
 
2321
When this option is enabled the JATS script will report the runtime of the
2322
underlying, invoked, command.
2323
 
2324
=item B<-version=xxx>
2325
 
2326
When this option is invoked JATS will attempt to use the specified version to
2327
perform all processing. JATS will search the GBE_DPKG_LOCAL, GBE_DPKG_CACHE,
2328
GBE_DPKG, GBE_DPKG_STORE in order to locate the specified version of the package.
2329
 
2330
The entire command line will be passed to the JATS wrapper script within that
2331
version. This bypasses the jats.bat or jats.sh startup scripts.
2332
 
277 dpurdie 2333
JATS will attempt to transfer the target version to the local cache in an
2334
attempt to improve performance.
227 dpurdie 2335
 
277 dpurdie 2336
=item B<-[no]exportvars>
227 dpurdie 2337
 
277 dpurdie 2338
The default operation is to export sanitised and calculated values to the
2339
programs running under JATS. The use of NoExportVars will prevent JATS from
2340
exporting modified EnvVars into the environment. This may be required by
2341
processes, such as the build daemons that need to pick up the current version of
2342
JATS on the fly and not have it fixed when the daemon is started.
227 dpurdie 2343
 
2344
=back
2345
 
2346
=head1 ARGUMENTS
2347
 
2348
=head2 Basic Commands
2349
 
2350
The following commands are invoked directly by the JATS script to wrap the build
2351
tools in a controlled manner.
2352
 
2353
=over 8
2354
 
2355
=item B<build>
2356
 
2357
Build or rebuild the sandbox and makefiles.
2358
 
2359
This command must be used before the component can be "made" and when the
2360
contents of the "buildpl" file change. It is a common mistake to use the "build"
2361
command to much.
2362
 
2363
The script will hunt for a suitable build.pl file before running the build and
2364
make subcommands.
2365
 
2366
The build process has a large number of options. Use "JATS build help" to
2367
display the complete list.
2368
 
2369
=item B<make>
2370
 
2371
Make one or more components
2372
 
2373
This command will invoke a suitable "make" program on the makefile found in
2374
the current directory. This makefile should have been generated by JATS.
2375
 
2376
The make process has a large number of options. Use "JATS make help" to
2377
display the complete list.
2378
 
2379
=item B<ant>
2380
 
2381
This command will use ANT to build a component. JATS will determine the
2382
build.xml file to use with the following algorithm.
2383
 
2384
    If the files called <Project>depends.xml and <Project>.xml exist then JATS
2385
    will create an 'auto.xml' from the depends file, if one does not already
2386
    exist or is older than the depends.xml file and then use the <Project>.xml
2387
    file as the ant build file.
2388
 
2389
    Otherwise ant is invoked and it will expect a build.xml file.
2390
 
2391
If multiple <Project>depends.xml and <Project>.xml file pairs are found the
2392
command will fail. This can be resolved through the use of the -buildfile=name
2393
option.
2394
 
2395
Ant is invoked with the version of Java specified with the -Java=x.x option.
2396
 
2397
=item B<abt>
2398
 
2399
This command is used to invoke the Auto Build Tool. It will invoke ANT on the
2400
build.xml file in the current directory in such  manner as to not affect the
239 dpurdie 2401
environment of the programs running under ANT.
227 dpurdie 2402
 
245 dpurdie 2403
The remained of the command line is passed to the ABT, with the exception of
239 dpurdie 2404
the options:
2405
 
2406
=over 8
2407
 
2408
=item * -java=x.x. This is used to control the version of Java used by the
227 dpurdie 2409
ABT. The default is 1.5.
2410
 
239 dpurdie 2411
=item * -buildfile=name. This is used to provide a different build file to ant.
2412
The default build file is 'build.xml'.
2413
 
2414
=back
2415
 
227 dpurdie 2416
=item B<install>
2417
 
2418
This command will install a generated "package" into the local_dpkg_archive
2419
directory. This allows a group of packages to be tested before being published
2420
into the global dpkg_archive.
2421
 
2422
NOTE. This command is no longer needed. The "build" process will place a
2423
shortcut in the local_dpkg_archive to a components "pkg" directory. Other
2424
components will utilize this shortcut directly and pickup the package without
2425
the user needing to "install" the package - a step that can be forgotten.
2426
 
2427
=item B<help>
2428
 
2429
Display the basic help message.
2430
 
2431
=item B<vars [-v]>
2432
 
2433
This command will display all the JATS related environment variables in a
2434
readable form.
2435
 
2436
Additional information will be displayed if an argument of "-v" is provided.
2437
 
2438
=back
2439
 
2440
=head2 Extended Commands
2441
 
2442
The following commands support the build environment. They are supplemental to
2443
the build environment. They are implemented as extensions to the basic JATS
2444
command scripts.
2445
 
2446
=over 8
2447
 
2448
=item B<create_dpkg>
2449
 
2450
This command will install a generated package into main dpkg_archive. This
2451
command should not be used directly by a user as it does not ensure that package
2452
has been created in a repeatable manner - use "jats release".
2453
 
2454
=item B<label>
2455
 
2456
This command provides a number of useful labelling mechanisms to assist in the
2457
labeling of source code.
2458
 
2459
=item B<release>, B<cbuild>
2460
 
2461
This command allows a package to be built and released, given a Clearcase label.
2462
This is the desired release mechanism.
2463
 
2464
The command has two main uses:
2465
 
2466
=over 8
2467
 
2468
=item 1
2469
 
2470
Build a package for release. The process will ensure that the build is
2471
controlled and repeatable.
2472
 
2473
=item 2
2474
 
2475
Rebuild a package for test or debugging purposes.
2476
 
2477
=back
2478
 
2479
=item B<extract>
2480
 
2481
This is the same as "release -extract"
2482
 
2483
 
2484
=item B<dpkg_cache>
2485
 
2486
This utility provides a number of commands to maintain the local cache of
245 dpurdie 2487
dpkg_archive.
227 dpurdie 2488
 
2489
=item B<gen_msproject>
2490
 
2491
This utility will generate a set of Microsoft Studio (Version 6) project and
2492
workspace files to encapsulate the JATS build. The resultant project allows VS
2493
to be used as an editor, source browser, debugger and build tool. JATS is
2494
still used to perform the build.
2495
 
2496
=item B<etool name>
2497
 
2498
This command allows any JATS extension program to be run. The programs will by
2499
found in the JATS TOOLS directory.
2500
 
2501
=item B<eprog name>
2502
 
2503
This command allows any JATS extension program to be run.
2504
If the program end in .pl, then it will be run within a perl interpreter.
2505
If the program end in .jar, then it will be run under a java interpreter.
2506
 
2507
=item B<ebin name>
2508
 
2509
This command allows any JATS support program to be run. The programs will by
2510
found in the JATS BIN directory for the current platform. This command allows
2511
a user script to access many of the machine independent utilities in a simple
2512
manner.
2513
 
2514
Example: "JATS ebin ls" - will provide a "real" ls on all platforms.
2515
 
2516
Example: "JATS ebin sh" - will start up the shell used by make.
2517
 
2518
=back
2519
 
2520
=head2 Command Shortcuts
2521
 
2522
The following commands are user shortcuts to the basic commands. The are basic
2523
commands run in sequence.
2524
 
2525
=over 8
2526
 
2527
=item B<all [make_opts]>
2528
 
2529
This command is the same as running the command "build" and "make all".
2530
It will build a component with a single command.
2531
 
2532
If "make_opts" is not present then "make all" is used.
2533
 
2534
If "make_opts" is present then they are passed to the "make" command. In this
2535
manner is it possible to build a WIN32 component of package with a single
2536
command.
2537
 
2538
=item B<go [make_opts]>
2539
 
2540
This command is similar to the "all" shortcut, but it does not "build" the
2541
sandbox. It may be used where the sandbox has already been prepared.
2542
 
2543
=item B<debug [target]>
2544
 
2545
This command is the same as running "make debug package_debug". It will make and
2546
package all the debug components of a sandbox.
2547
 
2548
If any additional arguments are provided to the B<dev> command then they will be
2549
treated as make targets and the commands will be expanded to make and package
2550
the specified debug versions of the names platforms. Make options cannot be
2551
passed in this manner.
2552
 
2553
Example: "JATS dev GAK" will create and package the debug parts for the
2554
GAK_MOS68K and GAK_MOSCF.
2555
 
2556
=item B<prod [target]>
2557
 
2558
This command is the same as running "make prod package_prod". It will make and
2559
package all the debug components of a sandbox.
2560
 
2561
If any additional arguments are provided to the B<prod> command then they will be
2562
treated as make targets and the commands will be expanded to make and package
2563
the specified debug versions of the names platforms. Make options cannot be
2564
passed in this manner.
2565
 
2566
Example: "JATS prod GAK" will create and package the production parts for the
2567
GAK_MOS68K and GAK_MOSCF.
2568
 
2569
=item B<clean>
2570
 
2571
This is the same as "make clean".
2572
 
2573
=item B<clobber>
2574
 
2575
This is the same as "build clobber"
2576
 
2577
=item B<else>
2578
 
2579
Commands that are not known to the JATS wrapper script are passed to etool.
2580
 
2581
ie: "JATS xxxx" is is the same as "JATS etool xxxx".
2582
 
2583
=back
2584
 
2585
=head1 DESCRIPTION
2586
 
2587
JATS is a wrapper script. It provides:
2588
 
2589
=over 8
2590
 
2591
=item *
2592
 
2593
A controlled and satirized environment to all the build tools.
2594
 
2595
=item *
2596
 
2597
The same command interface on all supported machines: Windows, Solaris and
2598
Linux.
2599
 
2600
=item *
2601
 
2602
Provides a framework for extending the build environment toolset.
2603
 
2604
=back
2605
 
2606
=head1 Installation of the startup script
2607
 
2608
The JATS wrapper script is invoked via a machine specific script. This is B<JATS.
2609
BAT> under Windows and B<JATS.SH> under Unix platforms. The startup script
2610
contains sufficient information to startup the main, and common, JATS
2611
program. The script specifies the environment on the machine and should not
2612
affect the target build environment. It also isolates the JATS version changes
2613
from the user.
2614
 
2615
This script is intended to be user configured. It should be copied into the
2616
users path and modified. It is intended that the script will not change from
2617
version to version of JATS.
2618
 
2619
=head2  Environment variables
2620
 
255 dpurdie 2621
Environmant varibales that specify a path may be set to '-', or 'none' in order
2622
to force an undefined path.
2623
 
227 dpurdie 2624
=over 8
2625
 
2626
=item GBE_MACHTYPE
2627
 
2628
This specifies the machine that the script is running on. This is fixed within
2629
the startup script.
2630
 
273 dpurdie 2631
=item GBE_HOSTMACH
2632
 
2633
This is a copy of GBE_MACHTYPE.
2634
Unlike GBE_MACHTYPE, this copy is not modified by makefiles.
2635
 
227 dpurdie 2636
=item GBE_PERL
2637
 
2638
This specifies the full path the to B<ActiveState> perl binary.
2639
 
2640
=item GBE_CORE
2641
 
2642
This specifies the path the to B<JATS> installation.
2643
 
2644
=item GBE_CACHE_JATS
2645
 
2646
When set to a non zero value will force JATS to transfer a working copy to the
2647
local dpkg_archive. This will speed up the build process because the utilities
2648
will be run from a local drive; not a network drive.
2649
 
2650
This will only operate if JATS is run from dpkg_archive.
2651
 
2652
=item GBE_DPKG_STORE (optional)
2653
 
2654
This is the global read-only archive store. It will only be used to source
2655
packages after all other archive stores have been examined. The GBE_DPKG_STORE
2656
is intended to provide a read-only or remote repository within a global
2657
environment.
2658
 
2659
=item GBE_DPKG
2660
 
2661
This is the official archive. Some tools will publish packages directly to this
2662
archive.
2663
 
2664
=item GBE_DPKG_CACHE (optional)
2665
 
2666
This the path to a local package archive cache. This is used to speed access to
2667
main repository. The cache should be on the users local machine and not a network
2668
drive.
2669
 
2670
=item GBE_DPKG_LOCAL (optional)
2671
 
2672
This the path to a group wide local package archive. This may be used to store
2673
non-official packages that are under test or development.
2674
 
2675
=item GBE_DPKG_SBOX (optional)
2676
 
2677
This the path to a sandbox specific package archive. This may be used to store
2678
non-official packages that are under test or development within the current sandbox.
2679
 
2680
The archive is located by searching from the current directory to the root of
2681
the filesystem for a directory called 'sandbox_dpkg_archive'.
2682
 
2683
It is intended that a group of packages that are being developed in the same
2684
sandbox will share the same sandbox_dpkg_archive.
2685
 
2686
Jats will ignore the version number when dealing with packages in GBE_DPKG_SBOX.
2687
This is done to simplify the publishing and consuming of packages in the sandbox.
2688
 
2689
This should not be set by a user. It will be calculated by JATS and passed to
245 dpurdie 2690
JATS tools and utilities.
227 dpurdie 2691
 
2692
=item GBE_SANDBOX (optional)
2693
 
2694
This the path to a sandbox base directory. It is intended that a group of
2695
packages that are being developed in the same sandbox will share the same
2696
sandbox_dpkg_archive.
2697
 
2698
This should not be set by a user. It will be calculated by JATS and passed to
245 dpurdie 2699
JATS tools and utilities.
227 dpurdie 2700
 
2701
=item GBE_DPLY (optional)
2702
 
2703
This the path to the deployment archive.
2704
This archive is NOT used when searching for packages, but it will be used when
2705
publishing special deployment package. This is not the norm.
2706
 
2707
This variable may be set on a per-project basis.
2708
 
2709
=item GBE_PLATFORM (deprecated)
2710
 
2711
This specifies the names of platforms that will be built and made. This should
2712
be empty. Use B<GBE_BUILDFILTER> to provide better control.
2713
 
2714
=item GBE_BUILDFILTER (desirable)
2715
 
2716
This is a filter string that specifies which platforms to create makefiles
2717
for. This variable is used to prevent JATS from creating Solaris and Linux
2718
targets on a Windows machine and visa-versa.
2719
 
2720
=item GBE_JATS_VERSION (optional)
2721
 
2722
Specifies the version of JATS that the user will use. This is the same as
2723
specifying the -version=xx.xx.xx option on the command line, but because it is
2724
in the environment the required version will be used by all invocations of JATS.
2725
 
2726
=item GBE_ABT (optional)
2727
 
2728
Used by the Auto Build Tool to indicate that the build is being performed by the
2729
ABT. When set the build environment will be modified to suite the ABT. Some
2730
operations may be relaxed.
2731
 
2732
=item GBE_VIEWBASE (optional)
2733
 
2734
Used by the 'release' utility to provide a user configurable base directory for
2735
the creation of static views.
2736
 
2737
=item GBE_RM_LOCATION (optional)
2738
 
2739
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
245 dpurdie 2740
Specifies the location of the Release Manager Database. This is a database url
227 dpurdie 2741
of the form jdbc:subprotocol:subname as used by java.sql.DriverManager.getConnection()
2742
 
2743
Example: jdbc:oracle:thin:@auperaora03:1521:RELEASEM
2744
 
2745
=item GBE_RM_USERNAME (optional)
2746
 
2747
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
2748
Specifies a USERNAME with access to the Release Manager Database.
2749
 
2750
=item GBE_RM_PASSWORD (optional)
2751
 
2752
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
2753
Specifies a PASSWORD to be used in conjunction with GBE_RM_USERNAME to access
2754
the Release Manager Database.
2755
 
2756
=item GBE_RM_URL (optional)
2757
 
2758
Used by tools that interface to Release Manager: primarily the (ABT) Auto Build Tools.
2759
Specifies the base URL of RElease Manager
2760
 
2761
=item GBE_DM_LOCATION (optional)
2762
 
2763
Similar to GBE_RM_LOCATION, but is used to access the Deployment Manager Database.
2764
If GBE_DM_LOCATION is not provided, then GBE_RM_LOCATION will be used.
2765
 
2766
=item GBE_DM_USERNAME (optional)
2767
 
2768
Similar to GBE_RM_USERNAME, but is used to access the Deployment Manager Database.
2769
 
2770
=item GBE_DM_PASSWORD (optional)
2771
 
2772
Similar to GBE_RM_PASSWORD, but is used to access the Deployment Manager Database.
2773
 
2774
=item GBE_DM_URL (optional)
2775
 
2776
Similar to GBE_DM_URL, but is used to access the Deployment Manager Database.
2777
 
297 dpurdie 2778
=item GBE_SVN_URL (optional)
2779
 
2780
Specifies the URL of the Subversion repository that can be used by some JATS
2781
commands. The URL should contain the protocol, the repository host and the path to
2782
the root of the the repository, but not the name of the repository. ie:
2783
 
2784
svn://auperaws996vm21
2785
 
2786
=item GBE_SVN_PATH (optional)
2787
 
2788
If provided this will be used to locate the 'svn' utility used by the SubVersion
2789
suport functions. If not provided, then the utilities assume that 'svn' is in the
2790
users PATH.
2791
 
2792
=item GBE_SVN_USERNAME (optional)
2793
 
2794
Subversion repository crediantials. If provided it will be used, otherwise the
2795
native svn credential mechanism will be used.
2796
 
2797
=item GBE_SVN_PASSWORD (optional)
2798
 
2799
Subversion repository crediantials. If provided it will be used, otherwise the
2800
native svn credential mechanism will be used.
2801
 
275 dpurdie 2802
=item GBE_MAKE_TYPE (internal)
2803
 
2804
This EnvVar is set when a Makefile is being procssed by 'make'. The value
2805
indicates the type of the build. It will be either P(Production), D(debug)
2806
or C(Common).
2807
 
2808
=item GBE_MAKE_TARGET (internal)
2809
 
2810
This EnvVar is set when a Makefile is being procssed by 'make'. The value
2811
is set current target platform name.
2812
 
2813
=item GBE_MAKE_CFG (internal)
2814
 
2815
This EnvVar is set when a Makefile is being procssed by 'make'. The value
285 dpurdie 2816
is set to the path of the parsed makefile.pl data gathered when the makefile
275 dpurdie 2817
was created.
2818
 
2819
=item GBE_MAKE_CMD (internal)
2820
 
2821
This EnvVar is set when a Makefile is being procssed by 'make'. The value
2822
is set current make command being processed.
2823
 
297 dpurdie 2824
=item GBE_HOSTNAME
279 dpurdie 2825
 
2826
This EnvVar is the name of the current host. It is available to be used within
2827
scripts that need to stamp build files.
2828
 
227 dpurdie 2829
=back
2830
 
2831
=head1  dpkg_archive
2832
 
2833
B<dpkg_archive> is the common package repository. This is on a shared network drive
2834
and as such affects the build speed. JATS supports three mechanisms to supplement
2835
dpkg_archive, as described below. The archive search order is:
2836
 
2837
=over
2838
 
2839
=item GBE_DPKG_LOCAL    (User local store)
2840
 
2841
=item GBE_DPKG_CACHE    (Machine local cache)
2842
 
2843
=item GBE_DPKG          (Site repository)
2844
 
2845
=item GBE_DPKG_STORE    (Global repository)
2846
 
2847
=back
2848
 
2849
=head2  local dpkg_archive
2850
 
2851
JATS supports a package archive that is local to a project or suite of build
2852
sandboxes. This is the archive used by the B<install> command.
2853
 
2854
The user does not have to do anything to access this archive. The archive is
2855
located by the JATS wrapper script by scanning up the directory tree for a
2856
directory called "local_dpkg_archive". If it is found then it is used as the
2857
preferred source for locating archives. This allows a component to be tested
2858
with a "local" or "fixed" version of another package, before an official
2859
release is made.
2860
 
2861
A local archive may be shared by members of a team by setting the environment
2862
variable B<GBE_DPKG_LOCAL> to the location of a shared drive.
2863
 
2864
=head2  dpkg_archive cache
2865
 
2866
JATS supports a package caching mechanism to reduce network utilization. If
2867
the user specified B<GBE_DPKG_CACHE> exists then that archive is treated as a
2868
cache archive. The various JATS tools work together to maintain the cache.
2869
 
2870
This cache must be setup by the user.
2871
 
2872
=head2  dpkg_archive store
2873
 
2874
JATS supports a global, read-only, package distribution mechanism. If
2875
the user specified B<GBE_DPKG_STORE> exists then that archive is treated as a
2876
global store. The store archive will be searched after all other archives.
2877
 
2878
A global store may be used by members of a global team, in a situation in
2879
which the store is rsync'ed from a central repository.
2880
 
2881
=head1 EXAMPLES
2882
 
2883
=over 8
2884
 
2885
=item   JATS build
2886
 
2887
This will prime the sandbox ready for "make". The command will locate the
2888
build.pl file and process it. This will locate all the external packages and
2889
generate the required makefiles.
2890
 
2891
=item   JATS make
2892
 
2893
This will run the GNU make program over the makefiles generated by the "build"
2894
command. This may be executed in a subdirectory in order to limit the targets
2895
that are "made".
2896
 
2897
B<NOTE:> Do not run "make" without using the JATS wrapper. It will not perform
2898
as expected as the environment will not have been set up correctly.
2899
 
2900
=back
2901
 
2902
=cut
2903