Blame lib/Autom4te/ChannelDefs.pm

Packit 47b4ca
# Copyright (C) 2002-2003, 2006, 2008-2012 Free Software Foundation,
Packit 47b4ca
# Inc.
Packit 47b4ca
Packit 47b4ca
# This program is free software: you can redistribute it and/or modify
Packit 47b4ca
# it under the terms of the GNU General Public License as published by
Packit 47b4ca
# the Free Software Foundation, either version 3 of the License, or
Packit 47b4ca
# (at your option) any later version.
Packit 47b4ca
Packit 47b4ca
# This program is distributed in the hope that it will be useful,
Packit 47b4ca
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 47b4ca
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 47b4ca
# GNU General Public License for more details.
Packit 47b4ca
Packit 47b4ca
# You should have received a copy of the GNU General Public License
Packit 47b4ca
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 47b4ca
Packit 47b4ca
package Autom4te::ChannelDefs;
Packit 47b4ca
Packit 47b4ca
use Autom4te::Channels;
Packit 47b4ca
Packit 47b4ca
=head1 NAME
Packit 47b4ca
Packit 47b4ca
Autom4te::ChannelDefs - channel definitions for Automake and helper functions
Packit 47b4ca
Packit 47b4ca
=head1 SYNOPSIS
Packit 47b4ca
Packit 47b4ca
  use Autom4te::ChannelDefs;
Packit 47b4ca
Packit 47b4ca
  print Autom4te::ChannelDefs::usage (), "\n";
Packit 47b4ca
  prog_error ($MESSAGE, [%OPTIONS]);
Packit 47b4ca
  error ($WHERE, $MESSAGE, [%OPTIONS]);
Packit 47b4ca
  error ($MESSAGE);
Packit 47b4ca
  fatal ($WHERE, $MESSAGE, [%OPTIONS]);
Packit 47b4ca
  fatal ($MESSAGE);
Packit 47b4ca
  verb ($MESSAGE, [%OPTIONS]);
Packit 47b4ca
  switch_warning ($CATEGORY);
Packit 47b4ca
  parse_WARNINGS ();
Packit 47b4ca
  parse_warnings ($OPTION, @ARGUMENT);
Packit 47b4ca
  Autom4te::ChannelDefs::set_strictness ($STRICTNESS_NAME);
Packit 47b4ca
Packit 47b4ca
=head1 DESCRIPTION
Packit 47b4ca
Packit 47b4ca
This package defines channels that can be used in Automake to
Packit 47b4ca
output diagnostics and other messages (via C<msg()>).  It also defines
Packit 47b4ca
some helper function to enable or disable these channels, and some
Packit 47b4ca
shorthand function to output on specific channels.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
use 5.006;
Packit 47b4ca
use strict;
Packit 47b4ca
use Exporter;
Packit 47b4ca
Packit 47b4ca
use vars qw (@ISA @EXPORT);
Packit 47b4ca
Packit 47b4ca
@ISA = qw (Exporter);
Packit 47b4ca
@EXPORT = qw (&prog_error &error &fatal &verb
Packit 47b4ca
	      &switch_warning &parse_WARNINGS &parse_warnings);
