#! /usr/bin/perl -w
# -*- perl -*-
# Generated from autoscan.in; do not edit by hand.

# autoscan - Create configure.scan (a preliminary configure.ac) for a package.
# Copyright (C) 1994, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
# 2007, 2008, 2009, 2010 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/>.

# Written by David MacKenzie <djm@gnu.ai.mit.edu>.

eval 'case $# in 0) exec /usr/bin/perl -S "$0";; *) exec /usr/bin/perl -S "$0" "$@";; esac'
    if 0;

BEGIN
{
  my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '//share/autoconf';
  unshift @INC, $pkgdatadir;

  # Override SHELL.  On DJGPP SHELL may not be set to a shell
  # that can handle redirection and quote arguments correctly,
  # e.g.: COMMAND.COM.  For DJGPP always use the shell that configure
  # has detected.
  $ENV{'SHELL'} = '/bin/sh' if ($^O eq 'dos');
}

use Autom4te::ChannelDefs;
use Autom4te::Configure_ac;
use Autom4te::General;
use Autom4te::FileUtils;
use Autom4te::XFile;
use File::Basename;
use File::Find;
use strict;

use vars qw(@cfiles @makefiles @shfiles @subdirs %printed);

# The kind of the words we are looking for.
my @kinds = qw (function header identifier program
		makevar librarie);

# For each kind, the default macro.
my %generic_macro =
  (
   'function'   => 'AC_CHECK_FUNCS',
   'header'     => 'AC_CHECK_HEADERS',
   'identifier' => 'AC_CHECK_TYPES',
   'program'    => 'AC_CHECK_PROGS',
   'library'    => 'AC_CHECK_LIB'
  );

my %kind_comment =
  (
   'function'   => 'Checks for library functions.',
   'header'     => 'Checks for header files.',
   'identifier' => 'Checks for typedefs, structures, and compiler characteristics.',
   'program'    => 'Checks for programs.',
  );

# $USED{KIND}{ITEM} is the list of locations where the ITEM (of KIND) was used
# in the user package.
# For instance $USED{function}{alloca} is the list of `file:line' where
# `alloca (...)' appears.
my %used = ();

# $MACRO{KIND}{ITEM} is the list of macros to use to test ITEM.
# Initialized from lib/autoscan/*.  E.g., $MACRO{function}{alloca} contains
# the singleton AC_FUNC_ALLOCA.  Some require several checks.
my %macro = ();

# $NEEDED_MACROS{MACRO} is an array of locations requiring MACRO.
# E.g., $NEEDED_MACROS{AC_FUNC_ALLOC} the list of `file:line' containing
# `alloca (...)'.
my %needed_macros =
  (
   'AC_PREREQ' => [$me],
  );

my $configure_scan = 'configure.scan';
my $log;

# Autoconf and lib files.
my $autom4te = $ENV{'AUTOM4TE'} || '/x86_64-unknown-linux-gnu/bin/autom4te';
my $autoconf = "$autom4te --language=autoconf";
my @prepend_include;
my @include = ('//share/autoconf');

# $help
# -----
$help = "Usage: $0 [OPTION]... [SRCDIR]

Examine source files in the directory tree rooted at SRCDIR, or the
current directory if none is given.  Search the source files for
common portability problems, check for incompleteness of
`configure.ac', and create a file `$configure_scan' which is a
preliminary `configure.ac' for that package.

  -h, --help          print this help, then exit
  -V, --version       print version number, then exit
  -v, --verbose       verbosely report processing
  -d, --debug         don't remove temporary files

Library directories:
  -B, --prepend-include=DIR  prepend directory DIR to search path
  -I, --include=DIR          append directory DIR to search path

Report bugs to <bug-autoconf\@gnu.org>.
GNU Autoconf home page: <http://www.gnu.org/software/autoconf/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
";

# $version
# --------
$version = "autoscan (GNU Autoconf) 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+/Autoconf: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David J. MacKenzie and Akim Demaille.
";




## ------------------------ ##
## Command line interface.  ##
## ------------------------ ##

# parse_args ()
# -------------
# Process any command line arguments.
sub parse_args ()
{
  getopt ('I|include=s' => \@include,
	  'B|prepend-include=s' => \@prepend_include);

  die "$me: too many arguments
Try `$me --help' for more information.\n"
    if @ARGV > 1;

  my $srcdir = $ARGV[0] || ".";

  verb "srcdir = $srcdir";
  chdir $srcdir || error "cannot cd to $srcdir: $!";
}


