#!/usr/bin/perl -w
# 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 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)
      --device                          Equivalent to --sdk iphoneos.internal
      --ios-simulator                   Equivalent to --sdk iphonesimulator
      --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");

foreach my $framework (@privateFrameworks) {
    print "Copying Private $framework from $productDir ...\n";
    system 'ditto', $productDir . "/$framework.framework/", "$stagingPrivatePath/$framework.framework/";
    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 'ditto', $productDir . "/$framework.framework/", "$stagingPublicPath/$framework.framework/";
    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";
}
