Commit | Line | Data |
---|---|---|
a687059c LW |
1 | #!../perl |
2 | ||
3 | $M = '-M'; | |
4 | $M = '-m' if -d '/usr/uts' && -f '/etc/master'; | |
5 | ||
6 | do 'getopt.pl'; | |
7 | do Getopt('f'); | |
8 | ||
9 | if ($opt_f) { | |
10 | $makefile = $opt_f; | |
11 | } | |
12 | elsif (-f 'makefile') { | |
13 | $makefile = 'makefile'; | |
14 | } | |
15 | elsif (-f 'Makefile') { | |
16 | $makefile = 'Makefile'; | |
17 | } | |
18 | else { | |
19 | die "No makefile\n"; | |
20 | } | |
21 | ||
22 | $MF = 'mf00'; | |
23 | ||
24 | while(($key,$val) = each(ENV)) { | |
25 | $mac{$key} = $val; | |
26 | } | |
27 | ||
28 | do scan($makefile); | |
29 | ||
30 | $co = $action{'.c.o'}; | |
31 | $co = ' ' unless $co; | |
32 | ||
33 | $missing = "Missing dependencies:\n"; | |
34 | foreach $key (sort keys(o)) { | |
35 | if ($oc{$key}) { | |
36 | $src = $oc{$key}; | |
37 | $action = $action{$key}; | |
38 | } | |
39 | else { | |
40 | $action = ''; | |
41 | } | |
42 | if (!$action) { | |
43 | if ($co && ($c = $key) =~ s/\.o$/.c/ && -f $c) { | |
44 | $src = $c; | |
45 | $action = $co; | |
46 | } | |
47 | else { | |
48 | print "No source found for $key $c\n"; | |
49 | next; | |
50 | } | |
51 | } | |
52 | $I = ''; | |
53 | $D = ''; | |
54 | $I .= $1 while $action =~ s/(-I\S+\s*)//; | |
55 | $D .= $1 . ' ' while $action =~ s/(-D\w+)//; | |
56 | if ($opt_v) { | |
57 | $cmd = "Checking $key: cc $M $D $I $src"; | |
58 | $cmd =~ s/\s\s+/ /g; | |
59 | print stderr $cmd,"\n"; | |
60 | } | |
61 | open(CPP,"cc $M $D $I $src|") || die "Can't run C preprocessor: $!"; | |
62 | while (<CPP>) { | |
63 | ($name,$dep) = split; | |
64 | $dep =~ s|^\./||; | |
65 | (print $missing,"$key: $dep\n"),($missing='') | |
66 | unless ($dep{"$key: $dep"} += 2) > 2; | |
67 | } | |
68 | } | |
69 | ||
70 | $extra = "\nExtraneous dependencies:\n"; | |
71 | foreach $key (sort keys(dep)) { | |
72 | if ($key =~ /\.o: .*\.h$/ && $dep{$key} == 1) { | |
73 | print $extra,$key,"\n"; | |
74 | $extra = ''; | |
75 | } | |
76 | } | |
77 | ||
78 | sub scan { | |
79 | local($makefile) = @_; | |
80 | local($MF) = $MF; | |
81 | print stderr "Analyzing $makefile.\n" if $opt_v; | |
82 | $MF++; | |
83 | open($MF,$makefile) || die "Can't open $makefile: $!"; | |
84 | while (<$MF>) { | |
85 | chop; | |
86 | chop($_ = $_ . <$MF>) while s/\\$//; | |
87 | next if /^#/; | |
88 | next if /^$/; | |
89 | s/\$\((\w+):([^=)]*)=([^)]*)\)/do subst("$1","$2","$3")/eg; | |
90 | s/\$\((\w+)\)/$mac{$1}/eg; | |
91 | $mac{$1} = $2, next if /^(\w+)\s*=\s*(.*)/; | |
92 | if (/^include\s+(.*)/) { | |
93 | do scan($1); | |
94 | print stderr "Continuing $makefile.\n" if $opt_v; | |
95 | next; | |
96 | } | |
97 | if (/^([^:]+):\s*(.*)/) { | |
98 | $left = $1; | |
99 | $right = $2; | |
100 | if ($right =~ /^([^;]*);(.*)/) { | |
101 | $right = $1; | |
102 | $action = $2; | |
103 | } | |
104 | else { | |
105 | $action = ''; | |
106 | } | |
107 | while (<$MF>) { | |
108 | last unless /^\t/; | |
109 | chop; | |
110 | chop($_ = $_ . <$MF>) while s/\\$//; | |
111 | next if /^#/; | |
112 | last if /^$/; | |
113 | s/\$\((\w+):([^=)]*)=([^)]*)\)/do subst("$1","$2","$3")/eg; | |
114 | s/\$\((\w+)\)/$mac{$1}/eg; | |
115 | $action .= $_; | |
116 | } | |
117 | foreach $targ (split(' ',$left)) { | |
118 | $targ =~ s|^\./||; | |
119 | foreach $src (split(' ',$right)) { | |
120 | $src =~ s|^\./||; | |
121 | $deplist{$targ} .= ' ' . $src; | |
122 | $dep{"$targ: $src"} = 1; | |
123 | $o{$src} = 1 if $src =~ /\.o$/; | |
124 | $oc{$targ} = $src if $targ =~ /\.o$/ && $src =~ /\.[yc]$/; | |
125 | } | |
126 | $action{$targ} .= $action; | |
127 | } | |
128 | redo if $_; | |
129 | } | |
130 | } | |
131 | close($MF); | |
132 | } | |
133 | ||
134 | sub subst { | |
135 | local($foo,$from,$to) = @_; | |
136 | $foo = $mac{$foo}; | |
137 | $from =~ s/\./[.]/; | |
138 | y/a/a/; | |
139 | $foo =~ s/\b$from\b/$to/g; | |
140 | $foo; | |
141 | } |