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.1.1.11  mrg #   Copyright (C) 2001-2024 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