#!/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");
}
