diff libiberty/maint-tool @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children f6334be47118
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libiberty/maint-tool	Fri Jul 17 14:47:48 2009 +0900
@@ -0,0 +1,296 @@
+#!/usr/bin/perl
+# -*- perl -*-
+
+#   Copyright (C) 2001, 2007
+#   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 .= "\t\$(COMPILE.c) \$< \$(OUTPUT_OPTION)\n";
+    $crule .= "\n";
+
+    $incdir = shift @ARGV;
+
+    opendir(INC, $incdir);
+    while ($f = readdir INC) {
+	next unless $f =~ /\.h$/;
+	$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$/.o/;
+	    $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");
+}