Edit

kc3-lang/automake/lib/Automake/Getopt.pm

Branch :

  • Show log

    Commit

  • Author : Stefano Lattarini
    Date : 2012-01-18 17:55:40
    Hash : 52246cc7
    Message : cmdline parsing: move into a dedicated perl module With this change, we delegate most of the automake and aclocal code for command-line options parsing to a new module "Automake::Getopt". This allows better code sharing between automake and aclocal, and also with Autoconf, which will sync the new module from us. See also autoconf commit 'v2.68-120-gf4be358' (2012-01-17, "getopt: new Autom4te::Getopt module"), and this mailing list discussion: <http://lists.gnu.org/archive/html/autoconf-patches/2012-01/msg00033.html> This change might interact with the behaviour described in automake bug#7434; for example, starting from now, "automake -Wfoo --version" will cause automake to emit diagnostic like "unknown warning category 'foo'" before actually printing the version number and exiting. This is not a big deal in practice, and the code sharing and simplifications introduced by this patch is certainly worth it. Still, we should revisited the issue in the future. * lib/Automake/Getopt.pm: New module, basically a slightly-edited copy of the 'lib/Autom4te/Getopt.pm' file from the autoconf devel repository (commit v2.68-120-gf4be358). It defines and exports ... (parse_options): ... this new function. * automake.in (parse_arguments): Use the new function. * aclocal.in (parse_arguments): Likewise. * lib/Automake/Makefile.am (dist_perllib_DATA): Add the new file. * tests/getopt.test: Remove. * tests/list-of-tests.mk: Update.

  • lib/Automake/Getopt.pm
  • # Copyright (C) 2012 Free Software Foundation, Inc.
    
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    # GNU General Public License for more details.
    
    # You should have received a copy of the GNU General Public License
    # along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
    package Automake::Getopt;
    
    =head1 NAME
    
    Automake::Getopt - GCS conforming parser for command line options
    
    =head1 SYNOPSIS
    
      use Automake::Getopt;
    
    =head1 DESCRIPTION
    
    Export a function C<parse_options>, performing parsing of command
    line options in conformance to the GNU Coding standards.
    
    =cut
    
    use 5.006_002;
    use strict;
    use warnings FATAL => 'all';
    use Exporter ();
    use Getopt::Long ();
    use Automake::ChannelDefs qw/fatal/;
    use Carp qw/croak confess/;
    
    use vars qw (@ISA @EXPORT);
    @ISA = qw (Exporter);
    @EXPORT= qw/getopt/;
    
    =item C<parse_options (%option)>
    
    Wrapper around C<Getopt::Long>, trying to conform to the GNU
    Coding Standards for error messages.
    
    =cut
    
    sub parse_options (%)
    {
      my %option = @_;
    
      Getopt::Long::Configure ("bundling", "pass_through");
      # Unrecognized options are passed through, so GetOption can only fail
      # due to internal errors or misuse of options specification.
      Getopt::Long::GetOptions (%option)
        or confess "error in options specification (likely)";
    
      if (@ARGV && $ARGV[0] =~ /^-./)
        {
          my %argopts;
          for my $k (keys %option)
    	{
    	  if ($k =~ /(.*)=s$/)
    	    {
    	      map { $argopts{(length ($_) == 1)
    			     ? "-$_" : "--$_" } = 1; } (split (/\|/, $1));
    	    }
    	}
          if ($ARGV[0] eq '--')
    	{
    	  shift @ARGV;
    	}
          elsif (exists $argopts{$ARGV[0]})
    	{
    	  fatal ("option `$ARGV[0]' requires an argument\n"
    		 . "Try `$0 --help' for more information.");
    	}
          else
    	{
    	  fatal ("unrecognized option `$ARGV[0]'.\n"
    		 . "Try `$0 --help' for more information.");
    	}
        }
    }
    
    =back
    
    =head1 SEE ALSO
    
    L<Getopt::Long>
    
    =cut
    
    1; # for require
    
    ### Setup "GNU" style for perl-mode and cperl-mode.
    ## Local Variables:
    ## perl-indent-level: 2
    ## perl-continued-statement-offset: 2
    ## perl-continued-brace-offset: 0
    ## perl-brace-offset: 0
    ## perl-brace-imaginary-offset: 0
    ## perl-label-offset: -2
    ## cperl-indent-level: 2
    ## cperl-brace-offset: 0
    ## cperl-continued-brace-offset: 0
    ## cperl-label-offset: -2
    ## cperl-extra-newline-before-brace: t
    ## cperl-merge-trailing-else: nil
    ## cperl-continued-statement-offset: 2
    ## End: