1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#!/usr/bin/perl -w 2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Copyright (C) 2005 Apple Computer, Inc. All rights reserved. 4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Redistribution and use in source and binary forms, with or without 6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# modification, are permitted provided that the following conditions 7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# are met: 8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 1. Redistributions of source code must retain the above copyright 10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# notice, this list of conditions and the following disclaimer. 11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 2. Redistributions in binary form must reproduce the above copyright 12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# notice, this list of conditions and the following disclaimer in the 13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# documentation and/or other materials provided with the distribution. 14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# its contributors may be used to endorse or promote products derived 16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# from this software without specific prior written permission. 17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# "find-extra-includes" script for WebKit Open Source Project 30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse strict; 32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse File::Find; 33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfind(\&wanted, @ARGV ? @ARGV : "."); 35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 36563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy %paths; 37563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy %includes; 38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub wanted 40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark my $file = $_; 42563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 43563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if ($file eq "icu") { 44563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $File::Find::prune = 1; 45563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return; 46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if ($file !~ /^\./ && $file =~ /\.(h|cpp|c|mm|m)$/) { 49563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $paths{$file} = $File::Find::name; 50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark open FILE, $file or die; 51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark while (<FILE>) { 52563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (m-^\s*#\s*(include|import)\s+["<]((\S+/)*)(\S+)[">]-) { 53563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark my $include = ($2 eq "sys/" ? $2 : "") . $4; 54563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $includes{$file}{$include}++; 55563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 56563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark close FILE; 58563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 59563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 60563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 61563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy %totalIncludes; 62563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub fillOut 64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark my ($file) = @_; 66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return if defined $totalIncludes{$file}; 68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for my $include (keys %{ $includes{$file} }) { 70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $totalIncludes{$file}{$include} = 1; 71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark fillOut($include); 72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for my $i (keys %{ $totalIncludes{$include} }) { 73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $totalIncludes{$file}{$i} = 1; 74563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub check 79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{ 80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark my ($file) = @_; 81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for my $include (keys %{ $includes{$file} }) { 83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark fillOut($include); 84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for my $i1 (sort keys %{ $includes{$file} }) { 86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for my $i2 (keys %{ $includes{$file} }) { 87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark next if $i1 eq $i2; 88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if ($totalIncludes{$i2}{$i1}) { 89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark my $b1 = $i1; 90563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark my $b2 = $file; 91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $b1 =~ s/\..+$//; 92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark $b2 =~ s/\..+$//; 93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark print "$paths{$file} does not need to include $i1, because $i2 does\n" if $b1 ne $b2; 94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark last; 95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 100563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkfor my $file (sort keys %includes) { 101563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark check($file); 102563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark} 103