Packit 47b4ca
Packit 47b4ca
=head2 CHANNELS
Packit 47b4ca
Packit 47b4ca
The following channels can be used as the first argument of
Packit 47b4ca
C<Autom4te::Channel::msg>.  For some of them we list a shorthand
Packit 47b4ca
function that makes the code more readable.
Packit 47b4ca
Packit 47b4ca
=over 4
Packit 47b4ca
Packit 47b4ca
=item C<fatal>
Packit 47b4ca
Packit 47b4ca
Fatal errors.  Use C<&fatal> to send messages over this channel.
Packit 47b4ca
Packit 47b4ca
=item C<error>
Packit 47b4ca
Packit 47b4ca
Common errors.  Use C<&error> to send messages over this channel.
Packit 47b4ca
Packit 47b4ca
=item C<error-gnu>
Packit 47b4ca
Packit 47b4ca
Errors related to GNU Standards.
Packit 47b4ca
Packit 47b4ca
=item C<error-gnu/warn>
Packit 47b4ca
Packit 47b4ca
Errors related to GNU Standards that should be warnings in "foreign" mode.
Packit 47b4ca
Packit 47b4ca
=item C<error-gnits>
Packit 47b4ca
Packit 47b4ca
Errors related to GNITS Standards (silent by default).
Packit 47b4ca
Packit 47b4ca
=item C<automake>
Packit 47b4ca
Packit 47b4ca
Internal errors.  Use C<&prog_error> to send messages over this channel.
Packit 47b4ca
Packit 47b4ca
=item C<cross>
Packit 47b4ca
Packit 47b4ca
Constructs compromising the cross-compilation of the package.
Packit 47b4ca
Packit 47b4ca
=item C<gnu>
Packit 47b4ca
Packit 47b4ca
Warnings related to GNU Coding Standards.
Packit 47b4ca
Packit 47b4ca
=item C<obsolete>
Packit 47b4ca
Packit 47b4ca
Warnings about obsolete features (silent by default).
Packit 47b4ca
Packit 47b4ca
=item C<override>
Packit 47b4ca
Packit 47b4ca
Warnings about user redefinitions of Automake rules or
Packit 47b4ca
variables (silent by default).
Packit 47b4ca
Packit 47b4ca
=item C<portability>
Packit 47b4ca
Packit 47b4ca
Warnings about non-portable constructs.
Packit 47b4ca
Packit 47b4ca
=item C<syntax>
Packit 47b4ca
Packit 47b4ca
Warnings about weird syntax, unused variables, typos ...
Packit 47b4ca
Packit 47b4ca
=item C<unsupported>
Packit 47b4ca
Packit 47b4ca
Warnings about unsupported (or mis-supported) features.
Packit 47b4ca
Packit 47b4ca
=item C<verb>
Packit 47b4ca
Packit 47b4ca
Messages output in C<--verbose> mode.  Use C<&verb> to send such messages.
Packit 47b4ca
Packit 47b4ca
=item C<note>
Packit 47b4ca
Packit 47b4ca
Informative messages.
Packit 47b4ca
Packit 47b4ca
=back
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
# Initialize our list of error/warning channels.
Packit 47b4ca
# Do not forget to update &usage and the manual
Packit 47b4ca
# if you add or change a warning channel.
Packit 47b4ca
Packit 47b4ca
register_channel 'fatal', type => 'fatal', ordered => 0;
Packit 47b4ca
register_channel 'error', type => 'error';
Packit 47b4ca
register_channel 'error-gnu', type => 'error';
Packit 47b4ca
register_channel 'error-gnu/warn', type => 'error';
Packit 47b4ca
register_channel 'error-gnits', type => 'error', silent => 1;
Packit 47b4ca
register_channel 'automake', type => 'fatal', backtrace => 1,
Packit 47b4ca
  header => ("####################\n" .
Packit 47b4ca
	     "## Internal Error ##\n" .
Packit 47b4ca
	     "####################\n"),
Packit 47b4ca
  footer => "\nPlease contact <bug-automake\@gnu.org>.",
Packit 47b4ca
  ordered => 0;
