#!/usr/bin/perl -w

# Copyright (C) 2010 Apple Inc. All rights reserved.
#
# 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. 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 INC. 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 File::Basename;
use FindBin;
use Getopt::Long qw(:config pass_through);
use lib $FindBin::Bin;
use webkitdirs;
use POSIX;

my $showHelp = 0;
my $clean = 0;
my $wtfOnly = 0;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName [options] [options to pass to build system]
  --help        Show this help message
  --clean       Clean up the build directory
  --wtf-only    Only build TestWTF and its dependencies
EOF

GetOptions(
    'help' => \$showHelp,
    'clean' => \$clean,
    'wtf-only' => \$wtfOnly,
);

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

checkRequiredSystemConfig();
setConfiguration();
chdirWebKit();

# Build

my $result;
if (isAppleMacWebKit()) {
    chdir "Source/ThirdParty/gtest";
    buildXCodeProject("xcode/gtest", $clean, XcodeOptions(), @ARGV);
    chdir "../../../Tools/TestWebKitAPI" or die;

    my @options = XcodeOptions();
    if ($wtfOnly) {
        push @options, ("-target", "TestWTF");
    }
    $result = buildXCodeProject("TestWebKitAPI", $clean, @options, @ARGV);
} elsif (isAppleWinWebKit()) {
    chdir "Tools/TestWebKitAPI" or die;
    my $solutionPath = "TestWebKitAPI.vcxproj/TestWebKitAPI.sln";
    $result = buildVisualStudioProject($solutionPath, $clean);
} else {
    die "TestWebKitAPI is not supported on this platform.\n";
}

exit exitStatus($result);
