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'};
|
---|
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 |
|
---|
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 |
|
---|
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);
|
---|