Home | History | Annotate | Line # | Download | only in libiberty
maint-tool revision 1.1.1.6
      1      1.1  mrg #!/usr/bin/perl
      2      1.1  mrg # -*- perl -*-
      3      1.1  mrg 
      4  1.1.1.6  mrg #   Copyright (C) 2001-2019 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.1.1.2  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.1.1.3  mrg     $crule .= "\tif [ x\"\$(NOASANFLAG)\" != x ]; then \\\n";
    218  1.1.1.3  mrg     $crule .= "\t  \$(COMPILE.c) \$(PICFLAG) \$(NOASANFLAG) \$< -o noasan/\$@; \\\n";
    219  1.1.1.3  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.1.1.2  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.1.1.2  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