1#!/usr/bin/perl -w 2# Copyright (C) 2010 Andras Becsi (abecsi@inf.u-szeged.hu), University of Szeged 3# 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# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 14# THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY 15# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR 18# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25# 26# A script which searches for headers included by WebKit2 files 27# and generates forwarding headers for these headers. 28 29use strict; 30use Cwd qw(abs_path realpath); 31use File::Find; 32use File::Basename; 33use File::Path qw(mkpath); 34use File::Spec::Functions; 35 36my $srcRoot = realpath(File::Spec->catfile(dirname(abs_path($0)), "../..")); 37my $incFromRoot = abs_path($ARGV[0]); 38my @platformPrefixes = ("android", "brew", "cf", "chromium", "curl", "efl", "gtk", "haiku", "mac", "qt", "soup", "v8", "win", "wx"); 39my @frameworks = ( "JavaScriptCore", "WebCore", "WebKit2"); 40my @skippedPrefixes; 41my @frameworkHeaders; 42my $framework; 43my %neededHeaders; 44 45shift; 46my $outputDirectory = $ARGV[0]; 47shift; 48my $platform = $ARGV[0]; 49 50foreach my $prefix (@platformPrefixes) { 51 push(@skippedPrefixes, $prefix) unless ($prefix =~ $platform); 52} 53 54foreach (@frameworks) { 55 $framework = $_; 56 @frameworkHeaders = (); 57 %neededHeaders = (); 58 59 find(\&collectNeededHeaders, $incFromRoot); 60 find(\&collectFameworkHeaderPaths, File::Spec->catfile($srcRoot, $framework)); 61 createForwardingHeadersForFramework(); 62} 63 64sub collectNeededHeaders { 65 my $filePath = $File::Find::name; 66 my $file = $_; 67 if ($filePath =~ '\.h$|\.cpp$|\.c$') { 68 open(FILE, "<$file") or die "Could not open $filePath.\n"; 69 while (<FILE>) { 70 if (m/^#.*<$framework\/(.*\.h)/) { 71 $neededHeaders{$1} = 1; 72 } 73 } 74 close(FILE); 75 } 76} 77 78sub collectFameworkHeaderPaths { 79 my $filePath = $File::Find::name; 80 my $file = $_; 81 if ($filePath =~ '\.h$' && $filePath !~ "ForwardingHeaders" && grep{$file eq $_} keys %neededHeaders) { 82 my $headerPath = substr($filePath, length(File::Spec->catfile($srcRoot, $framework)) + 1 ); 83 push(@frameworkHeaders, $headerPath) unless (grep($headerPath =~ "$_/", @skippedPrefixes) || $headerPath =~ "config.h"); 84 } 85} 86 87sub createForwardingHeadersForFramework { 88 my $targetDirectory = File::Spec->catfile($outputDirectory, $framework); 89 mkpath($targetDirectory); 90 foreach my $header (@frameworkHeaders) { 91 my $headerName = basename($header); 92 93 # If we found more headers with the same name, only generate a forwarding header for the current platform 94 if(grep($_ =~ "/$headerName\$", @frameworkHeaders) == 1 || $header =~ "/$platform/" ) { 95 my $forwardingHeaderPath = File::Spec->catfile($targetDirectory, $headerName); 96 my $expectedIncludeStatement = "#include \"$framework/$header\""; 97 my $foundIncludeStatement = 0; 98 99 $foundIncludeStatement = <EXISTING_HEADER> if open(EXISTING_HEADER, "<$forwardingHeaderPath"); 100 chomp($foundIncludeStatement); 101 102 if (! $foundIncludeStatement || $foundIncludeStatement ne $expectedIncludeStatement) { 103 print "[Creating forwarding header for $framework/$header]\n"; 104 open(FORWARDING_HEADER, ">$forwardingHeaderPath") or die "Could not open $forwardingHeaderPath."; 105 print FORWARDING_HEADER "$expectedIncludeStatement\n"; 106 close(FORWARDING_HEADER); 107 } 108 109 close(EXISTING_HEADER); 110 } 111 } 112} 113