#!/usr/bin/perl -w

# Copyright (C) 2005 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.

use strict;
use FindBin;
use lib $FindBin::Bin;
use webkitdirs;

my $programName = basename($0);
my $usage = <<EOF;
Usage: $programName [options]
  --32-bit                Set the default architecture to 32-bit
  --64-bit                Set the default architecture to 64-bit
  --debug                 Set the default configuration to debug
  --release               Set the default configuration to release
  --reset                 Reset configurations
EOF

my $configuration = passedConfiguration();
my $architecture = passedArchitecture();

if (!$architecture) {
    # Handle --64-bit explicitly here, as we don't want our other scripts to accept it
    for my $i (0 .. $#ARGV) {
        my $opt = $ARGV[$i];
        if ($opt =~ /^--64-bit$/i) {
            splice(@ARGV, $i, 1);
            $architecture = 'x86_64';
        }
    }
}

my $baseProductDir = baseProductDir();
system "mkdir", "-p", "$baseProductDir";

if (checkForArgumentAndRemoveFromARGV("--reset")) {
    unlink "$baseProductDir/Configuration";
    unlink "$baseProductDir/Architecture";
    exit 0;
}

if (!$configuration && !$architecture) {
    print STDERR $usage;
    exit 1;
}

if ($configuration) {
    open CONFIGURATION, ">", "$baseProductDir/Configuration" or die;
    print CONFIGURATION $configuration;
    close CONFIGURATION;
}

if ($architecture) {
    if ($architecture ne "x86_64") {
        open ARCHITECTURE, ">", "$baseProductDir/Architecture" or die;
        print ARCHITECTURE $architecture;
        close ARCHITECTURE;
    } else {
        unlink "$baseProductDir/Architecture";
    }
}
