123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300 |
- #!/usr/bin/perl
- # -*- perl -*-
- # Copyright (C) 2001, 2007, 2010, 2014
- # Free Software Foundation
- #
- # This file is part of the libiberty library.
- # Libiberty is free software; you can redistribute it and/or
- # modify it under the terms of the GNU Library General Public
- # License as published by the Free Software Foundation; either
- # version 2 of the License, or (at your option) any later version.
- #
- # Libiberty is distributed in the hope that it will be useful,
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- # Library General Public License for more details.
- #
- # You should have received a copy of the GNU Library General Public
- # License along with libiberty; see the file COPYING.LIB. If not,
- # write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
- # Boston, MA 02110-1301, USA.
- #
- # Originally written by DJ Delorie <dj@redhat.com>
- # This is a trivial script which checks the lists of C and O files in
- # the Makefile for consistency.
- $mode = shift;
- $srcdir = ".";
- if ($mode eq "-s") {
- $srcdir = shift;
- $mode = shift;
- }
- &missing() if $mode eq "missing";
- &undoc() if $mode eq "undoc";
- &deps() if $mode eq "deps";
- exit 0;
- format STDOUT =
- ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~
- $out
- ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
- $out
- .
- ######################################################################
- sub missing {
- opendir(S, $srcdir);
- while ($f = readdir S) {
- $have{$f} = 1;
- }
- closedir(S);
- opendir(S, ".");
- while ($f = readdir S) {
- $have{$f} = 1;
- }
- closedir(S);
- for $a (@ARGV) {
- $listed{$a} = 1;
- $have{$a} = 0;
- }
- for $f (sort keys %have) {
- next unless $have{$f};
- if ($f =~ /\.c$/) {
- print "S $f\n";
- }
- }
- for $f (sort keys %listed) {
- if ($f =~ /(.*)\.c$/) {
- $base = $1;
- if (! $listed{"./$base.o"}) {
- print "O $f\n";
- }
- }
- }
- }
- ######################################################################
- sub undoc {
- opendir(S, $srcdir);
- while ($file = readdir S) {
- if ($file =~ /\.texi$/) {
- open(T, "$srcdir/$file");
- while (<T>) {
- if (/^\@deftype[^\(]* ([^\s\(]+) *\(/) {
- $documented{$1} = 1;
- }
- }
- close(T);
- }
- if ($file =~ /\.c$/) {
- open(C, "$srcdir/$file");
- while (<C>) {
- if (/\@undocumented (\S+)/) {
- $documented{$1} = 1;
- }
- if (/^static /) {
- if (! /[\(;]/) {
- s/[\r\n]+$/ /;
- $_ .= <C>;
- }
- while ($_ =~ /\([^\)]*$/) {
- s/[\r\n]+$/ /;
- $_ .= <C>;
- }
- }
- s/ VPARAMS([ \(])/$1/;
- s/PREFIX\(([^\)]*)\)/byte_$1/;
- if (/^static [^\(]* ([^\s\(]+) *\(.*\)$/) {
- $documented{$1} = 1;
- }
- }
- }
- }
- closedir(D);
- # $out = join(' ', sort keys %documented);
- # write;
- # print "\n";
- system "etags $srcdir/*.c $srcdir/../include/*.h";
- open(TAGS, "TAGS");
- while (<TAGS>) {
- s/[\r\n]+$//;
- if (/^\014$/) {
- $filename = <TAGS>;
- $filename =~ s/[\r\n]+$//;
- $filename =~ s/,\d+$//;
- $filename =~ s@.*[/\\]@@;
- next;
- }
- if ($filename =~ /\.c$/ ) {
- next unless /^[_a-zA-Z]/;
- } else {
- next unless /^\# *define/;
- s/\# *define *//;
- }
- s/ VPARAMS//;
- s/ *\177.*//;
- s/,$//;
- s/DEFUN\(//;
- s/\(//;
- next if /^static /;
- next if /\s/;
- next if /^_/;
- next if $documented{$_};
- next if /_H_?$/;
- if ($seen_in{$_} ne $filename) {
- $saw{$_} ++;
- }
- $seen_in{$_} = $filename;
- }
- for $k (keys %saw) {
- delete $saw{$k} if $saw{$k} > 1;
- }
- for $k (sort keys %saw) {
- $fromfile{$seen_in{$k}} .= " " if $fromfile{$seen_in{$k}};
- $fromfile{$seen_in{$k}} .= $k;
- }
- for $f (sort keys %fromfile) {
- $out = "$f: $fromfile{$f}";
- write;
- }
- }
- ######################################################################
- sub deps_for {
- my($f) = @_;
- my(%d);
- open(F, $f);
- %d = ();
- while (<F>) {
- if (/^#\s*include\s+["<](.*)[">]/) {
- $d{$1} = 1;
- }
- }
- close(F);
- return keys %d;
- }
- sub canonicalize {
- my ($p) = @_;
- 0 while $p =~ s@/\./@/@g;
- 0 while $p =~ s@^\./@@g;
- 0 while $p =~ s@/[^/]+/\.\./@/@g;
- return $p;
- }
- sub locals_first {
- my ($a,$b) = @_;
- return -1 if $a eq "config.h";
- return 1 if $b eq "config.h";
- return $a cmp $b;
- }
- sub deps {
- $crule = "\tif [ x\"\$(PICFLAG)\" != x ]; then \\\n";
- $crule .= "\t \$(COMPILE.c) \$(PICFLAG) \$< -o pic/\$@; \\\n";
- $crule .= "\telse true; fi\n";
- $crule .= "\tif [ x\"\$(NOASANFLAG)\" != x ]; then \\\n";
- $crule .= "\t \$(COMPILE.c) \$(PICFLAG) \$(NOASANFLAG) \$< -o noasan/\$@; \\\n";
- $crule .= "\telse true; fi\n";
- $crule .= "\t\$(COMPILE.c) \$< \$(OUTPUT_OPTION)\n";
- $crule .= "\n";
- $incdir = shift @ARGV;
- opendir(INC, $incdir);
- while ($f = readdir INC) {
- next unless $f =~ /\.h$/ || $f =~ /\.def$/;
- $mine{$f} = "\$(INCDIR)/$f";
- $deps{$f} = join(' ', &deps_for("$incdir/$f"));
- }
- $mine{'config.h'} = "config.h";
- opendir(INC, $srcdir);
- while ($f = readdir INC) {
- next unless $f =~ /\.h$/;
- $mine{$f} = "\$(srcdir)/$f";
- $deps{$f} = join(' ', &deps_for("$srcdir/$f"));
- }
- $mine{'config.h'} = "config.h";
- open(IN, "$srcdir/Makefile.in");
- open(OUT, ">$srcdir/Makefile.tmp");
- while (<IN>) {
- last if /remainder of this file/;
- print OUT;
- }
- print OUT "# The dependencies in the remainder of this file are automatically\n";
- print OUT "# generated by \"make maint-deps\". Manual edits will be lost.\n\n";
- opendir(S, $srcdir);
- for $f (sort readdir S) {
- if ($f =~ /\.c$/) {
- %scanned = ();
- @pending = &deps_for("$srcdir/$f");
- while (@pending) {
- @tmp = @pending;
- @pending = ();
- for $p (@tmp) {
- next unless $mine{$p};
- if (!$scanned{$p}) {
- push(@pending, split(' ', $deps{$p}));
- $scanned{$p} = 1;
- }
- }
- }
- @deps = sort { &locals_first($a,$b) } keys %scanned;
- $obj = $f;
- $obj =~ s/\.c$/.\$(objext)/;
- $obj = "./$obj:";
- if ($#deps >= 0) {
- print OUT "$obj \$(srcdir)/$f";
- $len = length("$obj $f");
- for $dt (@deps) {
- $d = $mine{$dt};
- if ($len + length($d) > 70) {
- printf OUT " \\\n\t$d";
- $len = 8 + length($d);
- } else {
- print OUT " $d";
- $len += length($d) + 1;
- }
- }
- print OUT "\n";
- } else {
- print OUT "$obj \$(srcdir)/$f\n";
- }
- $c = $crule;
- $c =~ s@\$\<@\$\(srcdir\)\/$f@g;
- print OUT $c;
- }
- }
- closedir(S);
- close(IN);
- close(OUT);
- rename("$srcdir/Makefile.tmp", "$srcdir/Makefile.in");
- }
|