tests: move coverage about BUILT_SOURCES
[automake.git] / lib / Automake / Options.pm
blob2f977bd543e5f62a866e83f3f82f1c8943e69636
1 # Copyright (C) 2003-2012 Free Software Foundation, Inc.
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2, or (at your option)
6 # any later version.
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
13 # You should have received a copy of the GNU General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 package Automake::Options;
18 use 5.006;
19 use strict;
20 use Exporter;
21 use Automake::Config;
22 use Automake::ChannelDefs;
23 use Automake::Channels;
24 use Automake::Version;
26 use vars qw (@ISA @EXPORT);
28 @ISA = qw (Exporter);
29 @EXPORT = qw (option global_option
30 set_option set_global_option
31 unset_option unset_global_option
32 process_option_list process_global_option_list
33 set_strictness $strictness $strictness_name
34 &FOREIGN &GNU &GNITS);
36 =head1 NAME
38 Automake::Options - keep track of Automake options
40 =head1 SYNOPSIS
42 use Automake::Options;
44 # Option lookup and setting.
45 $opt = option 'name';
46 $opt = global_option 'name';
47 set_option 'name', 'value';
48 set_global_option 'name', 'value';
49 unset_option 'name';
50 unset_global_option 'name';
52 # Batch option setting.
53 process_option_list $location, @names;
54 process_global_option_list $location, @names;
56 # Strictness lookup and setting.
57 set_strictness 'foreign';
58 set_strictness 'gnu';
59 set_strictness 'gnits';
60 if ($strictness >= GNU) { ... }
61 print "$strictness_name\n";
63 =head1 DESCRIPTION
65 This packages manages Automake's options and strictness settings.
66 Options can be either local or global. Local options are set using an
67 C<AUTOMAKE_OPTIONS> variable in a F<Makefile.am> and apply only to
68 this F<Makefile.am>. Global options are set from the command line or
69 passed as an argument to C<AM_INIT_AUTOMAKE>, they apply to all
70 F<Makefile.am>s.
72 =cut
74 # Values are the Automake::Location of the definition.
75 use vars '%_options'; # From AUTOMAKE_OPTIONS
76 use vars '%_global_options'; # From AM_INIT_AUTOMAKE or the command line.
78 # Whether process_option_list has already been called for the current
79 # Makefile.am.
80 use vars '$_options_processed';
81 # Whether process_global_option_list has already been called.
82 use vars '$_global_options_processed';
84 =head2 Constants
86 =over 4
88 =item FOREIGN
90 =item GNU
92 =item GNITS
94 Strictness constants used as values for C<$strictness>.
96 =back
98 =cut
100 # Constants to define the "strictness" level.
101 use constant FOREIGN => 0;
102 use constant GNU => 1;
103 use constant GNITS => 2;
105 =head2 Variables
107 =over 4
109 =item C<$strictness>
111 The current strictness. One of C<FOREIGN>, C<GNU>, or C<GNITS>.
113 =item C<$strictness_name>
115 The current strictness name. One of C<'foreign'>, C<'gnu'>, or C<'gnits'>.
117 =back
119 =cut
121 # Strictness levels.
122 use vars qw ($strictness $strictness_name);
124 # Strictness level as set on command line.
125 use vars qw ($_default_strictness $_default_strictness_name);
128 =head2 Functions
130 =over 4
132 =item C<Automake::Options::reset>
134 Reset the options variables for the next F<Makefile.am>.
136 In other words, this gets rid of all local options in use by the
137 previous F<Makefile.am>.
139 =cut
141 sub reset ()
143 $_options_processed = 0;
144 %_options = %_global_options;
145 # The first time we are run,
146 # remember the current setting as the default.
147 if (defined $_default_strictness)
149 $strictness = $_default_strictness;
150 $strictness_name = $_default_strictness_name;
152 else
154 $_default_strictness = $strictness;
155 $_default_strictness_name = $strictness_name;
159 =item C<$value = option ($name)>
161 =item C<$value = global_option ($name)>
163 Query the state of an option. If the option is unset, this
164 returns the empty list. Otherwise it returns the option's value,
165 as set by C<set_option> or C<set_global_option>.
167 Note that C<global_option> should be used only when it is
168 important to make sure an option hasn't been set locally.
169 Otherwise C<option> should be the standard function to
170 check for options (be they global or local).
172 =cut
174 sub option ($)
176 my ($name) = @_;
177 return () unless defined $_options{$name};
178 return $_options{$name};
181 sub global_option ($)
183 my ($name) = @_;
184 return () unless defined $_global_options{$name};
185 return $_global_options{$name};
188 =item C<set_option ($name, $value)>
190 =item C<set_global_option ($name, $value)>
192 Set an option. By convention, C<$value> is usually the location
193 of the option definition.
195 =cut
197 sub set_option ($$)
199 my ($name, $value) = @_;
200 $_options{$name} = $value;
203 sub set_global_option ($$)
205 my ($name, $value) = @_;
206 $_global_options{$name} = $value;
210 =item C<unset_option ($name)>
212 =item C<unset_global_option ($name)>
214 Unset an option.
216 =cut
218 sub unset_option ($)
220 my ($name) = @_;
221 delete $_options{$name};
224 sub unset_global_option ($)
226 my ($name) = @_;
227 delete $_global_options{$name};
231 =item C<process_option_list (@list)>
233 =item C<process_global_option_list (@list)>
235 Process Automake's option lists. C<@list> should be a list of hash
236 references with keys C<option> and C<where>, where C<option> is an
237 option as they occur in C<AUTOMAKE_OPTIONS> or C<AM_INIT_AUTOMAKE>,
238 and C<where> is the location where that option occurred.
240 These functions should be called at most once for each set of options
241 having the same precedence; i.e., do not call it twice for two options
242 from C<AM_INIT_AUTOMAKE>.
244 Return 1 on error, 0 otherwise.
246 =cut
248 # _option_must_be_from_configure ($OPTION, $WHERE)
249 # ----------------------------------------------
250 # Check that the $OPTION given in location $WHERE is specified with
251 # AM_INIT_AUTOMAKE, not with AUTOMAKE_OPTIONS.
252 sub _option_must_be_from_configure ($$)
254 my ($opt, $where)= @_;
255 return
256 if $where->get =~ /^configure\./;
257 error $where,
258 "option '$opt' can only be used as argument to AM_INIT_AUTOMAKE\n" .
259 "but not in AUTOMAKE_OPTIONS makefile statements";
262 # _is_valid_easy_option ($OPTION)
263 # -------------------------------
264 # Explicitly recognize valid automake options that require no
265 # special handling by '_process_option_list' below.
266 sub _is_valid_easy_option ($)
268 my $opt = shift;
269 return scalar grep { $opt eq $_ } qw(
270 check-news
271 color-tests
272 cygnus
273 dejagnu
274 dist-bzip2
275 dist-lzip
276 dist-shar
277 dist-tarZ
278 dist-xz
279 dist-zip
280 no-define
281 no-dependencies
282 no-dist
283 no-dist-gzip
284 no-exeext
285 no-installinfo
286 no-installman
287 no-texinfo.tex
288 nostdinc
289 readme-alpha
290 std-options
291 subdir-objects
295 # $BOOL
296 # _process_option_list (\%OPTIONS, @LIST)
297 # ------------------------------------------
298 # Process a list of options. \%OPTIONS is the hash to fill with options
299 # data. @LIST is a list of options as get passed to public subroutines
300 # process_option_list() and process_global_option_list() (see POD
301 # documentation above).
302 sub _process_option_list (\%@)
304 my ($options, @list) = @_;
305 my @warnings = ();
307 foreach my $h (@list)
309 local $_ = $h->{'option'};
310 my $where = $h->{'where'};
311 $options->{$_} = $where;
312 if ($_ eq 'gnits' || $_ eq 'gnu' || $_ eq 'foreign')
314 set_strictness ($_);
316 elsif (/^(.*\/)?ansi2knr$/)
318 # Obsolete (and now removed) de-ANSI-fication support.
319 error ($where,
320 "automatic de-ANSI-fication support has been removed");
322 elsif ($_ eq 'dist-lzma')
324 error ($where, "support for lzma-compressed distribution " .
325 "archives has been removed");
327 elsif ($_ eq 'parallel-tests')
329 # Just recognize it explicitly.
331 elsif ($_ eq 'serial-tests')
333 # This is a little of an hack, but good enough for the moment.
334 delete $options->{'parallel-tests'};
336 elsif (/^filename-length-max=(\d+)$/)
338 delete $options->{$_};
339 $options->{'filename-length-max'} = [$_, $1];
341 elsif ($_ eq 'silent-rules')
343 _option_must_be_from_configure ($_, $where);
345 elsif ($_ eq 'tar-v7' || $_ eq 'tar-ustar' || $_ eq 'tar-pax')
347 _option_must_be_from_configure ($_, $where);
348 for my $opt ('tar-v7', 'tar-ustar', 'tar-pax')
350 next
351 if $opt eq $_ or ! exists $options->{$opt};
352 error ($where,
353 "options '$_' and '$opt' are mutually exclusive");
354 last;
357 elsif (/^\d+\.\d+(?:\.\d+)?[a-z]?(?:-[A-Za-z0-9]+)?$/)
359 # Got a version number.
360 if (Automake::Version::check ($VERSION, $&))
362 error ($where, "require Automake $_, but have $VERSION",
363 uniq_scope => US_GLOBAL);
364 return 1;
367 elsif (/^(?:--warnings=|-W)(.*)$/)
369 my @w = map { { cat => $_, loc => $where} } split (',', $1);
370 push @warnings, @w;
372 elsif (! _is_valid_easy_option $_)
374 error ($where, "option '$_' not recognized",
375 uniq_scope => US_GLOBAL);
376 return 1;
379 # We process warnings here, so that any explicitly-given warning setting
380 # will take precedence over warning settings defined implicitly by the
381 # strictness.
382 foreach my $w (@warnings)
384 msg 'unsupported', $w->{'loc'},
385 "unknown warning category '$w->{'cat'}'"
386 if switch_warning $w->{cat};
388 return 0;
391 sub process_option_list (@)
393 prog_error "local options already processed"
394 if $_options_processed;
395 return _process_option_list (%_options, @_);
396 $_options_processed = 1;
399 sub process_global_option_list (@)
401 prog_error "global options already processed"
402 if $_global_options_processed;
403 return _process_option_list (%_global_options, @_);
404 $_global_options_processed = 1;
407 =item C<set_strictness ($name)>
409 Set the current strictness level.
410 C<$name> should be one of C<'foreign'>, C<'gnu'>, or C<'gnits'>.
412 =cut
414 # Set strictness.
415 sub set_strictness ($)
417 $strictness_name = $_[0];
419 Automake::ChannelDefs::set_strictness ($strictness_name);
421 if ($strictness_name eq 'gnu')
423 $strictness = GNU;
425 elsif ($strictness_name eq 'gnits')
427 $strictness = GNITS;
429 elsif ($strictness_name eq 'foreign')
431 $strictness = FOREIGN;
433 else
435 prog_error "level '$strictness_name' not recognized";
441 ### Setup "GNU" style for perl-mode and cperl-mode.
442 ## Local Variables:
443 ## perl-indent-level: 2
444 ## perl-continued-statement-offset: 2
445 ## perl-continued-brace-offset: 0
446 ## perl-brace-offset: 0
447 ## perl-brace-imaginary-offset: 0
448 ## perl-label-offset: -2
449 ## cperl-indent-level: 2
450 ## cperl-brace-offset: 0
451 ## cperl-continued-brace-offset: 0
452 ## cperl-label-offset: -2
453 ## cperl-extra-newline-before-brace: t
454 ## cperl-merge-trailing-else: nil
455 ## cperl-continued-statement-offset: 2
456 ## End: