blob: ccc4264fc79a0f52f497771d78a792e847164c94 [file] [log] [blame]
eval 'exec perl -wS $0 ${1+\"$@\"}'
if 0;
#**************************************************************
#
# 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.
#
#**************************************************************
# This is a pre check, which checks if some extra software exists
BEGIN
{
# Adding the path of this script file to the include path in the hope
# that all used modules can be found in it.
$0 =~ /^(.*)[\/\\]/;
push @INC, $1;
}
use strict;
use English; # $OSNAME, ...
use Getopt::Long;
use Cwd;
use Cwd 'chdir';
my $cwd = getcwd();
our $help; # Help option flag
our $version; # Version option flag
# flush STDOUT
# my $old_handle = select (STDOUT); # "select" STDOUT and save # previously selected handle
# $| = 1; # perform flush after each write to STDOUT
# select ($old_handle); # restore previously selected handle
$OUTPUT_AUTOFLUSH=1; # works only if use English is used.
our $sGlobalIniFile;
our $verbose = 0;
our $ghostscript;
our $imagemagick;
our $java6;
our $printerdriver;
our $version_info = 'compare.pl';
GetOptions(
"ghostscript" => \$ghostscript,
"imagemagick" => \$imagemagick,
"java6" => \$java6,
"printerdriver" => \$printerdriver,
"verbose" => \$verbose,
"help" => \$help,
"version" => \$version
);
if ($help)
{
print_usage(*STDOUT);
exit(0);
}
# Check for version option
if ($version)
{
print STDERR "$version_info\n";
exit(0);
}
# prepare the GlobalIniFile
sub prepare()
{
my $sEnv = "$ENV{PRJ}";
if (! $sEnv)
{
print "Warning: Seems you are not in a makefile.mk environment.\n";
$sEnv = "..";
}
my $sPath = getcwd();
$sPath .= "/" . $sEnv;
chdir ($sPath);
cwd();
$sPath = getcwd();
my $sInpath = $ENV{INPATH};
$sPath .= "/" . $sInpath . "/misc";
$sGlobalIniFile = "$sPath/pathes.ini";
print "Global Path ini file is: $sGlobalIniFile\n" if ($verbose);
}
sub unixpath($)
{
my $path = shift;
$path =~ s/\\/\//g; # make out of '\' a '/'
return $path;
}
# search for file in a given path list.
# the path list should be separated as the path variable in the corresponding OS
sub searchForFileInPath($$)
{
my $sFile = shift;
my $sPathList = shift;
my $sep = ':';
if ($OSNAME eq "MSWin32")
{
$sep = ';';
}
my @path = split($sep, $sPathList);
my $sPath;
my $startdir;
my $bFound = 0;
my $olddir = getcwd();
my $sWindowsHomeDir = unixpath(lc($ENV{WINDIR}));
foreach $startdir (@path)
{
my $nCount = 0;
#
# IMPORTANT: leave out windir path.
#
if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
{
my $sPath = unixpath(lc(convertCygwinPath($startdir)));
if ($sPath =~ /^$sWindowsHomeDir/ )
{
print "path: $startdir is windows path leave out.\n" if ($verbose);
next;
}
}
local *DIR;
if (opendir (DIR, $startdir)) # open directory
{
print "path: $startdir" if ($verbose);
chdir ($startdir);
cwd();
my $myfile;
while ($myfile = readdir(DIR)) # get filename
{
if (-f $myfile ) # is it a file?
{
$nCount ++;
if ($myfile eq $sFile) # is it the real file?
{
$sPath = $startdir;
$bFound = 1;
last;
}
}
}
closedir(DIR);
print " ($nCount)\n" if ($verbose);
}
if ($bFound == 1)
{
last;
}
}
chdir ($olddir);
cwd();
return $sPath;
}
prepare();
# don't remove the inifile, only build clean should do this.
# if ( -e "$sGlobalIniFile")
# {
# unlink($sGlobalIniFile);
# }
# small helper, which replaces the return code
sub errorAdaption($)
{
my $error = shift;
if ($error != 0)
{
$error = $error / 256;
}
if ($error > 127)
{
$error = $error - 256;
}
return $error;
}
# for every error we increment this variable by 1
our $nGlobalErrors = 0;
sub handleError($$)
{
my $error = shift;
my $sText = shift;
if ($error != 0)
{
print "ERROR: search for $sText has failed with Errornumber: $error\n";
$nGlobalErrors ++;
}
}
sub convertCygwinPath($)
{
my $sPath = shift;
if ($OSNAME eq "cygwin")
{
# print "Cygwin Path Patch.\n" if ($verbose);
if ($sPath =~ /\/cygdrive\/(.)/)
{
my $Letter = $1;
$sPath =~ s/\/cygdrive\/${Letter}/${Letter}\:/;
# print "Cygwin Path Patch: '$sPath'\n" if ($verbose);
}
}
return $sPath;
}
# append key=value to GlobalIniFile
sub insertPath($$)
{
my $sKey = shift;
my $sValue = shift;
$sValue = convertCygwinPath($sValue);
my $sIniFile = convertCygwinPath($sGlobalIniFile);
local *INIFILE;
if (open(INIFILE, ">>" . $sIniFile ))
{
print INIFILE "$sKey=$sValue\n";
}
close(INIFILE);
}
sub getFastPath($)
{
my $sKey = shift;
my $sValue;
local *INIFILE;
my $sIniFile = convertCygwinPath($sGlobalIniFile);
if (open(INIFILE, $sIniFile))
{
my $line;
while ($line = <INIFILE>)
{
chomp($line);
if ( $line =~ /^$sKey=(.*)$/ )
{
$sValue = $1;
# print INIFILE "$sKey=$sValue\n";
}
}
close(INIFILE);
}
return $sValue;
}
sub checkForGhostscript()
{
print "Search for Ghostscript\n" if ($verbose);
if ($OSNAME eq "linux" ||
$OSNAME eq "solaris")
{
# search for ghostscript
local *GHOSTSCRIPT;
if (open(GHOSTSCRIPT, "which gs 2>&1 |"))
{
my $line;
while ($line = <GHOSTSCRIPT>)
{
chomp($line);
print "- $line\n" if ($verbose);
}
close(GHOSTSCRIPT);
}
my $error = errorAdaption($?);
handleError($error, "Ghostscript");
}
elsif ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
{
my $sGSExe = "gswin32c.exe";
# my $sGSPath = "C:/gs/gs8.64/bin";
my $sGSPath = getFastPath("gs.path");
if (! $sGSPath)
{
$sGSPath = searchForFileInPath($sGSExe, $ENV{PATH});
if ( ! -e "$sGSPath/$sGSExe")
{
$nGlobalErrors ++;
print "ERROR: search for $sGSPath/$sGSExe failed.\n";
print "Please install ghostscript from www.adobe.com to and make it available in \$PATH variable \n";
}
else
{
insertPath("gs.path", $sGSPath);
insertPath("gs.exe", $sGSExe);
}
}
if ( -e "$sGSPath/$sGSExe" )
{
print "Found Ghostscript: '$sGSPath'\n" if ($verbose);
}
}
else
{
print "ERROR: Check for Ghostscript failed, due to unsupported '$OSNAME' environment.\n";
$nGlobalErrors ++;
}
}
sub checkForPSDriver()
{
# we don't need to check for unix here, due to the fact, unix is per default be able to print in postscript
if ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
{
print "Check for postscript driver.\n" if ($verbose);
my $sWindowsRoot = $ENV{windir};
if (! $sWindowsRoot)
{
$sWindowsRoot = $ENV{WINDIR};
}
my $sCrossOfficeDriver = "${sWindowsRoot}/system32/crossoffice.ppd";
if ( ! -e "$sCrossOfficeDriver")
{
print "ERROR: Don't found Postscript driver $sCrossOfficeDriver file\n";
$nGlobalErrors ++;
print "Take a look on: http://so-gfxcmp.germany.sun.com/docs/further/convwatch/convwatch.html.\n";
}
}
}
sub checkForImageMagick()
{
print "Search for Imagemagick\n" if ($verbose);
if ($OSNAME eq "linux" ||
$OSNAME eq "solaris")
{
# search for imagemagick
local *IMAGEMAGICK;
if (open(IMAGEMAGICK, "which convert 2>&1 |"))
{
my $line;
while ($line = <IMAGEMAGICK>)
{
chomp($line);
print "- $line\n" if ($verbose);
}
close(IMAGEMAGICK);
}
my $error = errorAdaption($?);
handleError($error, "Imagemagick");
}
elsif ($OSNAME eq "MSWin32" || $OSNAME eq "cygwin")
{
my $sImageMagickExe = "convert.exe";
# my $sImageMagickPath = "C:/gs/gs8.64/bin";
my $sImageMagickPath = getFastPath("imagemagick.path");
if (! $sImageMagickPath)
{
$sImageMagickPath = searchForFileInPath($sImageMagickExe, $ENV{PATH});
if ($sImageMagickPath)
{
if ( ! -e "$sImageMagickPath/$sImageMagickExe")
{
$nGlobalErrors ++;
print "ERROR: search for $sImageMagickPath/$sImageMagickExe failed.\n";
print "Please install ImageMagick from www.imagemagick.org to and make it available in \$PATH variable \n";
}
else
{
insertPath("imagemagick.path", $sImageMagickPath);
# insertPath("gs.exe", $sImageMagickExe);
}
}
else
{
# next try, search image magick in $PROGRAMFILES
my $sPrograms = unixpath($ENV{PROGRAMFILES});
if (! $sPrograms)
{
print "There exist no \$PROGRAMFILES path, wrong Windows version?\n";
$nGlobalErrors++;
}
else
{
local *DIR;
if (opendir (DIR, $sPrograms)) # open program directory
{
my $myfile;
while ($myfile = readdir(DIR)) # get a filename
{
if ($myfile =~ /ImageMagick/)
{
$sImageMagickPath = $sPrograms . "/" . $myfile;
last;
}
}
closedir(DIR);
}
if (! -e $sImageMagickPath)
{
print "ImageMagick not found.\n";
$nGlobalErrors ++;
}
else
{
insertPath("imagemagick.path", $sImageMagickPath);
}
}
}
}
if ( -e "$sImageMagickPath/$sImageMagickExe" )
{
print "Found ImageMagick: '$sImageMagickPath'\n" if ($verbose);
}
}
else
{
print "ERROR: not supported environment\n";
}
}
sub checkForJava6()
{
print "Search for Java6\n" if ($verbose);
my $javaexe = "java";
if ( $ENV{JAVA6} )
{
$javaexe = $ENV{JAVA6};
}
if ($OSNAME eq "linux" || $OSNAME eq "cygwin")
{
# search for imagemagick
local *JAVA;
if (open(JAVA, "$javaexe -version 2>&1 |"))
{
my $line;
while ($line = <JAVA>)
{
chomp($line);
print "- $line\n" if ($verbose);
if ( $line =~ /java version "(.*)"/ )
{
my $javaversion = $1;
my @version = split('\.', $javaversion);
print "Found Java version: $version[1] the complete version: $javaversion\n" if ($verbose);
if ( $version[1] < 6)
{
print "Wrong Java version, at least Java version 6 is need but found $javaversion.\n";
$nGlobalErrors++;
print "It is possible to overwrite the java exe with environment variable JAVA6='path'.\n";
}
else
{
insertPath("java.exe", $javaexe);
}
last;
}
}
close(JAVA);
}
my $error = errorAdaption($?);
handleError($error, "Java");
}
elsif ($OSNAME eq "MSWin32")
{
my $javaexe = "java";
if ( $ENV{JAVA6} )
{
$javaexe = $ENV{JAVA6};
}
if (! -e $javaexe)
{
print "Java not found.\n";
$nGlobalErrors ++;
}
else
{
print "Found Java: '$javaexe'\n" if ($verbose);
insertPath("java.exe", $javaexe);
}
}
else
{
print "ERROR: Java not found.\n";
}
}
# different checks
print "Environment '$OSNAME'\n" if ($verbose);
if ($printerdriver)
{
checkForPSDriver();
}
if ($ghostscript)
{
checkForGhostscript();
}
if ($imagemagick)
{
checkForImageMagick();
}
if ($java6)
{
checkForJava6();
}
# return with found errors
exit($nGlobalErrors);
# ------------------------------------------------------------------------------
sub print_usage(*)
{
local *HANDLE = $_[0];
my $tool_name = basename($0);
print(HANDLE <<END_OF_USAGE);
Usage: $tool_name [OPTIONS]
-ghostscript Try to find ghostscript in your environment
-imagemagick Try to find imagemagick
-java6 Checks for java 1.6.x
-printerdriver Try to find printer driver, windows only
-verbose be verbose
-h, --help Print this help, then exit
-v, --version Print version number, then exit
END_OF_USAGE
;
}