# init_tables ()
# --------------
# Put values in the tables of what to do with each token.
sub init_tables ()
{
  # The data file format supports only one line of macros per function.
  # If more than that is required for a common portability problem,
  # a new Autoconf macro should probably be written for that case,
  # instead of duplicating the code in lots of configure.ac files.
  my $file = find_file ("autoscan/autoscan.list",
			reverse (@prepend_include), @include);
  my $table = new Autom4te::XFile "< " . open_quote ($file);
  my $tables_are_consistent = 1;

  while ($_ = $table->getline)
    {
      # Ignore blank lines and comments.
      next
	if /^\s*$/ || /^\s*\#/;

      # '<kind>: <word> <macro invocation>' or...
      # '<kind>: <word> warn: <message>'.
      if (/^(\S+):\s+(\S+)\s+(\S.*)$/)
	{
	  my ($kind, $word, $macro) = ($1, $2, $3);
	  error "$file:$.: invalid kind: $_"
	    unless grep { $_ eq $kind } @kinds;
	  push @{$macro{$kind}{$word}}, $macro;
	}
      else
	{
	  error "$file:$.: invalid definition: $_";
	}
    }

  if ($debug)
    {
      foreach my $kind (@kinds)
	{
	  foreach my $word (sort keys %{$macro{$kind}})
	    {
	      print "$kind: $word: @{$macro{$kind}{$word}}\n";
	    }
	}

    }
}


# used ($KIND, $WORD, [$WHERE])
# -----------------------------
# $WORD is used as a $KIND.
sub used ($$;$)
{
  my ($kind, $word, $where) = @_;
  $where ||= "$File::Find::name:$.";
  if (
      # Check for all the libraries.  But `-links' is certainly a
      # `find' argument, and `-le', a `test' argument.
      ($kind eq 'library' && $word !~ /^(e|inks)$/)
      # Other than libraries are to be checked only if listed in
      # the Autoscan library files.
      || defined $macro{$kind}{$word}
     )
    {
      push (@{$used{$kind}{$word}}, $where);
    }
}



## ----------------------- ##
## Scanning source files.  ##
## ----------------------- ##


