Subversion Repositories DevTools

Rev

Rev 7312 | Rev 7320 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7312 Rev 7319
Line 31... Line 31...
31
use ArrayHashUtils;
31
use ArrayHashUtils;
32
use File::Find;
32
use File::Find;
33
use Storable qw(dclone);
33
use Storable qw(dclone);
34
#use Digest::SHA qw(sha1);
34
#use Digest::SHA qw(sha1);
35
use Digest::SHA::PurePerl qw(sha1);
35
use Digest::SHA::PurePerl qw(sha1);
36
use IPC::Open3;
36
use JatsSignatureBuilder;
37
 
37
 
38
our $BuildVersion           = "2.1.0";
38
our $BuildVersion           = "2.1.0";
39
 
39
 
40
#.. Switchs
40
#.. Switchs
41
#
41
#
Line 45... Line 45...
45
our $CmdSwitch              = "";
45
our $CmdSwitch              = "";
46
our $Clobber                = 0;
46
our $Clobber                = 0;
47
our $Archive                = 0;
47
our $Archive                = 0;
48
our $Interface              = 0;
48
our $Interface              = 0;
49
our $RootOnly               = 0;
49
our $RootOnly               = 0;
-
 
50
our $SignatureOnly          = 0;
50
our $Perms                  = 0;
51
our $Perms                  = 0;
51
our $Expert                 = 0;
52
our $Expert                 = 0;
52
our $All                    = 0;
53
our $All                    = 0;
53
our $Cache                  = $ENV{GBE_DPKG_CACHE_CTL} || 0;
54
our $Cache                  = $ENV{GBE_DPKG_CACHE_CTL} || 0;
54
our $NoPackageError         = 0;
55
our $NoPackageError         = 0;
Line 112... Line 113...
112
 
113
 
113
my  $genToolsetPlatform     = 0;                # BuildToolset directive has been seen
114
my  $genToolsetPlatform     = 0;                # BuildToolset directive has been seen
114
my  $genToolsetActive       = 0;                # TOOLSET platform required:1, Error:2
115
my  $genToolsetActive       = 0;                # TOOLSET platform required:1, Error:2
115
my  $toolsetPlatform        = 'NONE';           # TOOLSET Display Value
116
my  $toolsetPlatform        = 'NONE';           # TOOLSET Display Value
116
my  @genToolsetArgs;                            # Args for a generated TOOLSET
117
my  @genToolsetArgs;                            # Args for a generated TOOLSET
-
 
118
my  $descpkgPath;                               # Path to the dscpkg file
117
 
119
 
118
BuildLibInit();
120
BuildLibInit();
119
 
121
 
120
sub BuildLibInit
122
sub BuildLibInit
121
{
123
{
Line 133... Line 135...
133
    EnvImport( 'USER' );
135
    EnvImport( 'USER' );
134
    EnvImport( 'GBE_HOSTNAME');
136
    EnvImport( 'GBE_HOSTNAME');
135
    EnvImport( 'GBE_DRV' )
137
    EnvImport( 'GBE_DRV' )
136
        if ( $ScmHost ne 'Unix' );            # DOS or WIN special
138
        if ( $ScmHost ne 'Unix' );            # DOS or WIN special
137
 
139
 
-
 
140
    EnvImportOptional ( 'GBE_DPKG_ESCROW','' );
138
    EnvImportOptional ( 'GBE_DPKG_REPLICA','' );
141
    EnvImportOptional ( 'GBE_DPKG_REPLICA','' );
139
    EnvImportOptional ( 'GBE_DPKG_STORE','' );
142
    EnvImportOptional ( 'GBE_DPKG_STORE','' );
140
    EnvImportOptional ( 'GBE_DPKG_CACHE','' );
143
    EnvImportOptional ( 'GBE_DPKG_CACHE','' );
141
    EnvImportOptional ( 'GBE_DPKG_LOCAL','' );
144
    EnvImportOptional ( 'GBE_DPKG_LOCAL','' );
142
    EnvImportOptional ( 'GBE_DPKG_SBOX' ,'' );
145
    EnvImportOptional ( 'GBE_DPKG_SBOX' ,'' );
Line 208... Line 211...
208
            $RootOnly       = 1;
211
            $RootOnly       = 1;
209
 
212
 
210
        } elsif ( $CmdSwitch eq "clobber" ) {
213
        } elsif ( $CmdSwitch eq "clobber" ) {
211
            $Clobber        = 1;
214
            $Clobber        = 1;
212
 
215
 
-
 
216
        } elsif ( $CmdSwitch eq "signature" ) {
-
 
217
            $SignatureOnly  = 1;
-
 
218
            $Interface      = 1;
-
 
219
            $IgnorePkgs     = 1;
-
 
220
 
213
        } elsif ( $CmdSwitch eq "help" || $CmdSwitch eq "usage" ) {
221
        } elsif ( $CmdSwitch eq "help" || $CmdSwitch eq "usage" ) {
214
            $opt_help = 1;
222
            $opt_help = 1;
215
            Usage();
223
            Usage();
216
 
224
 
217
        } else {
225
        } else {
Line 637... Line 645...
637
        #
645
        #
638
        #   If there are NO additive expressions in the alias, then
646
        #   If there are NO additive expressions in the alias, then
639
        #   assume all the active targets
647
        #   assume all the active targets
640
        #
648
        #
641
        unless (keys %add) {
649
        unless (keys %add) {
642
            my %add = map { $_ => 1 } @BUILD_ACTIVEPLATFORMS;
650
            %add = map { $_ => 1 } @BUILD_ACTIVEPLATFORMS;
-
 
651
Debug0("Adding: @BUILD_ACTIVEPLATFORMS");
643
        }
652
        }
644
 
653
 
645
        foreach ( keys %remove) {
654
        foreach ( keys %remove) {
646
            delete $add { $_};
655
            delete $add { $_};
647
        }
656
        }
Line 697... Line 706...
697
        {
706
        {
698
            $BUILDINFO{$word}{NOT_AVAILABLE} = 2;
707
            $BUILDINFO{$word}{NOT_AVAILABLE} = 2;
699
            Debug("ProcessBuildExclude. Remove $word ");
708
            Debug("ProcessBuildExclude. Remove $word ");
700
 
709
 
701
        } else {
710
        } else {
702
            Warning('BuildExclude: Unknown target:' . $word ) 
711
            abtWarning(0,'BuildExclude: Unknown target:' . $word ) 
703
        }
712
        }
704
    }
713
    }
