|
Packit |
fcad23 |
#!/usr/bin/perl
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
use strict;
|
|
Packit |
fcad23 |
use Data::Dumper;
|
|
Packit |
fcad23 |
use Getopt::Std;
|
|
Packit |
fcad23 |
use IO::File;
|
|
Packit |
fcad23 |
our %opts = (d => 'size-tests');
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# default arguments go here
|
|
Packit |
fcad23 |
my @sets =
|
|
Packit |
fcad23 |
({
|
|
Packit |
fcad23 |
"with-defaults" => '',
|
|
Packit |
fcad23 |
});
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my %base_args = %{$sets[0]};
|
|
Packit |
fcad23 |
my ($basename, $basenum);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
getopts('t:hlcD:nj:o:eb:T', \%opts) || usage();
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$opts{'j'} = "-j$opts{j}" if (exists($opts{'j'}));
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
usage() if ($opts{'h'});
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my @argumentsets =
|
|
Packit |
fcad23 |
(
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'security-types',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
usm => {
|
|
Packit |
fcad23 |
'with-security-modules' => 'usm',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
dtlsandtls => {
|
|
Packit |
fcad23 |
'with-security-modules' => 'tsm',
|
|
Packit |
fcad23 |
'with-out-security-modules' => 'usm',
|
|
Packit |
fcad23 |
'with-transports' => 'DTLSUDP TLSTCP',
|
|
Packit |
fcad23 |
'with-mib-modules' => 'tlstm-mib tsm-mib'
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
usmanddtlsandtls => {
|
|
Packit |
fcad23 |
'with-security-modules' => 'tsm usm',
|
|
Packit |
fcad23 |
'with-transports' => 'DTLSUDP TLSTCP',
|
|
Packit |
fcad23 |
'with-mib-modules' => 'tlstm-mib tsm-mib'
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'minimalist',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
minimal => {
|
|
Packit |
fcad23 |
'enable-minimalist' => '',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'not-minimal' => {
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'mib-loading',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
'without-mib-loading' => {
|
|
Packit |
fcad23 |
'disable-mib-loading' => '',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'with-mib-loading' => {
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'debugging',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
'without-debugging' => {
|
|
Packit |
fcad23 |
'disable-debugging' => '',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'with-debugging' => {
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'logging',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
'without-logging' => {
|
|
Packit |
fcad23 |
'with-out-features' => 'logging',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'with-logging' => {
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'agent-mibs',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
'full-agent' => {
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'mini-agent' => {
|
|
Packit |
fcad23 |
'enable-mini-agent' => '',
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'protocol-support',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
'everything' => {
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'read-only' => {
|
|
Packit |
fcad23 |
'enable-read-only' => '',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'notify-only' => {
|
|
Packit |
fcad23 |
'enable-notify-only' => '',
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
title => 'perl',
|
|
Packit |
fcad23 |
arguments =>
|
|
Packit |
fcad23 |
{
|
|
Packit |
fcad23 |
'without-perl-modules' => {
|
|
Packit |
fcad23 |
'without-perl-modules' => '',
|
|
Packit |
fcad23 |
'disable-embedded-perl' => '',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'with-perl-no-embedding' => {
|
|
Packit |
fcad23 |
'with-perl-modules' => '',
|
|
Packit |
fcad23 |
'disable-embedded-perl' => '',
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
'with-perl-and-embedding' => {
|
|
Packit |
fcad23 |
'with-perl-modules' => '',
|
|
Packit |
fcad23 |
'enable-embedded-perl' => '',
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
},
|
|
Packit |
fcad23 |
);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# map these to a referencable lookup hash
|
|
Packit |
fcad23 |
my %argumentsets;
|
|
Packit |
fcad23 |
foreach my $set (@argumentsets) {
|
|
Packit |
fcad23 |
$argumentsets{$set->{'title'}} = $set;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ($opts{'l'}) {
|
|
Packit |
fcad23 |
print "Types available:\n";
|
|
Packit |
fcad23 |
printf(" %-40.40s %s\n", "Test Title", "Number of subtests");
|
|
Packit |
fcad23 |
printf(" %-40.40s %s\n", "-" x 39, "-" x length("Number of subtests"));
|
|
Packit |
fcad23 |
foreach my $type (@argumentsets) {
|
|
Packit |
fcad23 |
my @keys = keys(%{$type->{'arguments'}});
|
|
Packit |
fcad23 |
printf(" %-40.40s %s\n", $type->{'title'}, $#keys+1);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
exit;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my %types;
|
|
Packit |
fcad23 |
if ($opts{'t'}) {
|
|
Packit |
fcad23 |
my @types = split(/,\s*/, $opts{'t'});
|
|
Packit |
fcad23 |
foreach my $type (@types) {
|
|
Packit |
fcad23 |
$types{$type} = 1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ($opts{'b'}) {
|
|
Packit |
fcad23 |
# use this set as the base default set of arguments
|
|
Packit |
fcad23 |
($basename, $basenum) = ($opts{'b'} =~ /(.*):(\d+)/);
|
|
Packit |
fcad23 |
if (!exists($argumentsets{$basename})) {
|
|
Packit |
fcad23 |
printf STDERR "failed to find set for -b argument: %s\n", $basename;
|
|
Packit |
fcad23 |
exit(1);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
@sets = add_in_flags($argumentsets{$basename}, \%base_args, ());
|
|
Packit |
fcad23 |
@sets = @sets[$basenum];
|
|
Packit |
fcad23 |
%base_args = %{$sets[0]};
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
foreach my $set (@argumentsets) {
|
|
Packit |
fcad23 |
if (!$opts{'t'} || exists($types{$set->{'title'}})) {
|
|
Packit |
fcad23 |
if ($basename && $set->{'title'} eq $basename) {
|
|
Packit |
fcad23 |
next;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
@sets = add_in_flags($set, \%base_args, @sets);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ($opts{'c'}) {
|
|
Packit |
fcad23 |
# print the configure flags
|
|
Packit |
fcad23 |
foreach my $set (@sets) {
|
|
Packit |
fcad23 |
print "$set->{'title'}:\n";
|
|
Packit |
fcad23 |
print " ", generate_configure_flags($set), "\n";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
exit;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my $summaryfile;
|
|
Packit |
fcad23 |
if ($opts{'o'} && !$opts{'n'}) {
|
|
Packit |
fcad23 |
$summaryfile = new IO::File;
|
|
Packit |
fcad23 |
$summaryfile->open(">$opts{o}");
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my $count = 0;
|
|
Packit |
fcad23 |
foreach my $set (@sets) {
|
|
Packit |
fcad23 |
$count++;
|
|
Packit |
fcad23 |
build_set($count, $set);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub add_in_flags {
|
|
Packit |
fcad23 |
my ($argumentset, $base_flags, @current_flags) = @_;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my @new_flags;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# do a linear search of the options
|
|
Packit |
fcad23 |
if (! $opts{'e'}) {
|
|
Packit |
fcad23 |
@new_flags = @current_flags;
|
|
Packit |
fcad23 |
foreach my $newargs (keys(%{$argumentset->{'arguments'}})) {
|
|
Packit |
fcad23 |
my %flags = %$base_flags;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$flags{'title'} = "$flags{'title'}:$newargs";
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
foreach my $newflag (keys(%{$argumentset->{'arguments'}{$newargs}})) {
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$flags{$newflag} .= " $argumentset->{'arguments'}{$newargs}{$newflag}";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
push @new_flags, \%flags;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return @new_flags;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# or an exponential search
|
|
Packit |
fcad23 |
foreach my $flags (@current_flags) {
|
|
Packit |
fcad23 |
foreach my $newargs (keys(%{$argumentset->{'arguments'}})) {
|
|
Packit |
fcad23 |
my %flags = %{$flags}; # copy the existing hash-set of flags
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (exists($flags{'title'})) {
|
|
Packit |
fcad23 |
$flags{'title'} .= ", $newargs";
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
$flags{'title'} .= "$newargs";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
foreach my $newflag (keys(%{$argumentset->{'arguments'}{$newargs}})) {
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$flags{$newflag} .= " $argumentset->{'arguments'}{$newargs}{$newflag}";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
push @new_flags, \%flags;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return @new_flags;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub generate_configure_flags {
|
|
Packit |
fcad23 |
my ($arguments) = @_;
|
|
Packit |
fcad23 |
my $line = "";
|
|
Packit |
fcad23 |
foreach my $arg (keys(%$arguments)) {
|
|
Packit |
fcad23 |
next if ($arg eq 'title');
|
|
Packit |
fcad23 |
if ($arguments->{$arg} =~ /^\s*$/) {
|
|
Packit |
fcad23 |
$line .= " --$arg";
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
$line .= " --$arg=\"$arguments->{$arg}\"";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return $line;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub build_set {
|
|
Packit |
fcad23 |
my ($num, $arguments) = @_;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$num = sprintf("%03d", $num);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my $file;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (!$opts{'n'}) {
|
|
Packit |
fcad23 |
mkdir $opts{'d'} if (! -d $opts{'d'});
|
|
Packit |
fcad23 |
die "failed to create the $opts{'d'} directory" if (! -d $opts{'d'});
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$file = new IO::File;
|
|
Packit |
fcad23 |
$file->open(">$opts{'d'}/$num-0-cmd-summary");
|
|
Packit |
fcad23 |
$file->print("Creating output for: $arguments->{'title'}\n");
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print "==================== $arguments->{'title'}\n";
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
System ($file, $num, "1-distclean", "make distclean");
|
|
Packit |
fcad23 |
System ($file, $num, "2-configure",
|
|
Packit |
fcad23 |
"./configure " . generate_configure_flags($arguments));
|
|
Packit |
fcad23 |
System ($file, $num, "3-features", "make features");
|
|
Packit |
fcad23 |
System ($file, $num, "4-make", "make $opts{'j'}");
|
|
Packit |
fcad23 |
System ($file, $num, "5-unused-code", "perl local/minimalist/find-unused-code -g");
|
|
Packit |
fcad23 |
System ($file, $num, "6-testing", "make -C testing test") if ($opts{'T'});
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (!$opts{'n'}) {
|
|
Packit |
fcad23 |
analyze_size($arguments->{'title'}, "$opts{'d'}/$num-9-results");
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub analyze_size {
|
|
Packit |
fcad23 |
my ($title, $filename) = @_;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my $outfile = new IO::File;
|
|
Packit |
fcad23 |
$outfile->open(">$filename");
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print "Results for: $title\n";
|
|
Packit |
fcad23 |
printf $outfile "Results for: $title\n";
|
|
Packit |
fcad23 |
printf ("%-50.50s %10s\n", "-" x 49, "-" x 10);
|
|
Packit |
fcad23 |
printf $outfile ("%-50.50s %10s\n", "-" x 49, "-" x 10);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my $totalsize = 0;
|
|
Packit |
fcad23 |
foreach my $buildfile (glob("snmplib/.libs/lib*.so.*.0.0"),
|
|
Packit |
fcad23 |
glob("agent/.libs/lib*.so.*.0.0"),
|
|
Packit |
fcad23 |
"agent/.libs/snmpd") {
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my @info = stat($buildfile);
|
|
Packit |
fcad23 |
printf $outfile ("%-50.50s %10s\n", $buildfile, $info[7]);
|
|
Packit |
fcad23 |
printf("%-50.50s %10s\n", $buildfile, $info[7]);
|
|
Packit |
fcad23 |
$totalsize += $info[7];
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
printf $outfile ("%-50.50s %10s\n", "-" x 49, "-" x 10);
|
|
Packit |
fcad23 |
printf $outfile ("%-50.50s %10s bytes\n", "TOTAL", $totalsize);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
printf("%-50.50s %10s\n", "-" x 49, "-" x 10);
|
|
Packit |
fcad23 |
printf("%-50.50s %10s bytes\n", "TOTAL", $totalsize);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (defined($summaryfile)) {
|
|
Packit |
fcad23 |
my $restricted_title = $title;
|
|
Packit |
fcad23 |
$restricted_title =~ s/[^a-zA-Z]/_/g;
|
|
Packit |
fcad23 |
printf $summaryfile "%10s %s \n", $totalsize, $title;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
return $totalsize;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub usage {
|
|
Packit |
fcad23 |
print "Usage: $0 [FLAGS]\n\n";
|
|
Packit |
fcad23 |
print "FLAGS:\n";
|
|
Packit |
fcad23 |
print " -h\t\thelp\n";
|
|
Packit |
fcad23 |
print " -t TYPES\tSelect types to analyze (default = all)\n";
|
|
Packit |
fcad23 |
print " -l\t\tList available types\n";
|
|
Packit |
fcad23 |
print " -c\t\tPrint the configuration flags that would be used\n";
|
|
Packit |
fcad23 |
print " -D DIR\tSave data results to this directory\n";
|
|
Packit |
fcad23 |
print " -o FILE\tSave a complete summary chart to FILE\n";
|
|
Packit |
fcad23 |
print " -n\t\tDry run -- only show the commands to execute\n";
|
|
Packit |
fcad23 |
print " -j NUM\tExecute make with parallel building (-jNUM)\n";
|
|
Packit |
fcad23 |
print " -e\t\tUse exponential expansion (all combos) of the requested options\n";
|
|
Packit |
fcad23 |
print " -b NAME:NUM\tUse NAME and the NUM'th set as the base arguments to start from\n";
|
|
Packit |
fcad23 |
print " -T\t\tRun 'make test' at each step as well\n";
|
|
Packit |
fcad23 |
exit;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub System {
|
|
Packit |
fcad23 |
my $file = shift;
|
|
Packit |
fcad23 |
my $num = shift;
|
|
Packit |
fcad23 |
my $title = shift;
|
|
Packit |
fcad23 |
my $pipe = " 2>&1 | tee $opts{'d'}/$num-$title.out\n";
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print "### ", join(" ", @_), $pipe;
|
|
Packit |
fcad23 |
if (!$opts{'n'} && $file) {
|
|
Packit |
fcad23 |
print $file "### ", join(" ", @_), "\n";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (!$opts{'n'}) {
|
|
Packit |
fcad23 |
system(join(" ", @_) . $pipe);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|