Subversion Repositories DevTools

Rev

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

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