| #!/usr/bin/env perl |
| |
| # Copyright (C) 2005-2022 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 warnings; |
| use FindBin; |
| use Getopt::Long qw(:config pass_through); |
| use lib $FindBin::Bin; |
| use webkitdirs; |
| use webkitperl::FeatureList qw(getFeatureOptionList); |
| use POSIX; |
| use Text::ParseWords; |
| |
| sub writeCongrats; |
| |
| prohibitUnknownPort(); |
| |
| if (shouldUseFlatpak()) { |
| print "Building flatpak based environment\n"; |
| my @command = (File::Spec->catfile(sourceDir(), "Tools", "Scripts", "build-jsc")); |
| runInFlatpak(@command); |
| } |
| |
| |
| my $shouldRunStaticAnalyzer = 0; |
| my $minimal = 0; |
| my $coverageSupport = 0; |
| my $showHelp = 0; |
| my $ftlJIT = int(isAppleCocoaWebKit() && !willUseIOSSimulatorSDK() || ((isARM64() || isX86_64()) && (isGtk() || isJSCOnly()))); |
| my $forceCLoop = 0; |
| my $makeArgs = ""; |
| my @cmakeArgs; |
| my $buildDir = ""; |
| my $startTime = time(); |
| my $useCCache = -1; |
| my $exportCompileCommands = 0; |
| |
| 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, parse_line('\s+', 0, $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) |
| --cloop Use C Loop interpreter (default: $forceCLoop) |
| --makeargs=<arguments> Optional Makefile flags |
| --cmakeargs=<arguments> One or more optional CMake flags (e.g. --cmakeargs="-DFOO=bar -DCMAKE_PREFIX_PATH=/usr/local") |
| --build-dir=<path> Build out of tree in directory at <path> |
| |
| --[no-]use-ccache Enable (or disable) CCache, if available |
| --export-compile-commands Generate compile_commands.json (Apple platforms only) |
| EOF |
| |
| my %options = ( |
| 'analyze!' => \$shouldRunStaticAnalyzer, |
| 'coverage!' => \$coverageSupport, |
| 'help' => \$showHelp, |
| 'ftl-jit!' => \$ftlJIT, |
| 'cloop!' => \$forceCLoop, |
| 'makeargs=s' => \$makeArgs, |
| 'cmakeargs=s' => \@cmakeArgs, |
| 'build-dir=s' => \$buildDir, |
| 'use-ccache!' => \$useCCache, |
| 'export-compile-commands' => \$exportCompileCommands |
| ); |
| |
| 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 (isAnyWindows()) { |
| $ftlJIT = 0; |
| } |
| |
| if ($buildDir && !isCMakeBuild()) { |
| print STDERR "--build-dir is currently only supported for cmake builds"; |
| exit 1; |
| } |
| |
| if (isWinCairo() || (isJSCOnly() && isWindows())) { |
| (system("python Tools/Scripts/update-webkit-wincairo-libs.py") == 0) or die; |
| } |
| |
| if ($useCCache == 1) { |
| $ENV{'WK_USE_CCACHE'} = "YES"; |
| } elsif ($useCCache == 0) { |
| $ENV{'WK_USE_CCACHE'} = "NO"; |
| } |
| |
| $ENV{'EXPORT_COMPILE_COMMANDS'} = "YES" if $exportCompileCommands; |
| |
| checkRequiredSystemConfig(); |
| setConfiguration(); |
| chdirWebKit(); |
| my @options = XcodeOptions(); |
| my @additionalSupportOptions = (); |
| push @additionalSupportOptions, XcodeCoverageSupportOptions() if $coverageSupport; |
| push @additionalSupportOptions, XcodeStaticAnalyzerOption() if $shouldRunStaticAnalyzer; |
| |
| if ($forceCLoop) { |
| $ftlJIT = 0; |
| } |
| |
| if (isCMakeBuild()) { |
| if (scalar(@ARGV) > 0) { |
| foreach (@ARGV) { |
| my $arg = $_; |
| if ($arg =~ /^-.*/) { |
| print STDERR "Unrecognized option `$arg'\n"; |
| } else { |
| print STDERR "Stray anonymous argument `$arg'\n"; |
| } |
| } |
| exit 2; |
| } |
| if ($forceCLoop) { |
| push @cmakeArgs, " -DENABLE_JIT=OFF"; |
| push @cmakeArgs, " -DENABLE_C_LOOP=ON"; |
| } |
| push @cmakeArgs, $ftlJIT ? " -DENABLE_FTL_JIT=ON" : " -DENABLE_FTL_JIT=OFF"; |
| if ($buildDir) { |
| push @cmakeArgs, " " . sourceDir(); |
| setBaseProductDir($buildDir); |
| } |
| |
| my @featureArgs = cmakeArgsFromFeatures(@features); |
| |
| 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 testapi testmasm testdfg $makeArgs"; |
| } elsif (canUseNinja()) { |
| $buildTarget .= "jsc testapi testmasm"; |
| } |
| |
| # This call only returns if nothing wrong happened |
| buildCMakeProjectOrExit(0, undef, $buildTarget, @featureArgs, @cmakeArgs); |
| writeCongrats(); |
| exit exitStatus(0); |
| } |
| |
| if (isAppleCocoaWebKit()) { |
| push @options, ($forceCLoop ? "ENABLE_JIT=ENABLE_JIT=0" : "ENABLE_JIT=ENABLE_JIT"); |
| push @options, ($forceCLoop ? "ENABLE_C_LOOP=ENABLE_C_LOOP" : "ENABLE_C_LOOP=ENABLE_C_LOOP=0"); |
| 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 ""; |
| } |
| } |
| } |
| |
| sub buildMyProject |
| { |
| my ($projectDirectory, $projectName) = @_; |
| my $result; |
| chdir $projectDirectory or die "Can't find $projectName directory to build from"; |
| if (isAppleCocoaWebKit()) { |
| my $compilerFlags = 'GCC_PREPROCESSOR_ADDITIONS="'; |
| if ($forceCLoop) { |
| $compilerFlags .= "ENABLE_JIT=0 ENABLE_C_LOOP=1"; |
| } |
| $compilerFlags .= '"'; |
| |
| my $extraCommands = ""; |
| foreach (@ARGV) { |
| # Ensure that if somebody passes in a flag like `ARCHS="i386 x86_64"` we |
| # maintain the quotes around "i386 x86_64". |
| my $arg = $_; |
| if ($arg =~ m/=/) { |
| $arg =~ s/=/="/; |
| $arg = $arg . "\""; |
| } |
| $extraCommands .= " " . $arg; |
| } |
| |
| my $command = "make " . (lc configuration()) . " " . $compilerFlags . " " . $extraCommands; |
| |
| print "\n"; |
| print "building ", $projectName, "\n"; |
| print "running build command '", $command, "' in ", $projectDirectory, "\n\n"; |
| |
| $result = system $command; |
| } else { |
| die "Building not defined for this platform!\n"; |
| } |
| exit exitStatus($result) if exitStatus($result); |
| chdirWebKit(); |
| } |
| |
| sub writeCongrats |
| { |
| my ($projectName) = @_; |
| my $endTime = time(); |
| my $buildTime = formatBuildTime($endTime - $startTime); |
| |
| print "\n"; |
| print "====================================================================\n"; |
| print " " . $projectName . " is now built ($buildTime). \n"; |
| print "====================================================================\n"; |
| } |
| |
| 1; |