source: main/trunk/greenstone2/bin/script/gs-magick.pl@ 24829

Last change on this file since 24829 was 24785, checked in by ak19, 13 years ago

GSDLARCH is only set on some Linux systems. Not set on the CentOS here, for example. So the code can't die if this is not set.

  • Property svn:executable set to *
File size: 6.1 KB
Line 
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
36BEGIN {
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'};
39 $ENV{'GSDLARCH'} = "" unless defined $ENV{'GSDLARCH'}; # GSDLARCH will be set only on some Linux systems
40 unshift (@INC, "$ENV{'GSDLHOME'}/perllib");
41}
42
43
44use strict;
45no strict 'refs'; # make an exception so we can use variables as filehandles
46use util;
47
48
49sub main
50{
51 my ($argc,@argv) = @_;
52
53 my $usage = "Usage: $0 [--usage|--verbosity <num>] <imagick-command> <arguments to imagick command>";
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
75 if($magick_cmd =~ m/--usage/) {
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
83 if($verbosity > 2) {
84 print STDERR "***** Running MAGICK_CMD: $magick_cmd\n";
85 #print STDERR "***** verbosity: $verbosity\n";
86 }
87
88 ## SET THE ENVIRONMENT AS USED TO BE DONE IN SETUP.BASH/BAT
89
90 my $magick_home = &util::filename_cat($ENV{'GSDLHOME'},"bin",$ENV{'GSDLOS'}.$ENV{'GSDLARCH'},"imagemagick");
91 if (-d $magick_home) { # "$GSDLHOME/bin/$GSDLOS$GSDLARCH/imagemagick"
92 $ENV{'MAGICK_HOME'} = $magick_home;
93 }
94
95 # if Greenstone came with imagick, or if the user otherwise has an
96 # imagick to fall back on (and set MAGICK_HOME that way) we use that
97 if(defined $ENV{'MAGICK_HOME'} && -d $ENV{'MAGICK_HOME'}) {
98 if($ENV{'GSDLOS'} =~ m/windows/) {
99 &util::envvar_prepend("PATH", $ENV{'MAGICK_HOME'}); # the imagemagick folder (no bin therein)
100 }
101
102 else { # linux and mac
103 &util::envvar_prepend("PATH", &util::filename_cat($ENV{'MAGICK_HOME'}, "bin"));
104
105 my $magick_lib = &util::filename_cat($ENV{'MAGICK_HOME'}, "lib");
106 if($ENV{'GSDLOS'} eq "linux") {
107 &util::envvar_prepend("LD_LIBRARY_PATH", $magick_lib);
108 } elsif ($ENV{'GSDLOS'} eq "darwin") {
109 &util::envvar_prepend("DYLD_LIBRARY_PATH", $magick_lib);
110 }
111 }
112
113 if($verbosity > 2) {
114 print STDERR "\t*** MAGICK_HOME".$ENV{'MAGICK_HOME'}."\n";
115 print STDERR "\t*** LD_LIB_PATH".$ENV{'LD_LIBRARY_PATH'}."\n" if defined $ENV{'LD_LIBRARY_PATH'};
116 print STDERR "\t*** DYLD_LIB_PATH".$ENV{'DYLD_LIBRARY_PATH'}."\n" if defined $ENV{'DYLD_LIBRARY_PATH'};
117 print STDERR "\t*** PATH".$ENV{'PATH'}."\n\n";
118 }
119 }
120
121 # if no MAGICK_HOME, maybe they want to run with the system imagemagick
122 elsif($verbosity > 2) {
123 print STDERR "**** No ImageMagick in Greenstone. Will try to use any imagemagick on the system.\n\n";
124 }
125
126 # RUN THE IMAGEMAGICK COMMAND
127
128 # John Thompson's manner of using backticks to preserve the output of
129 # running imagemagick.
130 # $? contains the exit code of running the imagemagick command.
131 # This needs to be shifted by 8 and then converted to be a signed value
132 # to work out the actual exit code value.
133
134 #my $result = `$magick_cmd`; # This way will trap STDOUT into local variable
135
136 my $result = "";
137 if (!open(PIN, "$magick_cmd |")) {
138 print STDERR "*** Can't run $magick_cmd. Error was: $!";
139 } else {
140 while (defined (my $imagick_output_line = <PIN>)) {
141 $result = $result.$imagick_output_line;
142 }
143 close(PIN);
144 }
145
146 # Perl Special Variables http://www.kichwa.com/quik_ref/spec_variables.html
147 # $? The status returned by the last pipe close, backtick(``) command or system operator.
148 # Note that this is the status word returned by the wait() system call, so the exit value
149 # of the subprocess is actually ($? >>*). $? & 255 gives which signal, if any, the process
150 # died from, and whether there was a core dump.
151
152 # Shift by 8 to get a value between 0 and 255, then work out if it is signed or unsigned
153 # http://stackoverflow.com/questions/2726447/why-is-the-exit-code-255-instead-of-1-in-perl
154 my $status = $?;
155 $status >>= 8;
156 $status = (($status & 0x80) ? -(0x100 - ($status & 0xFF)) : $status);
157
158 # send the output to STDOUT, since calling functions may call gs-magick.pl with backticks
159 print STDOUT $result;
160 exit($status);
161}
162
163&main(scalar(@ARGV),@ARGV);
Note: See TracBrowser for help on using the repository browser.