Subversion Repositories DevTools

Rev

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

Rev 7300 Rev 7301
Line 27... Line 27...
27
use Pod::Usage;
27
use Pod::Usage;
28
use Getopt::Long;
28
use Getopt::Long;
29
use File::Path;
29
use File::Path;
30
use XML::Writer;
30
use XML::Writer;
31
use ArrayHashUtils;
31
use ArrayHashUtils;
-
 
32
use File::Find;
-
 
33
use Digest::SHA qw(sha1);
-
 
34
use IPC::Open3;
32
 
35
 
33
our $BuildVersion           = "2.1.0";
36
our $BuildVersion           = "2.1.0";
34
 
37
 
35
#.. Switchs
38
#.. Switchs
36
#
39
#
Line 74... Line 77...
74
our $BUILDNAME_PACKAGE;                         # Name
77
our $BUILDNAME_PACKAGE;                         # Name
75
our $BUILDNAME_VERSION;                         # Version
78
our $BUILDNAME_VERSION;                         # Version
76
our $BUILDNAME_PROJECT;                         # Project(optional)
79
our $BUILDNAME_PROJECT;                         # Project(optional)
77
our $BUILDNAME_SUFFIX;                          # Project (available)
80
our $BUILDNAME_SUFFIX;                          # Project (available)
78
our $DEPLOY_PATCH           = 0;                # Deplyment patch number
81
our $DEPLOY_PATCH           = 0;                # Deplyment patch number
-
 
82
our $BUILDSIGNATURE;                            # Source signature
79
 
83
 
80
our %BUILDALIAS_DELAY       = ();               # Delayed aliases
84
our %BUILDALIAS_DELAY       = ();               # Delayed aliases
81
our %BUILDALIAS_TARGETS     = ();               # BuildAlias from --Targets
85
our %BUILDALIAS_TARGETS     = ();               # BuildAlias from --Targets
82
our %BUILDALIAS             = ();               # BuildAlias
86
our %BUILDALIAS             = ();               # BuildAlias
83
our %BUILDPRODUCT           = ();               # BuildProduct
87
our %BUILDPRODUCT           = ();               # BuildProduct
Line 100... Line 104...
100
our $BUILD_UUID             = time() . substr(rand(),2); # Build Unique Identifier
104
our $BUILD_UUID             = time() . substr(rand(),2); # Build Unique Identifier
101
 
105
 
102
my  $DeleteDPACKAGE         = 0;                # Must clobber DPACKAGE
106
my  $DeleteDPACKAGE         = 0;                # Must clobber DPACKAGE
103
my  $build_source_pkg       = 0;                # Flag to build source package
107
my  $build_source_pkg       = 0;                # Flag to build source package
104
my  $opt_help               = 0;
108
my  $opt_help               = 0;
105
my  $sandbox_exact          = 0;                # Exact or in-exact sandbox
-
 
106
my  $pkgFromSandbox         = 0;                # Flags that we have imported a package from a sandbox
109
my  $pkgFromSandbox         = 0;                # Flags that we have imported a package from a sandbox
107
 
110
 
108
my  $genToolsetPlatform     = 0;                # BuildToolset directive has been seen
111
my  $genToolsetPlatform     = 0;                # BuildToolset directive has been seen
109
my  $genToolsetActive       = 0;                # TOOLSET platform required:1, Error:2
112
my  $genToolsetActive       = 0;                # TOOLSET platform required:1, Error:2
110
my  $toolsetPlatform        = 'NONE';           # TOOLSET Display Value
113
my  $toolsetPlatform        = 'NONE';           # TOOLSET Display Value
Line 1467... Line 1470...
1467
    #   as they may be used later
1470
    #   as they may be used later
1468
    #
1471
    #
1469
    return if ( $Clobber );
1472
    return if ( $Clobber );
1470
    ToolsetFiles::AddFile('build.log');
1473
    ToolsetFiles::AddFile('build.log');
1471
    
1474
    
1472
    #
-
 
1473
    #   Determine type of sandbox
-
 
1474
    #
-
 
1475
    $sandbox_exact = ( -f $::GBE_DPKG_SBOX . '/.exact' )
-
 
1476
        if ( $::GBE_DPKG_SBOX );
-
 
1477
    
-
 
1478
#.. Create build.log summary information
1475
#.. Create build.log summary information
1479
#
1476
#
1480
    my ($sep) = "\n".(" " x 11) . ". ";
1477
    my ($sep) = "\n".(" " x 11) . ". ";
1481
 
1478
 
1482
    Log( "\nBuild configuration (version $::GBE_VERSION)" );
1479
    Log( "\nBuild configuration (version $::GBE_VERSION)" );
Line 1504... Line 1501...
1504
    Log( "DPKG ....... $::GBE_DPKG" );
1501
    Log( "DPKG ....... $::GBE_DPKG" );
1505
    Log( "DPKG_REPLI . $::GBE_DPKG_REPLICA" );
1502
    Log( "DPKG_REPLI . $::GBE_DPKG_REPLICA" );
1506
    Log( "DPKG_CACHE . $::GBE_DPKG_CACHE" );
1503
    Log( "DPKG_CACHE . $::GBE_DPKG_CACHE" );
1507
    Log( "DPKG_LOCAL . $::GBE_DPKG_LOCAL" );
1504
    Log( "DPKG_LOCAL . $::GBE_DPKG_LOCAL" );
1508
    Log( "DPKG_SBOX .. $::GBE_DPKG_SBOX" );
1505
    Log( "DPKG_SBOX .. $::GBE_DPKG_SBOX" );
1509
    Log( "Sandbox .... " . ($sandbox_exact ? "Exact" : "Development") );
1506
    Log( "Sandbox .... Development" );
1510
    Log( "LocalFilter. $::GBE_SANDBOX/buildfilter") if ( $::GBE_SANDBOX && -f $::GBE_SANDBOX . '/buildfilter' );
1507
    Log( "LocalFilter. $::GBE_SANDBOX/buildfilter") if ( $::GBE_SANDBOX && -f $::GBE_SANDBOX . '/buildfilter' );
1511
 
1508
 
1512
    #
1509
    #
1513
    #   Generate a list of platforms that are completely unknown to JATS
1510
    #   Generate a list of platforms that are completely unknown to JATS
1514
    #   May be the result of a user typo or a guess
1511
    #   May be the result of a user typo or a guess
Line 1570... Line 1567...
1570
    }
1567
    }
1571
 
1568
 
1572
    unless( @BUILD_ACTIVEPLATFORMS )
