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