(linenum→info "unix/slp.c:2238")

binutils/2.18/libiberty/maint-tool

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