2 # find a list of #include lines in C code that might not be needed
3 # usually called with something like this:
4 # minimal_includes.pl `find . -name "*.c"`
5 # Andrew Tridgell <tridge@samba.org>
14 #####################################################################
15 # write a string into a file
18 my($filename) = shift;
21 open(FILE, ">$filename") || die "can't open $filename";
29 my @lines = split(/^/m, `cat $fname`);
37 my $data = join('', @{$lines});
38 FileSave($fname, $data);
44 $fname =~ s/(.*)\.c$/$1.o/;
51 my $obj = obj_name($fname);
53 return "NOT A C FILE";
56 my $ret = `make $obj 2>&1 && md5sum $obj`;
58 return "COMPILE FAILED";
63 sub test_include($$$$)
69 my $line = $lines->[$i];
72 save_lines($fname, $lines);
74 my $out = test_compile($fname);
76 if ($out eq $original) {
78 print "$fname: removing $line";
81 print "$fname: might be able to remove $line";
83 # print "OUT: $out\n";
84 # print "ORIG: $original\n";
88 save_lines($fname, $lines);
94 my @lines = load_lines($fname);
95 my $num_lines = $#lines;
97 if (!stat(obj_name($fname))) {
101 my $original = test_compile($fname);
103 if ($original eq "COMPILE FAILED") {
104 # print "Failed to compile $fname\n";
108 print "Processing $fname (with $num_lines lines)\n";
112 for (my $i=0;$i<=$num_lines;$i++) {
113 my $line = $lines[$i];
114 if ($line =~ /^\#\s*if/) {
117 if ($line =~ /^\#\s*endif/) {
120 if ($if_level == 0 &&
121 $line =~ /^\#\s*include/ &&
122 !($line =~ /needed/)) {
123 test_include($fname, \@lines, $i, $original);
129 #########################################
135 Copyright (C) tridge\@samba.org
137 Usage: minimal_includes.pl [options] <C files....>
141 --remove remove includes, don't just list them
148 'h|help|?' => \$opt_help,
149 'remove' => \$opt_remove,
157 for (my $i=0;$i<=$#ARGV;$i++) {
158 my $fname = $ARGV[$i];
159 process_file($fname);