2006-12-05 22:58:38 +03:00
|
|
|
#
|
|
|
|
# Config object for release automation
|
|
|
|
#
|
|
|
|
|
|
|
|
package Bootstrap::Config;
|
|
|
|
|
|
|
|
use strict;
|
2007-03-26 03:54:25 +04:00
|
|
|
use POSIX "uname";
|
2006-12-05 22:58:38 +03:00
|
|
|
|
|
|
|
# shared static config
|
|
|
|
my %config;
|
|
|
|
|
|
|
|
# single shared instance
|
|
|
|
my $singleton = undef;
|
|
|
|
|
|
|
|
sub new {
|
|
|
|
my $proto = shift;
|
|
|
|
my $class = ref($proto) || $proto;
|
|
|
|
|
|
|
|
return $singleton if defined $singleton;
|
|
|
|
|
|
|
|
my $this = {};
|
|
|
|
bless($this, $class);
|
|
|
|
$this->Parse();
|
|
|
|
$singleton = $this;
|
|
|
|
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
sub Parse {
|
|
|
|
my $this = shift;
|
|
|
|
|
|
|
|
open (CONFIG, "< bootstrap.cfg")
|
2007-02-08 01:14:24 +03:00
|
|
|
|| die("Can't open config file bootstrap.cfg");
|
2006-12-05 22:58:38 +03:00
|
|
|
|
|
|
|
while (<CONFIG>) {
|
|
|
|
chomp; # no newline
|
|
|
|
s/#.*//; # no comments
|
|
|
|
s/^\s+//; # no leading white
|
|
|
|
s/\s+$//; # no trailing white
|
|
|
|
next unless length; # anything left?
|
|
|
|
my ($var, $value) = split(/\s*=\s*/, $_, 2);
|
|
|
|
$config{$var} = $value;
|
|
|
|
}
|
|
|
|
close CONFIG;
|
|
|
|
}
|
|
|
|
|
2007-03-26 03:54:25 +04:00
|
|
|
##
|
|
|
|
# Get checks to see if a variable exists and returns it.
|
|
|
|
# Returns scalar
|
|
|
|
#
|
|
|
|
# This method supports system-specific overrides, or "sysvar"s.
|
|
|
|
# For example, if a caller is on win32 and does
|
|
|
|
# Get(sysvar => "buildDir") and win32_buildDir exists, the value of
|
|
|
|
# win32_buildDir will be returned. If not, the value of buildDir will
|
|
|
|
# be returned. Otherwise, the die() assertion will be hit.
|
|
|
|
##
|
|
|
|
|
2006-12-05 22:58:38 +03:00
|
|
|
sub Get {
|
|
|
|
my $this = shift;
|
|
|
|
|
|
|
|
my %args = @_;
|
|
|
|
my $var = $args{'var'};
|
2007-03-26 03:54:25 +04:00
|
|
|
# sysvar will attempt to prepend the OS name to the requested var
|
|
|
|
my $sysvar = $args{'sysvar'};
|
2006-12-05 22:58:38 +03:00
|
|
|
|
2007-03-26 03:54:25 +04:00
|
|
|
if ((! defined($args{'var'})) && (! defined($args{'sysvar'}))) {
|
|
|
|
die "ASSERT: Bootstep::Config::Get(): null var requested";
|
|
|
|
} elsif ((defined($args{'var'})) && (defined($args{'sysvar'}))) {
|
|
|
|
die "ASSERT: Bootstep::Config::Get(): both var and sysvar requested";
|
|
|
|
}
|
2007-03-10 00:20:05 +03:00
|
|
|
|
2007-03-26 03:54:25 +04:00
|
|
|
if (defined($args{'sysvar'})) {
|
|
|
|
# look for a system specific var first
|
|
|
|
my $osname = $this->SystemInfo(var => 'osname');
|
|
|
|
my $sysvarOverride = $osname . '_' . $sysvar;
|
|
|
|
|
|
|
|
if ($this->Exists(var => $sysvarOverride)) {
|
|
|
|
return $config{$sysvarOverride};
|
|
|
|
} elsif ($this->Exists(var => $sysvar)) {
|
|
|
|
return $config{$sysvar};
|
|
|
|
} else {
|
|
|
|
die("No such system config variable: $sysvar");
|
|
|
|
}
|
|
|
|
} elsif ($this->Exists(var => $var)) {
|
2006-12-05 22:58:38 +03:00
|
|
|
return $config{$var};
|
|
|
|
} else {
|
2007-03-26 03:54:25 +04:00
|
|
|
die("No such config variable: $var");
|
2006-12-05 22:58:38 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-03-26 03:54:25 +04:00
|
|
|
##
|
|
|
|
# Exists checks to see if a config variable exists.
|
|
|
|
# Returns boolean (1 or 0)
|
|
|
|
#
|
|
|
|
# This method supports system-specific overrides, or "sysvar"s.
|
|
|
|
# For example, if a caller is on win32 and does
|
|
|
|
# Exists(sysvar => "win32_buildDir") and only buildDir exists, a 0
|
|
|
|
# will be returned. There is no "fallback" as in the case of Get.
|
|
|
|
##
|
|
|
|
|
2007-02-09 04:23:34 +03:00
|
|
|
sub Exists {
|
|
|
|
my $this = shift;
|
|
|
|
my %args = @_;
|
2007-03-26 03:54:25 +04:00
|
|
|
my $var = $args{'var'};
|
|
|
|
# sysvar will attempt to prepend the OS name to the requested var
|
|
|
|
my $sysvar = $args{'sysvar'};
|
2007-02-09 04:23:34 +03:00
|
|
|
|
2007-03-26 03:54:25 +04:00
|
|
|
if ((! defined($args{'var'})) && (! defined($args{'sysvar'}))) {
|
|
|
|
die "ASSERT: Bootstep::Config::Get(): null var requested";
|
|
|
|
} elsif ((defined($args{'var'})) && (defined($args{'sysvar'}))) {
|
|
|
|
die "ASSERT: Bootstep::Config::Get(): both var and sysvar requested";
|
|
|
|
}
|
|
|
|
|
|
|
|
if (defined($args{'sysvar'})) {
|
|
|
|
# look for a system specific var first
|
|
|
|
my $osname = $this->SystemInfo(var => 'osname');
|
|
|
|
my $sysvarOverride = $osname . '_' . $sysvar;
|
|
|
|
|
|
|
|
if (exists($config{$sysvarOverride})) {
|
|
|
|
return 1;
|
|
|
|
} elsif (exists($config{$sysvar})) {
|
|
|
|
return 1;
|
|
|
|
} else {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return exists($config{$var});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
sub SystemInfo {
|
|
|
|
my $this = shift;
|
|
|
|
my %args = @_;
|
2007-03-10 00:20:05 +03:00
|
|
|
|
2007-02-09 04:23:34 +03:00
|
|
|
my $var = $args{'var'};
|
2007-03-26 03:54:25 +04:00
|
|
|
|
|
|
|
my ($sysname, $hostname, $release, $version, $machine ) = uname;
|
|
|
|
|
|
|
|
if ($var eq 'sysname') {
|
|
|
|
return $sysname;
|
|
|
|
} elsif ($var eq 'hostname') {
|
|
|
|
return $hostname;
|
|
|
|
} elsif ($var eq 'release') {
|
|
|
|
return $release;
|
|
|
|
} elsif ($var eq 'version') {
|
|
|
|
return $version;
|
|
|
|
} elsif ($var eq 'machine') {
|
|
|
|
return $machine;
|
|
|
|
} elsif ($var eq 'osname') {
|
|
|
|
if ($sysname =~ /cygwin/i) {
|
|
|
|
return 'win32';
|
|
|
|
} elsif ($sysname =~ /darwin/i) {
|
|
|
|
return 'macosx';
|
|
|
|
} elsif ($sysname =~ /linux/i) {
|
|
|
|
return 'linux';
|
|
|
|
} else {
|
|
|
|
die("Unrecognized OS: $sysname");
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
die("No system info named $var");
|
|
|
|
}
|
2007-02-09 04:23:34 +03:00
|
|
|
}
|
|
|
|
|
2006-12-05 22:58:38 +03:00
|
|
|
1;
|