xref: /openbsd/gnu/lib/libiberty/src/maint-tool (revision 150b7e42)
19588ddcfSespie#!/usr/bin/perl
29588ddcfSespie# -*- perl -*-
39588ddcfSespie
49588ddcfSespie#   Copyright (C) 2001
59588ddcfSespie#   Free Software Foundation
69588ddcfSespie#
79588ddcfSespie# This file is part of the libiberty library.
89588ddcfSespie# Libiberty is free software; you can redistribute it and/or
99588ddcfSespie# modify it under the terms of the GNU Library General Public
109588ddcfSespie# License as published by the Free Software Foundation; either
119588ddcfSespie# version 2 of the License, or (at your option) any later version.
129588ddcfSespie#
139588ddcfSespie# Libiberty is distributed in the hope that it will be useful,
149588ddcfSespie# but WITHOUT ANY WARRANTY; without even the implied warranty of
159588ddcfSespie# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
169588ddcfSespie# Library General Public License for more details.
179588ddcfSespie#
189588ddcfSespie# You should have received a copy of the GNU Library General Public
199588ddcfSespie# License along with libiberty; see the file COPYING.LIB.  If not,
20*150b7e42Smiod# write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21*150b7e42Smiod# Boston, MA 02110-1301, USA.
229588ddcfSespie#
239588ddcfSespie# Originally written by DJ Delorie <dj@redhat.com>
249588ddcfSespie
259588ddcfSespie
269588ddcfSespie# This is a trivial script which checks the lists of C and O files in
279588ddcfSespie# the Makefile for consistency.
289588ddcfSespie
299588ddcfSespie$mode = shift;
309588ddcfSespie$srcdir = ".";
319588ddcfSespie
329588ddcfSespieif ($mode eq "-s") {
339588ddcfSespie    $srcdir = shift;
349588ddcfSespie    $mode = shift;
359588ddcfSespie}
369588ddcfSespie
379588ddcfSespie&missing() if $mode eq "missing";
389588ddcfSespie&undoc() if $mode eq "undoc";
399588ddcfSespie&deps() if $mode eq "deps";
409588ddcfSespie
419588ddcfSespieexit 0;
429588ddcfSespie
439588ddcfSespieformat STDOUT =
449588ddcfSespie^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~
459588ddcfSespie$out
469588ddcfSespie        ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
479588ddcfSespie$out
489588ddcfSespie.
499588ddcfSespie
509588ddcfSespie######################################################################
519588ddcfSespie
529588ddcfSespiesub missing {
539588ddcfSespie
549588ddcfSespie    opendir(S, $srcdir);
559588ddcfSespie    while ($f = readdir S) {
569588ddcfSespie	$have{$f} = 1;
579588ddcfSespie    }
589588ddcfSespie    closedir(S);
599588ddcfSespie    opendir(S, ".");
609588ddcfSespie    while ($f = readdir S) {
619588ddcfSespie	$have{$f} = 1;
629588ddcfSespie    }
639588ddcfSespie    closedir(S);
649588ddcfSespie
659588ddcfSespie    for $a (@ARGV) {
669588ddcfSespie	$listed{$a} = 1;
679588ddcfSespie	$have{$a} = 0;
689588ddcfSespie    }
699588ddcfSespie
709588ddcfSespie    for $f (sort keys %have) {
719588ddcfSespie	next unless $have{$f};
729588ddcfSespie	if ($f =~ /\.c$/) {
739588ddcfSespie	    print "S $f\n";
749588ddcfSespie	}
759588ddcfSespie    }
769588ddcfSespie    for $f (sort keys %listed) {
779588ddcfSespie	if ($f =~ /(.*)\.c$/) {
789588ddcfSespie	    $base = $1;
799588ddcfSespie	    if (! $listed{"$base.o"}) {
809588ddcfSespie		print "O $f\n";
819588ddcfSespie	    }
829588ddcfSespie	}
839588ddcfSespie    }
849588ddcfSespie}
859588ddcfSespie
869588ddcfSespie######################################################################
879588ddcfSespie
889588ddcfSespiesub undoc {
899588ddcfSespie
909588ddcfSespie    opendir(S, $srcdir);
919588ddcfSespie    while ($file = readdir S) {
929588ddcfSespie	if ($file =~ /\.texi$/) {
939588ddcfSespie	    open(T, "$srcdir/$file");
949588ddcfSespie	    while (<T>) {
959588ddcfSespie		if (/^\@deftype[^\(]* ([^\s\(]+) *\(/) {
969588ddcfSespie		    $documented{$1} = 1;
979588ddcfSespie		}
989588ddcfSespie	    }
999588ddcfSespie	    close(T);
1009588ddcfSespie	}
1019588ddcfSespie	if ($file =~ /\.c$/) {
1029588ddcfSespie	    open(C, "$srcdir/$file");
1039588ddcfSespie	    while (<C>) {
1049588ddcfSespie		if (/\@undocumented (\S+)/) {
1059588ddcfSespie		    $documented{$1} = 1;
1069588ddcfSespie		}
1079588ddcfSespie		if (/^static /) {
1089588ddcfSespie		    if (! /[\(;]/) {
1099588ddcfSespie			s/[\r\n]+$/ /;
1109588ddcfSespie			$_ .= <C>;
1119588ddcfSespie		    }
1129588ddcfSespie		    while ($_ =~ /\([^\)]*$/) {
1139588ddcfSespie			s/[\r\n]+$/ /;
1149588ddcfSespie			$_ .= <C>;
1159588ddcfSespie		    }
1169588ddcfSespie		}
1179588ddcfSespie		s/ VPARAMS([ \(])/$1/;
1189588ddcfSespie		s/PREFIX\(([^\)]*)\)/byte_$1/;
1199588ddcfSespie		if (/^static [^\(]* ([^\s\(]+) *\(.*\)$/) {
1209588ddcfSespie		    $documented{$1} = 1;
1219588ddcfSespie		}
1229588ddcfSespie	    }
1239588ddcfSespie	}
1249588ddcfSespie    }
1259588ddcfSespie    closedir(D);
1269588ddcfSespie
1279588ddcfSespie    # $out = join(' ', sort keys %documented);
1289588ddcfSespie    # write;
1299588ddcfSespie    # print "\n";
1309588ddcfSespie
1319588ddcfSespie    system "etags $srcdir/*.c $srcdir/../include/*.h";
1329588ddcfSespie    open(TAGS, "TAGS");
1339588ddcfSespie    while (<TAGS>) {
1349588ddcfSespie	s/[\r\n]+$//;
1359588ddcfSespie	if (/^\014$/) {
1369588ddcfSespie	    $filename = <TAGS>;
1379588ddcfSespie	    $filename =~ s/[\r\n]+$//;
1389588ddcfSespie	    $filename =~ s/,\d+$//;
1399588ddcfSespie	    $filename =~ s@.*[/\\]@@;
1409588ddcfSespie	    next;
1419588ddcfSespie	}
1429588ddcfSespie	if ($filename =~ /\.c$/ ) {
1439588ddcfSespie	    next unless /^[_a-zA-Z]/;
1449588ddcfSespie	} else {
1459588ddcfSespie	    next unless /^\# *define/;
1469588ddcfSespie	    s/\# *define *//;
1479588ddcfSespie	}
1489588ddcfSespie
1499588ddcfSespie	s/ VPARAMS//;
1509588ddcfSespie	s/ *\177.*//;
1519588ddcfSespie	s/,$//;
1529588ddcfSespie	s/DEFUN\(//;
1539588ddcfSespie	s/\(//;
1549588ddcfSespie
1559588ddcfSespie	next if /^static /;
1569588ddcfSespie	next if /\s/;
1579588ddcfSespie	next if /^_/;
1589588ddcfSespie	next if $documented{$_};
1599588ddcfSespie	next if /_H_?$/;
1609588ddcfSespie
1619588ddcfSespie	if ($seen_in{$_} ne $filename) {
1629588ddcfSespie	    $saw{$_} ++;
1639588ddcfSespie	}
1649588ddcfSespie	$seen_in{$_} = $filename;
1659588ddcfSespie    }
1669588ddcfSespie
1679588ddcfSespie    for $k (keys %saw) {
1689588ddcfSespie	delete $saw{$k} if $saw{$k} > 1;
1699588ddcfSespie    }
1709588ddcfSespie
1719588ddcfSespie    for $k (sort keys %saw) {
1729588ddcfSespie	$fromfile{$seen_in{$k}} .= " " if $fromfile{$seen_in{$k}};
1739588ddcfSespie	$fromfile{$seen_in{$k}} .= $k;
1749588ddcfSespie    }
1759588ddcfSespie
1769588ddcfSespie    for $f (sort keys %fromfile) {
1779588ddcfSespie	$out = "$f: $fromfile{$f}";
1789588ddcfSespie	write;
1799588ddcfSespie    }
1809588ddcfSespie}
1819588ddcfSespie
1829588ddcfSespie######################################################################
1839588ddcfSespie
1849588ddcfSespiesub deps_for {
1859588ddcfSespie    my($f) = @_;
1869588ddcfSespie    my(%d);
1879588ddcfSespie    open(F, $f);
1889588ddcfSespie    %d = ();
1899588ddcfSespie    while (<F>) {
1909588ddcfSespie	if (/^#\s*include\s+["<](.*)[">]/) {
1919588ddcfSespie	    $d{$1} = 1;
1929588ddcfSespie	}
1939588ddcfSespie    }
1949588ddcfSespie    close(F);
1959588ddcfSespie    return keys %d;
1969588ddcfSespie}
1979588ddcfSespie
1989588ddcfSespiesub canonicalize {
1999588ddcfSespie    my ($p) = @_;
2009588ddcfSespie    0 while $p =~ s@/\./@/@g;
2019588ddcfSespie    0 while $p =~ s@^\./@@g;
2029588ddcfSespie    0 while $p =~ s@/[^/]+/\.\./@/@g;
2039588ddcfSespie    return $p;
2049588ddcfSespie}
2059588ddcfSespie
2069588ddcfSespiesub locals_first {
2079588ddcfSespie    my ($a,$b) = @_;
2089588ddcfSespie    return -1 if $a eq "config.h";
2099588ddcfSespie    return  1 if $b eq "config.h";
2109588ddcfSespie    return $a cmp $b;
2119588ddcfSespie}
2129588ddcfSespie
2139588ddcfSespiesub deps {
2149588ddcfSespie
215*150b7e42Smiod    $crule  = "\tif [ x\"\$(PICFLAG)\" != x ]; then \\\n";
216*150b7e42Smiod    $crule .= "\t  \$(COMPILE.c) \$(PICFLAG) \$< -o pic/\$@; \\\n";
217*150b7e42Smiod    $crule .= "\telse true; fi\n";
218*150b7e42Smiod    $crule .= "\t\$(COMPILE.c) \$< \$(OUTPUT_OPTION)\n";
219*150b7e42Smiod    $crule .= "\n";
220*150b7e42Smiod
2219588ddcfSespie    $incdir = shift @ARGV;
2229588ddcfSespie
2239588ddcfSespie    opendir(INC, $incdir);
2249588ddcfSespie    while ($f = readdir INC) {
2259588ddcfSespie	next unless $f =~ /\.h$/;
2269588ddcfSespie	$mine{$f} = "\$(INCDIR)/$f";
2279588ddcfSespie	$deps{$f} = join(' ', &deps_for("$incdir/$f"));
2289588ddcfSespie    }
2299588ddcfSespie    $mine{'config.h'} = "config.h";
2309588ddcfSespie
23125e200daSespie    opendir(INC, $srcdir);
23225e200daSespie    while ($f = readdir INC) {
23325e200daSespie	next unless $f =~ /\.h$/;
23425e200daSespie	$mine{$f} = "\$(srcdir)/$f";
23525e200daSespie	$deps{$f} = join(' ', &deps_for("$srcdir/$f"));
23625e200daSespie    }
23725e200daSespie    $mine{'config.h'} = "config.h";
23825e200daSespie
2399588ddcfSespie    open(IN, "$srcdir/Makefile.in");
2409588ddcfSespie    open(OUT, ">$srcdir/Makefile.tmp");
2419588ddcfSespie    while (<IN>) {
2429588ddcfSespie	last if /remainder of this file/;
2439588ddcfSespie	print OUT;
2449588ddcfSespie    }
2459588ddcfSespie    print OUT "# The dependencies in the remainder of this file are automatically\n";
2469588ddcfSespie    print OUT "# generated by \"make maint-deps\".  Manual edits will be lost.\n\n";
2479588ddcfSespie
2489588ddcfSespie    opendir(S, $srcdir);
2499588ddcfSespie    for $f (sort readdir S) {
2509588ddcfSespie	if ($f =~ /\.c$/) {
2519588ddcfSespie
2529588ddcfSespie	    %scanned = ();
2539588ddcfSespie	    @pending = &deps_for("$srcdir/$f");
2549588ddcfSespie	    while (@pending) {
2559588ddcfSespie		@tmp = @pending;
2569588ddcfSespie		@pending = ();
2579588ddcfSespie		for $p (@tmp) {
2589588ddcfSespie		    next unless $mine{$p};
2599588ddcfSespie		    if (!$scanned{$p}) {
2609588ddcfSespie			push(@pending, split(' ', $deps{$p}));
2619588ddcfSespie			$scanned{$p} = 1;
2629588ddcfSespie		    }
2639588ddcfSespie		}
2649588ddcfSespie	    }
2659588ddcfSespie	    @deps = sort { &locals_first($a,$b) } keys %scanned;
2669588ddcfSespie	    $obj = $f;
2679588ddcfSespie	    $obj =~ s/\.c$/.o/;
268*150b7e42Smiod	    $obj = "./$obj:";
2699588ddcfSespie	    if ($#deps >= 0) {
270*150b7e42Smiod		print OUT "$obj \$(srcdir)/$f";
271*150b7e42Smiod		$len = length("$obj $f");
2729588ddcfSespie		for $dt (@deps) {
2739588ddcfSespie		    $d = $mine{$dt};
2749588ddcfSespie		    if ($len + length($d) > 70) {
2759588ddcfSespie			printf OUT " \\\n\t$d";
2769588ddcfSespie			$len = 8 + length($d);
2779588ddcfSespie		    } else {
2789588ddcfSespie			print OUT " $d";
2799588ddcfSespie			$len += length($d) + 1;
2809588ddcfSespie		    }
2819588ddcfSespie		}
2829588ddcfSespie		print OUT "\n";
283*150b7e42Smiod	    } else {
284*150b7e42Smiod		print OUT "$obj \$(srcdir)/$f\n";
2859588ddcfSespie	    }
286*150b7e42Smiod	    $c = $crule;
287*150b7e42Smiod	    $c =~ s@\$\<@\$\(srcdir\)\/$f@g;
288*150b7e42Smiod	    print OUT $c;
2899588ddcfSespie	}
2909588ddcfSespie    }
2919588ddcfSespie    closedir(S);
2929588ddcfSespie    close(IN);
2939588ddcfSespie    close(OUT);
2949588ddcfSespie
2959588ddcfSespie    rename("$srcdir/Makefile.tmp", "$srcdir/Makefile.in");
2969588ddcfSespie}
297