1#!/usr/bin/perl -w
2
3# Copyright (C) 2007 Apple Inc. All rights reserved.
4# Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
26
27use strict;
28use File::Spec;
29use FindBin;
30use Getopt::Long qw(:config pass_through);
31use lib $FindBin::Bin;
32use webkitdirs;
33use POSIX;
34
35# determine configuration, but default to "Release" instead of last-used configuration to match run-sunspider
36setConfiguration("Release");
37setConfiguration();
38my $configuration = configuration();
39
40my $root;
41my $showHelp = 0;
42my $suite = "";
43my $ubench = 0;
44my $v8 = 0;
45my $parseonly = 0;
46
47my $programName = basename($0);
48my $usage = <<EOF;
49Usage: $programName [options] FILE FILE
50  --help        Show this help message
51  --root        Path to root tools build
52  --suite           Select a specific benchmark suite. The default is sunspider-0.9.1
53  --ubench          Use microbenchmark suite instead of regular tests. Same as --suite=ubench
54  --v8-suite        Use the V8 benchmark suite. Same as --suite=v8-v4
55  --parse-only      Use the parse-only benchmark suite. Same as --suite=parse-only
56EOF
57
58GetOptions('root=s' => sub { my ($argName, $value) = @_; setConfigurationProductDir(Cwd::abs_path($value)); $root = $value; },
59           'suite=s' => \$suite,
60           'ubench' => \$ubench,
61           'v8' => \$v8,
62           'parse-only' => \$parseonly,
63           'help' => \$showHelp);
64
65if ($showHelp) {
66   print STDERR $usage;
67   exit 1;
68}
69
70sub buildJSC
71{
72    if (!defined($root)){
73        chdirWebKit();
74        my $buildResult = system currentPerlPath(), "Tools/Scripts/build-jsc", "--" . $configuration;
75        if ($buildResult) {
76            print STDERR "Compiling jsc failed!\n";
77            exit WEXITSTATUS($buildResult);
78        }
79    }
80}
81
82sub setupEnvironmentForExecution($)
83{
84    my ($productDir) = @_;
85    print "Starting sunspider-compare-results with DYLD_FRAMEWORK_PATH set to point to built JavaScriptCore in $productDir.\n";
86    $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
87    # FIXME: Other platforms may wish to augment this method to use LD_LIBRARY_PATH, etc.
88}
89
90sub pathToBuiltJSC($)
91{
92    my ($productDir) = @_;
93    my $jscName = "jsc";
94    $jscName .= "_debug" if configurationForVisualStudio() eq "Debug_All";
95    return "$productDir/$jscName";
96}
97
98sub pathToSystemJSC()
99{
100    my $path = "/System/Library/Frameworks/JavaScriptCore.framework/Resources/jsc";
101    if (-f $path) {
102        return $path;
103    }
104    return undef;
105}
106
107sub pathToJSC()
108{
109    my $path = pathToSystemJSC();
110    return $path if defined $path;
111
112    buildJSC();
113
114    my $productDir = jscProductDir();
115
116    setupEnvironmentForExecution($productDir);
117    return pathToBuiltJSC($productDir);
118}
119
120my $jscPath = pathToJSC();
121chdirWebKit();
122chdir("PerformanceTests/SunSpider");
123
124my @args = ("--shell", $jscPath);
125# This code could be removed if we chose to pass extra args to sunspider instead of Xcode
126push @args, "--suite=${suite}" if $suite;
127push @args, "--ubench" if $ubench;
128push @args, "--v8" if $v8;
129push @args, "--parse-only" if $parseonly;
130
131@ARGV = map { File::Spec->rel2abs($_) } @ARGV;
132
133exec currentPerlPath(), "./sunspider-compare-results", @args, @ARGV;
134