#**************************************************************
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
#**************************************************************

#
# configure.pl - a perl script to set a minimal environment for the SDK.
#
# Copyright 2000, 2010 Oracle and/or its affiliates.
#

use IO::File;
use File::Basename;

$main::hostname= $ARGV[0];
$main::sdkpath= $ARGV[1];
$main::OO_SDK_NAME= $ARGV[2];

$main::OO_MAJORVERSION=$main::OO_SDK_NAME;
$main::OO_MINORVERSION=$main::OO_SDK_NAME;
$main::OO_MAJORVERSION =~ s#[^\d]+(\d).(\d).+#$1#go;
$main::OO_MINORVERSION =~ s#[^\d]+(\d).(\d).+#$2#go;

$main::OO_SDK_CONFIG_HOME= "$ENV{HOME}/$main::OO_SDK_NAME";

$main::operatingSystem = `$main::sdkpath/config.guess | cut -d"-" -f3,4`;
chomp ($main::operatingSystem);

$main::OO_SDK_HOME = $main::sdkpath;
$main::OO_SDK_HOME_SUGGESTION = $main::sdkpath;

$main::OFFICE_HOME = "";

#$main::OFFICE_BASE_HOME = substr($main::sdkpath, 0, rindex($main::sdkpath, "/sdk"));

$main::OO_SDK_MAKE_HOME = "";
$main::makeName = "make";
if ( $main::operatingSystem =~ m/solaris/ || 
	 $main::operatingSystem =~ m/freebsd/ )
{
    $main::makeName = "gmake";
}
$main::OO_SDK_MAKE_HOME_SUGGESTION = searchprog($main::makeName);
$main::makeVersion = "3.79.1";
$main::correctVersion = 0;

$main::OO_SDK_ZIP_HOME = "";
$main::OO_SDK_ZIP_HOME_SUGGESTION = searchprog("zip");
$main::zipVersion = "2.3";

$main::OO_SDK_CAT_HOME = "";
$main::OO_SDK_CAT_HOME_SUGGESTION = searchprog("cat");
# TODO cat version
# $main::catVersion = "";

$main::OO_SDK_SED_HOME = "";
$main::OO_SDK_SED_HOME_SUGGESTION = searchprog("sed");
# TODO sed version
# $main::sedVersion = "";

$main::OO_SDK_CPP_HOME = "";
$main::cppName = "gcc";
$main::cppVersion = "4.0.1";
if ( $main::operatingSystem =~ m/solaris/ )
{
	$main::cppName = "CC";
	$main::cppVersion = "5.2";
}
if ( $main::operatingSystem =~ m/darwin/ )
{
	$main::cppName = "clang";
	$main::cppVersion = "4.2";
}
$main::OO_SDK_CC_55_OR_HIGHER = "";
if ( $main::operatingSystem =~ m/darwin/ )
{
	$clangpath = `xcrun -f clang++`;
	$main::OO_SDK_CPP_HOME_SUGGESTION = substr($clangpath, 0, rindex($clangpath, "/"));
} else {
	$main::OO_SDK_CPP_HOME_SUGGESTION = searchprog($main::cppName);
}

$main::OO_SDK_JAVA_HOME = "";
$main::OO_SDK_JAVA_BIN_DIR = "bin";
if ( $main::operatingSystem =~ m/darwin/ )
{
    $main::OO_SDK_JAVA_BIN_DIR="Commands";
}
$main::OO_SDK_JAVA_HOME_SUGGESTION = searchprog("javac");
$main::javaVersion = "1.5.0_01";

$main::OO_SDK_BOOST_HOME_SUGGESTION = "";
$main::boostVersion = "1.48.0";
$main::skipBoostDir = 0;

$main::SDK_AUTO_DEPLOYMENT = "";
$main::SDK_AUTO_DEPLOYMENT_SUGGESTION = "YES";

$main::OO_SDK_OUTPUT_DIR_SUGGESTION = "$ENV{HOME}";
$main::OO_SDK_OUTPUT_DIR = "";
$main::skipOutputDir = 0;

$main::return = 0;

