You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
3.0 KiB
141 lines
3.0 KiB
#!../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;
|
|
}
|