Blame local/minimalist/sizetests

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
}