#!/usr/bin/env perl

# Copyright (C) 2010 Google Inc. All rights reserved.
# Copyright (C) 2013, 2015 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. 
# 3.  Neither the name of Apple Inc. ("Apple") nor the names of
#     its contributors may be used to endorse or promote products derived
#     from this software without specific prior written permission. 
#
# THIS SOFTWARE IS PROVIDED BY APPLE 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 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.

# A script to expose WebKit's build directory detection logic to non-perl scripts.

use warnings;
use FindBin;
use Getopt::Long;

use lib $FindBin::Bin;
use webkitdirs;

my $showConfigurationDirectory = 0;
my $showExecutablePath = 0;
my $showHelp = 0;
my $showTopLevelDirectory = 0;


my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName [options]
  --configuration       Show the build directory for a specific configuration (e.g. Debug, Release.  Defaults to the active configuration set by set-webkit-configuration)
  --executablePath      Show the path to the executables produced by a specific build configuration. This differs from --configuration on Windows.
  -h|--help             Show this help message
  --top-level           Show the top-level build directory

  --gtk                 Find the build directory for the GTK+ port
  --wincairo            Find the build directory for using Cairo (rather than CoreGraphics) on Windows

Either --configuration or --top-level is required.
EOF

setConfiguration(); # Figure out from the command line if we're --debug or --release or the default.

# FIXME: Check if extra flags are valid or not.
Getopt::Long::Configure('pass_through'); # Let --blackberry, etc... be handled by webkitdirs
my $getOptionsResult = GetOptions(
    'configuration' => \$showConfigurationDirectory,
    'executablePath' => \$showExecutablePath,
    'top-level' => \$showTopLevelDirectory,
    'help|h' => \$showHelp,
);

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

if (!$showConfigurationDirectory && !$showTopLevelDirectory && !$showExecutablePath) {
    print baseProductDir() . "\n";
    print productDir() . "\n";
} elsif ($showTopLevelDirectory) {
    print baseProductDir() . "\n";
} elsif ($showExecutablePath) {
    print executableProductDir() . "\n";
} else {
    print productDir() . "\n";
}
