#!/usr/bin/perl # This trivial maintenance utility parses the Makefile (including # included Makefiles) and lists the files that are not referenced from # any Makefile (i.e. man pages or somesuch). # This parser is very crude and only works for libdjb style Makefiles. # For example, "target1 target2: include1.h" is not supported yet. local %dep; $wanted={}; sub parse { my $file; my $makefile=shift (@_); my $target; my $deps; $wanted{$makefile}=1; open $file,$makefile || die "Couldn't open $makefile!\n"; while (<$file>) { chomp; if (m/^include\s+([\w.]+)/) { # print "including $1\n"; &parse($1); } if (m/^([\w.\/-]+):/) { $target = $1; $first = $target unless (defined $first); # print "Found: $1\n"; s/[^:]*:\s*//; $deps=$_; while ($deps =~ m/\\$/) { $deps =~ s/\s*\\$/ /; $deps .= <$file>; chomp $deps; } $dep{$target} = $deps; # print " $target -> $deps\n"; } } close $file; } &parse("Makefile"); $wanted{TARGETS}=1; $wanted{FILES}=1; sub dodep { my $target=shift (@_); # print "dodep $target -> $dep{$target}\n"; if (defined $wanted{$target}) { # print "early exit $i\n"; return; } if (defined $dep{$target}) { foreach $i (split /\s+/,$dep{$target}) { &dodep($i); $wanted{$i}=1; } } } &dodep($first); opendir DIR,"." || die "could not opendir '.'!\n"; foreach $i (readdir DIR) { -f $i or next; if (not exists $wanted{$i}) { print "superfluous: $i\n"; } } closedir DIR; exit 0; foreach $i (keys %wanted) { print "$i\n"; # print "$i: ",join(' ',$dep{$i}),"\n"; }