#!/usr/bin/perl -w # Copyright (C) 2005, 2006 Apple Computer, Inc. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # Build script wrapper for the WebKit Open Source Project. use strict; use File::Basename; use File::Spec; use FindBin; use Getopt::Long qw(:config pass_through); use lib $FindBin::Bin; use webkitdirs; use POSIX; my $originalWorkingDirectory = getcwd(); my $channelMessagingSupport = 0; my $databaseSupport = 1; my $domStorageSupport = 1; my $gnomeKeyringSupport = 0; my $iconDatabaseSupport = 1; my $offlineWebApplicationSupport = 1; my $svgSupport = 1; my $svgAnimationSupport = 1; my $svgFiltersSupport = 0; my $svgForeignObjectSupport = 1; my $svgUseSupport = 1; my $svgFontsSupport = 1; my $svgAsImageSupport = 1; my $xpathSupport = 1; my $xsltSupport = 1; my $wmlSupport = 0; my $coverageSupport = 0; my $videoSupport = (isAppleWebKit() || isGtk()); # Enable by default for Apple's builds and Gtk+ my $workersSupport = (isAppleWebKit() || isGtk()); # Enable by default for Apple's builds (mac/win) and Gtk+ my $geolocationSupport = (isAppleMacWebKit() && !isTiger() && !isLeopard()); my $showHelp = 0; my $clean = 0; my $threeDRenderingSupport = 0; my $programName = basename($0); my $usage = < \$threeDRenderingSupport, 'channel-messaging!' => \$channelMessagingSupport, 'database!' => \$databaseSupport, 'dom-storage!' => \$domStorageSupport, 'gnomekeyring!' => \$gnomeKeyringSupport, 'icon-database!' => \$iconDatabaseSupport, 'offline-web-applications!' => \$offlineWebApplicationSupport, 'svg!' => \$svgSupport, 'svg-animation!' => \$svgAnimationSupport, 'svg-filters!' => \$svgFiltersSupport, 'svg-foreign-object!' => \$svgForeignObjectSupport, 'svg-fonts!' => \$svgFontsSupport, 'svg-as-image!' => \$svgAsImageSupport, 'svg-use!' => \$svgUseSupport, 'xpath!' => \$xpathSupport, 'xslt!' => \$xsltSupport, 'wml!' => \$wmlSupport, 'video!' => \$videoSupport, 'workers!' => \$workersSupport, 'geolocation!' => \$geolocationSupport, 'coverage!' => \$coverageSupport, 'help' => \$showHelp, 'clean' => \$clean); if ($showHelp) { print STDERR $usage; exit 1; } checkRequiredSystemConfig(); setConfiguration(); chdirWebKit(); if (isWx()) { $ENV{"WEBKITOUTPUTDIR"} = productDir(); my @opts = getWxArgs(); if ($clean) { push(@opts, "clean"); } system "WebKitTools/wx/build-wxwebkit @opts"; exit exitStatus($?); } my $productDir = productDir(); my @overrideFeatureDefinesOption = (); # This needs to be kept sorted, and in sync with FEATURE_DEFINES in JavaScriptCore.xcconfig, WebCore.xcconfig # and WebKit.xcconfig to prevent needless rebuilding when using both Xcode and build-webkit. push @overrideFeatureDefinesOption, "ENABLE_3D_RENDERING" if $threeDRenderingSupport; push @overrideFeatureDefinesOption, "ENABLE_CHANNEL_MESSAGING" if $channelMessagingSupport; push @overrideFeatureDefinesOption, "ENABLE_DATABASE" if $databaseSupport; push @overrideFeatureDefinesOption, "ENABLE_DOM_STORAGE" if $domStorageSupport; push @overrideFeatureDefinesOption, "ENABLE_ICONDATABASE" if $iconDatabaseSupport; push @overrideFeatureDefinesOption, "ENABLE_OFFLINE_WEB_APPLICATIONS" if $offlineWebApplicationSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG" if $svgSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG_ANIMATION" if $svgAnimationSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG_AS_IMAGE" if $svgAsImageSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG_FILTERS" if $svgFiltersSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG_FONTS" if $svgFontsSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG_FOREIGN_OBJECT" if $svgForeignObjectSupport; push @overrideFeatureDefinesOption, "ENABLE_SVG_USE" if $svgUseSupport; push @overrideFeatureDefinesOption, "ENABLE_VIDEO" if $videoSupport; push @overrideFeatureDefinesOption, "ENABLE_WORKERS" if $workersSupport; push @overrideFeatureDefinesOption, "ENABLE_XPATH" if $xpathSupport; push @overrideFeatureDefinesOption, "ENABLE_XSLT" if $xsltSupport; push @overrideFeatureDefinesOption, "ENABLE_WML" if $wmlSupport; push @overrideFeatureDefinesOption, "ENABLE_GEOLOCATION" if $geolocationSupport; my $overrideFeatureDefinesString = "FEATURE_DEFINES=" . join(" ", @overrideFeatureDefinesOption); my @coverageSupportOption = ($coverageSupport) ? XcodeCoverageSupportOptions() : (); # Check that all the project directories are there. my @projects = ("JavaScriptCore", "WebCore", "WebKit"); # Only Apple builds JavaScriptGlue, and only on the Mac push @projects, "JavaScriptGlue" if isAppleMacWebKit(); my @otherDirs = ("WebKitLibraries"); for my $dir (@projects, @otherDirs) { if (! -d $dir) { die "Error: No $dir directory found. Please do a fresh checkout.\n"; } } my @options = (); # enable autotool options accordingly if (isGtk()) { push @options, autotoolsFlag($databaseSupport, "database"); push @options, autotoolsFlag($domStorageSupport, "dom-storage"); push @options, autotoolsFlag($gnomeKeyringSupport, "gnomekeyring"); push @options, autotoolsFlag($iconDatabaseSupport, "icon-database"); push @options, autotoolsFlag($offlineWebApplicationSupport, "offline-web-applications"); push @options, autotoolsFlag($threeDRenderingSupport, "3D-rendering"); push @options, autotoolsFlag($channelMessagingSupport, "channel-messaging"); push @options, autotoolsFlag($svgSupport, "svg"); push @options, autotoolsFlag($svgAnimationSupport, "svg-animation"); push @options, autotoolsFlag($svgFiltersSupport, "svg-filters"); push @options, autotoolsFlag($svgForeignObjectSupport, "svg-foreign-object"); push @options, autotoolsFlag($svgFontsSupport, "svg-fonts"); push @options, autotoolsFlag($svgAsImageSupport, "svg-as-image"); push @options, autotoolsFlag($svgUseSupport, "svg-use-element"); push @options, autotoolsFlag($xpathSupport, "xpath"); push @options, autotoolsFlag($xsltSupport, "xslt"); push @options, autotoolsFlag($wmlSupport, "wml"); push @options, autotoolsFlag($videoSupport, "video"); push @options, autotoolsFlag($workersSupport, "web-workers"); push @options, autotoolsFlag($coverageSupport, "coverage"); } if (isAppleMacWebKit()) { push(@options, XcodeOptions()); # Copy library and header from WebKitLibraries to a findable place in the product directory. my $srcLib = "WebKitLibraries/libWebKitSystemInterfaceTiger.a"; my $lib = "$productDir/libWebKitSystemInterfaceTiger.a"; if (!-e $lib || -M $lib > -M $srcLib) { print "Updating $lib\n"; system "ditto", $srcLib, $lib; system "ranlib", $lib; } $srcLib = "WebKitLibraries/libWebKitSystemInterfaceLeopard.a"; $lib = "$productDir/libWebKitSystemInterfaceLeopard.a"; if (!-e $lib || -M $lib > -M $srcLib) { print "Updating $lib\n"; system "ditto", $srcLib, $lib; system "ranlib", $lib; } my $srcHeader = "WebKitLibraries/WebKitSystemInterface.h"; my $header = "$productDir/usr/local/include/WebKitSystemInterface.h"; if (!-e $header || -M $header > -M $srcHeader) { print "Updating $header\n"; system "mkdir", "-p", "$productDir/usr/local/include"; system "ditto", $srcHeader, $header; } $srcLib = "WebKitLibraries/libWebCoreSQLite3.a"; $lib = "$productDir/libWebCoreSQLite3.a"; if (!-e $lib || -M $lib > -M $srcLib) { print "Updating $lib\n"; system "ditto", $srcLib, $lib; system "ranlib", $lib; } my $srcHeaderDir = "WebKitLibraries/WebCoreSQLite3"; my $headerDir = "$productDir/WebCoreSQLite3"; if (!-e $headerDir || -M $headerDir > -M $srcHeaderDir) { print "Updating $headerDir\n"; system "ditto", $srcHeaderDir, $headerDir; } } if (isAppleWinWebKit()) { # Copy WebKitSupportLibrary to the correct location in WebKitLibraries so it can be found. # Will fail if WebKitSupportLibrary.zip is not in source root. (system("perl WebKitTools/Scripts/update-webkit-support-libs") == 0) or die; } # Force re-link of existing libraries if different than expected removeLibraryDependingOnSVG("WebCore", $svgSupport); # Build, and abort if the build fails. for my $dir (@projects) { chdir $dir or die; my $result = 0; # For Gtk and Qt the WebKit project builds all others if ((isGtk() || isQt()) && $dir ne "WebKit") { chdir ".." or die; next; } if (isGtk()) { $result = buildGtkProject($dir, $clean, @options); } elsif (isQt()) { $result = buildQMakeQtProject($dir, $clean, @ARGV); } elsif (isAppleMacWebKit()) { my @xcodeOptions = (); push(@xcodeOptions, @options); push(@xcodeOptions, $overrideFeatureDefinesString); push(@xcodeOptions, @coverageSupportOption); push(@xcodeOptions, @ARGV); $result = buildXCodeProject($dir, $clean, @xcodeOptions); } elsif (isAppleWinWebKit()) { if ($dir eq "WebKit") { $result = buildVisualStudioProject("win/WebKit.vcproj/WebKit.sln", $clean); } } elsif (isChromium()) { $result = buildSconsProject($dir, $clean); } if (exitStatus($result)) { if (isAppleWinWebKit()) { print "\n\n===== BUILD FAILED ======\n\n"; my $scriptDir = relativeScriptsDir(); print "Please ensure you have run $scriptDir/update-webkit to install depenedencies.\n\n"; my $baseProductDir = baseProductDir(); print "You can view build errors by checking the BuildLog.htm files located at:\n$baseProductDir/obj//.\n"; } exit exitStatus($result); } chdir ".." or die; } # Don't report the "WebKit is now built" message after a clean operation. exit if $clean; # Write out congratulations message. my $launcherPath = launcherPath(); my $launcherName = launcherName(); print "\n"; print "===========================================================\n"; print " WebKit is now built. To run $launcherName with this newly-built\n"; print " code, use the \"$launcherPath\" script.\n"; if ($svgSupport) { print "\n NOTE: WebKit has been built with SVG support enabled.\n"; print " $launcherName will have SVG viewing capabilities.\n"; } if ($svgAnimationSupport or $svgFiltersSupport or $svgForeignObjectSupport or $svgFontsSupport or $svgAsImageSupport or $svgUseSupport) { print " Your build supports the following (optional) SVG features: \n"; print " * Basic SVG animation.\n" if $svgAnimationSupport; print " * SVG filters.\n" if $svgFiltersSupport; print " * SVG foreign object.\n" if $svgForeignObjectSupport; print " * SVG fonts.\n" if $svgFontsSupport; print " * SVG as image.\n" if $svgAsImageSupport; print " * SVG support.\n" if $svgUseSupport; } print "===========================================================\n";