#!../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 () { ($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; }