[24600] | 1 | #!/usr/bin/perl -w
|
---|
| 2 |
|
---|
| 3 | ###########################################################################
|
---|
| 4 | #
|
---|
| 5 | # A component of the Greenstone digital library software
|
---|
| 6 | # from the New Zealand Digital Library Project at the
|
---|
| 7 | # University of Waikato, New Zealand.
|
---|
| 8 | #
|
---|
| 9 | # Copyright (C) 2009 New Zealand Digital Library Project
|
---|
| 10 | #
|
---|
| 11 | # This program is free software; you can redistribute it and/or modify
|
---|
| 12 | # it under the terms of the GNU General Public License as published by
|
---|
| 13 | # the Free Software Foundation; either version 2 of the License, or
|
---|
| 14 | # (at your option) any later version.
|
---|
| 15 | #
|
---|
| 16 | # This program is distributed in the hope that it will be useful,
|
---|
| 17 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 18 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 19 | # GNU General Public License for more details.
|
---|
| 20 | #
|
---|
| 21 | # You should have received a copy of the GNU General Public License
|
---|
| 22 | # along with this program; if not, write to the Free Software
|
---|
| 23 | # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
| 24 | #
|
---|
| 25 | ###########################################################################
|
---|
| 26 |
|
---|
| 27 |
|
---|
| 28 | # gs-magick.pl:
|
---|
| 29 | # Script to set the environment for imagemagick and then run it, returning
|
---|
| 30 | # both the exit code and printing the output to STDOUT.
|
---|
| 31 | # Setting the env vars necessary for imagemagick here locally means
|
---|
| 32 | # they won't interfere with the normal environment it would have
|
---|
| 33 | # if the environment had been set in setup.bash/setup.bat instead
|
---|
| 34 |
|
---|
| 35 |
|
---|
| 36 | BEGIN {
|
---|
| 37 | die "GSDLHOME not set - run the (gs3-)setup script\n" unless defined $ENV{'GSDLHOME'};
|
---|
| 38 | die "GSDLOS not set - run (gs3-)setup script\n" unless defined $ENV{'GSDLOS'};
|
---|
[24785] | 39 | $ENV{'GSDLARCH'} = "" unless defined $ENV{'GSDLARCH'}; # GSDLARCH will be set only on some Linux systems
|
---|
[24600] | 40 | unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
|
---|
| 41 | }
|
---|
| 42 |
|
---|
| 43 |
|
---|
| 44 | use strict;
|
---|
| 45 | no strict 'refs'; # make an exception so we can use variables as filehandles
|
---|
| 46 | use util;
|
---|
| 47 |
|
---|
| 48 |
|
---|
| 49 | sub main
|
---|
| 50 | {
|
---|
| 51 | my ($argc,@argv) = @_;
|
---|
| 52 |
|
---|
[24830] | 53 | my $usage = "Usage: $0 [--usage|--help|--verbosity <num>] <imagick-command> <arguments to imagick command>";
|
---|
[24600] | 54 |
|
---|
| 55 | my $verbosity = 0;
|
---|
| 56 | my $magick_cmd = "";
|
---|
| 57 |
|
---|
| 58 |
|
---|
| 59 | # Construct the imagemagick cmd string from all the arguments,
|
---|
| 60 | # embedding any arguments that contain spaces in quotes.
|
---|
| 61 | # We'll remove the --options afterwards.
|
---|
| 62 | my $count = 0;
|
---|
| 63 | for ($count = 0; $count < scalar(@argv); $count++) {
|
---|
| 64 | if($argv[$count] =~ m/ /) {
|
---|
| 65 | $argv[$count] = "\"".$argv[$count]."\"";
|
---|
| 66 | }
|
---|
| 67 | $magick_cmd = "$magick_cmd $argv[$count]";
|
---|
| 68 | }
|
---|
| 69 |
|
---|
| 70 | # process the --options in the imagemagick command
|
---|
| 71 | # Tried using the official GetOptions module to parse options, except that
|
---|
| 72 | # the --verbosity|--v option to gs-magick.pl interfered with the -verbose
|
---|
| 73 | # option that image-magick accepts.
|
---|
| 74 |
|
---|
[24830] | 75 | if($magick_cmd =~ m/--usage|--help/) {
|
---|
[24600] | 76 | print STDERR "$usage\n";
|
---|
| 77 | exit(0);
|
---|
| 78 | }
|
---|
| 79 |
|
---|
| 80 | $magick_cmd =~ s/\s*--verbosity(\s+|=)(\d*)\s*/ /; # --verbosity=4 or --verbosity 4
|
---|
| 81 | $verbosity = $2 if defined $2; # print STDERR "subst 2 is : $2\n" if defined $2;
|
---|
| 82 |
|
---|
[24831] | 83 | if(!defined $magick_cmd || $magick_cmd eq "" || $magick_cmd =~ m/^\s*$/) {
|
---|
| 84 | print STDERR "No command provided for imagemagick.\n$usage\n";
|
---|
| 85 | exit(0);
|
---|
| 86 | }
|
---|
| 87 |
|
---|
[24600] | 88 | if($verbosity > 2) {
|
---|
| 89 | print STDERR "***** Running MAGICK_CMD: $magick_cmd\n";
|
---|
| 90 | #print STDERR "***** verbosity: $verbosity\n";
|
---|
| 91 | }
|
---|
| 92 |
|
---|
| 93 | ## SET THE ENVIRONMENT AS USED TO BE DONE IN SETUP.BASH/BAT
|
---|
| 94 |
|
---|
| 95 | my $magick_home = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}.$ENV{'GSDLARCH'},"imagemagick");
|
---|
| 96 | if (-d $magick_home) { # "$GSDLHOME/bin/$GSDLOS$GSDLARCH/imagemagick"
|
---|
| 97 | $ENV{'MAGICK_HOME'} = $magick_home;
|
---|
| 98 | }
|
---|
| 99 |
|
---|
| 100 | # if Greenstone came with imagick, or if the user otherwise has an
|
---|
| 101 | # imagick to fall back on (and set MAGICK_HOME that way) we use that
|
---|
| 102 | if(defined $ENV{'MAGICK_HOME'} && -d $ENV{'MAGICK_HOME'}) {
|
---|
[24612] | 103 | if($ENV{'GSDLOS'} =~ m/windows/) {
|
---|
| 104 | &util::envvar_prepend("PATH", $ENV{'MAGICK_HOME'}); # the imagemagick folder (no bin therein)
|
---|
[24600] | 105 | }
|
---|
[24612] | 106 |
|
---|
| 107 | else { # linux and mac
|
---|
| 108 | &util::envvar_prepend("PATH", &util::filename_cat($ENV{'MAGICK_HOME'}, "bin"));
|
---|
| 109 |
|
---|
| 110 | my $magick_lib = &util::filename_cat($ENV{'MAGICK_HOME'}, "lib");
|
---|
| 111 | if($ENV{'GSDLOS'} eq "linux") {
|
---|
| 112 | &util::envvar_prepend("LD_LIBRARY_PATH", $magick_lib);
|
---|
| 113 | } elsif ($ENV{'GSDLOS'} eq "darwin") {
|
---|
| 114 | &util::envvar_prepend("DYLD_LIBRARY_PATH", $magick_lib);
|
---|
| 115 | }
|
---|
| 116 | }
|
---|
[24600] | 117 |
|
---|
| 118 | if($verbosity > 2) {
|
---|
[28166] | 119 | print STDERR "\t*** MAGICK_HOME: ".$ENV{'MAGICK_HOME'}."\n";
|
---|
| 120 | print STDERR "\t*** LD_LIB_PATH: ".$ENV{'LD_LIBRARY_PATH'}."\n" if defined $ENV{'LD_LIBRARY_PATH'};
|
---|
| 121 | print STDERR "\t*** DYLD_LIB_PATH: ".$ENV{'DYLD_LIBRARY_PATH'}."\n" if defined $ENV{'DYLD_LIBRARY_PATH'};
|
---|
| 122 | print STDERR "\t*** PATH: ".$ENV{'PATH'}."\n\n";
|
---|
[24600] | 123 | }
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | # if no MAGICK_HOME, maybe they want to run with the system imagemagick
|
---|
| 127 | elsif($verbosity > 2) {
|
---|
| 128 | print STDERR "**** No ImageMagick in Greenstone. Will try to use any imagemagick on the system.\n\n";
|
---|
| 129 | }
|
---|
| 130 |
|
---|
| 131 | # RUN THE IMAGEMAGICK COMMAND
|
---|
| 132 |
|
---|
| 133 | # John Thompson's manner of using backticks to preserve the output of
|
---|
| 134 | # running imagemagick.
|
---|
| 135 | # $? contains the exit code of running the imagemagick command.
|
---|
| 136 | # This needs to be shifted by 8 and then converted to be a signed value
|
---|
| 137 | # to work out the actual exit code value.
|
---|
| 138 |
|
---|
| 139 | #my $result = `$magick_cmd`; # This way will trap STDOUT into local variable
|
---|
| 140 |
|
---|
[24601] | 141 | my $result = "";
|
---|
[24600] | 142 | if (!open(PIN, "$magick_cmd |")) {
|
---|
[24830] | 143 | print STDERR "*** Can't run $magick_cmd. Error was: $!.\n\n";
|
---|
[24601] | 144 | } else {
|
---|
| 145 | while (defined (my $imagick_output_line = <PIN>)) {
|
---|
| 146 | $result = $result.$imagick_output_line;
|
---|
| 147 | }
|
---|
| 148 | close(PIN);
|
---|
[24600] | 149 | }
|
---|
| 150 |
|
---|
| 151 | # Perl Special Variables http://www.kichwa.com/quik_ref/spec_variables.html
|
---|
| 152 | # $? The status returned by the last pipe close, backtick(``) command or system operator.
|
---|
| 153 | # Note that this is the status word returned by the wait() system call, so the exit value
|
---|
| 154 | # of the subprocess is actually ($? >>*). $? & 255 gives which signal, if any, the process
|
---|
| 155 | # died from, and whether there was a core dump.
|
---|
| 156 |
|
---|
| 157 | # Shift by 8 to get a value between 0 and 255, then work out if it is signed or unsigned
|
---|
| 158 | # http://stackoverflow.com/questions/2726447/why-is-the-exit-code-255-instead-of-1-in-perl
|
---|
| 159 | my $status = $?;
|
---|
| 160 | $status >>= 8;
|
---|
| 161 | $status = (($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status);
|
---|
| 162 |
|
---|
| 163 | # send the output to STDOUT, since calling functions may call gs-magick.pl with backticks
|
---|
| 164 | print STDOUT $result;
|
---|
| 165 | exit($status);
|
---|
| 166 | }
|
---|
| 167 |
|
---|
| 168 | &main(scalar(@ARGV),@ARGV);
|
---|