1569
    unless( @BUILD_ACTIVEPLATFORMS )
1573
    {
1570
    {
1574
        my $msg = 'GBE_BUILDFILTER prevents any targets being built';
1571
        my $msg = 'GBE_BUILDFILTER prevents any targets being built';
1575
        if (defined($::GBE_ABT) || defined($::GBE_SANDBOX )) {
1572
        if (defined($::GBE_ABT) || 1) {
1576
 
1573
 
1577
            # Build filter on this machine prevents the package building
1574
            # Build filter on this machine prevents the package building
1578
            # On a Build System this is not an error
1575
            # On a Build System this is not an error
1579
            #   Create a dummy platform called NOBUILD
1576
            #   Create a dummy platform called NOBUILD
1580
            #   Do not populate the interface directory with package data
1577
            #   Do not populate the interface directory with package data
Line 1941... Line 1938...
1941
    Debug( "Name:      $name" );
1938
    Debug( "Name:      $name" );
1942
    Debug( "Version:   $version" );
1939
    Debug( "Version:   $version" );
1943
 
1940
 
1944
    DataDirective("LinkPkgArchive");            # This directive allowed here
1941
    DataDirective("LinkPkgArchive");            # This directive allowed here
1945
 
1942
 
1946
    if ( $IgnorePkgs )
1943
#   if ( $IgnorePkgs )
1947
    {
1944
#   {
1948
        Log( "LinkPkgArchive .. $name ($version) - Ignored" );
1945
#       Log( "LinkPkgArchive .. $name ($version) - Ignored" );
1949
        return;
1946
#       return;
1950
    }
1947
#   }
1951
 
1948
 
1952
    #
1949
    #
1953
    #   Ensure that we have do not have multiple definitions
1950
    #   Ensure that we have do not have multiple definitions
1954
    #
1951
    #
1955
    if ( PackageEntry::Exists( $name, $version ) )
1952
    if ( PackageEntry::Exists( $name, $version ) )
Line 1967... Line 1964...
1967
 
1964
 
1968
    #
1965
    #
1969
    #   Locate the package ONCE
1966
    #   Locate the package ONCE
1970
    #
1967
    #
1971
    Log( "LinkPkgArchive .. $name ($version)" );
1968
    Log( "LinkPkgArchive .. $name ($version)" );
1972
    my ($pkg, $local ) = PackageLocate( $name, $version );
1969
    my ($pkg, $local, $pkgSig ) = PackageLocate( $name, $version );
1973
    if ( $pkg )
1970
    if ( $pkg )
1974
    {
1971
    {
1975
        #
1972
        #
1976
        #   Generate package rules for each active platform
1973
        #   Generate package rules for each active platform
1977
        #
1974
        #
1978
        IncludePkg ( $name, $pkg );
1975
        IncludePkg ( $name, $pkg );
1979
        foreach my $platform ( @BUILD_ACTIVEPLATFORMS, '--' )
1976
        foreach my $platform ( @BUILD_ACTIVEPLATFORMS, '--' )
1980
        {
1977
        {
1981
            LinkEntry( $platform, $pkg, $name, $version, 0, $local );
1978
            LinkEntry( $platform, $pkg, $name, $version, 0, $local, $pkgSig );
1982
        }
1979
        }
1983
    }
1980
    }
1984
}
1981
}
1985
 
1982
 
1986
#-------------------------------------------------------------------------------
1983
#-------------------------------------------------------------------------------
Line 1993... Line 1990...
1993
# Inputs          : package name
1990
# Inputs          : package name
1994
#                   package version
1991
#                   package version
1995
#
1992
#
1996
# Returns         : path to the package
1993
# Returns         : path to the package
1997
#                   local       1 - From local package repository
1994
#                   local       1 - From local package repository
-
 
1995
#                   Package Signature
1998
#
1996
#
1999
sub PackageLocate
1997
sub PackageLocate
2000
{
1998
{
2001
    my ($name, $uversion ) = @_;
1999
    my ($name, $uversion ) = @_;
2002
    my $pkg;
2000
    my $pkg;
2003
    my $local = 1;
2001
    my $local = 1;
2004
    my $sandbox = ! $sandbox_exact;
2002
    my $sandbox = 1;
2005
    my $isa_cache = 0;
2003
    my $isa_cache = 0;
2006
    my $version;
2004
    my $version;
-
 
2005
    my $pkgSig = 'unknown';
2007
 
2006
 
2008
    Debug( "PackageLocate: ($name/$uversion)" );
2007
    Debug( "PackageLocate: ($name/$uversion)" );
2009
 
2008
 
2010
    #
2009
    #
-
 
2010
    #   If we are in a SandBox, then we use package signatures to locate pre-built
-
 
2011
    #   packages.
-
 
2012
    #
-
 
2013
    if ($::GBE_SANDBOX)
-
 
2014
    {
-
 
2015
        my @ret = PackageLocateBySignature(@_);
-
 
2016
        if ($ret[0])
-
 
2017
        {
-
 
2018
            return @ret;
-
 
2019
        }
-
 
2020
        Warning ("Package not found by signature - revert to package version")
-
 
2021
    }
-
 
2022
 
-
 
2023
    #
2011
    #   Look in each package archive directory
2024
    #   Look in each package archive directory
2012
    #
2025
    #
2013
    foreach my $dpkg ( split( $::ScmPathSep, $::GBE_DPKG_SBOX),
2026
    foreach my $dpkg ( split( $::ScmPathSep, $::GBE_DPKG_SBOX),
2014
                       '--NotSandbox',
2027
                       '--NotSandbox',
2015
                       split( $::ScmPathSep, $::GBE_DPKG_LOCAL),
2028
                       split( $::ScmPathSep, $::GBE_DPKG_LOCAL),
Line 2084... Line 2097...
2084
            my $link_src = $pkg;
2097
            my $link_src = $pkg;
2085
            $pkg = TagFileRead($pkg);
2098
            $pkg = TagFileRead($pkg);
2086
            $pkg =~ s~\\~/~g;
2099
            $pkg =~ s~\\~/~g;
2087
            if ($pkg =~ s~^GBE_SANDBOX/~$::GBE_SANDBOX/~)
2100
            if ($pkg =~ s~^GBE_SANDBOX/~$::GBE_SANDBOX/~)
2088
            {
2101
            {
2089
                    $pkgFromSandbox++;
-
 
2090
 
-
 
2091
                    # If the target sandbox is in the 'deploymode' then the package
2102
                    # If the target sandbox is in the 'deploymode' then the package
2092
                    # will not be in the expected location. It will be in a 'build/deploy'
2103
                    # will not be in the expected location. It will be in a 'build/deploy'
2093
                    # subdir. Remove the pkg/name dir to get to the root of the package
2104
                    # subdir. Remove the pkg/name dir to get to the root of the package
2094
                    my @dirs = File::Spec->splitdir( $pkg );
2105
                    my @dirs = File::Spec->splitdir( $pkg );
2095
                    splice(@dirs, -2);
2106
                    splice(@dirs, -2);
Line 2127... Line 2138...
2127
        #
2138
        #
2128
        #   Use the first suitable package found
2139
        #   Use the first suitable package found
2129
        #..
2140
        #..
2130
 
2141
 
2131
        Debug( "           importing $pkg" );
2142
        Debug( "           importing $pkg" );
2132
        return $pkg, $local;
2143
        return $pkg, $local, $pkgSig;
2133
    }
2144
    }
2134
 
2145
 
2135
    #
2146
    #
2136
    #   Package not found
2147
    #   Package not found
2137
    #   This is an error, although it can be bypassed
2148
    #   This is an error, although it can be bypassed
Line 2140... Line 2151...
2140
 
2151
 
2141
    Log( "WARNING .... Package not available: '$name/$version'" );
2152
    Log( "WARNING .... Package not available: '$name/$version'" );
2142
    return;
2153
    return;
2143
}
2154
}
2144
 
2155
 
-
 
2156
#-------------------------------------------------------------------------------
-
 
2157
# Function        : PackageLocateBySignature
-
 
2158
#
-
 
2159
# Description     : Locate a package via its signature
-
 
2160
#                   In a monoRepo sandbox pre-build package artifacts are located
-
 
2161
#                   via the signature of the source package. This must be generated
-
 
2162
#                   before it can be used.
-
 
2163
#                   
-
 
2164
#                   At the moment we simply generate an error if the signature cannot be
-
 
2165
#                   found. We could be clever and invoke jats to generate the required 
-
 
2166
#                   signature.
-
 
2167
#                   
-
 
2168
#
-
 
2169
# Inputs          : package name
-
 
2170
#                   package version
-
 
2171
#
-
 
2172
# Returns         : path to the package
-
 
2173
#                   local       1 - From local package repository
-
 
2174
#                   Package Signature
-
 
2175
#
-
 
2176
sub PackageLocateBySignature
-
 
2177
{
-
 
2178
    my ($name, $uversion ) = @_;
-
 
2179
    my $prj = '';
-
 
2180
    my $pkg;
-
 
2181
    my $local = 1;
-
 
2182
    my $in_sandbox = 1;
-
 
2183
    my $isa_cache = 0;
-
 
2184
    my $version;
-
 
2185
    my $pkgSig = 'unknown';
-
 
2186
 
-
 
2187
    Debug( "PackageLocateBySignature: ($name/$uversion)" );
-
 
2188
 
-
 
2189
    # 
-
 
2190
    #   We are in a sandbox and expect to find a interface/Package.sig file
-
 
2191
    #   This will allow us to locate the package in the package store
-
 
2192
    #   
-
 
2193
    #   If there is no interface/Package.sig, then the user must build (not make)
-
 
2194
    #   the package in the sandbox.
-
 
2195
    #   
-
 
2196
    #   ie: the interface/Package.sig file allows us to use the package from package cache
-
 
2197
    #       or indicates that the user has not yet built the package
-
 
2198
    #       
-
 
2199
    #
-
 
2200
    #   First locate the packages interface directory
-
 
2201
    #   We have a nice link from the sandbox to assist in this
-
 
2202
    #
-
 
2203
    my ($pn, $pv, $ps ) = SplitPackage ($name, $uversion );
-
 
2204
    $version = 'sandbox';
-
 
2205
    $prj = '.' . $ps if ( $ps ); 
-
 
2206
    $version .= $prj;
-
 
2207
     
-
 
2208
    my $ifaceDir = catdir($::GBE_SANDBOX, 'sandbox_dpkg_archive', $name, $version . '.int');
-
 
2209
    $ifaceDir = TagFileRead($ifaceDir);
-
 
2210
    $ifaceDir =~ s~\\~/~g;
-
 
2211
    $ifaceDir =~ s~GBE_SANDBOX/~$::GBE_SANDBOX/~;
-
 
2212
    my $pkgSigFile = catfile( $ifaceDir, 'Package.sig');
-
 
2213
 
-
 
2214
    return unless -f $pkgSigFile; 
-
 
2215
 
-
 
2216
    Error("Package signature not found for $name/$version", "You must 'build' the package before using it")
-
 
2217
        unless ( -f $pkgSigFile);
-
 
2218
    $pkgSig = TagFileRead($pkgSigFile);
-
 
2219
    Error("Package signature invalid for $name/$version", "Signature: $pkgSig") 
-
 
2220
        if(length($pkgSig) != 40);
-
 
2221
 
-
 
2222
    #
-
 
2223
    #   Look in each package archive directory
-
 
2224
    #
-
 
2225
    foreach my $dpkg ( split( $::ScmPathSep, $::GBE_DPKG_SBOX),
-
 
2226
                       '--NotSandbox',
-
 
2227
                       split( $::ScmPathSep, $::GBE_DPKG_LOCAL),
-
 
2228
                       '--NotLocal',
-
 
2229
                       split( $::ScmPathSep, $::GBE_DPKG_CACHE),
-
 
2230
                       '--NotCache',
-
 
2231
                       split( $::ScmPathSep, $::GBE_DPKG_REPLICA),
-
 
2232
                       split( $::ScmPathSep, $::GBE_DPKG),
-
 
2233
                       split( $::ScmPathSep, $::GBE_DPLY),
-
 
2234
                       split( $::ScmPathSep, $::GBE_DPKG_STORE) )
-
 
2235
    {
-
 
2236
 
-
 
2237
        #
-
 
2238
        #   Detect various tags that have been placed in the search list
-
 
2239
        #   to flag the end of the sandbox search and the end of the local
-
 
2240
        #   archive search
-
 
2241
        #
-
 
2242
        if ( $dpkg eq '--NotSandbox' )
-
 
2243
        {
-
 
2244
            $in_sandbox = 0;
-
 
2245
            next;
-
 
2246
        }
-
 
2247
        if ( $dpkg eq '--NotLocal' )
-
 
2248
        {
-
 
2249
            $local = 0;
-
 
2250
            $isa_cache = 1;
-
 
2251
            next;
-
 
2252
        }
-
 
2253
        if ( $dpkg eq '--NotCache' )
-
 
2254
        {
-
 
2255
            $isa_cache = 0;
-
 
2256
            next;
-
 
2257
        }
-
 
2258
        
-
 
2259
        $pkg = "$dpkg/$name$prj/$pkgSig";
-
 
2260
        $pkg = "$dpkg/$name/$version.lnk"
-
 
2261
            if ( -e "$dpkg/$name/$version.lnk" );
-
 
2262
 
-
 
2263
        #
-
 
2264
        #   If we are scanning the sandbox archive itself, then we can will override the signature
-
 
2265
        #   if the package has been built within the sandbox. This is indicated by the presence of a
-
 
2266
        #   valid .lnk file.
-
 
2267
        #   
-
 
2268
        #       Note: The .lnk file may be present, but it won't point to anything valid until
-
 
2269
        #             the package has been built.
-
 
2270
        #
-
 
2271
        if ($in_sandbox)
-
 
2272
        {
-
 
2273
            my $pkgLinkFile = $pkg;
-
 
2274
            $pkgLinkFile =~ s~pkgsig$~lnk~;
-
 
2275
 
-
 
2276
            if ( -f $pkgLinkFile )
-
 
2277
            {
-
 
2278
                Debug( "           link found -> $pkg" );
-
 
2279
                my $pkgLink = TagFileRead($pkgLinkFile);
-
 
2280
                $pkgLink =~ s~\\~/~g;
-
 
2281
                if ($pkgLink =~ s~^GBE_SANDBOX/~$::GBE_SANDBOX/~)
-
 
2282
                {
-
 
2283
                        # If the target sandbox is in the 'deploymode' then the package
-
 
2284
                        # will not be in the expected location. It will be in a 'build/deploy'
-
 
2285
                        # subdir. Remove the pkg/name dir to get to the root of the package
-
 
2286
                        my @dirs = File::Spec->splitdir( $pkgLink );
-
 
2287
                        splice(@dirs, -2);
-
 
2288
                        my $deployBox = catdir(@dirs, 'build', 'deploy');
-
 
2289
                        $pkgLink = $deployBox if ( -d $deployBox);
-
 
2290
                }
-
 
2291
 
-
 
2292
                # 
-
 
2293
                #   Handle badly formed packages - test for descpkg file
-
 
2294
                #   Or those have the body of the code in the pkg directory
-
 
2295
                #   
-
 
2296
                my $pkgDescpkg = catfile( $pkgLink, 'descpkg');
-
 
2297
                if (-d $pkgLink && -f $pkgDescpkg)
-
 
2298
                {
-
 
2299
                    $pkg = $pkgLink;
-
 
2300
Debug0("============== From Sandbox: $pkgSig");
-
 
2301
#                    $pkgFromSandbox++;
-
 
2302
                }
-
 
2303
            }
-
 
2304
        }
-
 
2305
 
-
 
2306
        Debug( "           searching $pkg" );
-
 
2307
 
-
 
2308
        #   Does the package directory exist?
-
 
2309
        #   Terminate the directory name with a "/" to detect hidden spaces
-
 
2310
        #..
-
 
2311
        $pkg =~ s~//~/~g;
-
 
2312
        next unless ( -d "$pkg/" );             # exists ?
-
 
2313
 
-
 
2314
        #
-
 
2315
        #   If the package exists within the dpkg_archive cache then mark the
-
 
2316
        #   version as having been used. Used by cache cleanup algorithms
-
 
2317
        #
-
 
2318
        if ( $isa_cache  )
-
 
2319
        {
-
 
2320
            TouchFile ( "$pkg/used.cache", "Marks the cache copy as being used");
-
 
2321
        }
-
 
2322
 
-
 
2323
        #
-
 
2324
        #   Use the first suitable package found
-
 
2325
        #..
-
 
2326
 
-
 
2327
        Debug( "           importing $pkg" );
-
 
2328
        return $pkg, $local, $pkgSig;
-
 
2329
    }
-
 
2330
 
-
 
2331
    #
-
 
2332
    #   Package not found
-
 
2333
    #   This is an error, although it can be bypassed
-
 
2334
    #
-
 
2335
    Error ("Required package not found: '$name/$version'" ) unless ( $NoPackageError );
-
 
2336
 
-
 
2337
    Log( "WARNING .... Package not available: '$name/$version'" );
-
 
2338
    return;
-
 
2339
}
2145
 
2340
 
2146
#-------------------------------------------------------------------------------
2341
#-------------------------------------------------------------------------------
2147
# Function        : LinkEntry
2342
# Function        : LinkEntry
2148
#
2343
#
2149
# Description     : Scan a package an locate platform specific directories
2344
# Description     : Scan a package an locate platform specific directories
Line 2155... Line 2350...
2155
#                   path to the package
2350
#                   path to the package
2156
#                   name of the package
2351
#                   name of the package
2157
#                   version of the package
2352
#                   version of the package
2158
#                   sandbox support (non-zero)
2353
#                   sandbox support (non-zero)
2159
#                   local package
2354
#                   local package
-
 
2355
#                   package Signature
2160
#
2356
#
2161
sub LinkEntry
2357
sub LinkEntry
2162
{
2358
{
2163
    my( $platform, $pkg, $name, $version, $sandbox, $local ) = @_;
2359
    my( $platform, $pkg, $name, $version, $sandbox, $local, $pkgSig ) = @_;
2164
    my( $entry );
2360
    my( $entry );
2165
 
2361
 
2166
    #   Create entry record
2362
    #   Create entry record
2167
    #
2363
    #
2168
    #..
2364
    #..
2169
    $entry = PackageEntry::New( $pkg, $name, $version, $sandbox, 'link', $local );
2365
    $entry = PackageEntry::New( $pkg, $name, $version, $sandbox, 'link', $local, $pkgSig );
2170
 
2366
 
2171
    #   Populate includes:
2367
    #   Populate includes:
2172
    #
2368
    #
2173
    #   - include/$platform                 (eg include/solaris)
2369
    #   - include/$platform                 (eg include/solaris)
2174
    #   - inc/$platform                     (eg inc/solaris)
2370
    #   - inc/$platform                     (eg inc/solaris)
Line 2273... Line 2469...
2273
    Debug( "Name:      $name" );
2469
    Debug( "Name:      $name" );
2274
    Debug( "Version:   $version" );
2470
    Debug( "Version:   $version" );
2275
 
2471
 
2276
    DataDirective("BuildPkgArchive");           # This directive allowed here
2472
    DataDirective("BuildPkgArchive");           # This directive allowed here
2277
 
2473
 
2278
    if ( $IgnorePkgs )
2474
#   if ( $IgnorePkgs )
2279
    {
2475
#   {
2280
        Log( "BuildPkgArchive . $name ($version) - Ignored" );
2476
#       Log( "BuildPkgArchive . $name ($version) - Ignored" );
2281
        return;
2477
#       return;
2282
    }
2478
#   }
2283
    
2479
    
2284
    #
2480
    #
2285
    #   Ensure that we have do not have multiple definitions
2481
    #   Ensure that we have do not have multiple definitions
2286
    #
2482
    #
2287
    if ( PackageEntry::Exists( $name, $version ) )
2483
    if ( PackageEntry::Exists( $name, $version ) )
Line 2300... Line 2496...
2300
    #
2496
    #
2301
    #   Locate the package
2497
    #   Locate the package
2302
    #   Use the first instance of the package that is found
2498
    #   Use the first instance of the package that is found
2303
    #
2499
    #
2304
    Log( "BuildPkgArchive . $name ($version)" );
2500
    Log( "BuildPkgArchive . $name ($version)" );
2305
    my ( $pkg, $local ) = PackageLocate( $name, $version );
2501
    my ( $pkg, $local, $pkgSig ) = PackageLocate( $name, $version );
2306
    if ( $pkg )
2502
    if ( $pkg )
2307
    {
2503
    {
2308
        #
2504
        #
2309
        #   Create a Package Entry
2505
        #   Create a Package Entry
2310
        #
2506
        #
2311
        my $entry = PackageEntry::New( $pkg, $name, $version, 0, 'build', $local );
2507
        my $entry = PackageEntry::New( $pkg, $name, $version, 0, 'build', $local, $pkgSig );
2312
 
2508
 
2313
        #
2509
        #
2314
        #   Determine if the package needs to be installed:
2510
        #   Determine if the package needs to be installed:
2315
        #       If the package is a 'local' package then force transfer
2511
        #       If the package is a 'local' package then force transfer
2316
        #       If the user has specified --cache then force transfer
2512
        #       If the user has specified --cache then force transfer
Line 3297... Line 3493...
3297
                Verbose2 ("Buildfilter Test: Was:$line, Is:$::GBE_BUILDFILTER");
3493
                Verbose2 ("Buildfilter Test: Was:$line, Is:$::GBE_BUILDFILTER");
3298
            }
3494
            }
3299
        }
3495
        }
3300
 
3496
 
3301
        #
3497
        #
-
 
3498
        #   See if the dependencies have changed
-
 
3499
        #   
-
 
3500
        my $BuildpkgSig = Digest::SHA->new;
-
 
3501
        $BuildpkgSig->add("PKGNAME: $BUILDNAME_PACKAGE $BUILDNAME_VERSION $BUILDNAME_SUFFIX");
-
 
3502
 
-
 
3503
        #
-
 
3504
        #   Include the signature of ALL dependent packages
-
 
3505
        #   Ie: The build fingerprint is a function of the source and its dependents
-
 
3506
        #
-
 
3507
        my $depTagFile = catfile($ScmInterface, 'build.bfp');
-
 
3508
        unless (-f $depTagFile) {
-
 
3509
            push @build_warn, "Missing: $depTagFile";
-
 
3510
        }
-
 
3511
        else
-
 
3512
        {
-
 
3513
            foreach my $tag ( PackageEntry::GetPackageList() )
-
 
3514
            {
-
 
3515
                my $pkgSig = PackageEntry::GetPackageSignature($tag);
-
 
3516
                $BuildpkgSig->add("PKGSIGNATURE: $pkgSig");
-
 
3517
            }
-
 
3518
            my $depSha1 =  $BuildpkgSig->hexdigest;
-
 
3519
            Debug2("DepSha1: $depSha1");
-
 
3520
            unless (TagFileMatch ($depTagFile, $depSha1))
-
 
3521
            {
-
 
3522
                push @build_warn, "Dependency signatures have changed";
-
 
3523
            }
-
 
3524
        }
-
 
3525
 
-
 
3526
        #
3302
        #   If any of the imported packages are from a sandbox, then we must force a build
3527
        #   If any of the imported packages are from a sandbox, then we must force a build
3303
        #   and a make.
3528
        #   and a make.
3304
        #
3529
        #
3305
        if ($pkgFromSandbox)
3530
        if ($pkgFromSandbox)
3306
        {
3531
        {
Line 3370... Line 3595...
3370
    #
3595
    #
3371
    if ( $target_archive = $::GBE_DPKG_SBOX )
3596
    if ( $target_archive = $::GBE_DPKG_SBOX )
3372
    {
3597
    {
3373
        $target_archive_name = "sandbox_dpkg_archive";
3598
        $target_archive_name = "sandbox_dpkg_archive";
3374
        $tag = "Sandbox";
3599
        $tag = "Sandbox";
3375
        if ( $sandbox_exact )
-
 
3376
        {
-
 
3377
            $link_file = "$BUILDVERSION.lnk";
-
 
3378
        }
-
 
3379
        else
-
 
3380
        {
-
 
3381
            $link_file  = 'sandbox' . ${BUILDNAME_SUFFIX} . '.lnk';
3600
        $link_file  = 'sandbox' . ${BUILDNAME_SUFFIX} . '.lnk';
3382
        }
-
 
3383
        $root_path = 'GBE_SANDBOX' . substr($Cwd, length($::GBE_SANDBOX));
3601
        $root_path = 'GBE_SANDBOX' . substr($Cwd, length($::GBE_SANDBOX));
3384
        Verbose2("Root Path: $::GBE_SANDBOX, $root_path");
3602
        Verbose2("Root Path: $::GBE_SANDBOX, $root_path");
3385
    }
3603
    }
3386
    elsif ( $target_archive = $::GBE_DPKG_LOCAL )
3604
    elsif ( $target_archive = $::GBE_DPKG_LOCAL )
3387
    {
3605
    {
Line 3684... Line 3902...
3684
    my @cmds = ('jmake.pl', 'rebuild');
3902
    my @cmds = ('jmake.pl', 'rebuild');
3685
    push @cmds, 'NORECURSE=1' if ( $RootOnly );
3903
    push @cmds, 'NORECURSE=1' if ( $RootOnly );
3686
    JatsTool ( @cmds);
3904
    JatsTool ( @cmds);
3687
 
3905
 
3688
    #
3906
    #
-
 
3907
    #   Generate package signature
-
 
3908
    #
3689
    ErrorConfig( 'name' => 'buildlib')   ;
3909
    ErrorConfig( 'name' => 'buildlib')   ;
-
 
3910
    BuildSignature();
-
 
3911
 
-
 
3912
    #
3690
    #   Generate some warnings that will be seen at the end of the build
3913
    #   Generate some warnings that will be seen at the end of the build
3691
    #
3914
    #
3692
    Warning ("BuildSrcArchive Directive Present","Read JATS Manual for correct usage")
3915
    Warning ("BuildSrcArchive Directive Present","Read JATS Manual for correct usage")
3693
        if ($build_source_pkg);
3916
        if ($build_source_pkg);
3694
}
3917
}
3695
 
3918
 
-
 
3919
#-------------------------------------------------------------------------------
-
 
3920
# Function        : BuildSignature 
-
 
3921
#
-
 
3922
# Description     : Generate a package 'signature' for this package
-
 
3923
#               
-
 
3924
#                   The signature is used to bypass the entire Make processing in a sandbox
-
 
3925
#                   If we can find a matching package in the package store then we don't 
-
 
3926
#                   need to 'make' this package.
-
 
3927
#
-
 
3928
#                   There are two scenarios:
-
 
3929
#                       In a GIT enabled sandbox
-
 
3930
#                       Without GIT
-
 
3931
#                       
-
 
3932
#                   In a GIT enabled sandbox the signature allows the use of a pre-built 
-
 
3933
#                   package - even if the package has been built on a different branch.
-
 
3934
#                   
-
 
3935
#                       The signature includes:
-
 
3936
#                           The name of this package
-
 
3937
#                           The GIT sha1 of the directory trees that contain this package
-
 
3938
#                           The package signatures of all dependent packages
-
 
3939
#                           
-
 
3940
#                   In a Non-GIT enabled sandbox the package signature will be set such that
-
 
3941
#                   the package will never be found in the package store and the package MUST
-
 
3942
#                   be built within the sandbox.
-
 
3943
#                   
-
 
3944
#                   The hard part is determing the directory trees that contain this package
-
 
3945
#                   Ideally this is a single dir-tree, but this cannot be enforced.
-
 
3946
#                   
-
 
3947
#                   Source directories have been gathered during makefile generation
-
 
3948
#                   
-
 
3949
#                   This suits most cases, but there are a few where the user needs
-
 
3950
#                   to give JATS a hint. Use the AsdSrcDir directive to extend
-
 
3951
#                   the signature paths to directories not under the build.pl
-
 
3952
#                   or any makefile included by the build.pl
-
 
3953
#                       
-
 
3954
# Inputs          : 
-
 
3955
#
-
 
3956
# Returns         : 
-
 
3957
#
-
 
3958
sub BuildSignature
-
 
3959
{
-
 
3960
    my %sigExcludeDirs;
-
 
3961
    my %sigExcludeFiles;
-
 
3962
    my $BuildSignatureSha1;
-
 
3963
    my $signatureFile = catfile($Cwd, $BUILDINTERFACE, 'Package.sig');
-
 
3964
    my $sigDebugFile  = catfile($Cwd, $BUILDINTERFACE, 'Package.dsig');
-
 
3965
    my @sigList;
-
 
3966
 
-
 
3967
    #
-
 
3968
    #   Only create the Signature file ONCE
-
 
3969
    #   Done on first build (after a clobber)
-
 
3970
    #
-
 
3971
#   if (-f $signatureFile)
-
 
3972
#   {
-
 
3973
#       Message("Generate Package Signature - Already generated");
-
 
3974
#       return;
-
 
3975
#   }
-
 
3976
 
-
 
3977
    Message("Generate Package Signature");
-
 
3978
 
-
 
3979
    #
-
 
3980
    #   Determine if this is a GIT enabled sandbox build
-
 
3981
    #   Need a .git directory or file in the root of the sandbox
-
 
3982
    #
-
 
3983
    my $gitEnabled;
-
 
3984
    if ($::GBE_SANDBOX && -e catfile ($::GBE_SANDBOX, '.git') )
-
 
3985
    {
-
 
3986
        $gitEnabled = 1;
-
 
3987
    }
-
 
3988
 
-
 
3989
    #
-
 
3990
    #   Start generating the signature
-
 
3991
    #       Include the package Name,Version and Project
-
 
3992
    #
-
 
3993
    $BuildSignatureSha1 = Digest::SHA->new;
-
 
3994
    $BuildSignatureSha1->add("PKGNAME: $BUILDNAME_PACKAGE $BUILDNAME_VERSION $BUILDNAME_SUFFIX");
-
 
3995
    push @sigList, "PKGNAME: $BUILDNAME_PACKAGE $BUILDNAME_VERSION $BUILDNAME_SUFFIX: " . $BuildSignatureSha1->clone->hexdigest;
-
 
3996
 
-
 
3997
    #
-
 
3998
    #   Include the signature of ALL dependent packages
-
 
3999
    #   Ie: The package signature is a function of the source and its dependents
-
 
4000
    #
-
 
4001
    foreach my $tag ( PackageEntry::GetPackageList() )
-
 
4002
    {
-
 
4003
        my $pkgSig = PackageEntry::GetPackageSignature($tag);
-
 
4004
        $BuildSignatureSha1->add("PKGSIGNATURE: $pkgSig");
-
 
4005
        push @sigList, "PKGSIGNATURE: $pkgSig: " . $BuildSignatureSha1->clone->hexdigest;
-
 
4006
    }
-
 
4007
 
-
 
4008
    #
-
 
4009
    #   Save the signature of the package header and the dependencies
-
 
4010
    #   This will be used for a simple test to see in we need to rebuild the build file 
-
 
4011
    #
-
 
4012
    my $depSha1 =  $BuildSignatureSha1->clone->hexdigest;
-
 
4013
    Debug2("DepSha1: $depSha1");
-
 
4014
    FileCreate( catfile($ScmInterface, 'build.bfp'), $depSha1 );
-
 
4015
 
-
 
4016
    if ($gitEnabled)
-
 
4017
    {
-
 
4018
        #
-
 
4019
        #   Include the sha1 of all 'git' tree items that form the complete source image
-
 
4020
        #
-
 
4021
        my @relDirList = map { my $relName = $_; $relName =~ s~^$::GBE_SANDBOX/~~; $relName  } ToolsetFiles::GetSubTrees(); 
-
 
4022
        my @cmdList = map { 'HEAD:' . $_  } @relDirList;
-
 
4023
Debug0(" GIT DIR: @relDirList" );
-
 
4024
Debug0(" GIT CMD: " . "git rev-parse @cmdList" );
-
 
4025
        my $index = 0;
-
 
4026
 
-
 
4027
        my $callback = sub {
-
 
4028
            my ($cdata, $line) = @_;
-
 
4029
            $line =~ s~\s+$~~;
-
 
4030
Debug0(" GIT OUT: " . $line  );
-
 
4031
            $BuildSignatureSha1->add($line);
-
 
4032
            push @sigList, "PKGSRC: $relDirList[$index++]: $line: " . $BuildSignatureSha1->clone->hexdigest;
-
 
4033
            return 0;
-
 
4034
        };
-
 
4035
 
-
 
4036
        GitCmd('rev-parse', @cmdList, { process => $callback } );
-
 
4037
        $BUILDSIGNATURE =  $BuildSignatureSha1->hexdigest;
-
 
4038
    }
-
 
4039
    else
-
 
4040
    {
-
 
4041
        $BUILDSIGNATURE = 'Sandbox is not git enabled';
-
 
4042
    }
-
 
4043
       
-
 
4044
    Message("Signature: $BUILDSIGNATURE");
-
 
4045
    push @sigList, "Signature: $BUILDSIGNATURE";
-
 
4046
    FileCreate( $signatureFile, $BUILDSIGNATURE );
-
 
4047
    FileCreate( $sigDebugFile, @sigList );
-
 
4048
Debug0("sigDebugFile: $sigDebugFile");
-
 
4049
 
-
 
4050
    #
-
 
4051
    #   Create the descpkg file - to include the signature
-
 
4052
    #
-
 
4053
    BuildDescpkg('Internal');
-
 
4054
}
-
 
4055
 
-
 
4056
#-------------------------------------------------------------------------------
-
 
4057
# Function        : GitCmd
-
 
4058
#
-
 
4059
# Description     : Run a Git Command and capture/process the output
-
 
4060
#
-
 
4061
#                   Based on JatsSvnCore:GitCmd
-
 
4062
#
-
 
4063
# Inputs          : Command
-
 
4064
#                   Command arguments
-
 
4065
#                   Last argument may be a hash of options.
-
 
4066
#                       nosavedata  - Don't save the data
-
 
4067
#                       process     - Callback function
-
 
4068
#                       printdata   - Print data
-
 
4069
#                       error       - Error Message
-
 
4070
#                                     Used as first line of an Error call
-
 
4071
#
-
 
4072
# Returns         : non-zero on errors detected
-
 
4073
#
-
 
4074
sub GitCmd
-
 
4075
{
-
 
4076
    my $self;           # Local storage
-
 
4077
    Debug ("GitCmd");
-
 
4078
 
-
 
4079
    #
-
 
4080
    #   Locate essential tools
-
 
4081
    #
-
 
4082
    our $GBE_SVN_PATH;
-
 
4083
    EnvImportOptional('GBE_GIT_PATH', '');
-
 
4084
    Debug ("GBE_GIT_PATH", $::GBE_GIT_PATH);
-
 
4085
 
-
 
4086
    my $stdmux = LocateProgInPath ( 'stdmux');
-
 
4087
    my $git    = LocateProgInPath ( 'git', '--All', '--Path=' . $::GBE_GIT_PATH );
-
 
4088
    
-
 
4089
    #
-
 
4090
    #   Extract arguments and options
-
 
4091
    #   If last argument is a hash, then its a hash of options
-
 
4092
    #
-
 
4093
    my $opt;
-
 
4094
    $opt = pop @_
-
 
4095
        if (@_ > 0 and UNIVERSAL::isa($_[-1],'HASH'));
-
 
4096
 
-
 
4097
    $self->{PRINTDATA} = $opt->{'printdata'} if ( exists $opt->{'printdata'} );
-
 
4098
 
-
 
4099
    Verbose2 "GitCmd $git @_";
-
 
4100
 
-
 
4101
    #
-
 
4102
    # Useful debugging
-
 
4103
    #
-
 
4104
    # $self->{LAST_CMD} = [$svn, @_];
-
 
4105
 
-
 
4106
    #
-
 
4107
    #   Reset command output data
-
 
4108
    #
-
 
4109
    $self->{ERROR_LIST} = [];
-
 
4110
    $self->{RESULT_LIST} = [];
-
 
4111
#    $self->{LAST_CMD} = \@_;
-
 
4112
 
-
 
4113
    #
-
 
4114
    #   Make use of a wrapper program to mux the STDERR and STDOUT into
-
 
4115
    #   one stream (STDOUT). #   This solves a lot of problems
-
 
4116
    #
-
 
4117
    #   Do not use IO redirection of STDERR because as this will cause a
-
 
4118
    #   shell (sh or cmd.exe) to be invoked and this makes it much
-
 
4119
    #   harder to kill on all platforms.
-
 
4120
    #
-
 
4121
    #   Use open3 as it allows the arguments to be passed
-
 
4122
    #   directly without escaping and without any shell in the way
-
 
4123
    #
-
 
4124
    local (*CHLD_OUT, *CHLD_IN);
-
 
4125
    my $pid = open3( \*CHLD_IN, \*CHLD_OUT, '>&STDERR', $stdmux, $git, @_);
-
 
4126
 
-
 
4127
    #
-
 
4128
    #   Looks as though we always get a PID - even if the process dies
-
 
4129
    #   straight away or can't be found. I suspect that open3 doesn't set
-
 
4130
    #   $! anyway. I know it doesn't set $?
-
 
4131
    #
-
 
4132
    Debug ("Pid: $pid");
-
 
4133
    Error ("Can't run command: $!") unless $pid;
-
 
4134
 
-
 
4135
    #
-
 
4136
    #   Close the input handle
-
 
4137
    #   We don't have anything to send to this program
-
 
4138
    #
-
 
4139
    close(CHLD_IN);
-
 
4140
 
-
 
4141
    #
-
 
4142
    #   Monitor the output from the utility
-
 
4143
    #   Have used stdmux to multiplex stdout and stderr
-
 
4144
    #
-
 
4145
    #   Note: IO::Select doesn't work on Windows :(
-
 
4146
    #   Note: Open3 will cause blocking unless both streams are read
-
 
4147
    #         Can read both streams becsue IO::Select doesn't work
-
 
4148
    #
-
 
4149
    #   Observation:
-
 
4150
    #       svn puts errors to STDERR
-
 
4151
    #       svn puts status to STDOUT
-
 
4152
    #
-
 
4153
    while (<CHLD_OUT>)
-
 
4154
    {
-
 
4155
        s~\s+$~~;
-
 
4156
        tr~\\/~/~;
-
 
4157
 
-
 
4158
 
-
 
4159
        Verbose3 ( "GitCmd:" . $_);
-
 
4160
        m~^STD(...):(.+)~;
-
 
4161
        my $data = $1 ? $2 : $_;
-
 
4162
        next unless ( $data );
-
 
4163
 
-
 
4164
        if ( $1 && $1 eq 'ERR' )
-
 
4165
        {
-
 
4166
            #
-
 
4167
            #   Process STDERR output
-
 
4168
            #
-
 
4169
            push @{$self->{ERROR_LIST}}, $data;
-
 
4170
        }
-
 
4171
        else
-
 
4172
        {
-
 
4173
            #
-
 
4174
            #   Process STDOUT data
-
 
4175
            #
-
 
4176
            push @{$self->{RESULT_LIST}}, $data unless ($opt->{'nosavedata'});
-
 
4177
 
-
 
4178
            #
-
 
4179
            #   If the user has specified a processing function then pass each
-
 
4180
            #   line to the specified function.  A non-zero return will
-
 
4181
            #   be taken as a signal to kill the command.
-
 
4182
            #
-
 
4183
            if ( exists ($opt->{'process'}) && $opt->{'process'}($self, $data) )
-
 
4184
            {
-
 
4185
                kill 9, $pid;
-
 
4186
                sleep(1);
-
 
4187
                last;
-
 
4188
            }
-
 
4189
        }
-
 
4190
    }
-
 
4191
 
-
 
4192
    close(CHLD_OUT);
-
 
4193
 
-
 
4194
    #
-
 
4195
    #   MUST wait for the process
-
 
4196
    #   Under Windows if this is not done then we eventually fill up some
-
 
4197
    #   perl-internal structure and can't spawn anymore processes.
-
 
4198
    #
-
 
4199
    my $rv = waitpid ( $pid, 0);
-
 
4200
 
-
 
4201
    #
-
 
4202
    #   If an error condition was detected and the user has provided
-
 
4203
    #   an error message, then display the error
-
 
4204
    #
-
 
4205
    #   This simplifies the user error processing
-
 
4206
    #
-
 
4207
    if ( @{$self->{ERROR_LIST}} && $opt->{'error'}  )
-
 
4208
    {
-
 
4209
        Error ( $opt->{'error'}, @{$self->{ERROR_LIST}} );
-
 
4210
    }
-
 
4211
 
-
 
4212
    #
-
 
4213
    #   Exit status has no meaning since open3 has been used
-
 
4214
    #   This is because perl does not treat the opened process as a child
-
 
4215
    #   Not too sure it makes any difference anyway
-
 
4216
    #
-
 
4217
    #
-
 
4218
    Debug ("Useless Exit Status: $rv");
-
 
4219
    my $result = @{$self->{ERROR_LIST}} ? 1 : 0;
-
 
4220
    Verbose3 ("Exit Code: $result");
-
 
4221
 
-
 
4222
    return $result;
-
 
4223
}
-
 
4224
 
3696
 
4225
 
3697
#-------------------------------------------------------------------------------
4226
#-------------------------------------------------------------------------------
3698
# Function        : BuildVersion
4227
# Function        : BuildVersion
3699
#
4228
#
3700
# Description     : Generate version.c and version.h files
4229
# Description     : Generate version.c and version.h files
Line 3829... Line 4358...
3829
#                   Take care when extending the format
4358
#                   Take care when extending the format
3830
#
4359
#
3831
#                   NOTE: It turns out that JANTS is not a standard and the
4360
#                   NOTE: It turns out that JANTS is not a standard and the
3832
#                         implementors (of JANTS) kept on changing it.
4361
#                         implementors (of JANTS) kept on changing it.
3833
#
4362
#
3834
# Inputs          :
4363
# Inputs          : $mode - 'Internal' - Skip sanity test
3835
#
4364
#
3836
# Returns         :
4365
# Returns         :
3837
#
4366
#
3838
sub BuildDescpkg
4367
sub BuildDescpkg
3839
{
4368
{
-
 
4369
    my ($mode) = @_;
-
 
4370
    unless ($mode && $mode eq 'Internal')
-
 
4371
    {
3840
    StartBuildPhase();                      # Starting the build phase. No more data collection
4372
        StartBuildPhase();                  # Starting the build phase. No more data collection
-
 
4373
    }
3841
    return if ( $Clobber );                 # clobber mode ?
4374
    return if ( $Clobber );                 # clobber mode ?
3842
 
4375
 
3843
    #
4376
    #
3844
    #   Store the files location for use at runtime
4377
    #   Store the files location for use at runtime
3845
    #   It will be a file that is 'known' to JATS
4378
    #   It will be a file that is 'known' to JATS
Line 3847... Line 4380...
3847
    my $pkgfile = BuildAddKnownFile ( $NoBuild ? $Cwd : $Srcdir, 'descpkg' );
4380
    my $pkgfile = BuildAddKnownFile ( $NoBuild ? $Cwd : $Srcdir, 'descpkg' );
3848
 
4381
 
3849
    my @desc;
4382
    my @desc;
3850
    push @desc, "Package Name:  $BUILDNAME_PACKAGE";
4383
    push @desc, "Package Name:  $BUILDNAME_PACKAGE";
3851
    push @desc, "Version:       $BUILDVERSION";
4384
    push @desc, "Version:       $BUILDVERSION";
-
 
4385
    push @desc, "Signature:     $BUILDSIGNATURE" if defined $BUILDSIGNATURE;
3852
    push @desc, "Released By:   $::USER";
4386
    push @desc, "Released By:   $::USER";
3853
    push @desc, "Released On:   $::CurrentTime";
4387
    push @desc, "Released On:   $::CurrentTime";
3854
    push @desc, "Build Machine: $::GBE_HOSTNAME";
4388
    push @desc, "Build Machine: $::GBE_HOSTNAME";
3855
    push @desc, "Path:          $Cwd";
4389
    push @desc, "Path:          $Cwd";
3856
    push @desc, "Jats Version:  $::GBE_VERSION";
4390
    push @desc, "Jats Version:  $::GBE_VERSION";