Home | History | Annotate | Download | only in Scripts
      1 #!/usr/bin/perl -w
      2 
      3 # Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
      4 #
      5 # Redistribution and use in source and binary forms, with or without
      6 # modification, are permitted provided that the following conditions
      7 # are met:
      8 #
      9 # 1.  Redistributions of source code must retain the above copyright
     10 #     notice, this list of conditions and the following disclaimer. 
     11 # 2.  Redistributions in binary form must reproduce the above copyright
     12 #     notice, this list of conditions and the following disclaimer in the
     13 #     documentation and/or other materials provided with the distribution. 
     14 # 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
     15 #     its contributors may be used to endorse or promote products derived
     16 #     from this software without specific prior written permission. 
     17 #
     18 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
     19 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     21 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
     22 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     23 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     24 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     25 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     28 
     29 # "find-extra-includes" script for WebKit Open Source Project
     30 
     31 use strict;
     32 use File::Find;
     33 
     34 find(\&wanted, @ARGV ? @ARGV : ".");
     35 
     36 my %paths;
     37 my %includes;
     38 
     39 sub wanted
     40 {
     41     my $file = $_;
     42 
     43     if ($file eq "icu") {
     44         $File::Find::prune = 1;
     45         return;
     46     }
     47 
     48     if ($file !~ /^\./ && $file =~ /\.(h|cpp|c|mm|m)$/) {
     49         $paths{$file} = $File::Find::name;
     50         open FILE, $file or die;
     51         while (<FILE>) {
     52             if (m-^\s*#\s*(include|import)\s+["<]((\S+/)*)(\S+)[">]-) {
     53                 my $include = ($2 eq "sys/" ? $2 : "") . $4;
     54                 $includes{$file}{$include}++;
     55             }
     56         }
     57         close FILE;
     58     }
     59 }
     60 
     61 my %totalIncludes;
     62 
     63 sub fillOut
     64 {
     65     my ($file) = @_;
     66 
     67     return if defined $totalIncludes{$file};
     68 
     69     for my $include (keys %{ $includes{$file} }) {
     70         $totalIncludes{$file}{$include} = 1;
     71         fillOut($include);
     72         for my $i (keys %{ $totalIncludes{$include} }) {
     73             $totalIncludes{$file}{$i} = 1;
     74         }
     75     }
     76 }
     77 
     78 sub check
     79 {
     80     my ($file) = @_;
     81 
     82     for my $include (keys %{ $includes{$file} }) {
     83         fillOut($include);
     84     }
     85     for my $i1 (sort keys %{ $includes{$file} }) {
     86         for my $i2 (keys %{ $includes{$file} }) {
     87             next if $i1 eq $i2;
     88             if ($totalIncludes{$i2}{$i1}) {
     89                 my $b1 = $i1;
     90                 my $b2 = $file;
     91                 $b1 =~ s/\..+$//;
     92                 $b2 =~ s/\..+$//;
     93                 print "$paths{$file} does not need to include $i1, because $i2 does\n" if $b1 ne $b2;
     94                 last;
     95             }
     96         }
     97     }
     98 }
     99 
    100 for my $file (sort keys %includes) {
    101     check($file);
    102 }
    103