freebsd-dev/gnu/usr.bin/perl/eg/muck
1994-09-10 06:27:55 +00:00

142 lines
2.8 KiB
Perl

#!../perl
$M = '-M';
$M = '-m' if -d '/usr/uts' && -f '/etc/master';
do 'getopt.pl';
do Getopt('f');
if ($opt_f) {
$makefile = $opt_f;
}
elsif (-f 'makefile') {
$makefile = 'makefile';
}
elsif (-f 'Makefile') {
$makefile = 'Makefile';
}
else {
die "No makefile\n";
}
$MF = 'mf00';
while(($key,$val) = each(ENV)) {
$mac{$key} = $val;
}
do scan($makefile);
$co = $action{'.c.o'};
$co = ' ' unless $co;
$missing = "Missing dependencies:\n";
foreach $key (sort keys(o)) {
if ($oc{$key}) {
$src = $oc{$key};
$action = $action{$key};
}
else {
$action = '';
}
if (!$action) {
if ($co && ($c = $key) =~ s/\.o$/.c/ && -f $c) {
$src = $c;
$action = $co;
}
else {
print "No source found for $key $c\n";
next;
}
}
$I = '';
$D = '';
$I .= $1 while $action =~ s/(-I\S+\s*)//;
$D .= $1 . ' ' while $action =~ s/(-D\w+)//;
if ($opt_v) {
$cmd = "Checking $key: cc $M $D $I $src";
$cmd =~ s/\s\s+/ /g;
print stderr $cmd,"\n";
}
open(CPP,"cc $M $D $I $src|") || die "Can't run C preprocessor: $!";
while (<CPP>) {
($name,$dep) = split;
$dep =~ s|^\./||;
(print $missing,"$key: $dep\n"),($missing='')
unless ($dep{"$key: $dep"} += 2) > 2;
}
}
$extra = "\nExtraneous dependencies:\n";
foreach $key (sort keys(dep)) {
if ($key =~ /\.o: .*\.h$/ && $dep{$key} == 1) {
print $extra,$key,"\n";
$extra = '';
}
}
sub scan {
local($makefile) = @_;
local($MF) = $MF;
print stderr "Analyzing $makefile.\n" if $opt_v;
$MF++;
open($MF,$makefile) || die "Can't open $makefile: $!";
while (<$MF>) {
chop;
chop($_ = $_ . <$MF>) while s/\\$//;
next if /^#/;
next if /^$/;
s/\$\((\w+):([^=)]*)=([^)]*)\)/do subst("$1","$2","$3")/eg;
s/\$\((\w+)\)/$mac{$1}/eg;
$mac{$1} = $2, next if /^(\w+)\s*=\s*(.*)/;
if (/^include\s+(.*)/) {
do scan($1);
print stderr "Continuing $makefile.\n" if $opt_v;
next;
}
if (/^([^:]+):\s*(.*)/) {
$left = $1;
$right = $2;
if ($right =~ /^([^;]*);(.*)/) {
$right = $1;
$action = $2;
}
else {
$action = '';
}
while (<$MF>) {
last unless /^\t/;
chop;
chop($_ = $_ . <$MF>) while s/\\$//;
next if /^#/;
last if /^$/;
s/\$\((\w+):([^=)]*)=([^)]*)\)/do subst("$1","$2","$3")/eg;
s/\$\((\w+)\)/$mac{$1}/eg;
$action .= $_;
}
foreach $targ (split(' ',$left)) {
$targ =~ s|^\./||;
foreach $src (split(' ',$right)) {
$src =~ s|^\./||;
$deplist{$targ} .= ' ' . $src;
$dep{"$targ: $src"} = 1;
$o{$src} = 1 if $src =~ /\.o$/;
$oc{$targ} = $src if $targ =~ /\.o$/ && $src =~ /\.[yc]$/;
}
$action{$targ} .= $action;
}
redo if $_;
}
}
close($MF);
}
sub subst {
local($foo,$from,$to) = @_;
$foo = $mac{$foo};
$from =~ s/\./[.]/;
y/a/a/;
$foo =~ s/\b$from\b/$to/g;
$foo;
}