if ( $main::operatingSystem =~ m/darwin/ )
{
# used for a SDK as part of the office installation
#    $main::OFFICE_HOME = `cd $main::sdkpath/../../.. && pwd`;
#    chomp($main::OFFICE_HOME);
#    print " Used Office = $main::OFFICE_HOME\n";
    print " Used SDK = $main::OO_SDK_HOME\n\n";

    $main::OFFICE_HOME_SUGGESTION = searchMacOffice();
    while ( (! -d "$main::OFFICE_HOME" ) ||
	    ((-d "$main::OFFICE_HOME") && (! -d "$main::OFFICE_HOME/Contents/MacOS")) )
    {
	print " Enter the Office installation directory [$main::OFFICE_HOME_SUGGESTION]: ";
	$main::OFFICE_HOME = readStdIn();
	chop($main::OFFICE_HOME);
	if ( $main::OFFICE_HOME eq "" ) 
	{
	    $main::OFFICE_HOME = $main::OFFICE_HOME_SUGGESTION;
	}
	
	if ( ! -d "$main::OFFICE_HOME" )
	{ 
	    $main::OFFICE_HOME = "";
	    print " Error: An office installation is required, please specify the path to a valid installation.\n";
	} 
	
#	$main::OFFICE_BASE_HOME = "$main::OFFICE_HOME/Contents";
    }
} else 
{
    $main::OFFICE_HOME_SUGGESTION = searchoffice();
    
    if ( $main::OFFICE_HOME_SUGGESTION eq "" ) {
	# prepare Office path
	$main::OFFICE_HOME_SUGGESTION = searchprog("soffice");
    }
    
    if ( ! $main::OFFICE_HOME_SUGGESTION eq "" )
    {
	my $tmpOffice = readlink "$main::OFFICE_HOME_SUGGESTION/soffice";
	
	if ( $tmpOffice eq "" )
	{
	    $tmpOffice = "$main::OFFICE_HOME_SUGGESTION/soffice";
	}
	
	my $offset = rindex($tmpOffice, "/program/soffice");
	if ( $offset != -1 )
	{
	    $main::OFFICE_HOME_SUGGESTION = substr($tmpOffice, 0, $offset);
	} else 
	{
	    $offset = rindex($tmpOffice, "/soffice");
	    if ( $offset != -1 )
	    {
		$main::OFFICE_HOME_SUGGESTION = substr($tmpOffice, 0, $offset);
	    } else
	    {
		$main::OFFICE_HOME_SUGGESTION = "";
	    }
	}
    }
    
    while ( (! -d "$main::OFFICE_HOME" ) ||
	    ((-d "$main::OFFICE_HOME") && (! -d "$main::OFFICE_HOME/program")) )
    {
	print " Enter the Office installation directory [$main::OFFICE_HOME_SUGGESTION]: ";
	$main::OFFICE_HOME = readStdIn();
	chop($main::OFFICE_HOME);
	if ( $main::OFFICE_HOME eq "" ) 
	{
	    $main::OFFICE_HOME = $main::OFFICE_HOME_SUGGESTION;
	}
	
	if ( ! -d "$main::OFFICE_HOME" )
	{ 
	    $main::OFFICE_HOME = "";
	    print " Error: An office installation is required, please specify the path to a valid installation.\n";
	} else
	{
	    # special work for a network installation, no prgram directory but a link to the soffice binary
	    if ( (! -d "$main::OFFICE_HOME/program") && (-e "$main::OFFICE_HOME/soffice") )
	    { 
		my $soserver = `ls -l $OFFICE_HOME_SUGGESTION/soffice | sed -n 's/.* -> //p'`;
		$soserver= substr($soserver, 0, rindex($soserver, "program") - 1);
		
		if ( ! -d $soserver )
		{
		    $main::OFFICE_HOME = "";
		    print " Error: An office installation is required, please specify the path to a valid installation.\n";
		} else 
		{
		    $main::OFFICE_HOME = $soserver;
		}
	    }
	}
    }
}