# scan_c_file ($FILE-NAME)
# ------------------------
sub scan_c_file ($)
{
  my ($file_name) = @_;
  push @cfiles, $File::Find::name;

  # Nonzero if in a multiline comment.
  my $in_comment = 0;

  my $file = new Autom4te::XFile "< " . open_quote ($file_name);

  while ($_ = $file->getline)
    {
      # Strip out comments.
      if ($in_comment && s,^.*?\*/,,)
	{
	  $in_comment = 0;
	}
      # The whole line is inside a commment.
      next if $in_comment;
      # All on one line.
      s,/\*.*?\*/,,g;

      # Starting on this line.
      if (s,/\*.*$,,)
	{
	  $in_comment = 1;
	}

      # Preprocessor directives.
      if (s/^\s*\#\s*//)
	{
	  if (/^include\s*<([^>]*)>/)
	    {
	      used ('header', $1);
	    }
	  if (s/^(if|ifdef|ifndef|elif)\s+//)
	    {
	      foreach my $word (split (/\W+/))
		{
		  used ('identifier', $word)
		    unless $word eq 'defined' || $word !~ /^[a-zA-Z_]/;
		}
	    }
	  # Ignore other preprocessor directives.
	  next;
	}

      # Remove string and character constants.
      s,\"[^\"]*\",,g;
      s,\'[^\']*\',,g;

      # Tokens in the code.
      # Maybe we should ignore function definitions (in column 0)?
      while (s/\b([a-zA-Z_]\w*)\s*\(/ /)
	{
	  used ('function', $1);
	}
      while (s/\b([a-zA-Z_]\w*)\b/ /)
	{
	  used ('identifier', $1);
	}
    }

  $file->close;
}


# scan_makefile($MAKEFILE-NAME)
# -----------------------------
sub scan_makefile ($)
{
  my ($file_name) = @_;
  push @makefiles, $File::Find::name;

  my $file = new Autom4te::XFile "< " . open_quote ($file_name);

  while ($_ = $file->getline)
    {
      # Strip out comments.
      s/#.*//;

      # Variable assignments.
      while (s/\b([a-zA-Z_]\w*)\s*=/ /)
	{
	  used ('makevar', $1);
	}
      # Be sure to catch a whole word.  For instance `lex$U.$(OBJEXT)'
      # is a single token.  Otherwise we might believe `lex' is needed.
      foreach my $word (split (/\s+/))
	{
	  # Libraries.
	  if ($word =~ /^-l([a-zA-Z_]\w*)$/)
	    {
	      used ('library', $1);
	    }
	  # Tokens in the code.
	  # We allow some additional characters, e.g., `+', since
	  # autoscan/programs includes `c++'.
	  if ($word =~ /^[a-zA-Z_][\w+]*$/)
	    {
	      used ('program', $word);
	    }
	}
    }

  $file->close;
}


# scan_sh_file($SHELL-SCRIPT-NAME)
# --------------------------------
sub scan_sh_file ($)
{
  my ($file_name) = @_;
  push @shfiles, $File::Find::name;

  my $file = new Autom4te::XFile "< " . open_quote ($file_name);

  while ($_ = $file->getline)
    {
      # Strip out comments and variable references.
      s/#.*//;
      s/\${[^\}]*}//g;
      s/@[^@]*@//g;

      # Tokens in the code.
      while (s/\b([a-zA-Z_]\w*)\b/ /)
	{
	  used ('program', $1);
	}
    }

  $file->close;
}


# scan_file ()
# ------------
# Called by &find on each file.  $_ contains the current file name with
# the current directory of the walk through.
sub scan_file ()
{
  # Wanted only if there is no corresponding FILE.in.
  return
    if -f "$_.in";

  # Save $_ as Find::File requires it to be preserved.
  local $_ = $_;

  # Strip a useless leading `./'.
  $File::Find::name =~ s,^\./,,;

  if ($_ ne '.' and -d $_ and
      -f "$_/configure.in"  ||
      -f "$_/configure.ac"  ||
      -f "$_/configure.gnu" ||
      -f "$_/configure")
    {
      $File::Find::prune = 1;
      push @subdirs, $File::Find::name;
    }
  if (/\.[chlym](\.in)?$/)
    {
      used 'program', 'cc', $File::Find::name;
      scan_c_file ($_);
    }
  elsif (/\.(cc|cpp|cxx|CC|C|hh|hpp|hxx|HH|H|yy|ypp|ll|lpp)(\.in)?$/)
    {
      used 'program', 'c++', $File::Find::name;
      scan_c_file ($_);
    }
  elsif ((/^((?:GNUm|M|m)akefile)(\.in)?$/ && ! -f "$1.am")
	 || /^(?:GNUm|M|m)akefile(\.am)?$/)
    {
      scan_makefile ($_);
    }
  elsif (/\.sh(\.in)?$/)
    {
      scan_sh_file ($_);
    }
}


# scan_files ()
# -------------
# Read through the files and collect lists of tokens in them
# that might create nonportabilities.
sub scan_files ()
{
  find (\&scan_file, '.');

  if ($verbose)
    {
      print "cfiles: @cfiles\n";
      print "makefiles: @makefiles\n";
      print "shfiles: @shfiles\n";

      foreach my $kind (@kinds)
	{
	  print "\n$kind:\n";
	  foreach my $word (sort keys %{$used{$kind}})
	    {
	      print "$word: @{$used{$kind}{$word}}\n";
	    }
	}
    }
}


## ----------------------- ##
## Output configure.scan.  ##
## ----------------------- ##


# output_kind ($FILE, $KIND)
# --------------------------
sub output_kind ($$)
{
  my ($file, $kind) = @_;
  # Lists of words to be checked with the generic macro.
  my @have;

  print $file "\n# $kind_comment{$kind}\n"
    if exists $kind_comment{$kind};
  foreach my $word (sort keys %{$used{$kind}})
    {
      # Output the needed macro invocations in $configure_scan if not
      # already printed, and remember these macros are needed.
      foreach my $macro (@{$macro{$kind}{$word}})
	{
	  if ($macro =~ /^warn:\s+(.*)/)
	    {
	      my $message = $1;
	      foreach my $location (@{$used{$kind}{$word}})
		{
		  warn "$location: warning: $message\n";
		}
	    }
	  elsif (exists $generic_macro{$kind}
	      && $macro eq $generic_macro{$kind})
	    {
	      push (@have, $word);
	      push (@{$needed_macros{"$generic_macro{$kind}([$word])"}},
		    @{$used{$kind}{$word}});
	    }
	  else
	    {
	      if (! $printed{$macro})
		{
		  print $file "$macro\n";
		  $printed{$macro} = 1;
		}
	      push (@{$needed_macros{$macro}},
		    @{$used{$kind}{$word}});
	    }
	}
    }
  print $file "$generic_macro{$kind}([" . join(' ', sort(@have)) . "])\n"
    if @have;
}


# output_libraries ($FILE)
# ------------------------
sub output_libraries ($)
{
  my ($file) = @_;

  print $file "\n# Checks for libraries.\n";
  foreach my $word (sort keys %{$used{'library'}})
    {
      print $file "# FIXME: Replace `main' with a function in `-l$word':\n";
      print $file "AC_CHECK_LIB([$word], [main])\n";
    }
}


# output ($CONFIGURE_SCAN)
# ------------------------
# Print a proto configure.ac.
sub output ($)
{
  my $configure_scan = shift;
  my %unique_makefiles;

  my $file = new Autom4te::XFile "> " . open_quote ($configure_scan);

  print $file
    ("#                                               -*- Autoconf -*-\n" .
     "# Process this file with autoconf to produce a configure script.\n" .
     "\n" .
     "AC_PREREQ([2.68])\n" .
     "AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])\n");
  if (defined $cfiles[0])
    {
      print $file "AC_CONFIG_SRCDIR([$cfiles[0]])\n";
      print $file "AC_CONFIG_HEADERS([config.h])\n";
    }

  output_kind ($file, 'program');
  output_kind ($file, 'makevar');
  output_libraries ($file);
  output_kind ($file, 'header');
  output_kind ($file, 'identifier');
  output_kind ($file, 'function');

  print $file "\n";
  if (@makefiles)
    {
      # Change DIR/Makefile.in to DIR/Makefile.
      foreach my $m (@makefiles)
	{
	  $m =~ s/\.(?:in|am)$//;
	  $unique_makefiles{$m}++;
	}
      print $file ("AC_CONFIG_FILES([",
		   join ("\n                 ",
			 sort keys %unique_makefiles), "])\n");
    }
  if (@subdirs)
    {
      print $file ("AC_CONFIG_SUBDIRS([",
		   join ("\n                   ",
			 sort @subdirs), "])\n");
    }
  print $file "AC_OUTPUT\n";

  $file->close;
}



## --------------------------------------- ##
## Checking the accuracy of configure.ac.  ##
## --------------------------------------- ##


# &check_configure_ac ($CONFIGURE_AC)
# -----------------------------------
# Use autoconf to check if all the suggested macros are included
# in CONFIGURE_AC.
sub check_configure_ac ($)
{
  my ($configure_ac) = @_;

  # Find what needed macros are invoked in CONFIGURE_AC.
  # I'd be very happy if someone could explain to me why sort (uniq ...)
  # doesn't work properly: I need `uniq (sort ...)'.  --akim
  my $trace_option =
    join (' --trace=', '',
	  uniq (sort (map { s/\(.*//; $_ } keys %needed_macros)));

  verb "running: $autoconf $trace_option $configure_ac";
  my $traces =
    new Autom4te::XFile "$autoconf $trace_option $configure_ac |";

  while ($_ = $traces->getline)
    {
      chomp;
      my ($file, $line, $macro, @args) = split (/:/, $_);
      if ($macro =~ /^AC_CHECK_(HEADER|FUNC|TYPE|MEMBER)S$/)
	{
	  # To be rigorous, we should distinguish between space and comma
	  # separated macros.  But there is no point.
	  foreach my $word (split (/\s|,/, $args[0]))
	    {
	      # AC_CHECK_MEMBERS wants `struct' or `union'.
	      if ($macro eq "AC_CHECK_MEMBERS"
		  && $word =~ /^stat.st_/)
		{
		  $word = "struct " . $word;
		}
	      delete $needed_macros{"$macro([$word])"};
	    }
	}
      else
	{
	  delete $needed_macros{$macro};
	}
    }

  $traces->close;

  # Report the missing macros.
  foreach my $macro (sort keys %needed_macros)
    {
      warn ("$configure_ac: warning: missing $macro wanted by: "
	    . (${$needed_macros{$macro}}[0])
	    . "\n");
      print $log "$me: warning: missing $macro wanted by: \n";
      foreach my $need (@{$needed_macros{$macro}})
	{
	  print $log "\t$need\n";
	}
    }
}


## -------------- ##
## Main program.  ##
## -------------- ##

parse_args;
$log = new Autom4te::XFile "> " . open_quote ("$me.log");

$autoconf .= " --debug" if $debug;
$autoconf .= " --verbose" if $verbose;
$autoconf .= join (' --include=', '', map { shell_quote ($_) } @include);
$autoconf .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include);

my $configure_ac = find_configure_ac;
init_tables;
scan_files;
output ('configure.scan');
if (-f $configure_ac)
  {
    check_configure_ac ($configure_ac);
  }
# This close is really needed.  For some reason, probably best named
# a bug, it seems that the dtor of $LOG is not called automatically
# at END.  It results in a truncated file.
$log->close;
exit 0;

### 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:
