| #!/usr/bin/perl -w | |
| # Copyright (C) 2005, 2013 Apple Inc. All rights reserved. | |
| # Copyright (C) 2007 Eric Seidel <eric@webkit.org> | |
| # | |
| # 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 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. | |
| use strict; | |
| use FindBin; | |
| use Getopt::Long qw(:config pass_through); | |
| use lib $FindBin::Bin; | |
| use webkitdirs; | |
| use webkitperl::FeatureList qw(getFeatureOptionList); | |
| use POSIX; | |
| sub cMakeArgsFromFeatures(); | |
| sub writeCongrats(); | |
| prohibitUnknownPort(); | |
| my $shouldRunStaticAnalyzer = 0; | |
| my $minimal = 0; | |
| my $coverageSupport = 0; | |
| my $showHelp = 0; | |
| my $ftlJIT = int(isAppleMacWebKit() && !willUseIOSSimulatorSDK() || isX86_64() && (isGtk() || isEfl() || isJSCOnly())); | |
| my $forceCLoop = 0; | |
| my $cli = 0; | |
| my $makeArgs = ""; | |
| my @cmakeArgs; | |
| my $copyLibraries = 1; | |
| my $startTime = time(); | |
| my @features = getFeatureOptionList(); | |
| # Initialize values from defaults | |
| foreach (@ARGV) { | |
| if ($_ eq '--minimal') { | |
| $minimal = 1; | |
| } | |
| } | |
| # Initialize values from defaults | |
| foreach (@features) { | |
| ${$_->{value}} = ($minimal ? 0 : $_->{default}); | |
| } | |
| # Additional environment parameters | |
| push @ARGV, split(/ /, $ENV{'BUILD_JSC_ARGS'}) if ($ENV{'BUILD_JSC_ARGS'}); | |
| my $programName = basename($0); | |
| my $usage = <<EOF; | |
| Usage: $programName [options] [options to pass to build system] | |
| --help Show this help message | |
| --[no-]analyze Toggle code static analysis (default: $shouldRunStaticAnalyzer) | |
| --[no-]coverage Toggle code coverage support (default: $coverageSupport) | |
| --[no-]ftl-jit Toggle FTL JIT support (default: $ftlJIT) | |
| --[no-]copy-libraries Toggle whether to copy libraries (default: $copyLibraries) | |
| --cloop Use C Loop interpreter (default: $forceCLoop) | |
| --cli Build the new jsc command line interface (default: $cli) | |
| --makeargs=<arguments> Optional Makefile flags | |
| --cmakeargs=<arguments> One or more optional CMake flags (e.g. --cmakeargs="-DFOO=bar -DCMAKE_PREFIX_PATH=/usr/local") | |
| EOF | |
| my %options = ( | |
| 'analyze!' => \$shouldRunStaticAnalyzer, | |
| 'coverage!' => \$coverageSupport, | |
| 'help' => \$showHelp, | |
| 'ftl-jit!' => \$ftlJIT, | |
| 'cloop!' => \$forceCLoop, | |
| 'cli!' => \$cli, | |
| 'copy-libraries!' => \$copyLibraries, | |
| 'makeargs=s' => \$makeArgs, | |
| 'cmakeargs=s' => \@cmakeArgs | |
| ); | |
| foreach (@features) { | |
| if ($_->{javascript}) { | |
| my $opt = sprintf("%-35s", " --[no-]$_->{option}"); | |
| $usage .= "$opt $_->{desc} (default: $_->{default})\n"; | |
| $options{"$_->{option}!"} = $_->{value}; | |
| } | |
| } | |
| GetOptions(%options); | |
| if ($showHelp) { | |
| print STDERR $usage; | |
| exit 1; | |
| } | |
| if (isAppleWinWebKit()) { | |
| $ftlJIT = 0; | |
| } | |
| checkRequiredSystemConfig(); | |
| setConfiguration(); | |
| chdirWebKit(); | |
| my @options = XcodeOptions(); | |
| my @additionalSupportOptions = (); | |
| push @additionalSupportOptions, XcodeCoverageSupportOptions() if $coverageSupport; | |
| push @additionalSupportOptions, XcodeStaticAnalyzerOption() if $shouldRunStaticAnalyzer; | |
| if ($forceCLoop) { | |
| $ftlJIT = 0; | |
| } | |
| if (isCMakeBuild()) { | |
| push @cmakeArgs, $forceCLoop ? " -DENABLE_JIT=OFF" : " -DENABLE_JIT=ON"; | |
| push @cmakeArgs, $ftlJIT ? " -DENABLE_FTL_JIT=ON" : " -DENABLE_FTL_JIT=OFF"; | |
| my @featureArgs = cMakeArgsFromFeatures(); | |
| my $buildTarget = ""; | |
| unless (isAnyWindows()) { | |
| # By default we build using all of the available CPUs | |
| $makeArgs .= ($makeArgs ? " " : "") . "-j" . numberOfCPUs() if $makeArgs !~ /-j\s*\d+/; | |
| $buildTarget = "jsc testb3 testair testWASM $makeArgs"; | |
| } elsif (canUseNinja()) { | |
| $buildTarget .= "jsc testapi"; | |
| } | |
| # This call only returns if nothing wrong happened | |
| buildCMakeProjectOrExit(0, undef, $buildTarget, (cmakeBasedPortArguments(), @featureArgs, @cmakeArgs)); | |
| writeCongrats(); | |
| exit exitStatus(0); | |
| } | |
| if (isAppleMacWebKit()) { | |
| push @options, ($forceCLoop ? "ENABLE_JIT=ENABLE_JIT=0" : "ENABLE_JIT=ENABLE_JIT"); | |
| push @options, ($ftlJIT ? "ENABLE_FTL_JIT=ENABLE_FTL_JIT" : "ENABLE_FTL_JIT=ENABLE_FTL_JIT=0"); | |
| sub option($$$) | |
| { | |
| my ($feature, $isEnabled, $defaultValue) = @_; | |
| return "" if $defaultValue == $isEnabled; | |
| return $feature . "=" . ($isEnabled ? $feature : ""); | |
| } | |
| foreach (@features) { | |
| if ($_->{javascript}) { | |
| my $option = option($_->{define}, ${$_->{value}}, $_->{default}); | |
| push @options, $option unless $option eq ""; | |
| } | |
| } | |
| if ($copyLibraries) { | |
| my @copyLibrariesArgs = ("perl", "Tools/Scripts/copy-webkitlibraries-to-product-directory"); | |
| push @copyLibrariesArgs, "--device" if willUseIOSDeviceSDK(); | |
| push @copyLibrariesArgs, productDir(); | |
| (system(@copyLibrariesArgs) == 0) or die; | |
| } | |
| } | |
| sub buildMyProject | |
| { | |
| my ($projectDirectory, $projectName) = @_; | |
| my $result; | |
| chdir $projectDirectory or die "Can't find $projectName directory to build from"; | |
| if (isAppleMacWebKit()) { | |
| $result = system "sh", "-c", ('xcodebuild -project ' . $projectName . '.xcodeproj "$@" | grep -v setenv && exit ${PIPESTATUS[0]}'), "xcodebuild", @options, @ARGV, @additionalSupportOptions; | |
| } elsif (isAppleWinWebKit() || isWinCairo()) { | |
| # WTF is a part of JavaScriptCore.sln because jsc.exe wouldn't start otherwise. | |
| if ($projectName ne "WTF") { | |
| $result = buildVisualStudioProject("$projectName.vcxproj/$projectName.sln"); | |
| } | |
| } elsif (isGtk()) { | |
| checkForArgumentAndRemoveFromARGV("--gtk"); | |
| $result = buildGtkProject($projectName, 0); | |
| } else { | |
| die "Building not defined for this platform!\n"; | |
| } | |
| exit exitStatus($result) if exitStatus($result); | |
| chdirWebKit(); | |
| } | |
| sub cMakeArgsFromFeatures() | |
| { | |
| my @args; | |
| foreach (@features) { | |
| my $featureName = $_->{define}; | |
| if ($featureName) { | |
| my $isEnabled = ${$_->{value}}; | |
| if ($isEnabled != $_->{default}) { | |
| my $featureEnabled = $isEnabled ? "ON" : "OFF"; | |
| push @args, "-D$featureName=$featureEnabled"; | |
| } | |
| } | |
| } | |
| return @args; | |
| } | |
| sub writeCongrats() | |
| { | |
| my $endTime = time(); | |
| my $buildTime = formatBuildTime($endTime - $startTime); | |
| print "\n"; | |
| print "====================================================================\n"; | |
| print " JavaScriptCore is now built ($buildTime). \n"; | |
| print "====================================================================\n"; | |
| } | |
| if (!isAppleWinWebKit() && !isWinCairo()) { | |
| buildMyProject("Source/bmalloc", "bmalloc"); | |
| } | |
| buildMyProject("Source/WTF", "WTF"); | |
| buildMyProject("Source/JavaScriptCore", "JavaScriptCore"); | |
| if (isAppleMacWebKit() && $cli) { | |
| buildMyProject("Tools/jsc-cli", "jsc-cli"); | |
| } |