#!/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::Basename;
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 build directory for the chosen platform and SDK.

    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)
      --tvos-device                     Use "appletvos.internal" SDK if installed, else "appletvos" SDK (tvOS only)
      --watchos-device                  Use "watchos.internal" SDK if installed, else "watchos" SDK (watchOS 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 WebGPU WebKitLegacy);
my @publicFrameworks = qw(JavaScriptCore WebKit);
my @extensions = qw(GPUExtension NetworkingExtension WebContentCaptivePortalExtension WebContentEnhancedSecurityExtension WebContentExtension);
my $packagedRootBasePath = usesCryptexPath() ? "/System/Cryptexes/OS/" : "/";
$packagedRootBasePath = "$packagedRootBasePath" . "System/iOSSupport/" if isMacCatalystWebKit();
my $privateInstallPath = "$packagedRootBasePath" . "System/Library/PrivateFrameworks";
my $publicInstallPath = "$packagedRootBasePath" . "System/Library/Frameworks";
my $extensionsInstallPath = "/System/Library/ExtensionKit/Extensions";

my $configuration = configuration();
my $platform = xcodeSDKPlatformName();
my $productDir = productDir();
my $stagingRoot = tempdir(CLEANUP => 1);
my $stagingPrivatePath = "$stagingRoot$privateInstallPath";
my $stagingPublicPath = "$stagingRoot$publicInstallPath";
my $stagingExtensionsPath = "$stagingRoot$extensionsInstallPath";
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;
system 'mkdir', '-p', $stagingExtensionsPath;

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 $?;
}

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

system 'ditto', "$productDir/usr", "$stagingRoot" . "$packagedRootBasePath" . "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";
}
