Subversion Repositories DevTools

Rev

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