-
 
714
    ErrorDoExit();
705
}
715
}
706
 
716
 
707
#-------------------------------------------------------------------------------
717
#-------------------------------------------------------------------------------
708
# Function        : BuildProduct
718
# Function        : BuildProduct
709
#
719
#
Line 1514... Line 1524...
1514
    Log( "BUILDFILTER. " . PrintList([split(' ', $::GBE_BUILDFILTER)], $sep) ) if defined ($::GBE_BUILDFILTER);
1524
    Log( "BUILDFILTER. " . PrintList([split(' ', $::GBE_BUILDFILTER)], $sep) ) if defined ($::GBE_BUILDFILTER);
1515
 
1525
 
1516
    Log( "DPKG_STORE.. $::GBE_DPKG_STORE" );
1526
    Log( "DPKG_STORE.. $::GBE_DPKG_STORE" );
1517
    Log( "DPKG ....... $::GBE_DPKG" );
1527
    Log( "DPKG ....... $::GBE_DPKG" );
1518
    Log( "DPKG_REPLI . $::GBE_DPKG_REPLICA" );
1528
    Log( "DPKG_REPLI . $::GBE_DPKG_REPLICA" );
-
 
1529
    Log( "DPKG_ESCROW. $::GBE_DPKG_ESCROW" ) if $::GBE_DPKG_ESCROW;
1519
    Log( "DPKG_CACHE . $::GBE_DPKG_CACHE" );
1530
    Log( "DPKG_CACHE . $::GBE_DPKG_CACHE" );
1520
    Log( "DPKG_LOCAL . $::GBE_DPKG_LOCAL" );
1531
    Log( "DPKG_LOCAL . $::GBE_DPKG_LOCAL" );
1521
    Log( "DPKG_SBOX .. $::GBE_DPKG_SBOX" );
1532
    Log( "DPKG_SBOX .. $::GBE_DPKG_SBOX" );
1522
    Log( "Sandbox .... Development" );
1533
    Log( "Sandbox .... Development" );
1523
    Log( "LocalFilter. $::GBE_DPKG_SBOX/buildfilter") if ( $::GBE_DPKG_SBOX && -f $::GBE_DPKG_SBOX . '/buildfilter' );
1534
    Log( "LocalFilter. $::GBE_DPKG_SBOX/buildfilter") if ( $::GBE_DPKG_SBOX && -f $::GBE_DPKG_SBOX . '/buildfilter' );
Line 1956... Line 1967...
1956
    Debug( "Name:      $name" );
1967
    Debug( "Name:      $name" );
1957
    Debug( "Version:   $version" );
1968
    Debug( "Version:   $version" );
1958
 
1969
 
1959
    DataDirective("LinkPkgArchive");            # This directive allowed here
1970
    DataDirective("LinkPkgArchive");            # This directive allowed here
1960
 
1971
 
1961
#   if ( $IgnorePkgs )
1972
   if ( $IgnorePkgs )
1962
#   {
1973
   {
1963
#       Log( "LinkPkgArchive .. $name ($version) - Ignored" );
1974
       Log( "LinkPkgArchive .. $name ($version) - Ignored" );
1964
#       return;
1975
       return;
1965
#   }
1976
   }
1966
 
1977
 
1967
    #
1978
    #
1968
    #   Ensure that we have do not have multiple definitions
1979
    #   Ensure that we have do not have multiple definitions
1969
    #
1980
    #
1970
    if ( PackageEntry::Exists( $name, $version ) )
1981
    if ( PackageEntry::Exists( $name, $version ) )
Line 1986... Line 1997...
1986
    Log( "LinkPkgArchive .. $name ($version)" );
1997
    Log( "LinkPkgArchive .. $name ($version)" );
1987
    my ($pkg, $local, $pkgSig ) = PackageLocate( $name, $version );
1998
    my ($pkg, $local, $pkgSig ) = PackageLocate( $name, $version );
1988
    if ( $pkg )
1999
    if ( $pkg )
1989
    {
2000
    {
1990
        #
2001
        #
-
 
2002
        #   Create a Package Entry
-
 
2003
        #
-
 
2004
        my $entry = PackageEntry::New( $pkg, $name, $version, 'link', $local, $pkgSig );
-
 
2005
 
-
 
2006
        #
1991
        #   Generate package rules for each active platform
2007
        #   Generate package rules for each active platform
1992
        #
2008
        #
1993
        IncludePkg ( $name, $pkg );
2009
        IncludePkg ( $name, $pkg );
1994
        foreach my $platform ( @BUILD_ACTIVEPLATFORMS )
2010
        foreach my $platform ( @BUILD_ACTIVEPLATFORMS ) {
1995
        {
-
 
1996
            LinkEntry( $platform, $pkg, $name, $version, 0, $local, $pkgSig );
2011
            LinkEntry( $platform, $entry );
1997
        }
2012
        }
1998
    }
2013
    }
1999
}
2014
}
2000
 
2015
 
2001
#-------------------------------------------------------------------------------
2016
#-------------------------------------------------------------------------------
Line 2018... Line 2033...
2018
    my $pkg;
2033
    my $pkg;
2019
    my $local = 1;
2034
    my $local = 1;
2020
    my $sandbox = 1;
2035
    my $sandbox = 1;
2021
    my $isa_cache = 0;
2036
    my $isa_cache = 0;
2022
    my $version;
2037
    my $version;
2023
    my $pkgSig = 'Unknown';
2038
    my $pkgSig = 'MSG: No signature for ' . $name . '_' . $uversion;
-
 
2039
 
2024
 
2040
 
2025
    Debug( "PackageLocate: ($name/$uversion)" );
2041
    Debug( "PackageLocate: ($name/$uversion)" );
2026
 
2042
 
2027
    #
2043
    #
2028
    #   If we are in a SandBox, then we use package signatures to locate pre-built
2044
    #   If we are in a SandBox, then we use package signatures to locate pre-built
Line 2045... Line 2061...
2045
                       '--NotSandbox',
2061
                       '--NotSandbox',
2046
                       split( $::ScmPathSep, $::GBE_DPKG_LOCAL),
2062
                       split( $::ScmPathSep, $::GBE_DPKG_LOCAL),
2047
                       '--NotLocal',
2063
                       '--NotLocal',
2048
                       split( $::ScmPathSep, $::GBE_DPKG_CACHE),
2064
                       split( $::ScmPathSep, $::GBE_DPKG_CACHE),
2049
                       '--NotCache',
