Reviewed by Adam.
[WebKit-https.git] / WebKitTools / Scripts / webkitdirs.pm
1 # Copyright (C) 2005, 2006, 2007 Apple 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 use File::Basename;
33 use POSIX;
34
35 BEGIN {
36    use Exporter   ();
37    our ($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS);
38    $VERSION     = 1.00;
39    @ISA         = qw(Exporter);
40    @EXPORT      = qw(&chdirWebKit &baseProductDir &productDir &XcodeOptions &XcodeOptionString &XcodeOptionStringNoConfig &passedConfiguration &setConfiguration &safariPath &checkFrameworks &currentSVNRevision);
41    %EXPORT_TAGS = ( );
42    @EXPORT_OK   = ();
43 }
44
45 our @EXPORT_OK;
46
47 my $baseProductDir;
48 my @baseProductDirOption;
49 my $configuration;
50 my $configurationForVisualStudio;
51 my $configurationProductDir;
52 my $sourceDir;
53 my $currentSVNRevision;
54 my $osXVersion;
55 my $isQt;
56 my $isGtk;
57
58 # Variables for Win32 support
59 my $vcBuildPath;
60 my $windowsTmpPath;
61
62 sub determineSourceDir
63 {
64     return if $sourceDir;
65     $sourceDir = $FindBin::Bin;
66     
67     # walks up path checking each directory to see if it is the main WebKit project dir, 
68     # defined by containing JavaScriptCore, WebCore, and WebKit
69     until ((-d "$sourceDir/JavaScriptCore" && -d "$sourceDir/WebCore" && -d "$sourceDir/WebKit") || (-d "$sourceDir/Internal" && -d "$sourceDir/OpenSource"))
70     {
71         if ($sourceDir !~ s|/[^/]+$||) {
72             die "Could not find top level webkit directory above source directory using FindBin.\n";
73         }
74     }
75
76     $sourceDir = "$sourceDir/OpenSource" if -d "$sourceDir/OpenSource";
77 }
78
79 # used for scripts which are stored in a non-standard location
80 sub setSourceDir($)
81 {
82     ($sourceDir) = @_;
83 }
84
85 sub determineBaseProductDir
86 {
87     return if defined $baseProductDir;
88     determineSourceDir();
89     if (isOSX()) {
90         open PRODUCT, "defaults read com.apple.Xcode PBXApplicationwideBuildSettings 2> /dev/null |" or die;
91         $baseProductDir = join '', <PRODUCT>;
92         close PRODUCT;
93
94         $baseProductDir = $1 if $baseProductDir =~ /SYMROOT\s*=\s*\"(.*?)\";/s;
95         undef $baseProductDir unless $baseProductDir =~ /^\//;
96
97         if (!defined($baseProductDir)) {
98             open PRODUCT, "defaults read com.apple.Xcode PBXProductDirectory 2> /dev/null |" or die;
99             $baseProductDir = <PRODUCT>;
100             close PRODUCT;
101             if ($baseProductDir) {
102                 chomp $baseProductDir;
103                 undef $baseProductDir unless $baseProductDir =~ /^\//;
104             }
105         }
106     } else {
107         $baseProductDir = $ENV{"WEBKITOUTPUTDIR"};
108         if (isCygwin() && $baseProductDir) {
109             my $unixBuildPath = `cygpath --unix \"$baseProductDir\"`;
110             chomp $unixBuildPath;
111             $baseProductDir = $unixBuildPath;
112         }
113     }
114
115     if ($baseProductDir && isOSX()) {
116         $baseProductDir =~ s|^\Q$(SRCROOT)/..\E$|$sourceDir|;
117         $baseProductDir =~ s|^\Q$(SRCROOT)/../|$sourceDir/|;
118         $baseProductDir =~ s|^~/|$ENV{HOME}/|;
119         die "Can't handle Xcode product directory with a ~ in it.\n" if $baseProductDir =~ /~/;
120         die "Can't handle Xcode product directory with a variable in it.\n" if $baseProductDir =~ /\$/;
121         @baseProductDirOption = ();
122     }
123
124     if (!defined($baseProductDir)) {
125         $baseProductDir = "$sourceDir/WebKitBuild";
126         @baseProductDirOption = ("SYMROOT=$baseProductDir", "OBJROOT=$baseProductDir") if (isOSX());
127         if (isCygwin()) {
128             my $dosBuildPath = `cygpath --windows \"$baseProductDir\"`;
129             chomp $dosBuildPath;
130             $ENV{"WEBKITOUTPUTDIR"} = $dosBuildPath;
131         }
132     }
133 }
134
135 sub setBaseProductDir($)
136 {
137     ($baseProductDir) = @_;
138 }
139
140 sub determineConfiguration
141 {
142     return if defined $configuration;
143     determineBaseProductDir();
144     if (open CONFIGURATION, "$baseProductDir/Configuration") {
145         $configuration = <CONFIGURATION>;
146         close CONFIGURATION;
147     }
148     if ($configuration) {
149         chomp $configuration;
150         # compatibility for people who have old Configuration files
151         $configuration = "Release" if $configuration eq "Deployment";
152         $configuration = "Debug" if $configuration eq "Development";
153     } else {
154         $configuration = "Release";
155     }
156 }
157
158 sub determineConfigurationForVisualStudio
159 {
160     return if defined $configurationForVisualStudio;
161     determineConfiguration();
162     $configurationForVisualStudio = $configuration;
163     return unless $configuration eq "Debug";
164     setupCygwinEnv();
165     chomp(my $dir = `cygpath -ua '$ENV{WEBKITLIBRARIESDIR}'`);
166     $configurationForVisualStudio = "Debug_Internal" if -f "$dir/bin/CoreFoundation_debug.dll";
167 }
168
169 sub determineConfigurationProductDir
170 {
171     return if defined $configurationProductDir;
172     determineBaseProductDir();
173     if(isCygwin()) {
174         $configurationProductDir = "$baseProductDir/bin";
175     } else {
176         determineConfiguration();
177         $configurationProductDir = "$baseProductDir/$configuration";
178     }
179 }
180
181 sub setConfigurationProductDir($)
182 {
183     ($configurationProductDir) = @_;
184 }
185
186 sub determineCurrentSVNRevision
187 {
188     return if defined $currentSVNRevision;
189     determineSourceDir();
190     my $svnInfo = `LC_ALL=C svn info $sourceDir | grep Revision:`;
191     ($currentSVNRevision) = ($svnInfo =~ m/Revision: (\d+).*/g);
192     die "Unable to determine current SVN revision in $sourceDir" unless (defined $currentSVNRevision);
193     return $currentSVNRevision;
194 }
195
196
197 sub chdirWebKit
198 {
199     determineSourceDir();
200     chdir $sourceDir or die;
201 }
202
203 sub baseProductDir
204 {
205     determineBaseProductDir();
206     return $baseProductDir;
207 }
208
209 sub sourceDir
210 {
211     determineSourceDir();
212     return $sourceDir;
213 }
214
215 sub productDir
216 {
217     determineConfigurationProductDir();
218     return $configurationProductDir;
219 }
220
221 sub configuration()
222 {
223     determineConfiguration();
224     return $configuration;
225 }
226
227 sub configurationForVisualStudio()
228 {
229     determineConfigurationForVisualStudio();
230     return $configurationForVisualStudio;
231 }
232
233 sub currentSVNRevision
234 {
235     determineCurrentSVNRevision();
236     return $currentSVNRevision;
237 }
238
239 sub XcodeOptions
240 {
241     determineBaseProductDir();
242     determineConfiguration();
243     return (@baseProductDirOption, "-configuration", $configuration);
244 }
245
246 sub XcodeOptionString
247 {
248     return join " ", XcodeOptions();
249 }
250
251 sub XcodeOptionStringNoConfig
252 {
253     return join " ", @baseProductDirOption;
254 }
255
256 my $passedConfiguration;
257 my $searchedForPassedConfiguration;
258 sub determinePassedConfiguration
259 {
260     return if $searchedForPassedConfiguration;
261     $searchedForPassedConfiguration = 1;
262     for my $i (0 .. $#ARGV) {
263         my $opt = $ARGV[$i];
264         if ($opt =~ /^--debug$/i || $opt =~ /^--devel/i) {
265             splice(@ARGV, $i, 1);
266             $passedConfiguration = "Debug";
267             return;
268         }
269         if ($opt =~ /^--release$/i || $opt =~ /^--deploy/i) {
270             splice(@ARGV, $i, 1);
271             $passedConfiguration = "Release";
272             return;
273         }
274     }
275     $passedConfiguration = undef;
276 }
277
278 sub passedConfiguration
279 {
280     determinePassedConfiguration();
281     return $passedConfiguration;
282 }
283
284 sub setConfiguration
285 {
286     if (my $config = shift @_) {
287         $configuration = $config;
288         return;
289     }
290
291     determinePassedConfiguration();
292     $configuration = $passedConfiguration if $passedConfiguration;
293 }
294
295 sub safariPathFromSafariBundle
296 {
297     my ($safariBundle) = @_;
298
299     return "$safariBundle/Contents/MacOS/Safari" if isOSX();
300     return $safariBundle if isCygwin();
301 }
302
303 sub installedSafariPath
304 {
305     my $safariBundle;
306
307     if (isOSX()) {
308         $safariBundle = "/Applications/Safari.app";
309     } elsif (isCygwin()) {
310         $safariBundle = `"$configurationProductDir/FindSafari.exe"`;
311         $safariBundle =~ s/[\r\n]+$//;
312         $safariBundle = `cygpath -u '$safariBundle'`;
313         $safariBundle =~ s/[\r\n]+$//;
314         $safariBundle .= "Safari.exe";
315     }
316
317     return safariPathFromSafariBundle($safariBundle);
318 }
319
320 # Locate Safari.
321 sub safariPath
322 {
323     # Use WEBKIT_SAFARI environment variable if present.
324     my $safariBundle = $ENV{WEBKIT_SAFARI};
325     if (!$safariBundle) {
326         determineConfigurationProductDir();
327         # Use Safari.app in product directory if present (good for Safari development team).
328         if (isOSX() && -d "$configurationProductDir/Safari.app") {
329             $safariBundle = "$configurationProductDir/Safari.app";
330         } elsif (isCygwin() && -x "$configurationProductDir/bin/Safari.exe") {
331             $safariBundle = "$configurationProductDir/bin/Safari.exe";
332         } else {
333             return installedSafariPath();
334         }
335     }
336     my $safariPath = safariPathFromSafariBundle($safariBundle);
337     die "Can't find executable at $safariPath.\n" if isOSX() && !-x $safariPath;
338     return $safariPath;
339 }
340
341 sub builtDylibPathForName
342 {
343     my $framework = shift;
344     determineConfigurationProductDir();
345     if (isQt() or isGtk()) {
346         return "$configurationProductDir/$framework";
347     }
348     if (isOSX()) {
349         return "$configurationProductDir/$framework.framework/Versions/A/$framework";
350     }
351     if (isCygwin()) {
352         if ($framework eq "JavaScriptCore") {
353                 return "$baseProductDir/lib/$framework.lib";
354         } else {
355             return "$baseProductDir/$framework.intermediate/$configuration/$framework.intermediate/$framework.lib";
356         }
357     }
358
359     die "Unsupported platform, can't determine built library locations.";
360 }
361
362 # Check to see that all the frameworks are built.
363 sub checkFrameworks
364 {
365     return if isCygwin();
366     my @frameworks = ("JavaScriptCore", "WebCore");
367     push(@frameworks, "WebKit") if isOSX();
368     for my $framework (@frameworks) {
369         my $path = builtDylibPathForName($framework);
370         die "Can't find built framework at \"$path\".\n" unless -x $path;
371     }
372 }
373
374 sub hasSVGSupport
375 {
376     return 0 if isCygwin();
377
378     my $path = shift;
379
380     if (isQt()) {
381         return 1;
382     }
383
384     if (isGtk() and $path =~ /WebCore/) {
385         $path .= "/../lib/libWebKitGtk.so";
386     }
387
388     open NM, "-|", "nm", $path or die;
389     my $hasSVGSupport = 0;
390     while (<NM>) {
391         $hasSVGSupport = 1 if /SVGElement/;
392     }
393     close NM;
394     return $hasSVGSupport;
395 }
396
397 sub removeLibraryDependingOnSVG
398 {
399     my $frameworkName = shift;
400     my $shouldHaveSVG = shift;
401
402     my $path = builtDylibPathForName($frameworkName);
403     return unless -x $path;
404
405     my $hasSVG = hasSVGSupport($path);
406     system "rm -f $path" if ($shouldHaveSVG xor $hasSVG);
407 }
408
409 sub checkWebCoreSVGSupport
410 {
411     my $required = shift;
412     my $framework = "WebCore";
413     my $path = builtDylibPathForName($framework);
414     my $hasSVG = hasSVGSupport($path);
415     if ($required && !$hasSVG) {
416         die "$framework at \"$path\" does not include SVG Support, please run build-webkit --svg\n";
417     }
418     return $hasSVG;
419 }
420
421 sub isQt()
422 {
423     determineIsQt();
424     return $isQt;
425 }
426
427 sub checkArgv($)
428 {
429     my $argToCheck = shift;
430     foreach my $opt (@ARGV) {
431         if ($opt =~ /^$argToCheck/i ) {
432             @ARGV = grep(!/^$argToCheck/i, @ARGV);
433             return 1;
434         }
435     }
436     return 0;
437 }
438
439 sub determineIsQt()
440 {
441     return if defined($isQt);
442
443     # Allow override in case QTDIR is not set.
444     if (checkArgv("--qt")) {
445         $isQt = 1;
446         return;
447     }
448
449     # The presence of QTDIR only means Qt if --gtk is not on the command-line
450     if (isGtk()) {
451         $isQt = 0;
452         return;
453     }
454     
455     $isQt = defined($ENV{'QTDIR'});
456 }
457
458 sub isGtk()
459 {
460     determineIsGtk();
461     return $isGtk;
462 }
463
464 sub determineIsGtk()
465 {
466     return if defined($isGtk);
467
468     if (checkArgv("--gtk")) {
469         $isGtk = 1;
470     } else {
471         $isGtk = 0;
472     }
473 }
474
475 sub isCygwin()
476 {
477     return ($^O eq "cygwin");
478 }
479
480 sub isDarwin()
481 {
482     return ($^O eq "darwin");
483 }
484
485 sub isOSX()
486 {
487     return isDarwin() unless (isQt() or isGtk());
488     return 0;
489 }
490
491 sub determineOSXVersion()
492 {
493     return if $osXVersion;
494
495     if (!isOSX()) {
496         $osXVersion = -1;
497         return;
498     }
499
500     my $version = `sw_vers -productVersion`;
501     my @splitVersion = split(/\./, $version);
502     @splitVersion >= 2 or die "Invalid version $version";
503     $osXVersion = {
504             "major" => $splitVersion[0],
505             "minor" => $splitVersion[1],
506             "subminor" => (defined($splitVersion[2]) ? $splitVersion[2] : 0),
507     };
508 }
509
510 sub osXVersion()
511 {
512     determineOSXVersion();
513     return $osXVersion;
514 }
515
516 sub isTiger()
517 {
518     return isOSX() && osXVersion()->{"minor"} == 4;
519 }
520
521 sub isLeopard()
522 {
523     return isOSX() && osXVersion()->{"minor"} == 5;
524 }
525
526 sub relativeScriptsDir()
527 {
528     my $scriptDir = File::Spec->catpath("", File::Spec->abs2rel(dirname($0), getcwd()), "");
529     if ($scriptDir eq "") {
530         $scriptDir = ".";
531     }
532     return $scriptDir;
533 }
534
535 sub launcherPath()
536 {
537     my $relativeScriptsPath = relativeScriptsDir();
538     if (isGtk() || isQt()) {
539         return "$relativeScriptsPath/run-launcher";
540     } elsif (isOSX() || isCygwin()) {
541         return "$relativeScriptsPath/run-safari";
542     }
543 }
544
545 sub launcherName()
546 {
547     if (isGtk()) {
548         return "GtkLauncher";
549     } elsif (isQt()) {
550         return "QtLauncher";
551     } elsif (isOSX() || isCygwin()) {
552         return "Safari";
553     }
554 }
555
556 sub checkRequiredSystemConfig
557 {
558     if (isOSX()) {
559         chomp(my $productVersion = `sw_vers -productVersion`);
560         if ($productVersion lt "10.4") {
561             print "*************************************************************\n";
562             print "Mac OS X Version 10.4.0 or later is required to build WebKit.\n";
563             print "You have " . $productVersion . ", thus the build will most likely fail.\n";
564             print "*************************************************************\n";
565         }
566         my $xcodeVersion = `xcodebuild -version`;
567         if ($xcodeVersion !~ /DevToolsCore-(\d+)/ || $1 < 747) {
568             print "*************************************************************\n";
569             print "Xcode Version 2.3 or later is required to build WebKit.\n";
570             print "You have an earlier version of Xcode, thus the build will\n";
571             print "most likely fail.  The latest Xcode is available from the web:\n";
572             print "http://developer.apple.com/tools/xcode\n";
573             print "*************************************************************\n";
574         }
575     } elsif (isGtk() or isQt()) {
576         my @cmds = qw(flex bison gperf);
577         my @missing = ();
578         foreach my $cmd (@cmds) {
579             if (not `$cmd --version`) {
580                 push @missing, $cmd;
581             }
582         }
583         if (@missing) {
584             my $list = join ", ", @missing;
585             die "ERROR: $list missing but required to build WebKit.\n";
586         }
587     }
588     # Win32 and other platforms may want to check for minimum config
589 }
590
591 sub setupCygwinEnv()
592 {
593     return if !isCygwin();
594     return if $vcBuildPath;
595
596     my $programFilesPath = `cygpath "$ENV{'PROGRAMFILES'}"`;
597     chomp $programFilesPath;
598     $vcBuildPath = "$programFilesPath/Microsoft Visual Studio 8/Common7/IDE/devenv.com";
599     if (! -e $vcBuildPath) {
600         # VC++ not found, try VC++ Express
601         my $vsInstallDir;
602         if ($ENV{'VSINSTALLDIR'}) {
603             $vsInstallDir = $ENV{'VSINSTALLDIR'};
604         } else {
605             $programFilesPath = $ENV{'PROGRAMFILES'} || "C:\\Program Files";
606             $vsInstallDir = "$programFilesPath/Microsoft Visual Studio 8";
607         }
608         $vsInstallDir = `cygpath "$vsInstallDir"`;
609         chomp $vsInstallDir;
610         $vcBuildPath = "$vsInstallDir/Common7/IDE/VCExpress.exe";
611         if (! -e $vcBuildPath) {
612             print "*************************************************************\n";
613             print "Cannot find '$vcBuildPath'\n";
614             print "Please execute the file 'vcvars32.bat' from\n";
615             print "'$programFilesPath\\Microsoft Visual Studio 8\\VC\\bin\\'\n";
616             print "to setup the necessary environment variables.\n";
617             print "*************************************************************\n";
618             die;
619         }
620     }
621
622     chomp($ENV{'WEBKITLIBRARIESDIR'} = `cygpath -wa "$sourceDir/WebKitLibraries/win"`) unless $ENV{'WEBKITLIBRARIESDIR'};
623
624     $windowsTmpPath = `cygpath -w /tmp`;
625     chomp $windowsTmpPath;
626     print "Building results into: ", baseProductDir(), "\n";
627     print "WEBKITOUTPUTDIR is set to: ", $ENV{"WEBKITOUTPUTDIR"}, "\n";
628     print "WEBKITLIBRARIESDIR is set to: ", $ENV{"WEBKITLIBRARIESDIR"}, "\n";
629 }
630
631 sub buildVisualStudioProject($)
632 {
633     my ($project) = @_;
634     setupCygwinEnv();
635
636     my $config = configurationForVisualStudio();
637
638     chomp(my $winProjectPath = `cygpath -w "$project"`);
639
640     print "$vcBuildPath $winProjectPath /build $config\n";
641     return system $vcBuildPath, $winProjectPath, "/build", $config;
642 }
643
644 sub qtMakeCommand($)
645 {
646     my ($qmakebin) = @_;
647     chomp(my $mkspec = `$qmakebin -query QMAKE_MKSPECS`);
648     $mkspec .= "/default";
649
650     my $compiler = "";
651     open SPEC, "<$mkspec/qmake.conf" or return "make";
652     while (<SPEC>) {
653         if ($_ =~ /QMAKE_CC\s*=\s*([^\s]+)/) {
654             $compiler = $1;
655         }
656     }
657     close SPEC;
658
659     #print "default spec: " . $mkspec . "\n";
660     #print "compiler found: " . $compiler . "\n";
661
662     if ($compiler eq "cl") {
663         return "nmake";
664     }
665
666     return "make";
667 }
668
669 sub buildQMakeProject(@)
670 {
671     my @buildArgs = @_;
672
673     push @buildArgs, "-r";
674
675     my $qmakebin = "qmake"; # Allow override of the qmake binary from $PATH
676     for my $i (0 .. $#ARGV) {
677         my $opt = $ARGV[$i];
678         if ($opt =~ /^--qmake=(.*)/i ) {
679             $qmakebin = $1;
680         } elsif ($opt =~ /^--qmakearg=(.*)/i ) {
681             push @buildArgs, $1;
682         }
683     }
684
685     my $make = qtMakeCommand($qmakebin);
686     my $config = configuration();
687     my $prefix = $ENV{"WebKitInstallationPrefix"};
688
689     push @buildArgs, "OUTPUT_DIR=" . baseProductDir() . "/$config";
690     push @buildArgs, sourceDir() . "/WebKit.pro";
691     if ($config =~ m/debug/i) {
692         push @buildArgs, "CONFIG-=release";
693         push @buildArgs, "CONFIG+=debug";
694     } else {
695         push @buildArgs, "CONFIG+=release";
696         push @buildArgs, "CONFIG-=debug";
697     }
698
699     my $dir = baseProductDir();
700     if (! -d $dir) {
701         mkdir $dir or die "Failed to create product directory " . $dir;
702     }
703     $dir = $dir . "/$config";
704     if (! -d $dir) {
705         mkdir $dir or die "Failed to create build directory " . $dir;
706     }
707
708     chdir $dir or die "Failed to cd into " . $dir . "\n";
709
710     print "Calling '$qmakebin @buildArgs' in " . $dir . " ...\n\n";
711     print "Installation directory: $prefix\n" if(defined($prefix));
712
713     my $result = system $qmakebin, @buildArgs;
714     if ($result ne 0) {
715        die "Failed to setup build environment using $qmakebin!\n";
716     }
717
718     my $clean = $ENV{"WEBKIT_FULLBUILD"};
719
720     if (defined $clean) {
721       system "$make clean";
722     }
723
724     $result = system "$make";
725     chdir ".." or die;
726     return $result;
727 }
728
729 sub buildQMakeQtProject($)
730 {
731     my ($project) = @_;
732
733     my @buildArgs = ("CONFIG+=qt-port");
734     return buildQMakeProject(@buildArgs);
735 }
736
737 sub buildQMakeGtkProject($)
738 {
739     my ($project) = @_;
740
741     if ($project ne "WebKit") {
742         die "The Gtk portbuilds JavaScriptCore/WebCore/WebKitQt in one shot! Only call it for 'WebKit'.\n";
743     }
744
745     my @buildArgs = ("CONFIG+=gtk-port");
746     push @buildArgs, "CONFIG-=qt";
747
748     return buildQMakeProject(@buildArgs);
749 }
750
751 sub setPathForRunningWebKitApp
752 {
753     my ($env) = @_;
754
755     return unless isCygwin();
756
757     $env->{PATH} = join(':', productDir(), dirname(installedSafariPath()), $env->{PATH} || "");
758 }
759
760 sub exitStatus($)
761 {
762     my ($returnvalue) = @_;
763     if ($^O eq "MSWin32") {
764         return $returnvalue >> 8;
765     }
766     return WEXITSTATUS($returnvalue);
767 }
768
769 1;