[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'};
|
---|
[24606] | 39 | if($ENV{'GSDLOS'} =~ m/windows/) { # windows doesn't (yet) define GSDLARCH env var
|
---|
| 40 | $ENV{'GSDLARCH'} = "" unless defined $ENV{'GSDLARCH'};
|
---|
| 41 | }
|
---|
| 42 | die "GSDLARCH not set - run (gs3-)setup script\n" unless defined $ENV{'GSDLARCH'};
|
---|
[24600] | 43 | unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
|
---|
| 44 | }
|
---|
| 45 |
|
---|
| 46 |
|
---|
| 47 | use strict;
|
---|
| 48 | no strict 'refs'; # make an exception so we can use variables as filehandles
|
---|
| 49 | use util;
|
---|
| 50 |
|
---|
| 51 |
|
---|
| 52 | sub main
|
---|
| 53 | {
|
---|
| 54 | my ($argc,@argv) = @_;
|
---|
| 55 |
|
---|
| 56 | my $usage = "Usage: $0 [--usage|--verbosity <num>] <imagick-command> <arguments to imagick command>";
|
---|
| 57 |
|
---|
| 58 | my $verbosity = 0;
|
---|
| 59 | my $magick_cmd = "";
|
---|
| 60 |
|
---|
| 61 |
|
---|
| 62 | # Construct the imagemagick cmd string from all the arguments,
|
---|
| 63 | # embedding any arguments that contain spaces in quotes.
|
---|
| 64 | # We'll remove the --options afterwards.
|
---|
| 65 | my $count = 0;
|
---|
| 66 | for ($count = 0; $count < scalar(@argv); $count++) {
|
---|
| 67 | if($argv[$count] =~ m/ /) {
|
---|
| 68 | $argv[$count] = "\"".$argv[$count]."\"";
|
---|
| 69 | }
|
---|
| 70 | $magick_cmd = "$magick_cmd $argv[$count]";
|
---|
| 71 | }
|
---|
| 72 |
|
---|
| 73 | # process the --options in the imagemagick command
|
---|
| 74 | # Tried using the official GetOptions module to parse options, except that
|
---|
| 75 | # the --verbosity|--v option to gs-magick.pl interfered with the -verbose
|
---|
| 76 | # option that image-magick accepts.
|
---|
| 77 |
|
---|
| 78 | if($magick_cmd =~ m/--usage/) {
|
---|
| 79 | print STDERR "$usage\n";
|
---|
| 80 | exit(0);
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | $magick_cmd =~ s/\s*--verbosity(\s+|=)(\d*)\s*/ /; # --verbosity=4 or --verbosity 4
|
---|
| 84 | $verbosity = $2 if defined $2; # print STDERR "subst 2 is : $2\n" if defined $2;
|
---|
| 85 |
|
---|
| 86 | if($verbosity > 2) {
|
---|
| 87 | print STDERR "***** Running MAGICK_CMD: $magick_cmd\n";
|
---|
| 88 | #print STDERR "***** verbosity: $verbosity\n";
|
---|
| 89 | }
|
---|
| 90 |
|
---|
| 91 | ## SET THE ENVIRONMENT AS USED TO BE DONE IN SETUP.BASH/BAT
|
---|
| 92 |
|
---|
| 93 | my $magick_home = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}.$ENV{'GSDLARCH'},"imagemagick");
|
---|
| 94 | if (-d $magick_home) { # "$GSDLHOME/bin/$GSDLOS$GSDLARCH/imagemagick"
|
---|
| 95 | $ENV{'MAGICK_HOME'} = $magick_home;
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 | # if Greenstone came with imagick, or if the user otherwise has an
|
---|
| 99 | # imagick to fall back on (and set MAGICK_HOME that way) we use that
|
---|
| 100 | if(defined $ENV{'MAGICK_HOME'} && -d $ENV{'MAGICK_HOME'}) {
|
---|
| 101 | &util::envvar_prepend("PATH", &util::filename_cat($ENV{'MAGICK_HOME'}, "bin"));
|
---|
| 102 |
|
---|
| 103 | my $magick_lib = &util::filename_cat($ENV{'MAGICK_HOME'}, "lib");
|
---|
| 104 | if($ENV{'GSDLOS'} eq "linux") {
|
---|
| 105 | &util::envvar_prepend("LD_LIBRARY_PATH", $magick_lib);
|
---|
| 106 | } elsif ($ENV{'GSDLOS'} eq "darwin") {
|
---|
| 107 | &util::envvar_prepend("DYLD_LIBRARY_PATH", $magick_lib);
|
---|
| 108 | }
|
---|
| 109 |
|
---|
| 110 | if($verbosity > 2) {
|
---|
| 111 | print STDERR "\t*** MAGICK_HOME".$ENV{'MAGICK_HOME'}."\n";
|
---|
| 112 | print STDERR "\t*** LD_LIB_PATH".$ENV{'LD_LIBRARY_PATH'}."\n";
|
---|
| 113 | print STDERR "\t*** PATH".$ENV{'PATH'}."\n\n";
|
---|
| 114 | }
|
---|
| 115 | }
|
---|
| 116 |
|
---|
| 117 | # if no MAGICK_HOME, maybe they want to run with the system imagemagick
|
---|
| 118 | elsif($verbosity > 2) {
|
---|
| 119 | print STDERR "**** No ImageMagick in Greenstone. Will try to use any imagemagick on the system.\n\n";
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | # RUN THE IMAGEMAGICK COMMAND
|
---|
| 123 |
|
---|
| 124 | # John Thompson's manner of using backticks to preserve the output of
|
---|
| 125 | # running imagemagick.
|
---|
| 126 | # $? contains the exit code of running the imagemagick command.
|
---|
| 127 | # This needs to be shifted by 8 and then converted to be a signed value
|
---|
| 128 | # to work out the actual exit code value.
|
---|
| 129 |
|
---|
| 130 | #my $result = `$magick_cmd`; # This way will trap STDOUT into local variable
|
---|
| 131 |
|
---|
[24601] | 132 | my $result = "";
|
---|
[24600] | 133 | if (!open(PIN, "$magick_cmd |")) {
|
---|
| 134 | print STDERR "*** Can't run $magick_cmd. Error was: $!";
|
---|
[24601] | 135 | } else {
|
---|
| 136 | while (defined (my $imagick_output_line = <PIN>)) {
|
---|
| 137 | $result = $result.$imagick_output_line;
|
---|
| 138 | }
|
---|
| 139 | close(PIN);
|
---|
[24600] | 140 | }
|
---|
| 141 |
|
---|
| 142 | # Perl Special Variables http://www.kichwa.com/quik_ref/spec_variables.html
|
---|
| 143 | # $? The status returned by the last pipe close, backtick(``) command or system operator.
|
---|
| 144 | # Note that this is the status word returned by the wait() system call, so the exit value
|
---|
| 145 | # of the subprocess is actually ($? >>*). $? & 255 gives which signal, if any, the process
|
---|
| 146 | # died from, and whether there was a core dump.
|
---|
| 147 |
|
---|
| 148 | # Shift by 8 to get a value between 0 and 255, then work out if it is signed or unsigned
|
---|
| 149 | # http://stackoverflow.com/questions/2726447/why-is-the-exit-code-255-instead-of-1-in-perl
|
---|
| 150 | my $status = $?;
|
---|
| 151 | $status >>= 8;
|
---|
| 152 | $status = (($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status);
|
---|
| 153 |
|
---|
| 154 | # send the output to STDOUT, since calling functions may call gs-magick.pl with backticks
|
---|
| 155 | print STDOUT $result;
|
---|
| 156 | exit($status);
|
---|
| 157 | }
|
---|
| 158 |
|
---|
| 159 | &main(scalar(@ARGV),@ARGV);
|
---|