# prepare GNU make path
while ( (!$main::correctVersion) &&
		((! -d "$main::OO_SDK_MAKE_HOME" ) ||
		 ((-d "$main::OO_SDK_MAKE_HOME") && (! -e "$main::OO_SDK_MAKE_HOME/$main::makeName"))) )
{
    print " Enter GNU make ($main::makeVersion or higher) tools directory [$main::OO_SDK_MAKE_HOME_SUGGESTION]: ";
    $main::OO_SDK_MAKE_HOME = readStdIn();
    chop($main::OO_SDK_MAKE_HOME);
    if ( $main::OO_SDK_MAKE_HOME eq "" ) 
    {
		$main::OO_SDK_MAKE_HOME = $main::OO_SDK_MAKE_HOME_SUGGESTION;
    }
    if ( (! -d "$main::OO_SDK_MAKE_HOME") || 
		 ((-d "$main::OO_SDK_MAKE_HOME") && (! -e "$main::OO_SDK_MAKE_HOME/$main::makeName")) )
    { 
		$main::OO_SDK_MAKE_HOME = "";
		print " Error: GNU make is required, please specify a GNU make tools directory.\n";
    } else 
    {
		#check version
		my $testVersion = `$OO_SDK_MAKE_HOME/$main::makeName --version`;
		if ( $testVersion eq "")
		{
			print " Set the environment variable OO_SDK_MAKE_HOME to your GNU build tools directory.\n";
			print " GNU make version $main::makeVersion can be obtained at ftp://ftp.gnu.org/gnu/make/\n";
		} else 
		{
		    if ($testVersion =~ m#((\d+\.)+\d+)# )
			{
				$testVersion = $1;
			}
			$main::correctVersion = testVersion($main::makeVersion, $testVersion, "$main::OO_SDK_MAKE_HOME/$main::makeName", 1);
			if ( !$main::correctVersion )
			{
				print " The '$main::makeName' command found at '$main::OO_SDK_MAKE_HOME' has a wrong version\n";
				$main::OO_SDK_MAKE_HOME = "";
			}
		}
	}
}

# prepare zip path
$main::correctVersion = 0;
while ( (!$main::correctVersion) &&
		((! -d "$main::OO_SDK_ZIP_HOME" ) ||
		 ((-d "$main::OO_SDK_ZIP_HOME") && (! -e "$main::OO_SDK_ZIP_HOME/zip"))) )
{
    print " Enter zip ($main::zipVersion or higher) tool directory [$main::OO_SDK_ZIP_HOME_SUGGESTION]: ";
    $main::OO_SDK_ZIP_HOME = readStdIn();
    chop($main::OO_SDK_ZIP_HOME);
    if ( $main::OO_SDK_ZIP_HOME eq "" ) 
    {
		$main::OO_SDK_ZIP_HOME = $main::OO_SDK_ZIP_HOME_SUGGESTION;
    }
    if ( (! -d "$main::OO_SDK_ZIP_HOME") || 
		 ((-d "$main::OO_SDK_ZIP_HOME") && (! -e "$main::OO_SDK_ZIP_HOME/zip")) )
    { 
		$main::OO_SDK_ZIP_HOME = "";
		print " Error: zip tool is required, please specify a zip tool directory.\n";
    } else 
    {
		#check version
		my $testVersion = `$OO_SDK_ZIP_HOME/zip -h 2>&1 | egrep Zip | head -n 1`;
		$testVersion =~ s#Zip ([\d.]+) .*#$1#go;
		if ( $testVersion eq "")
		{
			print " Set the environment variable OO_SDK_ZIP_HOME to your zip tool directory.\n";
			print " zip version $main::zipVersion can be obtained at ftp://www.info-zip.org/\n";
		} else 
		{
		    if ($testVersion =~ m#((\d+\.)+\d+)# )
			{
				$testVersion = $1;
			}
			$main::correctVersion = testVersion($main::zipVersion, $testVersion, "$main::OO_SDK_MAKE_HOME/zip", 1);
			if ( !$main::correctVersion )
			{
				print " The 'zip' command found at '$main::OO_SDK_ZIP_HOME' has a wrong version\n";
				$main::OO_SDK_ZIP_HOME = "";
			}
		}
	}
}

# prepare cat path
$main::correctVersion = 0;
while ( (!$main::correctVersion) &&
        ((! -d "$main::OO_SDK_CAT_HOME" ) ||
         ((-d "$main::OO_SDK_CAT_HOME") && (! -e "$main::OO_SDK_CAT_HOME/cat"))) )
{
    print " Enter cat tool directory [$main::OO_SDK_CAT_HOME_SUGGESTION]: ";
    $main::OO_SDK_CAT_HOME = readStdIn();
    chop($main::OO_SDK_CAT_HOME);
    if ( $main::OO_SDK_CAT_HOME eq "" )
    {
        $main::OO_SDK_CAT_HOME = $main::OO_SDK_CAT_HOME_SUGGESTION;
    }
    if ( (! -d "$main::OO_SDK_CAT_HOME") ||
         ((-d "$main::OO_SDK_CAT_HOME") && (! -e "$main::OO_SDK_CAT_HOME/cat")) )
    {
        $main::OO_SDK_CAT_HOME = "";
        print " Error: cat tool is required, please specify a cat tool directory.\n";
    }
    # else ...
    # TODO check version
    # NOTE: only Linux cat understands --version
}

# prepare sed path
$main::correctVersion = 0;
while ( (!$main::correctVersion) &&
        ((! -d "$main::OO_SDK_SED_HOME" ) ||
         ((-d "$main::OO_SDK_SED_HOME") && (! -e "$main::OO_SDK_SED_HOME/sed"))) )
{
    print " Enter sed tool directory [$main::OO_SDK_SED_HOME_SUGGESTION]: ";
    $main::OO_SDK_SED_HOME = readStdIn();
    chop($main::OO_SDK_SED_HOME);
    if ( $main::OO_SDK_SED_HOME eq "" )
    {
        $main::OO_SDK_SED_HOME = $main::OO_SDK_SED_HOME_SUGGESTION;
    }
    if ( (! -d "$main::OO_SDK_SED_HOME") ||
         ((-d "$main::OO_SDK_SED_HOME") && (! -e "$main::OO_SDK_SED_HOME/sed")) )
    {
        $main::OO_SDK_SED_HOME = "";
        print " Error: sed tool is required, please specify a sed tool directory.\n";
    }
    # else ...
    # TODO check version
    # NOTE: only Linux sed understands --version
}

# prepare C++ compiler path
$main::correctVersion = 0;
while ( (!$main::correctVersion) &&
		((! -d "$main::OO_SDK_CPP_HOME" ) ||
		 ((-d "$main::OO_SDK_CPP_HOME") && (! -e "$main::OO_SDK_CPP_HOME/$main::cpp"))) )
{
	print " C++ compilers where for example a language binding exist:\n";
	print "  - Solaris, Sun WorkShop 6 update 1 C++ 5.2 2000/09/11 or higher\n";
	print "  - Linux, GNU C++ compiler, gcc version 4.0.1 or higher\n";
	print "  - MacOS 64bit, Apple LLVM version 4.2 (clang-425.0.28) or higher\n";
	print "    on MacOS auto detected using xcrun -f clang'\n";

	if ( $main::operatingSystem =~ m/darwin/ )
	{
		# xcrun is used to find the correct clang compiler, just print the result as information
		$main::OO_SDK_CPP_HOME = $main::OO_SDK_CPP_HOME_SUGGESTION;
		print " Used clang compiler: $main::OO_SDK_CPP_HOME\n";
	} else 
	{
		print " Enter the directory of the C++ compiler, the directory\n";
		print " where the compiler is located (optional) [$main::OO_SDK_CPP_HOME_SUGGESTION]: ";
	
		$main::OO_SDK_CPP_HOME = readStdIn();
		chop($main::OO_SDK_CPP_HOME);
		if ( $main::OO_SDK_CPP_HOME eq "" ) 
		{
			$main::OO_SDK_CPP_HOME = $main::OO_SDK_CPP_HOME_SUGGESTION;
		}
	}

	if ( (!$main::operatingSystem =~ m/darwin/) && (! $main::OO_SDK_CPP_HOME eq "") ) 
	{
		if ( (! -d "$main::OO_SDK_CPP_HOME") || 
			 ((-d "$main::OO_SDK_CPP_HOME") && (! -e "$main::OO_SDK_CPP_HOME/$main::cppName")) )
		{ 
			print " Error: Could not find directory '$main::OO_SDK_CPP_HOME'.\n";
			if ( skipChoice("C++ compiler") == 1 )
			{
				$main::correctVersion = 1;
			}
			$main::OO_SDK_CPP_HOME = "";
		} else 
		{
			#check version
			if ( $main::cppName eq "gcc" )
			{
				my $testVersion = `$OO_SDK_CPP_HOME/$main::cppName -dumpversion`;
				if ( $testVersion eq "")
				{
					print " The '$main::cppName' command found at $main::OO_SDK_CPP_HOME/$main::cppName is not a ";
					print " GNU compiler.\nSet the environment variable OO_SDK_CPP_HOME to your GNU build tools ";
					print " directory.\nA GNU compiler version $main::cppVersion can be obtained at ";
					print " ftp://ftp.gnu.org/gnu/gcc/\n";
				} else 
				{
					$main::correctVersion = testVersion($main::cppVersion, $testVersion, "$main::OO_SDK_CPP_HOME/$main::cppName", 1);
					if ( !$main::correctVersion )
					{
						print " The '$main::cppName' command found at '$main::OO_SDK_CPP_HOME' has a wrong version\n";
						if ( skipChoice("C++ compiler") == 1 )
						{
							$main::correctVersion = 1;
						}

						$main::OO_SDK_CPP_HOME = "";
					}
				}
			} else
			{
				# for Solaris we have to check the version too
				open(FILE, "$OO_SDK_CPP_HOME/$main::cppName -V 2>&1 |");
				my @lines = <FILE>;
				my $testVersion = $lines[0];
				if ( $testVersion eq "")
				{
					print " The '$main::cppName' command found at $main::OO_SDK_CPP_HOME/$main::cppName is not a ";
					print " Solaris C++ compiler.\nSet the environment variable OO_SDK_CPP_HOME to your Solaris C++ compiler directory.\n";
				} else 
				{
				    if ($testVersion =~ m#((\d+\.)+\d+)# )
					{
						$testVersion = $1;
					}
					$main::correctVersion = testVersion($main::cppVersion, $testVersion, "$main::OO_SDK_CPP_HOME/$main::cppName", 1);
					if ( !$main::correctVersion )
					{
						print " The '$main::cppName' command found at '$main::OO_SDK_CPP_HOME' has a wrong version\n";
						if ( skipChoice("C++ compiler") == 1 )
						{
							$main::correctVersion = 1;
						}

						$main::OO_SDK_CPP_HOME = "";
					} else {
						$main::correctVersion = testVersion("5.5", $testVersion, "$main::OO_SDK_CPP_HOME/$main::cppName", 2);
						if ( $main::correctVersion ) {
							$main::OO_SDK_CC_55_OR_HIGHER = $testVersion;
						}					  
					}
				}
			}
		}
	} else
	{
		# the C++ compiler is optional
		$main::correctVersion = 1;
	}
}


# prepare Java path
$main::correctVersion = 0;

# prepare Java suggestion (cut bin or Commands directory to be in the root of the Java SDK)
$main::offset = rindex($main::OO_SDK_JAVA_HOME_SUGGESTION, "/$main::OO_SDK_JAVA_BIN_DIR");
if ( $main::offset != -1 )
{
	$main::OO_SDK_JAVA_HOME_SUGGESTION = substr($main::OO_SDK_JAVA_HOME_SUGGESTION, 0, $main::offset);
}

while ( (!$main::correctVersion) &&
		((! -d "$main::OO_SDK_JAVA_HOME" ) ||
		 ((-d "$main::OO_SDK_JAVA_HOME") && (! -e "$main::OO_SDK_JAVA_HOME/$main::OO_SDK_JAVA_BIN_DIR/javac"))) )
{
	print " Enter Java SDK (1.5, recommendation is 1.6 or higher) installation directory  (optional) [$main::OO_SDK_JAVA_HOME_SUGGESTION]: ";
	$main::OO_SDK_JAVA_HOME = readStdIn();
	chop($main::OO_SDK_JAVA_HOME);
	if ( $main::OO_SDK_JAVA_HOME eq "" ) 
	{
		$main::OO_SDK_JAVA_HOME = $main::OO_SDK_JAVA_HOME_SUGGESTION;
	}
	if ( ! $main::OO_SDK_JAVA_HOME eq "" ) 
	{
		if ( (! -d "$main::OO_SDK_JAVA_HOME") || 
			 ((-d "$main::OO_SDK_JAVA_HOME") && (! -e "$main::OO_SDK_JAVA_HOME/$main::OO_SDK_JAVA_BIN_DIR/javac")) )
		{ 
			print " Error: Could not find directory '$main::OO_SDK_JAVA_HOME' or '$main::OO_SDK_JAVA_HOME/$main::OO_SDK_JAVA_BIN_DIR/javac'.\n";
			if ( skipChoice("JAVA SDK") == 1 )
			{
				$main::correctVersion = 1;
			}
			$main::OO_SDK_JAVA_HOME = "";
		} else 
		{
			#check version
			my $testVersion = `$main::OO_SDK_JAVA_HOME/$main::OO_SDK_JAVA_BIN_DIR/java -version 2>&1 | egrep "java version" | head -n 1 | sed -e 's#.*version "##' | sed -e 's#".*##'`;
			$testVersion =~ s#([^\n]+)\n#$1#go;
			
			$main::correctVersion = testVersion($main::javaVersion, $testVersion, "$main::OO_SDK_JAVA_HOME/$main::OO_SDK_JAVA_BIN_DIR/java", 1);
			if ( !$main::correctVersion )
			{
				if ( skipChoice("JAVA SDK") == 1 )
				{
					$main::correctVersion = 1;
				}
				$main::OO_SDK_JAVA_HOME = "";
			}
		}
	}else
	{
		# the Java SDK is optional
		$main::correctVersion = 1;
	}
}

# prepare boost directory (optional)
while ( (!$main::skipBoostDir) &&
		((! -d "$main::OO_SDK_BOOST_HOME" ) ||
         ((-d "$main::OO_SDK_BOOST_HOME") && (! -e "$main::OO_SDK_BOOST_HOME/boost/tr1/unordered_map.hpp"))) )
{

    print " Enter boost directory [$main::OO_SDK_BOOST_HOME_SUGGESTION]: ";
    $main::OO_SDK_BOOST_HOME = readStdIn();
    chop($main::OO_SDK_BOOST_HOME);
    if ( $main::OO_SDK_BOOST_HOME eq "" )
    {
        $main::OO_SDK_BOOST_HOME = $main::OO_SDK_BOOST_HOME_SUGGESTION;
    }
    if ( (! -d "$main::OO_SDK_BOOST_HOME") ||
         ((-d "$main::OO_SDK_BOOST_HOME") && (! -e "$main::OO_SDK_BOOST_HOME/boost/tr1/unordered_map.hpp")) )
    {
        print " Error: boost couldn't be find or verified, please specify a boost directory.\n";
		if ( skipChoice("optional output directory") == 1 )
		{
			$main::skipBoostDir = 1;
		}
        $main::OO_SDK_BOOST_HOME = "";
    } else
	{
		# the boost directory is optional
		$main::skipBoostDir = 1;
	}
}

# prepare output directory (optional)
while ( (!$main::skipOutputDir) &&
		(! -d "$main::OO_SDK_OUTPUT_DIR") )
{
	print " Default output directory is in your HOME directory.\n";
	print " Enter an existent directory if you prefer a different output directory (optional) [$main::OO_SDK_OUTPUT_DIR_SUGGESTION]: ";
	
	$main::OO_SDK_OUTPUT_DIR = readStdIn();

	chop($main::OO_SDK_OUTPUT_DIR);
	if ( $main::OO_SDK_OUTPUT_DIR eq "" ) 
	{
		$main::OO_SDK_OUTPUT_DIR = $main::OO_SDK_OUTPUT_DIR_SUGGESTION;
	}
	if ( ! $main::OO_SDK_OUTPUT_DIR eq "" ) 
	{
		if ( ! -d "$main::OO_SDK_OUTPUT_DIR" )
		{ 
			print " Error: Could not find directory '$main::OO_SDK_OUTPUT_DIR'.\n";
			if ( skipChoice("optional output directory") == 1 )
			{
				$main::skipOutputDir = 1;
			}
			$main::OO_SDK_OUTPUT_DIR = "";
		}
	} else
	{
		# the output directory is optional
		$main::skipOutputDir = 1;
	}
}

# prepare auto deployment
while ( $main::SDK_AUTO_DEPLOYMENT eq "" || 
	((! $main::SDK_AUTO_DEPLOYMENT eq "YES") && 
	 (! $main::SDK_AUTO_DEPLOYMENT eq "NO")) )
{
    print " Automatic deployment of UNO components (YES/NO) [$main::SDK_AUTO_DEPLOYMENT_SUGGESTION]: ";
    $main::SDK_AUTO_DEPLOYMENT = uc <STDIN>;
    chop($main::SDK_AUTO_DEPLOYMENT);
    if ( $main::SDK_AUTO_DEPLOYMENT eq "" )
    {
	$main::SDK_AUTO_DEPLOYMENT = "YES";
    }
}

prepareScriptFile("setsdkenv_unix.sh.in", "setsdkenv_unix.sh");
chmod 0644, "$main::OO_SDK_CONFIG_HOME/$main::hostname/setsdkenv_unix.sh";

print "\n";
print " ************************************************************************\n";
print " * ... your SDK environment has been prepared.\n";
print " * For each time you want to use this configured SDK environment, you\n";
print " * have to run the \"setsdkenv_unix\" script file!\n";
print " * Alternatively can you source one of the scripts\n";
print " *   \"$main::OO_SDK_CONFIG_HOME/$main::hostname/setsdkenv_unix.sh\"\n";
print " * to get an environment without starting a new shell.\n";
print " ************************************************************************\n\n";

exit $return;

sub skipChoice
{
	my $msg = shift;
	my $skip = "";
	while ( !( $skip eq "yes" || $skip eq "no") )
	{
		print " Do you want to skip the choice of the '$msg' (YES/NO): [YES] ";
		$skip = lc <STDIN>;
		chop($skip);
		if ( $skip eq "" ) { $skip = "yes"; } # default
		if ( $skip eq "yes" )
		{
			return 1;
		}
	}
	return 0;
}

sub resolveLink
{
    my $base= shift;
    my $link= shift;

    my $resolvedpath = "$base/$link";
    my $linktarget =  readlink "$resolvedpath"; 
    my $resolvedlink = "";

    while ( $linktarget ne "") {

	if ( $linktarget =~ m/^\/.*/ )
	{
	    $resolvedpath = "$linktarget";
	} else {
	    $resolvedpath = `cd $base/$linktarget; pwd`;
	    chop $resolvedpath;
	}
	$base = dirname("$resolvedpath");

	$linktarget = readlink "$resolvedpath";
    }

    $resolvedlink = `cd $resolvedpath; pwd`;
    chop $resolvedlink;
    return $resolvedlink;
}

sub searchprog
{
	my $_search= shift;
	my $tmpPath = `echo "\$PATH"`;
	my @pathList = split(":" , $tmpPath);
	my $progDir = "";

    if ( $_search eq "javac" )
    {
		if ( $main::operatingSystem =~ m/darwin/ ) {
			$progDir = resolveLink("/System/Library/Frameworks/JavaVM.Framework/Versions", "CurrentJDK");

			if ( -e "$progDir/$main::OO_SDK_JAVA_BIN_DIR/javac" )
			{
				return "$progDir/$main::OO_SDK_JAVA_BIN_DIR";
			}
		}

		if ( $main::operatingSystem =~ m/solaris/ ) {
			$progDir = resolveLink("/usr/jdk", "latest");
			if ( -e "$progDir/$main::OO_SDK_JAVA_BIN_DIR/javac" )
			{
				return "$progDir/$main::OO_SDK_JAVA_BIN_DIR";
			}
		}
    }

    if ( $_search eq "gmake" && $main::operatingSystem =~ m/solaris/ ) {
		if ( -e "/usr/sfw/bin/gmake" )
		{
			return "/usr/sfw/bin";
		}
    }

	foreach $i (@pathList)
	{
	    chomp ($i);

		if ( -e "$i/$_search" )
		{

			if ( index($i, "/") == 0 )
			{
				# # absolute path; leave unchanged
				$progDir = $i;
			} else
			{
				$progDir = `cd "$i"; pwd`;
			}
			return $progDir
		}
	}
	return $progDir
}

sub searchMacOffice
{
	if (-d "/Applications/OpenOffice.app" ) {
		return "/Applications/OpenOffice.app"
	}
	return "";
}

sub searchoffice
{
	my $offset = rindex($main::sdkpath, "/openoffice");
	my $tmpOffice = substr($main::sdkpath, 0, $offset);
	my $officepath = "$tmpOffice/openoffice$main::OO_MAJORVERSION";

#	if ( $main::OO_MINORVERSION > 0) {
#		$officepath = "$officepath$main::OO_MINORVERSION";
#	} 

	# search corresponding office for this SDK
	if (-d $officepath && -e "$officepath/program/soffice") {
		return $officepath;
	}
	return "";
}



sub testVersion
{
	my $tmpMustBeVersion = shift;
	my $tmpTestVersion = shift;
	my $toolName = shift;
	# 1=check + message 2=check only
	my $checkOnly = shift;
	my @mustBeVersion = split(/\.|_|-/,$tmpMustBeVersion);
	my @testVersion = split(/\.|_|-/,$tmpTestVersion);
	my $length = $#mustBeVersion;

	if ($#testVersion < $#mustBeVersion) {
	    $length = $#testVersion;
	}

	for ($i=0; $i <= $length; $i++ )
	{
		if ( @testVersion[$i] > @mustBeVersion[$i] )
		{
			return 1; # 1 indicates a correct version
		}

		if ( @testVersion[$i] < @mustBeVersion[$i] )
		{
			if ( $#checkOnly == 1 ) {
				print " The command '$toolName' has the version $tmpTestVersion.\n";
				print " The SDK requires at least the version $tmpMustBeVersion.\n";
			}
			return 0;
		}
	}

	return 1; # 1 indicates a correct version
}

sub readStdIn
{
	my $tmpstdin = <STDIN>;
	if ( index($tmpstdin, "\$") != -1)
	{
	    return `echo $tmpstdin`;
	}

	return $tmpstdin;
}

sub prepareScriptFile() 
{
	my $inputFile = shift;
	my $outputFile = shift;

	if ( ! -d "$main::OO_SDK_CONFIG_HOME/$main::hostname" )
	{
		system("mkdir -p $main::OO_SDK_CONFIG_HOME/$main::hostname");
	}

	open ( FILEIN, "$main::sdkpath/$inputFile" ) || die "\nERROR: could not open '$main::sdkpath/$inputFile' for reading";
	open ( FILEOUT, ">$main::OO_SDK_CONFIG_HOME/$main::hostname/$outputFile" ) || die "\nERROR: could not open '$main::OO_SDK_CONFIG_HOME/$main::hostname/$outputFile' for writing";

	while ( <FILEIN> )
	{
		$_ =~ s#\@OO_SDK_NAME\@#$main::OO_SDK_NAME#go;
		$_ =~ s#\@OO_SDK_HOME\@#$main::OO_SDK_HOME#go;
		$_ =~ s#\@OFFICE_HOME\@#$main::OFFICE_HOME#go;
		$_ =~ s#\@OO_SDK_MAKE_HOME\@#$main::OO_SDK_MAKE_HOME#go;
		$_ =~ s#\@OO_SDK_ZIP_HOME\@#$main::OO_SDK_ZIP_HOME#go;
		$_ =~ s#\@OO_SDK_CAT_HOME\@#$main::OO_SDK_CAT_HOME#go;
		$_ =~ s#\@OO_SDK_SED_HOME\@#$main::OO_SDK_SED_HOME#go;
		$_ =~ s#\@OO_SDK_CPP_HOME\@#$main::OO_SDK_CPP_HOME#go;
		$_ =~ s#\@OO_SDK_CC_55_OR_HIGHER\@#$main::OO_SDK_CC_55_OR_HIGHER#go;
		$_ =~ s#\@OO_SDK_JAVA_HOME\@#$main::OO_SDK_JAVA_HOME#go;
		$_ =~ s#\@OO_SDK_BOOST_HOME\@#$main::OO_SDK_BOOST_HOME#go;
		$_ =~ s#\@SDK_AUTO_DEPLOYMENT\@#$main::SDK_AUTO_DEPLOYMENT#go;
		$_ =~ s#\@OO_SDK_OUTPUT_DIR\@#$main::OO_SDK_OUTPUT_DIR#go;
	
		print FILEOUT $_; 
	}
	
	close FILEIN;
	close FILEOUT;
}
