Home | History | Annotate | Line # | Download | only in libiberty
      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