FreeCalypso > hg > leo2moko-debug
diff g23m/system/busyb/tools/cmp_objs.pl @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/system/busyb/tools/cmp_objs.pl Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,386 @@ +#!perl -w + +# This script compares object files in two directories. Comparisons is done bytewise ignoring +# the first 8 bytes of the file ( COFF magic number and time stamp). +# +# The directories must be specified in a configuration file read by the script. The filename is +# passed as the one and only command line parameter. +# +# The script expects the utility cmp to be in the path. +# +# The syntax of each line in the configuration file is the following (comments start with #) +# <left_directory> <right_directory> <excluded_files> <explicit_files> +# <excluded_files> = [-<filename_without_path>]* +# <explicit_files> = [+<filename_without_path>]* +# +# default behaviour (no excluded or explicit files) is to compare all similar named files +# inthe two directories +# if <excluded_files> are specified these files are excluded from the comparison +# if <explicit_files> are specified ONY THESE FILES are included in the comparison +# +# Attention: file and directory names MUST NOT contain spaces or other white space + +use strict; + +use File::Glob ':glob'; +use File::Spec; + +# define global variables +my $cnfFile=$ARGV[0]; +my $logFile="cmp_report.log"; +my $firstComment = 1; + +# find the config file +@ARGV == 1 || die "Usage:\tcmp_objs.pl config_file\n"; + +# check for cmp.exe +system("cmp -v > cmp_report.log 2>&1") && die "ERROR: cmp must be in the path \n"; + +# open the config file +# +open (IN,"<$cnfFile")||die "Can't open $cnfFile !\n"; + +# parse the config file +# + my $line; + + while(defined($line = <IN>)) + { + # reset variable for next loop + my $leftDir; + my $rightDir; + my @files; + my @excludedFiles; + my @explicitFiles; + + # ignore comments (starting with #) + if($line =~ /^\s*\#/) { + # print out special comments starting with ## + if ($' =~ /^\s*\#/) { + if ($firstComment == 1) { + print "\n"; + $firstComment = 0; + } + print "[COMMENT] $'"; + } + else { + $firstComment = 1; + } + next; + } + + # ignore empty lines + if($line =~ /^\s+$/) { + next; + } + + # remove trailing \n + chomp($line); + + # put everything SEPARATED BY WHITESPACE in an array + @files = split(/\s+/,$line); + + # find the directories (and remove them from the array) + $leftDir = $files[0]; shift(@files); + $rightDir = $files[0]; shift(@files); + + # check whether the directories are wildcards +# if ($leftDir =~ s/(.*?)(\/\*)/$1/ && $rightDir =~ s/(.*?)(\/\*)/$1/ ) { + if ($leftDir =~ s:(.*?)([/\\]\*):$1: && $rightDir =~ s:(.*?)([/\\]\*):$1: ) { + my @dirs; + my @leftDirs; + my @rightDirs; + + # check whether the parent directories exist + (-e $leftDir) || die "Directory $leftDir does not exist !\n"; + (-e $rightDir) || die "Directory $rightDir does not exist !\n"; + + # find all sub directories left + @dirs = bsd_glob("$leftDir/*"); + @dirs = sort @dirs; + foreach (@dirs) { + my ($drv,$dir); + ($drv,$dir,$_) = File::Spec->splitpath($_); + if (-d "$leftDir/$_") { + push (@leftDirs, "$_"); + } + } + + # reset variables + splice (@dirs); + + # find all sub directories right + @dirs = bsd_glob("$rightDir/*"); + @dirs = sort @dirs; + foreach (@dirs) { + my ($drv,$dir); + ($drv,$dir,$_) = File::Spec->splitpath($_); + if (-d "$rightDir/$_") { + push (@rightDirs, "$_"); + } + } + + # create a hash that uses the filename as the key and an integer as value + # to find those directories that are found in both directories or only in one + # of them + my %count; + my $element; + + foreach $element (@leftDirs) { $count{$element}++; } + foreach $element (@rightDirs) { $count{$element}+=2; } + + # delete used arrays for later reuse + splice (@dirs); + splice (@leftDirs); + splice (@rightDirs); + + foreach $element (keys %count) { + if ($count{$element} == 1) { + push @leftDirs, $element; + } + elsif ($count{$element} == 2) { + push @rightDirs, $element; + } + elsif ($count{$element} == 3) { + push @dirs, $element; + } + } + print "[LEFT ] $leftDir/*\n"; + print "[RIGHT ] $rightDir/*\n"; + foreach $element (sort(@leftDirs)) { + print "[WARNING - directory missing right] $element\n"; + } + foreach $element (sort(@rightDirs)) { + print "[WARNING - directory missing left] $element\n"; + } + print "\n"; + foreach $element (sort(@dirs)) { + # ignore some commonly used version files + splice (@excludedFiles); + push (@excludedFiles,"ver.obj"); + push (@excludedFiles,"$element\_version.obj"); + cmp_dirs ("$leftDir/$element", "$rightDir/$element", \@excludedFiles, \@explicitFiles); + } + + } + else { + # check whether the directories exist + (-e $leftDir) || die "Directory $leftDir does not exist !\n"; + (-e $rightDir) || die "Directory $rightDir does not exist !\n"; + + if (defined($files[0])) { + # some files are are specified or excluded explicitely + foreach (@files) { + if (/^-/) { + push(@excludedFiles,$'); + } + elsif(/^\+/) { + (-e "$leftDir/$'") || die "File $rightDir/$' does not exist !\n"; + (-e "$rightDir/$'") || die "File $rightDir/$' does not exist !\n"; + push(@explicitFiles,$'); + } + } + } + cmp_dirs ($leftDir, $rightDir, \@excludedFiles, \@explicitFiles); + } + + } + + +# close the config file +# +close IN; + +# delete the log file +# +#unlink($logFile); + +################### +# +sub cmp_dirs { + + my $leftDir = $_[0]; + my $rightDir = $_[1]; + my @excludedFiles = @{$_[2]}; + my @explicitFiles = @{$_[3]}; + + my @files; + my @leftFiles; + my @rightFiles; + my $element; + + if (defined($explicitFiles[0])) { + @files = @explicitFiles; + } + else { + @leftFiles = bsd_glob("$leftDir/*.obj"); + @leftFiles = sort @leftFiles; + foreach (@leftFiles) { + my ($drv,$dir); + ($drv,$dir,$_) = File::Spec->splitpath($_); + } + + @rightFiles = bsd_glob("$rightDir/*.obj"); + @rightFiles = sort @rightFiles; + foreach (@rightFiles) { + my ($drv,$dir); + ($drv,$dir,$_) = File::Spec->splitpath($_); + } + + # create a hash that uses the filename as the key and an integer as value + # to find those files that are found in both directories or only in one + # of them + my %count; + + foreach $element (@leftFiles) { $count{$element}++; } + foreach $element (@rightFiles) { $count{$element}+=2; } + + # delete used arrays for later reuse + splice (@files); + splice (@leftFiles); + splice (@rightFiles); + + # remove all exclude files + foreach $element (@excludedFiles) { + if (exists($count{$element})) { +# print "Skipping file: $element \n"; + delete($count{$element}); + } + } + + foreach $element (keys %count) { + if ($count{$element} == 1) { + push @leftFiles, $element; + } + elsif ($count{$element} == 2) { + push @rightFiles, $element; + } + elsif ($count{$element} == 3) { + push @files, $element; + } + } + } + + + print "[LEFT ] $leftDir/\n"; + print "[RIGHT] $rightDir/\n"; + + if(defined($leftFiles[0]) || defined($rightFiles[0]) ) { + my %tmp; + + foreach $element (@leftFiles) { $tmp{$element} = " [WARNING - file missing right] $element\n" }; + foreach $element (@rightFiles) { $tmp{$element} = " [WARNING - file missing left ] $element\n"; } + + foreach $element (sort(keys %tmp)) { + print $tmp{$element}; + } + } + + + foreach (sort(@files)) { + if (system("cmp -i8 $leftDir/$_ $rightDir/$_ >>$logFile 2>&1")) { + print " [ERROR - files differ] $_\n"; + cmp_cmdFiles ($leftDir , $rightDir , $_ ); + } + } + + print "\n"; +} + + + + +################### +## +sub cmp_cmdFiles { + + my $leftDir = $_[0]; + my $rigthDir = $_[1]; + my $cmdFile = $_[2]; + + my @leftDef; + my @rightDef; + + $cmdFile =~ s/\.obj/\.cl470cmd/; + + my $leftFile = $leftDir . "\\" . $cmdFile; + my $rightFile = $rigthDir . "\\" . $cmdFile; + + print " [Checking cmd files ] $cmdFile\n"; + + if (!(-e $leftFile) || !(-e $rightFile)){ + print " [Cmdfile(s) missing]\n\n"; + return; + } + + my @AoA = parse_cmdFile($leftFile); + push(@leftDef, @{$AoA[0]}); + + @AoA = parse_cmdFile($rightFile); + push(@rightDef, @{$AoA[0]}); + + my %defines; + my $element; + my %defSorted; + + foreach $element (@leftDef) { $defines{$element}++; } + foreach $element (@rightDef) { $defines{$element}+=2; } + + foreach $element (keys %defines) { + if ($defines{$element} == 1) { + $defSorted{" [LEFT ] $element\n"} = 0; + } + elsif ($defines{$element} == 2) { + $defSorted{" [RIGHT] $element\n"} = 0; + } + } + foreach $element (sort(keys(%defSorted))) { + print $element; + } + + print "\n"; +} + +################### +## +sub parse_cmdFile { + my @defines; + my %def; + my $line; + my $element; + + open (CMD,"<$_[0]")||die "Can't open $_[0] !\n"; + while(defined($line = <CMD>)) + { + chomp($line); + my @tmp = split(/\s+/,$line); + foreach $element (@tmp) { + if ($element =~ /^-d/i ) { + if ($' =~ /^$/) { + #ignore empty defines + } + else { + $def{"-D$'"}++; + } + } + elsif ($element =~ /^-u/i ) { + if ($' =~ /^$/) { + #ignore empty defines + } + else { + $def{"-U$'"}++; + } + } + } + } + +# check for double defines +# foreach $element (keys %def) { +# print "$element\n"; +# } + + @defines = sort(keys %def); + + close CMD; + return (\@defines); +}