2065
                       '--NotCache',
-
 
2066
                       split( $::ScmPathSep, $::GBE_DPKG_ESCROW),
-
 
2067
                       '--NotEscrow',
2050
                       split( $::ScmPathSep, $::GBE_DPKG_REPLICA),
2068
                       split( $::ScmPathSep, $::GBE_DPKG_REPLICA),
2051
                       split( $::ScmPathSep, $::GBE_DPKG),
2069
                       split( $::ScmPathSep, $::GBE_DPKG),
2052
                       split( $::ScmPathSep, $::GBE_DPLY),
2070
                       split( $::ScmPathSep, $::GBE_DPLY),
2053
                       split( $::ScmPathSep, $::GBE_DPKG_STORE) )
2071
                       split( $::ScmPathSep, $::GBE_DPKG_STORE) )
2054
    {
2072
    {
Line 2072... Line 2090...
2072
        if ( $dpkg eq '--NotCache' )
2090
        if ( $dpkg eq '--NotCache' )
2073
        {
2091
        {
2074
            $isa_cache = 0;
2092
            $isa_cache = 0;
2075
            next;
2093
            next;
2076
        }
2094
        }
-
 
2095
        if ( $dpkg eq '--NotEscrow' )
-
 
2096
        {
-
 
2097
            last if ($::GBE_DPKG_ESCROW);
-
 
2098
            next;
-
 
2099
        }
-
 
2100
 
2077
        
2101
        
2078
        #
2102
        #
2079
        #   If we are playing in a sandbox, then the version number is
2103
        #   If we are playing in a sandbox, then the version number is
2080
        #   not used. The Package suffix is still used so that we can
2104
        #   not used. The Package suffix is still used so that we can
2081
        #   differentiate sysbasetypes.xxxxx.mas and sysbasetypes.xxxxx.syd
2105
        #   differentiate sysbasetypes.xxxxx.mas and sysbasetypes.xxxxx.syd
Line 2228... Line 2252...
2228
    my $ifaceDir = catdir($::GBE_SANDBOX, 'sandbox_dpkg_archive', $name, $version . '.int');
2252
    my $ifaceDir = catdir($::GBE_SANDBOX, 'sandbox_dpkg_archive', $name, $version . '.int');
2229
    $ifaceDir = TagFileRead($ifaceDir);
2253
    $ifaceDir = TagFileRead($ifaceDir);
2230
    $ifaceDir =~ s~\\~/~g;
2254
    $ifaceDir =~ s~\\~/~g;
2231
    $ifaceDir =~ s~GBE_SANDBOX/~$::GBE_SANDBOX/~;
2255
    $ifaceDir =~ s~GBE_SANDBOX/~$::GBE_SANDBOX/~;
2232
    my $pkgSigFile = catfile( $ifaceDir, 'Package.sig');
2256
    my $pkgSigFile = catfile( $ifaceDir, 'Package.sig');
2233
 
-
 
-
 
2257
Debug0 ('SigFile:', $ifaceDir ,$pkgSigFile);
2234
    # Temp: Remove when we no longer have package-versions
2258
    # Temp: Remove when we no longer have package-versions
2235
    return unless -f $pkgSigFile; 
2259
    return unless -f $pkgSigFile; 
2236
 
2260
 
2237
    Error("Package signature not found for $name/$version", "You must 'build' the package before using it")
2261
    Error("Package signature not found for $name/$version", "You must 'build' the package before using it")
2238
        unless ( -f $pkgSigFile);
2262
        unless ( -f $pkgSigFile);
Line 2351... Line 2375...
2351
 
2375
 
2352
    #
2376
    #
2353
    #   Package not found
2377
    #   Package not found
2354
    #   This is an error, although it can be bypassed
2378
    #   This is an error, although it can be bypassed
2355
    #
2379
    #
2356
    Error ("Required package not found by signature: '$name/$version'" ) unless ( $NoPackageError );
2380
    Error ("Required package not found by signature: '$name/$version'", "Signature: $pkgSig" ) unless ( $NoPackageError );
2357
    
2381
    
2358
    Log( "WARNING .... Package not available: '$name/$version'" );
2382
    Log( "WARNING .... Package not available: '$name/$version'" );
2359
    return;
2383
    return;
2360
}
2384
}
2361
 
2385
 
Line 2365... Line 2389...
2365
# Description     : Scan a package an locate platform specific directories
2389
# Description     : Scan a package an locate platform specific directories
2366
#                   Create data structures to capture the information
2390
#                   Create data structures to capture the information
2367
#                   This function is used by LinkPkgArchive
2391
#                   This function is used by LinkPkgArchive
2368
#                   to perfom the bulk of package inclusion work.
2392
#                   to perfom the bulk of package inclusion work.
2369
#
2393
#
2370
# Inputs          : platform being processed
2394
# Inputs          : $platform   - Platform being processed
2371
#                   path to the package
-
 
2372
#                   name of the package
-
 
2373
#                   version of the package
2395
#                   $entry      - Reference to a PackageEntry
2374
#                   sandbox support (non-zero)
-
 
2375
#                   local package
-
 
2376
#                   package Signature
-
 
