eval 'exec perl -wS $0 ${1+\"$@\"}' if 0; #************************************************************************* # # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # Copyright 2000, 2010 Oracle and/or its affiliates. # # OpenOffice.org - a multi-platform office productivity suite # # This file is part of OpenOffice.org. # # OpenOffice.org is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License version 3 # only, as published by the Free Software Foundation. # # OpenOffice.org is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License version 3 for more details # (a copy is included in the LICENSE file that accompanied this code). # # You should have received a copy of the GNU Lesser General Public License # version 3 along with OpenOffice.org. If not, see # # for a copy of the LGPLv3 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 = ) { 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 = ) { 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 = ) { 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 = ) { 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 <