1 # autoconf -- create `configure' using m4 macros
2 # Copyright (C) 2001-2004, 2006-2007, 2009-2012 Free Software
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 package Autom4te
::General
;
22 Autom4te::General - general support functions for Autoconf and Automake
30 This perl module provides various general purpose support functions
31 used in several executables of the Autoconf and Automake packages.
37 use Autom4te
::ChannelDefs
;
38 use Autom4te
::Channels
;
39 use Autom4te
::Getopt
();
47 use vars qw
(@ISA @EXPORT);
51 # Variables we define and export.
53 qw
($debug $force $help $me $tmp $verbose $version);
55 # Functions we define and export.
58 &getopt
&shell_quote
&mktmpdir
61 # Functions we forward (coming from modules we use).
62 my @export_forward_subs =
63 qw
(&basename
&dirname
&fileparse
);
65 @EXPORT = (@export_vars, @export_subs, @export_forward_subs);
68 # Variable we share with the main package. Be sure to have a single
69 # copy of them: using `my' together with multiple inclusion of this
70 # package would introduce several copies.
72 =head2 Global Variables
78 Set this variable to 1 if debug messages should be enabled. Debug
79 messages are meant for developers only, or when tracking down an
89 Set this variable to 1 to recreate all the files, or to consider all
90 the output files are obsolete.
99 Set to the help message associated with the option C<--help>.
108 The name of this application, for diagnostic messages.
117 The name of the temporary directory created by C<mktmpdir>. Left
128 Enable verbosity messages. These messages are meant for ordinary
129 users, and typically make explicit the steps being performed.
133 use vars qw
($verbose);
138 Set to the version message associated to the option C<--version>.
142 use vars qw
($version);
161 Filter Perl's exit codes, delete any temporary directory (unless
162 C<$debug>), and exit nonzero whenever closing C<STDOUT> fails.
170 # $? contains the exit status we will return.
171 # It was set using one of the following ways:
173 # 1) normal termination
175 # 2) calling `exit (n)'
177 # 3) calling die or friends (croak, confess...):
178 # a) when $! is non-0
180 # b) when $! is 0 but $? is not
181 # this sets $? = ($? >> 8) (i.e., the exit code of the
182 # last program executed)
183 # c) when both $! and $? are 0
186 # Cases 1), 2), and 3b) are fine, but we prefer $? = 1 for 3a) and 3c).
188 $status = 1 if ($! && $! == $?
) || $?
== 255;
189 # (Note that we cannot safely distinguish calls to `exit (n)'
190 # from calls to die when `$! = n'. It's not big deal because
191 # we only call `exit (0)' or `exit (1)'.)
193 if (!$debug && defined $tmp && -d
$tmp)
195 local $SIG{__WARN__
} = sub { $status = 1; warn $_[0] };
196 File
::Path
::rmtree
$tmp;
199 # This is required if the code might send any output to stdout
200 # E.g., even --version or --help. So it's best to do it unconditionally.
203 print STDERR
"$me: closing standard output: $!\n";
217 =item C<debug (@message)>
219 If the debug mode is enabled (C<$debug> and C<$verbose>), report the
220 C<@message> on C<STDERR>, signed with the name of the program.
226 # Messages displayed only if $DEBUG and $VERBOSE.
229 print STDERR
"$me: ", @_, "\n"
230 if $verbose && $debug;
234 =item C<getopt (%option)>
236 Wrapper around C<Autom4te::Getopt::parse_options>. In addition to
237 the user C<option>s, support C<-h>/C<--help>, C<-V>/C<--version>,
238 C<-v>/C<--verbose>, C<-d>/C<--debug>, C<-f>/C<--force>. Conform to
239 the GNU Coding Standards for error messages.
245 # Handle the %OPTION, plus all the common options.
249 %option = ("h|help" => sub { print $help; exit 0 },
250 "V|version" => sub { print $version; exit 0 },
252 "v|verbose" => sub { ++$verbose },
253 "d|debug" => sub { ++$debug },
254 'f|force' => \
$force,
256 # User options last, so that they have precedence.
258 Autom4te
::Getopt
::parse_options
(%option);
260 setup_channel
'note', silent
=> !$verbose;
261 setup_channel
'verb', silent
=> !$verbose;
265 =item C<shell_quote ($file_name)>
267 Quote C<$file_name> for the shell.
272 # shell_quote ($FILE_NAME)
273 # ------------------------
274 # If the string $S is a well-behaved file name, simply return it.
275 # If it contains white space, quotes, etc., quote it, and return
280 if ($s =~ m![^\w+/.,-]!)
282 # Convert each single quote to '\''
283 $s =~ s/\'/\'\\\'\'/g;
284 # Then single quote the string.
290 =item C<mktmpdir ($signature)>
292 Create a temporary directory which name is based on C<$signature>.
293 Store its name in C<$tmp>. C<END> is in charge of removing it, unless
298 # mktmpdir ($SIGNATURE)
299 # ---------------------
302 my ($signature) = @_;
303 my $TMPDIR = $ENV{'TMPDIR'} || '/tmp';
304 my $quoted_tmpdir = shell_quote
($TMPDIR);
306 # If mktemp supports dirs, use it.
307 $tmp = `(umask 077 &&
308 mktemp -d $quoted_tmpdir/"${signature}XXXXXX") 2>/dev/null`;
311 if (!$tmp || ! -d
$tmp)
313 $tmp = "$TMPDIR/$signature" . int (rand 10000) . ".$$";
315 or croak
"$me: cannot create $tmp: $!\n";
318 print STDERR
"$me:$$: working in $tmp\n"
323 =item C<uniq (@list)>
325 Return C<@list> with no duplicates, keeping only the first
337 foreach my $item (@_)
339 if (! exists $seen{$item})
345 return wantarray ?
@res : "@res";
349 =item C<handle_exec_errors ($command)>
351 Display an error message for C<$command>, based on the content of
357 # handle_exec_errors ($COMMAND)
358 # -----------------------------
359 sub handle_exec_errors
($)
363 $command = (split (' ', $command))[0];
366 error
"failed to run $command: $!";
370 use POSIX qw
(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG
);
374 my $status = WEXITSTATUS
($?
);
375 # WIFEXITED and WEXITSTATUS can alter $!, reset it so that
376 # error() actually propagates the command's exit status, not $!.
378 error
"$command failed with exit status: $status";
380 elsif (WIFSIGNALED
($?
))
382 my $signal = WTERMSIG
($?
);
383 # In this case we prefer to exit with status 1.
385 error
"$command terminated by signal: $signal";
389 error
"$command exited abnormally";
402 Written by Alexandre Duret-Lutz E<lt>F<adl@gnu.org>E<gt> and Akim
403 Demaille E<lt>F<akim@freefriends.org>E<gt>.
411 ### Setup "GNU" style for perl-mode and cperl-mode.
413 ## perl-indent-level: 2
414 ## perl-continued-statement-offset: 2
415 ## perl-continued-brace-offset: 0
416 ## perl-brace-offset: 0
417 ## perl-brace-imaginary-offset: 0
418 ## perl-label-offset: -2
419 ## cperl-indent-level: 2
420 ## cperl-brace-offset: 0
421 ## cperl-continued-brace-offset: 0
422 ## cperl-label-offset: -2
423 ## cperl-extra-newline-before-brace: t
424 ## cperl-merge-trailing-else: nil
425 ## cperl-continued-statement-offset: 2