2377
#
2396
#
2378
sub LinkEntry
2397
sub LinkEntry
2379
{
2398
{
2380
    my( $platform, $pkg, $name, $version, $sandbox, $local, $pkgSig ) = @_;
-
 
2381
    my( $entry );
2399
    my( $platform, $base_entry ) = @_;
2382
 
2400
 
2383
    #   Create entry record
-
 
2384
    #
2401
    #
-
 
2402
    #   Clone the entry - we will add platform specific data into it
2385
    #..
2403
    #
2386
    $entry = PackageEntry::New( $pkg, $name, $version, $sandbox, 'link', $local, $pkgSig );
2404
    my $entry = dclone($base_entry);
-
 
2405
 
2387
 
2406
 
2388
    #   Populate includes:
2407
    #   Populate includes:
2389
    #
2408
    #
2390
    #   - include/$platform                 (eg include/solaris)
2409
    #   - include/$platform                 (eg include/solaris)
2391
    #   - inc/$platform                     (eg inc/solaris)
2410
    #   - inc/$platform                     (eg inc/solaris)
Line 2404... Line 2423...
2404
    #..
2423
    #..
2405
    my $parts = $BUILDINFO{$platform}{PARTS};
2424
    my $parts = $BUILDINFO{$platform}{PARTS};
2406
 
2425
 
2407
    foreach my $part ( @$parts )
2426
    foreach my $part ( @$parts )
2408
    {
2427
    {
2409
        $entry->RuleInc( "/include." . $part ) if ( !$sandbox );
2428
        $entry->RuleInc( "/include." . $part );
2410
        $entry->RuleInc( "/inc." . $part )     if ( !$sandbox );
2429
        $entry->RuleInc( "/inc." . $part );
2411
        $entry->RuleInc( "/include/" . $part ) if ( !$sandbox );
2430
        $entry->RuleInc( "/include/" . $part );
2412
        $entry->RuleInc( "/inc/" . $part );
2431
        $entry->RuleInc( "/inc/" . $part );
2413
    }
2432
    }
2414
 
2433
 
2415
    #
2434
    #
2416
    #   Also search the root include directory - last
2435
    #   Also search the root include directory - last
2417
    #
2436
    #
2418
    $entry->RuleInc( "/include" )               if ( !$sandbox );
2437
    $entry->RuleInc( "/include" );
2419
    $entry->RuleInc( "/inc" );
2438
    $entry->RuleInc( "/inc" );
2420
 
2439
 
2421
    #   Populate libraries:
2440
    #   Populate libraries:
2422
    #
2441
    #
2423
    #   - lib/lib.$platform[D|P]            (eg lib/lib.sparcD)
2442
    #   - lib/lib.$platform[D|P]            (eg lib/lib.sparcD)
Line 2434... Line 2453...
2434
    #..
2453
    #..
2435
    $parts = $BUILDINFO{$platform}{PARTS};
2454
    $parts = $BUILDINFO{$platform}{PARTS};
2436
 
2455
 
2437
    foreach my $part ( @$parts )
2456
    foreach my $part ( @$parts )
2438
    {
2457
    {
2439
        $entry->RuleLib("/lib" . ".$part" )     if ( !$sandbox );
2458
        $entry->RuleLib("/lib" . ".$part" );
2440
        $entry->RuleLib("/lib" . "/lib.$part" ) if ( !$sandbox );
2459
        $entry->RuleLib("/lib" . "/lib.$part" );
2441
        $entry->RuleLib("/lib" . "/$part" );
2460
        $entry->RuleLib("/lib" . "/$part" );
2442
    }
2461
    }
2443
 
2462
 
2444
    #
2463
    #
2445
    #   Some extra places to search
2464
    #   Some extra places to search
Line 2490... Line 2509...
2490
    Debug( "Name:      $name" );
2509
    Debug( "Name:      $name" );
2491
    Debug( "Version:   $version" );
2510
    Debug( "Version:   $version" );
2492
 
2511
 
2493
    DataDirective("BuildPkgArchive");           # This directive allowed here
2512
    DataDirective("BuildPkgArchive");           # This directive allowed here
2494
 
2513
 
2495
#   if ( $IgnorePkgs )
2514
   if ( $IgnorePkgs )
2496
#   {
2515
   {
2497
#       Log( "BuildPkgArchive . $name ($version) - Ignored" );
2516
       Log( "BuildPkgArchive . $name ($version) - Ignored" );
2498
#       return;
2517
       return;
2499
#   }
2518
   }
2500
    
2519
    
2501
    #
2520
    #
2502
    #   Ensure that we have do not have multiple definitions
2521
    #   Ensure that we have do not have multiple definitions
2503
    #
2522
    #
2504
    if ( PackageEntry::Exists( $name, $version ) )
2523
    if ( PackageEntry::Exists( $name, $version ) )
Line 2523... Line 2542...
2523
    if ( $pkg )
2542
    if ( $pkg )
2524
    {
2543
    {
2525
        #
2544
        #
2526
        #   Create a Package Entry
2545
        #   Create a Package Entry
2527
        #
2546
        #
2528
        my $entry = PackageEntry::New( $pkg, $name, $version, 0, 'build', $local, $pkgSig );
2547
        my $entry = PackageEntry::New( $pkg, $name, $version, 'build', $local, $pkgSig );
2529
 
2548
 
2530
        #
2549
        #
2531
        #   Determine if the package needs to be installed:
2550
        #   Determine if the package needs to be installed:
2532
        #       If the package is a 'local' package then force transfer
2551
        #       If the package is a 'local' package then force transfer
2533
        #       If the user has specified --cache then force transfer
2552
        #       If the user has specified --cache then force transfer
Line 3731... Line 3750...
3731
    }
3750
    }
3732
 
3751
 
3733
    if ( $Clobber )                             # clobber mode ?
3752
    if ( $Clobber )                             # clobber mode ?
3734
    {
3753
    {
3735
        #
3754
        #
3736
        #   Unmake all the makefiles
-
 
3737
        #   No longer needed as we track the file that are created
-
 
3738
        #
-
 
3739
        #if ( -e "Makefile.gbe" )
-
 
3740
        #{
-
 
3741
        #    JatsTool ( 'jmake.pl', 'unmakefiles');
-
 
3742
        #}
-
 
3743
 
-
 
3744
        #
-
 
3745
        #   Delete my own configuration files
3755
        #   Delete my own configuration files
3746
        #
3756
        #
3747
        DeleteCfg();
3757
        DeleteCfg();
3748
 
3758
 
3749
        #
3759
        #
Line 3799... Line 3809...
3799
 
3809
 
3800
        BuildPackageLink();
3810
        BuildPackageLink();
3801
        BuildSandboxData();
3811
        BuildSandboxData();
3802
        return;
3812
        return;
3803
    }
3813
    }
-
 
3814
    #
-
 
3815
    #   Generate the path to the descpkg file
-
 
3816
    #   The file is created later in the build proccess, but the makefile generation 
-
 
3817
    #   needs to have a known path to the file.
-
 
3818
    #    
-
 
3819
    #   It will be a file that is 'known' to JATS
-
 
3820
    #
-
 
3821
    $descpkgPath = BuildAddKnownFile ( $NoBuild ? $Cwd : $Srcdir, 'descpkg' );
3804
 
3822
 
3805
    #.. Build support files
3823
    #.. Build support files
3806
    #
3824
    #
3807
    DeleteCfg();
3825
    DeleteCfg();
3808
    BuildConfig();
3826
    BuildConfig();
3809
    BuildSharedLibFiles();
3827
    BuildSharedLibFiles();
3810
    WriteParsedBuildConfig();
3828
    WriteParsedBuildConfig();
3811
    BuildPackageLink();
3829
    BuildPackageLink();
3812
    BuildSandboxData();
3830
    BuildSandboxData();
3813
    NoBuildMarker();
-
 
3814
 
3831
 
3815
    #
3832
    #
3816
    #  ONLY (re)building interface dir
3833
    #  ONLY (re)building interface dir
3817
    #
3834
    #
3818
    return
-
 
3819
        if ( $Interface );
3835
    unless ( $Interface ) {
3820
 
3836
 
3821
    #---------------------------------------------------------------------------
3837
        #---------------------------------------------------------------------------
3822
    #
3838
        #
3823
    #.. Make bootstrap "makefile",
3839
        #.. Make bootstrap "makefile",
3824
    #   Simulate a top level makefile
3840
        #   Simulate a top level makefile
3825
    #       Pass argumenst to makelib
3841
        #       Pass argumenst to makelib
3826
    #       Sumulate SubDir() operations
3842
        #       Sumulate SubDir() operations
3827
    #       Sumulate a Platform(*);
3843
        #       Sumulate a Platform(*);
3828
    #
3844
        #
3829
    #       Due to the normal way that makelib.pl is executed,
3845
        #       Due to the normal way that makelib.pl is executed,
3830
    #       the following substitutions are done.
3846
        #       the following substitutions are done.
3831
    #
3847
        #
3832
    @ARGV = ();
3848
        @ARGV = ();
3833
    $0 = "makefile.pl ";
3849
        $0 = "makefile.pl ";
3834
    push @ARGV, "$Cwd";                         # current working directory
3850
        push @ARGV, "$Cwd";                         # current working directory
3835
    push @ARGV, "$::GBE_TOOLS/makelib.pl";     # makelib.pl image
3851
        push @ARGV, "$::GBE_TOOLS/makelib.pl";      # makelib.pl image
3836
    push @ARGV, "--interface=$BUILDINTERFACE"
3852
        push @ARGV, "--interface=$BUILDINTERFACE"
3837
        if ($BUILDINTERFACE);
3853
            if ($BUILDINTERFACE);
3838
 
3854
 
3839
    Debug( "ARGV:      @ARGV" );
3855
        Debug( "ARGV:      @ARGV" );
3840
 
3856
 
3841
    #.. (re)Build root makefile
3857
        #.. (re)Build root makefile
3842
    #
3858
        #
3843
    $ScmBuildlib = 0;                           # clear Buildlib flag for 'makelib.pl'
3859
        $ScmBuildlib = 0;                           # clear Buildlib flag for 'makelib.pl'
3844
    RootMakefile();                             # inform 'makelib.pl'
3860
        RootMakefile();                             # inform 'makelib.pl'
3845
    MakeLibInit();                              # run initialisation
3861
        MakeLibInit();                              # run initialisation
3846
 
3862
 
3847
    #.. Register subdir(s)
3863
        #.. Register subdir(s)
3848
    #
3864
        #
3849
    UniquePush (\@BUILDSUBDIRS, $Srcdir );
3865
        UniquePush (\@BUILDSUBDIRS, $Srcdir );
3850
    SubDir( @BUILDSUBDIRS );
3866
        SubDir( @BUILDSUBDIRS );
3851
    Platform( @BUILD_ACTIVEPLATFORMS );
3867
        Platform( @BUILD_ACTIVEPLATFORMS );
3852
 
3868
 
3853
    #.. (re)build src makefiles and associated information
3869
        #.. (re)build src makefiles and associated information
3854
    #   JatsTool will not return on error
3870
        #   JatsTool will not return on error
3855
    #
3871
        #
3856
    my @cmds = ('jmake.pl', 'rebuild');
3872
        my @cmds = ('jmake.pl', 'rebuild');
3857
    push @cmds, 'NORECURSE=1' if ( $RootOnly );
3873
        push @cmds, 'NORECURSE=1' if ( $RootOnly );
3858
    JatsTool ( @cmds);
3874
        JatsTool ( @cmds);
-
 
3875
    }
3859
 
3876
 
3860
    #
3877
    #
3861
    #   Generate package signature
3878
    #   Generate package signature
-
 
3879
    #   Write the descpkg file again - with a signature this time
3862
    #
3880
    #
3863
    ErrorConfig( 'name' => 'buildlib')   ;
3881
    ErrorConfig( 'name' => 'buildlib')   ;
3864
    BuildSignature();
3882
    BuildSignature();
-
 
3883
    WriteDescpkg();
-
 
3884
    NoBuildMarker();
3865
 
3885
 
3866
    #
3886
    #
3867
    #   Generate some warnings that will be seen at the end of the build
3887
    #   Generate some warnings that will be seen at the end of the build
3868
    #
3888
    #
3869
    Warning ("BuildSrcArchive Directive Present","Read JATS Manual for correct usage")
3889
    Warning ("BuildSrcArchive Directive Present","Read JATS Manual for correct usage")
Line 3909... Line 3929...
3909
#
3929
#
3910
# Returns         : 
3930
# Returns         : 
3911
#
3931
#
3912
sub BuildSignature
3932
sub BuildSignature
3913
{
3933
{
3914
    my %sigExcludeDirs;
-
 
3915
    my %sigExcludeFiles;
-
 
3916
    my $BuildSignatureSha1;
-
 
3917
    my $signatureFile = catfile($Cwd, $BUILDINTERFACE, 'Package.sig');
-
 
3918
    my $sigDebugFile  = catfile($Cwd, $BUILDINTERFACE, 'Package.dsig');
-
 
3919
    my @sigList;
-
 
3920
 
-
 
3921
    #
-
 
3922
    #   Only create the Signature file ONCE
-
 
3923
    #   Done on first build (after a clobber)
-
 
3924
    #
-
 
3925
#   if (-f $signatureFile)
-
 
3926
#   {
-
 
3927
#       Message("Generate Package Signature - Already generated");
-
 
3928
#       return;
-
 
3929
#   }
-
 
3930
 
-
 
3931
    Message("Generate Package Signature");
3934
    Message("Generate Package Signature");
3932
 
-
 
3933
    #
-
 
3934
    #   Determine if this is a GIT enabled sandbox build
-
 
3935
    #   Need a .git directory or file in the root of the sandbox
-
 
3936
    #
-
 
3937
    my $gitEnabled;
-
 
3938
    if ($::GBE_SANDBOX && -e catfile ($::GBE_SANDBOX, '.git') )
-
 
3939
    {
-
 
3940
        $gitEnabled = 1;
-
 
3941
    }
-
 
3942
 
-
 
3943
    #
-
 
3944
    #   Start generating the signature
-
 
3945
    #       Include the package Name,Version and Project
3935
    #   Generate the package signature using the new method
3946
    #
-
 
3947
    $BuildSignatureSha1 = Digest::SHA::PurePerl->new;
-
 
3948
    $BuildSignatureSha1->add("PKGNAME: $BUILDNAME_PACKAGE $BUILDNAME_VERSION $BUILDNAME_SUFFIX");
-
 
3949
    push @sigList, "PKGNAME: $BUILDNAME_PACKAGE $BUILDNAME_VERSION $BUILDNAME_SUFFIX: " . $BuildSignatureSha1->clone->hexdigest;
-
 
3950
 
-
 
3951
    #
-
 
3952
    #   Include the signature of ALL dependent packages
3936
    #       Quick parse the build and makefiles
3953
    #   Ie: The package signature is a function of the source and its dependents
-
 
3954
    #
-
 
3955
    foreach my $tag ( PackageEntry::GetPackageList() )
-
 
3956
    {
-
 
3957
        my $pkgSig = PackageEntry::GetPackageSignature($tag);
-
 
3958
        $BuildSignatureSha1->add("PKGSIGNATURE: $pkgSig");
-
 
3959
        push @sigList, sprintf("PKGSIGNATURE: [%s] %s: %s", PackageEntry::GetNameVersion($tag), $pkgSig , $BuildSignatureSha1->clone->hexdigest);
-
 
3960
    }
-
 
3961
 
-
 
3962
    #
-
 
3963
    #   Save the signature of the package header and the dependencies
-
 
3964
    #   This will be used for a simple test to see in we need to rebuild the build file 
-
 
3965
    #
3937
    #
3966
    my $depSha1 =  $BuildSignatureSha1->clone->hexdigest;
-
 
3967
    Debug2("DepSha1: $depSha1");
-
 
3968
    FileCreate( catfile($ScmInterface, 'build.bfp'), $depSha1 );
-
 
3969
 
-
 
3970
    if ($gitEnabled)
-
 
3971
    {
-
 
3972
        #
-
 
3973
        #   Include the sha1 of all 'git' tree items that form the complete source image
-
 
3974
        #   Warn user if not all components are version controlled
-
 
3975
        #
-
 
3976
        my @relDirList = map { my $relName = $_; $relName =~ s~^$::GBE_SANDBOX/~~; $relName  } ToolsetFiles::GetSubTrees(); 
-
 
3977
        my @cmdList = map { 'HEAD:' . $_  } @relDirList;
-
 
3978
        Debug3(" GIT CMD: " . "git rev-parse", @cmdList );
-
 
3979
 
-
 
3980
        #
-
 
3981
        #   Callback function to process the output of the Git parse
-
 
3982
        #   Expect one line for each HEAD: item
-
 
3983
        #
-
 
3984
        my $index = 0;
-
 
3985
        my @notControlled;
-
 
3986
        my $callback = sub {
-
 
3987
            my ($cdata, $line) = @_;
-
 
3988
            $line =~ s~\s+$~~;
-
 
3989
            Debug3(" GIT OUT: " . $line  );
-
 
3990
            if ($line =~ m~^HEAD:(.*)~) {
-
 
3991
                push @notControlled, $1;
-
 
3992
            }
-
 
3993
            $BuildSignatureSha1->add($line);
-
 
3994
            push @sigList, "PKGSRC: $relDirList[$index++]: $line: " . $BuildSignatureSha1->clone->hexdigest;
-
 
3995
            return 0;
-
 
3996
        };
-
 
3997
 
-
 
3998
        my $rv = GitCmd('rev-parse', @cmdList, { process => $callback } );
-
 
3999
        Debug2("GitCmd Result: $rv");
-
 
4000
        $BUILDSIGNATURE =  $BuildSignatureSha1->hexdigest;
3938
    $BUILDSIGNATURE = JatsSignatureBuilder::GeneratePackageSignature ($Cwd, catfile($Cwd, $BUILDINTERFACE));
4001
 
-
 
4002
        if (@notControlled) {
-
 
4003
            Warning('The folling paths are not version controlled:', @notControlled);
-
 
4004
        }
-
 
4005
    }
-
 
4006
    else
-
 
4007
    {
-
 
4008
        $BUILDSIGNATURE = 'MSG: Sandbox is not git enabled';
-
 
4009
    }
-
 
4010
       
-
 
4011
    Message("Signature: $BUILDSIGNATURE");
-
 
4012
    push @sigList, "Signature: $BUILDSIGNATURE";
-
 
4013
    FileCreate( $signatureFile, $BUILDSIGNATURE );
-
 
4014
    FileCreate( $sigDebugFile, @sigList );
-
 
4015
Debug0("sigDebugFile: $sigDebugFile");
-
 
4016
 
3939
 
4017
    #
3940
    #
4018
    #   See if the package exists in one of the package stores
3941
    #   See if the package exists in one of the package stores
4019
    #   Look in each package archive directory
3942
    #   Look in each package archive directory
4020
    #   
3943
    #   
Line 4030... Line 3953...
4030
        if (-d $pkgDir ) {
3953
        if (-d $pkgDir ) {
4031
            Message("PreBuild: $pkgDir");
3954
            Message("PreBuild: $pkgDir");
4032
            last;
3955
            last;
4033
        }
3956
        }
4034
    }
3957
    }
4035
 
-
 
4036
    #
-
 
4037
    #   Create the descpkg file - to include the signature
-
 
4038
    #
-
 
4039
    BuildDescpkg('Internal');
-
 
4040
}
-
 
4041
 
-
 
4042
#-------------------------------------------------------------------------------
-
 
4043
# Function        : GitCmd
-
 
4044
#
-
 
4045
# Description     : Run a Git Command and capture/process the output
-
 
4046
#
-
 
4047
#                   Based on JatsSvnCore:SvnCmd
-
 
4048
#
-
 
4049
# Inputs          : Command
-
 
4050
#                   Command arguments
-
 
4051
#                   Last argument may be a hash of options.
-
 
4052
#                       nosavedata  - Don't save the data
-
 
4053
#                       process     - Callback function
-
 
4054
#                       printdata   - Print data
-
 
4055
#                       error       - Error Message
-
 
4056
#                                     Used as first line of an Error call
-
 
4057
#
-
 
4058
# Returns         : non-zero on errors detected
-
 
4059
#
-
 
4060
sub GitCmd
-
 
4061
{
-
 
4062
    my $self;           # Local storage
-
 
4063
    Debug ("GitCmd");
-
 
4064
 
-
 
4065
    #
-
 
4066
    #   Locate essential tools
-
 
4067
    #
-
 
4068
    our $GBE_SVN_PATH;
-
 
4069
    EnvImportOptional('GBE_GIT_PATH', '');
-
 
4070
    Debug ("GBE_GIT_PATH", $::GBE_GIT_PATH);
-
 
4071
 
-
 
4072
    my $stdmux = LocateProgInPath ( 'stdmux');
-
 
4073
    my $git    = LocateProgInPath ( 'git', '--All', '--Path=' . $::GBE_GIT_PATH );
-
 
4074
    
-
 
4075
    #
-
 
4076
    #   Extract arguments and options
-
 
4077
    #   If last argument is a hash, then its a hash of options
-
 
4078
    #
-
 
4079
    my $opt;
-
 
4080
    $opt = pop @_
-
 
4081
        if (@_ > 0 and UNIVERSAL::isa($_[-1],'HASH'));
-
 
4082
 
-
 
4083
    $self->{PRINTDATA} = $opt->{'printdata'} if ( exists $opt->{'printdata'} );
-
 
4084
 
-
 
4085
    Verbose2 "GitCmd $git @_";
-
 
4086
 
-
 
4087
    #
-
 
4088
    # Useful debugging
-
 
4089
    #
-
 
4090
    # $self->{LAST_CMD} = [$svn, @_];
-
 
4091
 
-
 
4092
    #
-
 
4093
    #   Reset command output data
-
 
4094
    #
-
 
4095
    $self->{ERROR_LIST} = [];
-
 
4096
    $self->{RESULT_LIST} = [];
-
 
4097
#    $self->{LAST_CMD} = \@_;
-
 
4098
 
-
 
4099
    #
-
 
4100
    #   Make use of a wrapper program to mux the STDERR and STDOUT into
-
 
4101
    #   one stream (STDOUT). #   This solves a lot of problems
-
 
4102
    #
-
 
4103
    #   Do not use IO redirection of STDERR because as this will cause a
-
 
4104
    #   shell (sh or cmd.exe) to be invoked and this makes it much
-
 
4105
    #   harder to kill on all platforms.
-
 
4106
    #
-
 
4107
    #   Use open3 as it allows the arguments to be passed
-
 
4108
    #   directly without escaping and without any shell in the way
-
 
4109
    #
-
 
4110
    local (*CHLD_OUT, *CHLD_IN);
-
 
4111
    my $pid = open3( \*CHLD_IN, \*CHLD_OUT, '>&STDERR', $stdmux, $git, @_);
-
 
4112
 
-
 
4113
    #
-
 
4114
    #   Looks as though we always get a PID - even if the process dies
-
 
4115
    #   straight away or can't be found. I suspect that open3 doesn't set
-
 
4116
    #   $! anyway. I know it doesn't set $?
-
 
4117
    #
-
 
4118
    Debug ("Pid: $pid");
-
 
4119
    Error ("Can't run command: $!") unless $pid;
-
 
4120
 
-
 
4121
    #
-
 
4122
    #   Close the input handle
-
 
4123
    #   We don't have anything to send to this program
-
 
4124
    #
-
 
4125
    close(CHLD_IN);
-
 
4126
 
-
 
4127
    #
-
 
4128
    #   Monitor the output from the utility
-
 
4129
    #   Have used stdmux to multiplex stdout and stderr
-
 
4130
    #
-
 
4131
    #   Note: IO::Select doesn't work on Windows :(
-
 
4132
    #   Note: Open3 will cause blocking unless both streams are read
-
 
4133
    #         Can't read both streams because IO::Select doesn't work
-
 
4134
    #
-
 
4135
    #   Observation:
-
 
4136
    #       svn puts errors to STDERR
-
 
4137
    #       svn puts status to STDOUT
-
 
4138
    #
-
 
4139
    while (<CHLD_OUT>)
-
 
4140
    {
-
 
4141
        s~\s+$~~;
-
 
4142
        tr~\\/~/~;
-
 
4143
 
-
 
4144
 
-
 
4145
        Verbose3 ( "GitCmd:" . $_);
-
 
4146
        m~^STD(...):(.+)~;
-
 
4147
        my $data = $1 ? $2 : $_;
-
 
4148
        next unless ( $data );
-
 
4149
 
-
 
4150
        if ( $1 && $1 eq 'ERR' )
-
 
4151
        {
-
 
4152
            #
-
 
4153
            #   Process STDERR output
-
 
4154
            #
-
 
4155
            push @{$self->{ERROR_LIST}}, $data;
-
 
4156
        }
-
 
4157
        else
-
 
4158
        {
-
 
4159
            #
-
 
4160
            #   Process STDOUT data
-
 
4161
            #
-
 
4162
            push @{$self->{RESULT_LIST}}, $data unless ($opt->{'nosavedata'});
-
 
4163
 
-
 
4164
            #
-
 
4165
            #   If the user has specified a processing function then pass each
-
 
4166
            #   line to the specified function.  A non-zero return will
-
 
4167
            #   be taken as a signal to kill the command.
-
 
4168
            #
-
 
4169
            if ( exists ($opt->{'process'}) && $opt->{'process'}($self, $data) )
-
 
4170
            {
-
 
4171
                kill 9, $pid;
-
 
4172
                sleep(1);
-
 
4173
                last;
-
 
4174
            }
-
 
4175
        }
-
 
4176
    }
-
 
4177
 
-
 
4178
    close(CHLD_OUT);
-
 
4179
 
-
 
4180
    #
-
 
4181
    #   MUST wait for the process
-
 
4182
    #   Under Windows if this is not done then we eventually fill up some
-
 
4183
    #   perl-internal structure and can't spawn anymore processes.
-
 
4184
    #
-
 
4185
    my $rv = waitpid ( $pid, 0);
-
 
4186
 
-
 
4187
    #
-
 
4188
    #   If an error condition was detected and the user has provided
-
 
4189
    #   an error message, then display the error
-
 
4190
    #
-
 
4191
    #   This simplifies the user error processing
-
 
4192
    #
-
 
4193
    if ( @{$self->{ERROR_LIST}} && $opt->{'error'}  )
-
 
4194
    {
-
 
4195
        Error ( $opt->{'error'}, @{$self->{ERROR_LIST}} );
-
 
4196
    }
-
 
4197
 
-
 
4198
    #
-
 
4199
    #   Exit status has no meaning since open3 has been used
-
 
4200
    #   This is because perl does not treat the opened process as a child
-
 
4201
    #   Not too sure it makes any difference anyway
-
 
4202
    #
-
 
4203
    #
-
 
4204
    Debug ("Useless Exit Status: $rv");
-
 
4205
    my $result = @{$self->{ERROR_LIST}} ? 1 : 0;
-
 
4206
    Verbose3 ("Exit Code: $result");
-
 
4207
 
-
 
4208
    return $result;
-
 
4209
}
3958
}
4210
 
3959
 
4211
 
-
 
4212
#-------------------------------------------------------------------------------
3960
#-------------------------------------------------------------------------------
4213
# Function        : BuildVersion
3961
# Function        : BuildVersion
4214
#
3962
#
4215
# Description     : Generate version.c and version.h files
3963
# Description     : Generate version.c and version.h files
4216
#
3964
#
Line 4343... Line 4091...
4343
#                   The format of this file matches that generated by JANTS
4091
#                   The format of this file matches that generated by JANTS
4344
#                   Take care when extending the format
4092
#                   Take care when extending the format
4345
#
4093
#
4346
#                   NOTE: It turns out that JANTS is not a standard and the
4094
#                   NOTE: It turns out that JANTS is not a standard and the
4347
#                         implementors (of JANTS) kept on changing it.
4095
#                         implementors (of JANTS) kept on changing it.
-
 
4096
#                         
-
 
4097
#                   NOTE: This directive is now ignored
-
 
4098
#                         The descpkg file is generated internally
4348
#
4099
#
4349
# Inputs          : $mode - 'Internal' - Skip sanity test
4100
# Inputs          : $mode - 'Internal' - Skip sanity test
4350
#
4101
#
4351
# Returns         :
4102
# Returns         :
4352
#
4103
#
4353
sub BuildDescpkg
4104
sub BuildDescpkg
4354
{
4105
{
4355
    my ($mode) = @_;
-
 
4356
    unless ($mode && $mode eq 'Internal')
-
 
4357
    {
-
 
4358
        StartBuildPhase();                  # Starting the build phase. No more data collection
4106
    StartBuildPhase();                  # Starting the build phase. No more data collection
4359
    }
4107
}
4360
    return if ( $Clobber );                 # clobber mode ?
-
 
4361
 
4108
 
-
 
4109
#-------------------------------------------------------------------------------
-
 
4110
# Function        : WriteDescpkg 
4362
    #
4111
#
-
 
4112
# Description     : Create a package description file
4363
    #   Store the files location for use at runtime
4113
#                   The format of this file matches that generated by JANTS
4364
    #   It will be a file that is 'known' to JATS
4114
#                   Take care when extending the format
4365
    #
4115
#
4366
    my $pkgfile = BuildAddKnownFile ( $NoBuild ? $Cwd : $Srcdir, 'descpkg' );
4116
#                   NOTE: It turns out that JANTS is not a standard and the
-
 
4117
#                         implementors (of JANTS) kept on changing it.
-
 
4118
#
-
 
4119
# Inputs          :  
-
 
4120
#
-
 
4121
# Returns         : 
-
 
4122
#
-
 
4123
sub WriteDescpkg
-
 
4124
{
-
 
4125
    return if ( $Clobber );                 # clobber mode ?
4367
 
4126
 
4368
    my @desc;
4127
    my @desc;
4369
    push @desc, "Package Name:  $BUILDNAME_PACKAGE";
4128
    push @desc, "Package Name:  $BUILDNAME_PACKAGE";
4370
    push @desc, "Version:       $BUILDVERSION";
4129
    push @desc, "Version:       $BUILDVERSION";
4371
    push @desc, "Signature:     $BUILDSIGNATURE" if defined $BUILDSIGNATURE;
4130
    push @desc, "Signature:     $BUILDSIGNATURE" if defined $BUILDSIGNATURE;
Line 4390... Line 4149...
4390
        push @attributes, "build=\"true\"" if $type =~ /Build/i;
4149
        push @attributes, "build=\"true\"" if $type =~ /Build/i;
4391
 
4150
 
4392
        push @desc, "<sandbox @attributes/>";
4151
        push @desc, "<sandbox @attributes/>";
4393
    }
4152
    }
4394
 
4153
 
4395
    FileCreate ($pkgfile, \@desc );
4154
    FileCreate ($descpkgPath, \@desc );
4396
}
4155
}
4397
 
4156
 
4398
#-------------------------------------------------------------------------------
4157
#-------------------------------------------------------------------------------
4399
# Function        : NoBuildMarker
4158
# Function        : NoBuildMarker
4400
#
4159
#
Line 5291... Line 5050...
5291
 
5050
 
5292
 Commands:
5051
 Commands:
5293
    clobber        - Remove generated build system (eg Makefiles).
5052
    clobber        - Remove generated build system (eg Makefiles).
5294
    interface      - Only (re)build the interface tree.
5053
    interface      - Only (re)build the interface tree.
5295
    rootonly       - Only (re)build the root directory.
5054
    rootonly       - Only (re)build the root directory.
-
 
5055
    signature      - Create the packages signature
5296
 
5056
 
5297
=head1 OPTIONS
5057
=head1 OPTIONS
5298
 
5058
 
5299
=over 8
5059
=over 8
5300
 
5060
 
Line 5432... Line 5192...
5432
the root-level makefiles.
5192
the root-level makefiles.
5433
 
5193
 
5434
The build process will not recurse through the subdirectories creating
5194
The build process will not recurse through the subdirectories creating
5435
makefiles. These can be made on-demand by jats if a 'make' command is issued.
5195
makefiles. These can be made on-demand by jats if a 'make' command is issued.
5436
 
5196
 
-
 
5197
=item B<signature>
-
 
5198
 
-
 
5199
This command will only build, or rebuild, the 'interface' directory and 
-
 
5200
the root-level makefiles. It will not process external packages.
-
 
5201
 
-
 
5202
The build process will not recurse through the subdirectories creating
-
 
5203
makefiles. These can be made on-demand by jats if a 'make' command is issued.
-
 
5204
 
-
 
5205
This option is provided to allow the packages signature to be calculated.
-
 
5206
 
5437
=item B<clobber>
5207
=item B<clobber>
5438
 
5208
 
5439
This command will remove generated build system files and directories.
5209
This command will remove generated build system files and directories.
5440
 
5210
 
5441
=back
5211
=back