#!/usr/bin/env perl

# Copyright (C) 2007 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.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 INC. OR
# 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 File::Spec;
use FindBin;
use Getopt::Long qw(:config pass_through);
use lib $FindBin::Bin;
use webkitdirs;
use POSIX;

# determine configuration, but default to "Release" instead of last-used configuration to match run-sunspider
setConfiguration("Release");
setConfiguration();
my $configuration = configuration();

my $root;
my $showHelp = 0;
my $suite = "";
my $ubench = 0;
my $v8 = 0;
my $parseonly = 0;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName [options] FILE FILE
  --help        Show this help message
  --root        Path to root tools build
  --suite           Select a specific benchmark suite. The default is sunspider-0.9.1
  --ubench          Use microbenchmark suite instead of regular tests. Same as --suite=ubench
  --v8-suite        Use the V8 benchmark suite. Same as --suite=v8-v4
  --parse-only      Use the parse-only benchmark suite. Same as --suite=parse-only
EOF

GetOptions('root=s' => sub { my ($argName, $value) = @_; setConfigurationProductDir(Cwd::abs_path($value)); $root = $value; },
           'suite=s' => \$suite,
           'ubench' => \$ubench,
           'v8' => \$v8,
           'parse-only' => \$parseonly,
           'help' => \$showHelp);

if ($showHelp) {
   print STDERR $usage;
   exit 1;
}

sub buildJSC
{
    if (!defined($root)){
        chdirWebKit();
        my $buildResult = system currentPerlPath(), "Tools/Scripts/build-jsc", "--" . $configuration;
        if ($buildResult) {
            print STDERR "Compiling jsc failed!\n";
            exit WEXITSTATUS($buildResult);
        }
    }
}

sub setupEnvironmentForExecution($)
{
    my ($productDir) = @_;
    print "Starting sunspider-compare-results with DYLD_FRAMEWORK_PATH set to point to built JavaScriptCore in $productDir.\n";
    $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
    # FIXME: Other platforms may wish to augment this method to use LD_LIBRARY_PATH, etc.
}

sub pathToBuiltJSC($)
{
    my ($productDir) = @_;
    my $jscName = "jsc";
    $jscName .= "_debug" if configuration() eq "Debug_All";
    return "$productDir/$jscName";
}

sub pathToSystemJSC()
{
    my $path = "/System/Library/Frameworks/JavaScriptCore.framework/Resources/jsc";
    if (-f $path) {
        return $path;
    }
    return undef;
}

sub pathToJSC()
{
    my $path = pathToSystemJSC();
    return $path if defined $path;

    buildJSC();

    my $productDir = jscProductDir();

    setupEnvironmentForExecution($productDir);
    return pathToBuiltJSC($productDir);
}

my $jscPath = pathToJSC();
chdirWebKit();
chdir("PerformanceTests/SunSpider");

my @args = ("--shell", $jscPath);
# This code could be removed if we chose to pass extra args to sunspider instead of Xcode
push @args, "--suite=${suite}" if $suite;
push @args, "--ubench" if $ubench;
push @args, "--v8" if $v8;
push @args, "--parse-only" if $parseonly;

@ARGV = map { File::Spec->rel2abs($_) } @ARGV;

exec currentPerlPath(), "./sunspider-compare-results", @args, @ARGV;
