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 | } |
---|