diff options
author | DJ Delorie <dj@redhat.com> | 2002-01-22 20:14:53 +0000 |
---|---|---|
committer | DJ Delorie <dj@redhat.com> | 2002-01-22 20:14:53 +0000 |
commit | cc096b7166610e6cca71574ef936acbabc922708 (patch) | |
tree | e1f498ad212739694972f83364c71a374ce90a3d /libiberty/maint-tool | |
parent | 069e84fd968e0561b436e2af0bd2310e028fd04f (diff) | |
download | gdb-cc096b7166610e6cca71574ef936acbabc922708.zip gdb-cc096b7166610e6cca71574ef936acbabc922708.tar.gz gdb-cc096b7166610e6cca71574ef936acbabc922708.tar.bz2 |
merge from gcc
Diffstat (limited to 'libiberty/maint-tool')
-rw-r--r-- | libiberty/maint-tool | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/libiberty/maint-tool b/libiberty/maint-tool index 75b0c50..ceeb48d 100644 --- a/libiberty/maint-tool +++ b/libiberty/maint-tool @@ -36,6 +36,7 @@ if ($mode eq "-s") { &missing() if $mode eq "missing"; &undoc() if $mode eq "undoc"; +&deps() if $mode eq "deps"; exit 0; @@ -178,3 +179,100 @@ sub undoc { 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 { + + $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"; + + 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; + $len = length($obj); + 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"; + } + } + } + closedir(S); + close(IN); + close(OUT); + + rename("$srcdir/Makefile.tmp", "$srcdir/Makefile.in"); +} |