1 1.1 mrg #!/usr/bin/perl 2 1.1 mrg # -*- perl -*- 3 1.1 mrg 4 1.11 mrg # Copyright (C) 2001-2022 Free Software Foundation, Inc. 5 1.1 mrg # 6 1.1 mrg # This file is part of the libiberty library. 7 1.1 mrg # Libiberty is free software; you can redistribute it and/or 8 1.1 mrg # modify it under the terms of the GNU Library General Public 9 1.1 mrg # License as published by the Free Software Foundation; either 10 1.1 mrg # version 2 of the License, or (at your option) any later version. 11 1.1 mrg # 12 1.1 mrg # Libiberty is distributed in the hope that it will be useful, 13 1.1 mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 1.1 mrg # Library General Public License for more details. 16 1.1 mrg # 17 1.1 mrg # You should have received a copy of the GNU Library General Public 18 1.1 mrg # License along with libiberty; see the file COPYING.LIB. If not, 19 1.1 mrg # write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 20 1.1 mrg # Boston, MA 02110-1301, USA. 21 1.1 mrg # 22 1.1 mrg # Originally written by DJ Delorie <dj (at] redhat.com> 23 1.1 mrg 24 1.1 mrg 25 1.1 mrg # This is a trivial script which checks the lists of C and O files in 26 1.1 mrg # the Makefile for consistency. 27 1.1 mrg 28 1.1 mrg $mode = shift; 29 1.1 mrg $srcdir = "."; 30 1.1 mrg 31 1.1 mrg if ($mode eq "-s") { 32 1.1 mrg $srcdir = shift; 33 1.1 mrg $mode = shift; 34 1.1 mrg } 35 1.1 mrg 36 1.1 mrg &missing() if $mode eq "missing"; 37 1.1 mrg &undoc() if $mode eq "undoc"; 38 1.1 mrg &deps() if $mode eq "deps"; 39 1.1 mrg 40 1.1 mrg exit 0; 41 1.1 mrg 42 1.1 mrg format STDOUT = 43 1.1 mrg ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~ 44 1.1 mrg $out 45 1.1 mrg ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~ 46 1.1 mrg $out 47 1.1 mrg . 48 1.1 mrg 49 1.1 mrg ###################################################################### 50 1.1 mrg 51 1.1 mrg sub missing { 52 1.1 mrg 53 1.1 mrg opendir(S, $srcdir); 54 1.1 mrg while ($f = readdir S) { 55 1.1 mrg $have{$f} = 1; 56 1.1 mrg } 57 1.1 mrg closedir(S); 58 1.1 mrg opendir(S, "."); 59 1.1 mrg while ($f = readdir S) { 60 1.1 mrg $have{$f} = 1; 61 1.1 mrg } 62 1.1 mrg closedir(S); 63 1.1 mrg 64 1.1 mrg for $a (@ARGV) { 65 1.1 mrg $listed{$a} = 1; 66 1.1 mrg $have{$a} = 0; 67 1.1 mrg } 68 1.1 mrg 69 1.1 mrg for $f (sort keys %have) { 70 1.1 mrg next unless $have{$f}; 71 1.1 mrg if ($f =~ /\.c$/) { 72 1.1 mrg print "S $f\n"; 73 1.1 mrg } 74 1.1 mrg } 75 1.1 mrg for $f (sort keys %listed) { 76 1.1 mrg if ($f =~ /(.*)\.c$/) { 77 1.1 mrg $base = $1; 78 1.3 mrg if (! $listed{"./$base.o"}) { 79 1.1 mrg print "O $f\n"; 80 1.1 mrg } 81 1.1 mrg } 82 1.1 mrg } 83 1.1 mrg } 84 1.1 mrg 85 1.1 mrg ###################################################################### 86 1.1 mrg 87 1.1 mrg sub undoc { 88 1.1 mrg 89 1.1 mrg opendir(S, $srcdir); 90 1.1 mrg while ($file = readdir S) { 91 1.1 mrg if ($file =~ /\.texi$/) { 92 1.1 mrg open(T, "$srcdir/$file"); 93 1.1 mrg while (<T>) { 94 1.1 mrg if (/^\@deftype[^\(]* ([^\s\(]+) *\(/) { 95 1.1 mrg $documented{$1} = 1; 96 1.1 mrg } 97 1.1 mrg } 98 1.1 mrg close(T); 99 1.1 mrg } 100 1.1 mrg if ($file =~ /\.c$/) { 101 1.1 mrg open(C, "$srcdir/$file"); 102 1.1 mrg while (<C>) { 103 1.1 mrg if (/\@undocumented (\S+)/) { 104 1.1 mrg $documented{$1} = 1; 105 1.1 mrg } 106 1.1 mrg if (/^static /) { 107 1.1 mrg if (! /[\(;]/) { 108 1.1 mrg s/[\r\n]+$/ /; 109 1.1 mrg $_ .= <C>; 110 1.1 mrg } 111 1.1 mrg while ($_ =~ /\([^\)]*$/) { 112 1.1 mrg s/[\r\n]+$/ /; 113 1.1 mrg $_ .= <C>; 114 1.1 mrg } 115 1.1 mrg } 116 1.1 mrg s/ VPARAMS([ \(])/$1/; 117 1.1 mrg s/PREFIX\(([^\)]*)\)/byte_$1/; 118 1.1 mrg if (/^static [^\(]* ([^\s\(]+) *\(.*\)$/) { 119 1.1 mrg $documented{$1} = 1; 120 1.1 mrg } 121 1.1 mrg } 122 1.1 mrg } 123 1.1 mrg } 124 1.1 mrg closedir(D); 125 1.1 mrg 126 1.1 mrg # $out = join(' ', sort keys %documented); 127 1.1 mrg # write; 128 1.1 mrg # print "\n"; 129 1.1 mrg 130 1.1 mrg system "etags $srcdir/*.c $srcdir/../include/*.h"; 131 1.1 mrg open(TAGS, "TAGS"); 132 1.1 mrg while (<TAGS>) { 133 1.1 mrg s/[\r\n]+$//; 134 1.1 mrg if (/^\014$/) { 135 1.1 mrg $filename = <TAGS>; 136 1.1 mrg $filename =~ s/[\r\n]+$//; 137 1.1 mrg $filename =~ s/,\d+$//; 138 1.1 mrg $filename =~ s@.*[/\\]@@; 139 1.1 mrg next; 140 1.1 mrg } 141 1.1 mrg if ($filename =~ /\.c$/ ) { 142 1.1 mrg next unless /^[_a-zA-Z]/; 143 1.1 mrg } else { 144 1.1 mrg next unless /^\# *define/; 145 1.1 mrg s/\# *define *//; 146 1.1 mrg } 147 1.1 mrg 148 1.1 mrg s/ VPARAMS//; 149 1.1 mrg s/ *\177.*//; 150 1.1 mrg s/,$//; 151 1.1 mrg s/DEFUN\(//; 152 1.1 mrg s/\(//; 153 1.1 mrg 154 1.1 mrg next if /^static /; 155 1.1 mrg next if /\s/; 156 1.1 mrg next if /^_/; 157 1.1 mrg next if $documented{$_}; 158 1.1 mrg next if /_H_?$/; 159 1.1 mrg 160 1.1 mrg if ($seen_in{$_} ne $filename) { 161 1.1 mrg $saw{$_} ++; 162 1.1 mrg } 163 1.1 mrg $seen_in{$_} = $filename; 164 1.1 mrg } 165 1.1 mrg 166 1.1 mrg for $k (keys %saw) { 167 1.1 mrg delete $saw{$k} if $saw{$k} > 1; 168 1.1 mrg } 169 1.1 mrg 170 1.1 mrg for $k (sort keys %saw) { 171 1.1 mrg $fromfile{$seen_in{$k}} .= " " if $fromfile{$seen_in{$k}}; 172 1.1 mrg $fromfile{$seen_in{$k}} .= $k; 173 1.1 mrg } 174 1.1 mrg 175 1.1 mrg for $f (sort keys %fromfile) { 176 1.1 mrg $out = "$f: $fromfile{$f}"; 177 1.1 mrg write; 178 1.1 mrg } 179 1.1 mrg } 180 1.1 mrg 181 1.1 mrg ###################################################################### 182 1.1 mrg 183 1.1 mrg sub deps_for { 184 1.1 mrg my($f) = @_; 185 1.1 mrg my(%d); 186 1.1 mrg open(F, $f); 187 1.1 mrg %d = (); 188 1.1 mrg while (<F>) { 189 1.1 mrg if (/^#\s*include\s+["<](.*)[">]/) { 190 1.1 mrg $d{$1} = 1; 191 1.1 mrg } 192 1.1 mrg } 193 1.1 mrg close(F); 194 1.1 mrg return keys %d; 195 1.1 mrg } 196 1.1 mrg 197 1.1 mrg sub canonicalize { 198 1.1 mrg my ($p) = @_; 199 1.1 mrg 0 while $p =~ s@/\./@/@g; 200 1.1 mrg 0 while $p =~ s@^\./@@g; 201 1.1 mrg 0 while $p =~ s@/[^/]+/\.\./@/@g; 202 1.1 mrg return $p; 203 1.1 mrg } 204 1.1 mrg 205 1.1 mrg sub locals_first { 206 1.1 mrg my ($a,$b) = @_; 207 1.1 mrg return -1 if $a eq "config.h"; 208 1.1 mrg return 1 if $b eq "config.h"; 209 1.1 mrg return $a cmp $b; 210 1.1 mrg } 211 1.1 mrg 212 1.1 mrg sub deps { 213 1.1 mrg 214 1.1 mrg $crule = "\tif [ x\"\$(PICFLAG)\" != x ]; then \\\n"; 215 1.1 mrg $crule .= "\t \$(COMPILE.c) \$(PICFLAG) \$< -o pic/\$@; \\\n"; 216 1.1 mrg $crule .= "\telse true; fi\n"; 217 1.5 mrg $crule .= "\tif [ x\"\$(NOASANFLAG)\" != x ]; then \\\n"; 218 1.5 mrg $crule .= "\t \$(COMPILE.c) \$(PICFLAG) \$(NOASANFLAG) \$< -o noasan/\$@; \\\n"; 219 1.5 mrg $crule .= "\telse true; fi\n"; 220 1.1 mrg $crule .= "\t\$(COMPILE.c) \$< \$(OUTPUT_OPTION)\n"; 221 1.1 mrg $crule .= "\n"; 222 1.1 mrg 223 1.1 mrg $incdir = shift @ARGV; 224 1.1 mrg 225 1.1 mrg opendir(INC, $incdir); 226 1.1 mrg while ($f = readdir INC) { 227 1.3 mrg next unless $f =~ /\.h$/ || $f =~ /\.def$/; 228 1.1 mrg $mine{$f} = "\$(INCDIR)/$f"; 229 1.1 mrg $deps{$f} = join(' ', &deps_for("$incdir/$f")); 230 1.1 mrg } 231 1.1 mrg $mine{'config.h'} = "config.h"; 232 1.1 mrg 233 1.1 mrg opendir(INC, $srcdir); 234 1.1 mrg while ($f = readdir INC) { 235 1.1 mrg next unless $f =~ /\.h$/; 236 1.1 mrg $mine{$f} = "\$(srcdir)/$f"; 237 1.1 mrg $deps{$f} = join(' ', &deps_for("$srcdir/$f")); 238 1.1 mrg } 239 1.1 mrg $mine{'config.h'} = "config.h"; 240 1.1 mrg 241 1.1 mrg open(IN, "$srcdir/Makefile.in"); 242 1.1 mrg open(OUT, ">$srcdir/Makefile.tmp"); 243 1.1 mrg while (<IN>) { 244 1.1 mrg last if /remainder of this file/; 245 1.1 mrg print OUT; 246 1.1 mrg } 247 1.1 mrg print OUT "# The dependencies in the remainder of this file are automatically\n"; 248 1.1 mrg print OUT "# generated by \"make maint-deps\". Manual edits will be lost.\n\n"; 249 1.1 mrg 250 1.1 mrg opendir(S, $srcdir); 251 1.1 mrg for $f (sort readdir S) { 252 1.1 mrg if ($f =~ /\.c$/) { 253 1.1 mrg 254 1.1 mrg %scanned = (); 255 1.1 mrg @pending = &deps_for("$srcdir/$f"); 256 1.1 mrg while (@pending) { 257 1.1 mrg @tmp = @pending; 258 1.1 mrg @pending = (); 259 1.1 mrg for $p (@tmp) { 260 1.1 mrg next unless $mine{$p}; 261 1.1 mrg if (!$scanned{$p}) { 262 1.1 mrg push(@pending, split(' ', $deps{$p})); 263 1.1 mrg $scanned{$p} = 1; 264 1.1 mrg } 265 1.1 mrg } 266 1.1 mrg } 267 1.1 mrg @deps = sort { &locals_first($a,$b) } keys %scanned; 268 1.1 mrg $obj = $f; 269 1.3 mrg $obj =~ s/\.c$/.\$(objext)/; 270 1.1 mrg $obj = "./$obj:"; 271 1.1 mrg if ($#deps >= 0) { 272 1.1 mrg print OUT "$obj \$(srcdir)/$f"; 273 1.1 mrg $len = length("$obj $f"); 274 1.1 mrg for $dt (@deps) { 275 1.1 mrg $d = $mine{$dt}; 276 1.1 mrg if ($len + length($d) > 70) { 277 1.1 mrg printf OUT " \\\n\t$d"; 278 1.1 mrg $len = 8 + length($d); 279 1.1 mrg } else { 280 1.1 mrg print OUT " $d"; 281 1.1 mrg $len += length($d) + 1; 282 1.1 mrg } 283 1.1 mrg } 284 1.1 mrg print OUT "\n"; 285 1.1 mrg } else { 286 1.1 mrg print OUT "$obj \$(srcdir)/$f\n"; 287 1.1 mrg } 288 1.1 mrg $c = $crule; 289 1.1 mrg $c =~ s@\$\<@\$\(srcdir\)\/$f@g; 290 1.1 mrg print OUT $c; 291 1.1 mrg } 292 1.1 mrg } 293 1.1 mrg closedir(S); 294 1.1 mrg close(IN); 295 1.1 mrg close(OUT); 296 1.1 mrg 297 1.1 mrg rename("$srcdir/Makefile.tmp", "$srcdir/Makefile.in"); 298 1.1 mrg } 299