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