1 # Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved 2 # Copyright (C) 2006 Alexey Proskuryakov (ap (at] nypop.com) 3 # Copyright (C) 2010 Andras Becsi (abecsi (at] inf.u-szeged.hu), University of Szeged 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 # Module to share code to detect the existance of features in built binaries. 30 31 use strict; 32 use warnings; 33 34 BEGIN { 35 use Exporter (); 36 our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS); 37 $VERSION = 1.00; 38 @ISA = qw(Exporter); 39 @EXPORT = qw(&checkWebCoreFeatureSupport 40 &removeLibraryDependingOnFeature); 41 %EXPORT_TAGS = ( ); 42 @EXPORT_OK = (); 43 } 44 45 sub libraryContainsSymbol($$) 46 { 47 my ($path, $symbol) = @_; 48 49 if (isCygwin() or isWindows()) { 50 # FIXME: Implement this for Windows. 51 return 0; 52 } 53 54 my $foundSymbol = 0; 55 if (-e $path) { 56 open NM, "-|", "nm", $path or die; 57 while (<NM>) { 58 $foundSymbol = 1 if /$symbol/; # FIXME: This should probably check for word boundaries before/after the symbol name. 59 } 60 close NM; 61 } 62 return $foundSymbol; 63 } 64 65 sub hasFeature($$) 66 { 67 my ($featureName, $path) = @_; 68 my %symbolForFeature = ( 69 "MathML" => "MathMLElement", 70 "SVG" => "SVGDefsElement", # We used to look for SVGElement but isSVGElement exists (and would match) in --no-svg builds. 71 "Accelerated Compositing" => "GraphicsLayer", 72 "3D Rendering" => "WebCoreHas3DRendering", 73 "3D Canvas" => "WebGLShader", 74 "WML" => "WMLElement", 75 "WCSS" => "parseWCSSInputProperty", 76 "XHTMLMP" => "isXHTMLMPDocument", 77 ); 78 my $symbolName = $symbolForFeature{$featureName}; 79 die "Unknown feature: $featureName" unless $symbolName; 80 return libraryContainsSymbol($path, $symbolName); 81 } 82 83 sub checkWebCoreFeatureSupport($$) 84 { 85 my ($feature, $required) = @_; 86 my $libraryName = "WebCore"; 87 my $path = builtDylibPathForName($libraryName); 88 my $hasFeature = hasFeature($feature, $path); 89 if ($required && !$hasFeature) { 90 die "$libraryName at \"$path\" does not include $hasFeature support. See build-webkit --help\n"; 91 } 92 return $hasFeature; 93 } 94 95 sub removeLibraryDependingOnFeature($$$) 96 { 97 my ($libraryName, $featureName, $shouldHaveFeature) = @_; 98 my $path = builtDylibPathForName($libraryName); 99 return unless -x $path; 100 101 my $hasFeature = hasFeature($featureName, $path); 102 system "rm -f $path" if ($shouldHaveFeature xor $hasFeature); 103 } 104 105 1; 106