Packit 47b4ca
Packit 47b4ca
register_channel 'cross', type => 'warning', silent => 1;
Packit 47b4ca
register_channel 'gnu', type => 'warning';
Packit 47b4ca
register_channel 'obsolete', type => 'warning', silent => 1;
Packit 47b4ca
register_channel 'override', type => 'warning', silent => 1;
Packit 47b4ca
register_channel 'portability', type => 'warning', silent => 1;
Packit 47b4ca
register_channel 'syntax', type => 'warning';
Packit 47b4ca
register_channel 'unsupported', type => 'warning';
Packit 47b4ca
Packit 47b4ca
register_channel 'verb', type => 'debug', silent => 1, ordered => 0;
Packit 47b4ca
register_channel 'note', type => 'debug', silent => 0;
Packit 47b4ca
Packit 47b4ca
=head2 FUNCTIONS
Packit 47b4ca
Packit 47b4ca
=over 4
Packit 47b4ca
Packit 47b4ca
=item C<usage ()>
Packit 47b4ca
Packit 47b4ca
Return the warning category descriptions.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub usage ()
Packit 47b4ca
{
Packit 47b4ca
  return "Warning categories include:
Packit 47b4ca
  `cross'         cross compilation issues
Packit 47b4ca
  `gnu'           GNU coding standards (default in gnu and gnits modes)
Packit 47b4ca
  `obsolete'      obsolete features or constructions
Packit 47b4ca
  `override'      user redefinitions of Automake rules or variables
Packit 47b4ca
  `portability'   portability issues (default in gnu and gnits modes)
Packit 47b4ca
  `syntax'        dubious syntactic constructs (default)
Packit 47b4ca
  `unsupported'   unsupported or incomplete features (default)
Packit 47b4ca
  `all'           all the warnings
Packit 47b4ca
  `no-CATEGORY'   turn off warnings in CATEGORY
Packit 47b4ca
  `none'          turn off all the warnings
Packit 47b4ca
  `error'         treat warnings as errors";
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<prog_error ($MESSAGE, [%OPTIONS])>
Packit 47b4ca
Packit 47b4ca
Signal a programming error (on channel C<automake>),
Packit 47b4ca
display C<$MESSAGE>, and exit 1.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub prog_error ($;%)
Packit 47b4ca
{
Packit 47b4ca
  my ($msg, %opts) = @_;
Packit 47b4ca
  msg 'automake', '', $msg, %opts;
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<error ($WHERE, $MESSAGE, [%OPTIONS])>
Packit 47b4ca
Packit 47b4ca
=item C<error ($MESSAGE)>
Packit 47b4ca
Packit 47b4ca
Uncategorized errors.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub error ($;$%)
Packit 47b4ca
{
Packit 47b4ca
  my ($where, $msg, %opts) = @_;
Packit 47b4ca
  msg ('error', $where, $msg, %opts);
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<fatal ($WHERE, $MESSAGE, [%OPTIONS])>
Packit 47b4ca
Packit 47b4ca
=item C<fatal ($MESSAGE)>
Packit 47b4ca
Packit 47b4ca
Fatal errors.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub fatal ($;$%)
Packit 47b4ca
{
Packit 47b4ca
  my ($where, $msg, %opts) = @_;
Packit 47b4ca
  msg ('fatal', $where, $msg, %opts);
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<verb ($MESSAGE, [%OPTIONS])>
Packit 47b4ca
Packit 47b4ca
C<--verbose> messages.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub verb ($;%)
Packit 47b4ca
{
Packit 47b4ca
  my ($msg, %opts) = @_;
Packit 47b4ca
  msg 'verb', '', $msg, %opts;
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<switch_warning ($CATEGORY)>
Packit 47b4ca
Packit 47b4ca
If C<$CATEGORY> is C<mumble>, turn on channel C<mumble>.
Packit 47b4ca
If it is C<no-mumble>, turn C<mumble> off.
Packit 47b4ca
Else handle C<all> and C<none> for completeness.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub switch_warning ($)
Packit 47b4ca
{
Packit 47b4ca
  my ($cat) = @_;
Packit 47b4ca
  my $has_no = 0;
Packit 47b4ca
Packit 47b4ca
  if ($cat =~ /^no-(.*)$/)
Packit 47b4ca
    {
Packit 47b4ca
      $cat = $1;
Packit 47b4ca
      $has_no = 1;
Packit 47b4ca
    }
Packit 47b4ca
Packit 47b4ca
  if ($cat eq 'all')
Packit 47b4ca
    {
Packit 47b4ca
      setup_channel_type 'warning', silent => $has_no;
Packit 47b4ca
    }
Packit 47b4ca
  elsif ($cat eq 'none')
Packit 47b4ca
    {
Packit 47b4ca
      setup_channel_type 'warning', silent => ! $has_no;
Packit 47b4ca
    }
Packit 47b4ca
  elsif ($cat eq 'error')
Packit 47b4ca
    {
Packit 47b4ca
      $warnings_are_errors = ! $has_no;
Packit 47b4ca
      # Set exit code if Perl warns about something
Packit 47b4ca
      # (like uninitialized variables).
Packit 47b4ca
      $SIG{"__WARN__"} =
Packit 47b4ca
	$has_no ? 'DEFAULT' : sub { print STDERR @_; $exit_code = 1; };
Packit 47b4ca
    }
Packit 47b4ca
  elsif (channel_type ($cat) eq 'warning')
Packit 47b4ca
    {
Packit 47b4ca
      setup_channel $cat, silent => $has_no;
Packit 47b4ca
    }
Packit 47b4ca
  else
Packit 47b4ca
    {
Packit 47b4ca
      return 1;
Packit 47b4ca
    }
Packit 47b4ca
  return 0;
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<parse_WARNINGS ()>
Packit 47b4ca
Packit 47b4ca
Parse the WARNINGS environment variable.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub parse_WARNINGS ()
Packit 47b4ca
{
Packit 47b4ca
  if (exists $ENV{'WARNINGS'})
Packit 47b4ca
    {
Packit 47b4ca
      # Ignore unknown categories.  This is required because WARNINGS
Packit 47b4ca
      # should be honored by many tools.
Packit 47b4ca
      switch_warning $_ foreach (split (',', $ENV{'WARNINGS'}));
Packit 47b4ca
    }
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<parse_warnings ($OPTION, @ARGUMENT)>
Packit 47b4ca
Packit 47b4ca
Parse the argument of C<--warning=CATEGORY> or C<-WCATEGORY>.
Packit 47b4ca
Packit 47b4ca
C<$OPTIONS> is C<"--warning"> or C<"-W">, C<@ARGUMENT> is a list of
Packit 47b4ca
C<CATEGORY>.
Packit 47b4ca
Packit 47b4ca
This can be used as an argument to C<Getopt>.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub parse_warnings ($@)
Packit 47b4ca
{
Packit 47b4ca
  my ($opt, @categories) = @_;
Packit 47b4ca
Packit 47b4ca
  foreach my $cat (map { split ',' } @categories)
Packit 47b4ca
    {
Packit 47b4ca
      msg 'unsupported', "unknown warning category `$cat'"
Packit 47b4ca
	if switch_warning $cat;
Packit 47b4ca
    }
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=item C<set_strictness ($STRICTNESS_NAME)>
Packit 47b4ca
Packit 47b4ca
Configure channels for strictness C<$STRICTNESS_NAME>.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
sub set_strictness ($)
Packit 47b4ca
{
Packit 47b4ca
  my ($name) = @_;
Packit 47b4ca
Packit 47b4ca
  if ($name eq 'gnu')
Packit 47b4ca
    {
Packit 47b4ca
      setup_channel 'error-gnu', silent => 0;
Packit 47b4ca
      setup_channel 'error-gnu/warn', silent => 0, type => 'error';
Packit 47b4ca
      setup_channel 'error-gnits', silent => 1;
Packit 47b4ca
      setup_channel 'portability', silent => 0;
Packit 47b4ca
      setup_channel 'gnu', silent => 0;
Packit 47b4ca
    }
Packit 47b4ca
  elsif ($name eq 'gnits')
Packit 47b4ca
    {
Packit 47b4ca
      setup_channel 'error-gnu', silent => 0;
Packit 47b4ca
      setup_channel 'error-gnu/warn', silent => 0, type => 'error';
Packit 47b4ca
      setup_channel 'error-gnits', silent => 0;
Packit 47b4ca
      setup_channel 'portability', silent => 0;
Packit 47b4ca
      setup_channel 'gnu', silent => 0;
Packit 47b4ca
    }
Packit 47b4ca
  elsif ($name eq 'foreign')
Packit 47b4ca
    {
Packit 47b4ca
      setup_channel 'error-gnu', silent => 1;
Packit 47b4ca
      setup_channel 'error-gnu/warn', silent => 0, type => 'warning';
Packit 47b4ca
      setup_channel 'error-gnits', silent => 1;
Packit 47b4ca
      setup_channel 'portability', silent => 1;
Packit 47b4ca
      setup_channel 'gnu', silent => 1;
Packit 47b4ca
    }
Packit 47b4ca
  else
Packit 47b4ca
    {
Packit 47b4ca
      prog_error "level `$name' not recognized\n";
Packit 47b4ca
    }
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
=back
Packit 47b4ca
Packit 47b4ca
=head1 SEE ALSO
Packit 47b4ca
Packit 47b4ca
L<Autom4te::Channels>
Packit 47b4ca
Packit 47b4ca
=head1 HISTORY
Packit 47b4ca
Packit 47b4ca
Written by Alexandre Duret-Lutz E<lt>F<adl@gnu.org>E<gt>.
Packit 47b4ca
Packit 47b4ca
=cut
Packit 47b4ca
Packit 47b4ca
### Setup "GNU" style for perl-mode and cperl-mode.
Packit 47b4ca
## Local Variables:
Packit 47b4ca
## perl-indent-level: 2
Packit 47b4ca
## perl-continued-statement-offset: 2
Packit 47b4ca
## perl-continued-brace-offset: 0
Packit 47b4ca
## perl-brace-offset: 0
Packit 47b4ca
## perl-brace-imaginary-offset: 0
Packit 47b4ca
## perl-label-offset: -2
Packit 47b4ca
## cperl-indent-level: 2
Packit 47b4ca
## cperl-brace-offset: 0
Packit 47b4ca
## cperl-continued-brace-offset: 0
Packit 47b4ca
## cperl-label-offset: -2
Packit 47b4ca
## cperl-extra-newline-before-brace: t
Packit 47b4ca
## cperl-merge-trailing-else: nil
Packit 47b4ca
## cperl-continued-statement-offset: 2
Packit 47b4ca
## End: