* Scripts/webkitdirs.pm: Add a compatibilty hack for people with old
[WebKit-https.git] / WebKitTools / Scripts / webkitdirs.pm
1 # Copyright (C) 2005, 2006 Apple Computer, Inc.  All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions
5 # are met:
6 #
7 # 1.  Redistributions of source code must retain the above copyright
8 #     notice, this list of conditions and the following disclaimer. 
9 # 2.  Redistributions in binary form must reproduce the above copyright
10 #     notice, this list of conditions and the following disclaimer in the
11 #     documentation and/or other materials provided with the distribution. 
12 # 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
13 #     its contributors may be used to endorse or promote products derived
14 #     from this software without specific prior written permission. 
15 #
16 # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
17 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
20 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27 # Module to share code to get to WebKit directories.
28
29 use strict;
30 use warnings;
31 use FindBin;
32
33 BEGIN {
34    use Exporter   ();
35    our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
36    $VERSION     = 1.00;
37    @ISA         = qw(Exporter);
38    @EXPORT      = qw(&chdirWebKit &baseProductDir &productDir &XcodeOptions &XcodeOptionString &XcodeOptionStringNoConfig &passedConfiguration &setConfiguration &safariPath &checkFrameworks);
39    %EXPORT_TAGS = ( );
40    @EXPORT_OK   = ();
41 }
42
43 our @EXPORT_OK;
44
45 my $baseProductDir;
46 my @baseProductDirOption;
47 my $configuration;
48 my $configurationProductDir;
49 my $sourceDir;
50
51 sub determineSourceDir
52 {
53     return if $sourceDir;
54     $sourceDir = $FindBin::Bin;
55     if ($sourceDir !~ s|/[^/]+/[^/]+$||) {
56         die "Could not find two levels above source directory using FindBin.\n";
57     }
58 }
59
60 sub determineBaseProductDir
61 {
62     return if defined $baseProductDir;
63     determineSourceDir();
64     open PRODUCT, "defaults read com.apple.Xcode PBXProductDirectory 2> /dev/null |" or die;
65     $baseProductDir = <PRODUCT>;
66     close PRODUCT;
67     if ($baseProductDir) {
68         chomp $baseProductDir;
69         $baseProductDir =~ s|^\Q$(SRCROOT)/..\E$|$sourceDir|;
70         $baseProductDir =~ s|^\Q$(SRCROOT)/../|$sourceDir/|;
71         $baseProductDir =~ s|^~/|$ENV{HOME}/|;
72         die "Can't handle Xcode product directory with a ~ in it.\n" if $baseProductDir =~ /~/;
73         die "Can't handle Xcode product directory with a variable in it.\n" if $baseProductDir =~ /\$/;
74         @baseProductDirOption = ();
75     } else {
76         $baseProductDir = "$sourceDir/WebKitBuild";
77         @baseProductDirOption = ("SYMROOT=$baseProductDir");
78     }
79 }
80
81 sub determineConfiguration
82 {
83     return if defined $configuration;
84     determineBaseProductDir();
85     if (open CONFIGURATION, "$baseProductDir/Configuration") {
86         $configuration = <CONFIGURATION>;
87         close CONFIGURATION;
88     }
89     if ($configuration) {
90         chomp $configuration;
91         # compatibility for people who have old Configuration files
92         $configuration = "Release" if $configuration eq "Deployment";
93         $configuration = "Debug" if $configuration eq "Development";
94     } else {
95         $configuration = "Release";
96     }
97 }
98
99 sub determineConfigurationProductDir
100 {
101     return if defined $configurationProductDir;
102     determineBaseProductDir();
103     determineConfiguration();
104     $configurationProductDir = "$baseProductDir/$configuration";
105 }
106
107 sub chdirWebKit
108 {
109     determineSourceDir();
110     chdir $sourceDir or die;
111 }
112
113 sub baseProductDir
114 {
115     determineBaseProductDir();
116     return $baseProductDir;
117 }
118
119 sub productDir
120 {
121     determineConfigurationProductDir();
122     return $configurationProductDir;
123 }
124
125 sub XcodeOptions
126 {
127     determineBaseProductDir();
128     determineConfiguration();
129     return (@baseProductDirOption, "-configuration", $configuration);
130 }
131
132 sub XcodeOptionString
133 {
134     return join " ", XcodeOptions();
135 }
136
137 sub XcodeOptionStringNoConfig
138 {
139     return join " ", @baseProductDirOption;
140 }
141
142 my $passedConfiguration;
143 my $searchedForPassedConfiguration;
144 sub determinePassedConfiguration
145 {
146     return if $searchedForPassedConfiguration;
147     $searchedForPassedConfiguration = 1;
148     for my $i (0 .. $#ARGV) {
149         my $opt = $ARGV[$i];
150         if ($opt =~ /^--debug$/i || $opt =~ /^--devel/i) {
151             splice(@ARGV, $i, 1);
152             $passedConfiguration = "Debug";
153             return;
154         }
155         if ($opt =~ /^--release$/i || $opt =~ /^--deploy/i) {
156             splice(@ARGV, $i, 1);
157             $passedConfiguration = "Release";
158             return;
159         }
160     }
161     $passedConfiguration = undef;
162 }
163
164 sub passedConfiguration
165 {
166     determinePassedConfiguration();
167     return $passedConfiguration;
168 }
169
170 sub setConfiguration
171 {
172     determinePassedConfiguration();
173     $configuration = $passedConfiguration if $passedConfiguration;
174 }
175
176 # Locate Safari.
177 sub safariPath
178 {
179     # Use WEBKIT_SAFARI environment variable if present.
180     my $safariBundle = $ENV{WEBKIT_SAFARI};
181     if (!$safariBundle) {
182         determineConfigurationProductDir();
183         # Use Safari.app in product directory if present (good for Safari development team).
184         if (-d "$configurationProductDir/Safari.app") {
185             $safariBundle = "$configurationProductDir/Safari.app";
186         } else {
187             # Otherwise use Safari.app in Applications directory.
188             $safariBundle = "/Applications/Safari.app";
189         }
190     }
191     my $safariPath = "$safariBundle/Contents/MacOS/Safari";
192     die "Can't find executable at $safariPath.\n" unless -x $safariPath;
193     return $safariPath;
194 }
195
196 sub builtDylibPathForName
197 {
198     my $framework = shift;
199     determineConfigurationProductDir();
200     return "$configurationProductDir/$framework.framework/Versions/A/$framework";
201 }
202
203 # Check to see that all the frameworks are built.
204 sub checkFrameworks
205 {
206     for my $framework ("JavaScriptCore", "WebCore", "WebKit") {
207         my $path = builtDylibPathForName($framework);
208         die "Can't find built framework at \"$path\".\n" unless -x $path;
209     }
210 }
211
212 sub hasSVGSupport
213 {
214     my $path = shift;
215     open NM, "-|", "nm", $path or die;
216     my $hasSVGSupport = 0;
217     while (<NM>) {
218         $hasSVGSupport = 1 if /SVGElement/;
219     }
220     close NM;
221     return $hasSVGSupport;
222 }
223
224 sub removeLibraryDependingOnSVG
225 {
226     my $frameworkName = shift;
227     my $shouldHaveSVG = shift;
228     
229     my $path = builtDylibPathForName($frameworkName);
230     return unless -x $path;
231     
232     my $hasSVG = hasSVGSupport($path);
233     system "rm -f $path" if ($shouldHaveSVG xor $hasSVG);
234 }
235
236 sub checkWebCoreSVGSupport
237 {
238     my $required = shift;
239     my $framework = "WebCore";
240     my $path = builtDylibPathForName($framework);
241     my $hasSVG = hasSVGSupport($path);
242     if ($required && !$hasSVG) {
243         die "$framework at \"$path\" does not include SVG Support, please run build-webkit --svg\n";
244     }
245     return $hasSVG;
246 }
247
248 sub checkRequiredSystemConfig
249 {
250     chomp(my $productVersion = `sw_vers -productVersion`);
251     if ($productVersion lt "10.4") {
252         print "*************************************************************\n";
253         print "Mac OS X Version 10.4.0 or later is required to build WebKit.\n";
254         print "You have " . $productVersion . ", thus the build will most likely fail.\n";
255         print "*************************************************************\n";
256     }
257     my $xcodeVersion = `xcodebuild -version`;
258     if ($xcodeVersion !~ /DevToolsCore-(\d+)/ || $1 < 620) {
259         print "*************************************************************\n";
260         print "Xcode Version 2.1 or later is required to build WebKit.\n";
261         print "You have an earlier version of Xcode, thus the build will\n";
262         print "most likely fail.  The latest Xcode is available from the web:\n";
263         print "http://developer.apple.com/tools/xcode\n";
264         print "*************************************************************\n";
265     }
266 }
267
268 1;