1563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#!/usr/bin/perl -w
2563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
3563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Copyright (C) 2007 Apple Inc. All rights reserved.
4563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Copyright (C) 2007 Eric Seidel <eric@webkit.org>
5563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#
6563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# Redistribution and use in source and binary forms, with or without
7563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# modification, are permitted provided that the following conditions
8563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# are met:
9563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 1. Redistributions of source code must retain the above copyright
10563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#    notice, this list of conditions and the following disclaimer.
11563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# 2. Redistributions in binary form must reproduce the above copyright
12563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#    notice, this list of conditions and the following disclaimer in the
13563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#    documentation and/or other materials provided with the distribution.
14563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark#
15563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
16563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
19563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
23563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
26563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
27563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse strict;
28563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse File::Spec;
29563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse FindBin;
30563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse Getopt::Long qw(:config pass_through);
31563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse lib $FindBin::Bin;
32563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse webkitdirs;
33563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkuse POSIX;
34563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
35563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# determine configuration, but default to "Release" instead of last-used configuration to match run-sunspider
36563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarksetConfiguration("Release");
37563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarksetConfiguration();
38563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy $configuration = configuration();
39563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
40563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy $root;
41563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy $showHelp = 0;
42d0825bca7fe65beaee391d30da42e937db621564Steve Blockmy $suite = "";
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochmy $ubench = 0;
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochmy $v8 = 0;
45d0825bca7fe65beaee391d30da42e937db621564Steve Blockmy $parseonly = 0;
46563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
47563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy $programName = basename($0);
48563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkmy $usage = <<EOF;
49563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkUsage: $programName [options] FILE FILE
50563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  --help        Show this help message
51563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark  --root        Path to root tools build
52d0825bca7fe65beaee391d30da42e937db621564Steve Block  --suite           Select a specific benchmark suite. The default is sunspider-0.9.1
53d0825bca7fe65beaee391d30da42e937db621564Steve Block  --ubench          Use microbenchmark suite instead of regular tests. Same as --suite=ubench
54d0825bca7fe65beaee391d30da42e937db621564Steve Block  --v8-suite        Use the V8 benchmark suite. Same as --suite=v8-v4
55d0825bca7fe65beaee391d30da42e937db621564Steve Block  --parse-only      Use the parse-only benchmark suite. Same as --suite=parse-only
56563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkEOF
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
58a94275402997c11dd2e778633dacf4b7e630a35dBen MurdochGetOptions('root=s' => sub { my ($argName, $value) = @_; setConfigurationProductDir(Cwd::abs_path($value)); $root = $value; },
59d0825bca7fe65beaee391d30da42e937db621564Steve Block           'suite=s' => \$suite,
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch           'ubench' => \$ubench,
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch           'v8' => \$v8,
62d0825bca7fe65beaee391d30da42e937db621564Steve Block           'parse-only' => \$parseonly,
63563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark           'help' => \$showHelp);
64563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
65563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkif ($showHelp) {
66563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark   print STDERR $usage;
67563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark   exit 1;
68563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
69563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
70563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub buildJSC
71563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
72563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (!defined($root)){
73563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        chdirWebKit();
74f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        my $buildResult = system currentPerlPath(), "Tools/Scripts/build-jsc", "--" . $configuration;
75563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if ($buildResult) {
76563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            print STDERR "Compiling jsc failed!\n";
77563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            exit WEXITSTATUS($buildResult);
78563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
79563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
80563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
82563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarksub setupEnvironmentForExecution($)
83563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
84563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    my ($productDir) = @_;
85563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    print "Starting sunspider-compare-results with DYLD_FRAMEWORK_PATH set to point to built JavaScriptCore in $productDir.\n";
86563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    $ENV{DYLD_FRAMEWORK_PATH} = $productDir;
87563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    # FIXME: Other platforms may wish to augment this method to use LD_LIBRARY_PATH, etc.
88563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
89563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochsub pathToBuiltJSC($)
91563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark{
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    my ($productDir) = @_;
93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    my $jscName = "jsc";
944576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    $jscName .= "_debug" if configurationForVisualStudio() eq "Debug_All";
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return "$productDir/$jscName";
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark}
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochsub pathToSystemJSC()
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    my $path = "/System/Library/Frameworks/JavaScriptCore.framework/Resources/jsc";
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (-f $path) {
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        return $path;
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return undef;
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochsub pathToJSC()
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    my $path = pathToSystemJSC();
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return $path if defined $path;
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    buildJSC();
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
114cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    my $productDir = jscProductDir();
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    setupEnvironmentForExecution($productDir);
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return pathToBuiltJSC($productDir);
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochmy $jscPath = pathToJSC();
121563af33bc48281d19dce701398dbb88cb54fd7ecCary ClarkchdirWebKit();
122cad810f21b803229eb11403f9209855525a25d57Steve Blockchdir("PerformanceTests/SunSpider");
123563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochmy @args = ("--shell", $jscPath);
125563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark# This code could be removed if we chose to pass extra args to sunspider instead of Xcode
126d0825bca7fe65beaee391d30da42e937db621564Steve Blockpush @args, "--suite=${suite}" if $suite;
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpush @args, "--ubench" if $ubench;
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpush @args, "--v8" if $v8;
129d0825bca7fe65beaee391d30da42e937db621564Steve Blockpush @args, "--parse-only" if $parseonly;
130563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
131cad810f21b803229eb11403f9209855525a25d57Steve Block@ARGV = map { File::Spec->rel2abs($_) } @ARGV;
132cad810f21b803229eb11403f9209855525a25d57Steve Block
133231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockexec currentPerlPath(), "./sunspider-compare-results", @args, @ARGV;
134