#!/usr/bin/env perl
# Copyright (C) 2005, 2006, 2007, 2008, 2009 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 warnings;
use English;
use File::Copy qw/ move /;
use File::Temp qw/ tempdir tempfile /;
use FindBin;
use Getopt::Long qw(:config pass_through);
use lib $FindBin::Bin;
use webkitdirs;

chdirWebKit();

my $showHelp = 0;

my $programName = basename($0);

sub usage()
{
    my $usage = <<EOF;
    Bundles up products created with build-webkit into a zip suitable for sharing as a root.
    The archive is created in the top level webkit directory.

    Usage: $programName [configuration options]
      --help                            Show this help message
      --sdk                             Specifies SDK for which the roots are staged
                                        (Default: currently installed Base SDK)
      --ios-device                      Use "iphoneos.internal" SDK if installed, else "iphoneos" SDK (iOS only)
      --device                          DEPRECATED alias of --ios-device
      --ios-simulator                   Use "iphonesimulator.internal" SDK if installed, else "iphonesimulator" SDK (iOS only)
      --simulator                       DEPRECATED alias of --ios-simulator
      --debug                           Package roots from Debug-<platform>
      --release                         Package roots from Release-<platform>

EOF

    print $usage;
    exit 0;
}

my %options = (
    'help' => \$showHelp,
);

usage() if not @ARGV or not GetOptions(
    'help' => \$showHelp,
);
usage() if $showHelp;

setConfiguration();

my @privateFrameworks = qw(WebCore WebKitLegacy WebKit2);
my @publicFrameworks = qw(JavaScriptCore WebKit);
my $privateInstallPath = "/System/Library/PrivateFrameworks";
my $publicInstallPath = "/System/Library/Frameworks";

my $configuration = configuration();
my $platform = xcodeSDKPlatformName();
my $productDir = productDir();
my $stagingRoot = tempdir(CLEANUP => 1);
my $stagingPrivatePath = "$stagingRoot$privateInstallPath";
my $stagingPublicPath = "$stagingRoot$publicInstallPath";
my $archiveName = "webkit-$configuration-$platform";
my $archivePath = "$productDir/$archiveName.tar.gz";
my ($fh, $tempArchiveName) = tempfile( "/tmp/$archiveName-XXXXXXX");

system 'mkdir', '-p', $stagingPrivatePath;
system 'mkdir', '-p', $stagingPublicPath;

foreach my $framework (@privateFrameworks) {
    print "Copying Private $framework from $productDir ...\n";
    system 'cp', '-LpR', $productDir . "/$framework.framework", "$stagingPrivatePath/";
    die "Check to see that you have built $framework for $configuration-$platform" if $? and $framework ne 'WebKit2';
}

foreach my $framework (@publicFrameworks) {
    print "Copying Public $framework from $productDir ...\n";
    system 'cp', '-LpR', $productDir . "/$framework.framework", "$stagingPublicPath/";
    die "Check to see that you have built $framework for $configuration-$platform" if $?;
}

system 'ditto', "$productDir/usr", "$stagingRoot/usr";

chdir $stagingRoot;
print "Creating compressed archive ...\n";
system 'ditto', '-cz', $stagingRoot, $tempArchiveName;

chdirWebKit();
my $moved = move($tempArchiveName, $archivePath);

if ($moved) {
    print "Your root is: $archivePath\n";
} else {
    print "Couldn't move temporary archive $tempArchiveName to $archivePath\n";
}
