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

Last change on this file since 24831 was 24831, checked in by ak19, 12 years ago

Another minor change: if no parameters given, the gs-magick.pl script still needs to print out the usage message.

  • Property svn:executable set to *
File size: 6.3 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|--help|--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|--help/) {
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(!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
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'}) {
103 if($ENV{'GSDLOS'} =~ m/windows/) {
104 &util::envvar_prepend("PATH", $ENV{'MAGICK_HOME'}); # the imagemagick folder (no bin therein)
105 }
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 }
117
118 if($verbosity > 2) {
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";
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
141 my $result = "";
142 if (!open(PIN, "$magick_cmd |")) {
143 print STDERR "*** Can't run $magick_cmd. Error was: $!.\n\n";
144 } else {
145 while (defined (my $imagick_output_line = <PIN>)) {
146 $result = $result.$imagick_output_line;
147 }
148 close(PIN);
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);
Note: See TracBrowser for help on using the repository browser.