Blame bin/autoheader.in

Packit 47b4ca
#! @PERL@
Packit 47b4ca
# -*- Perl -*-
Packit 47b4ca
# @configure_input@
Packit 47b4ca
Packit 47b4ca
eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
Packit 47b4ca
    if 0;
Packit 47b4ca
Packit 47b4ca
# autoheader -- create `config.h.in' from `configure.ac'
Packit 47b4ca
Packit 47b4ca
# Copyright (C) 1992-1994, 1996, 1998-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
# Written by Roland McGrath.
Packit 47b4ca
# Rewritten in Perl by Akim Demaille.
Packit 47b4ca
Packit 47b4ca
BEGIN
Packit 47b4ca
{
Packit 47b4ca
  my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@';
Packit 47b4ca
  unshift @INC, "$pkgdatadir";
Packit 47b4ca
Packit 47b4ca
  # Override SHELL.  On DJGPP SHELL may not be set to a shell
Packit 47b4ca
  # that can handle redirection and quote arguments correctly,
Packit 47b4ca
  # e.g.: COMMAND.COM.  For DJGPP always use the shell that configure
Packit 47b4ca
  # has detected.
Packit 47b4ca
  $ENV{'SHELL'} = '@SHELL@' if ($^O eq 'dos');
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
use Autom4te::ChannelDefs;
Packit 47b4ca
use Autom4te::Channels;
Packit 47b4ca
use Autom4te::Configure_ac;
Packit 47b4ca
use Autom4te::FileUtils;
Packit 47b4ca
use Autom4te::General;
Packit 47b4ca
use Autom4te::XFile;
Packit 47b4ca
use strict;
Packit 47b4ca
Packit 47b4ca
# Using `do FILE', we need `local' vars.
Packit 47b4ca
use vars qw ($config_h %verbatim %symbol);
Packit 47b4ca
Packit 47b4ca
# Lib files.
Packit 47b4ca
my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@';
Packit 47b4ca
local $config_h;
Packit 47b4ca
my $config_h_in;
Packit 47b4ca
my @prepend_include;
Packit 47b4ca
my @include;
Packit 47b4ca
Packit 47b4ca
Packit 47b4ca
# $HELP
Packit 47b4ca
# -----
Packit 47b4ca
$help = "Usage: $0 [OPTION]... [TEMPLATE-FILE]
Packit 47b4ca
Packit 47b4ca
Create a template file of C \`\#define\' statements for \`configure\' to
Packit 47b4ca
use.  To this end, scan TEMPLATE-FILE, or \`configure.ac\' if present,
Packit 47b4ca
or else \`configure.in\'.
Packit 47b4ca
Packit 47b4ca
  -h, --help               print this help, then exit
Packit 47b4ca
  -V, --version            print version number, then exit
Packit 47b4ca
  -v, --verbose            verbosely report processing
Packit 47b4ca
  -d, --debug              don\'t remove temporary files
Packit 47b4ca
  -f, --force              consider all files obsolete
Packit 47b4ca
  -W, --warnings=CATEGORY  report the warnings falling in CATEGORY
Packit 47b4ca
Packit 47b4ca
" . Autom4te::ChannelDefs::usage () . "
Packit 47b4ca
Packit 47b4ca
Library directories:
Packit 47b4ca
  -B, --prepend-include=DIR  prepend directory DIR to search path
Packit 47b4ca
  -I, --include=DIR          append directory DIR to search path
Packit 47b4ca
Packit 47b4ca
Report bugs to <bug-autoconf\@gnu.org>.
Packit 47b4ca
GNU Autoconf home page: <http://www.gnu.org/software/autoconf/>.
Packit 47b4ca
General help using GNU software: <http://www.gnu.org/gethelp/>.
Packit 47b4ca
";
Packit 47b4ca
Packit 47b4ca
Packit 47b4ca
# $VERSION
Packit 47b4ca
# --------
Packit 47b4ca
$version = "autoheader (@PACKAGE_NAME@) @VERSION@
Packit 47b4ca
Copyright (C) @RELEASE_YEAR@ Free Software Foundation, Inc.
Packit 47b4ca
License GPLv3+/Autoconf: GNU GPL version 3 or later
Packit 47b4ca
<http://gnu.org/licenses/gpl.html>, <http://gnu.org/licenses/exceptions.html>
Packit 47b4ca
This is free software: you are free to change and redistribute it.
Packit 47b4ca
There is NO WARRANTY, to the extent permitted by law.
Packit 47b4ca
Packit 47b4ca
Written by Roland McGrath and Akim Demaille.
Packit 47b4ca
";
Packit 47b4ca
Packit 47b4ca
Packit 47b4ca
## ---------- ##
Packit 47b4ca
## Routines.  ##
Packit 47b4ca
## ---------- ##
Packit 47b4ca
Packit 47b4ca
Packit 47b4ca
# parse_args ()
Packit 47b4ca
# -------------
Packit 47b4ca
# Process any command line arguments.
Packit 47b4ca
sub parse_args ()
Packit 47b4ca
{
Packit 47b4ca
  my $srcdir;
Packit 47b4ca
Packit 47b4ca
  parse_WARNINGS;
Packit 47b4ca
  getopt ('I|include=s'         => \@include,
Packit 47b4ca
	  'B|prepend-include=s' => \@prepend_include,
Packit 47b4ca
	  'W|warnings=s'        => \&parse_warnings);
Packit 47b4ca
Packit 47b4ca
  if (! @ARGV)
Packit 47b4ca
    {
Packit 47b4ca
      my $configure_ac = require_configure_ac;
Packit 47b4ca
      push @ARGV, $configure_ac;
Packit 47b4ca
    }
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
Packit 47b4ca
## -------------- ##
Packit 47b4ca
## Main program.  ##
Packit 47b4ca
## -------------- ##
Packit 47b4ca
Packit 47b4ca
mktmpdir ('ah');
Packit 47b4ca
switch_warning 'obsolete';
Packit 47b4ca
parse_args;
Packit 47b4ca
Packit 47b4ca
# Preach.
Packit 47b4ca
my $config_h_top = find_file ("config.h.top?",
Packit 47b4ca
			      reverse (@prepend_include), @include);
Packit 47b4ca
my $config_h_bot = find_file ("config.h.bot?",
Packit 47b4ca
			      reverse (@prepend_include), @include);
Packit 47b4ca
my $acconfig_h = find_file ("acconfig.h?",
Packit 47b4ca
			    reverse (@prepend_include), @include);
Packit 47b4ca
if ($config_h_top || $config_h_bot || $acconfig_h)
Packit 47b4ca
  {
Packit 47b4ca
    my $msg = << "END";
Packit 47b4ca
    Using auxiliary files such as \`acconfig.h\', \`config.h.bot\'
Packit 47b4ca
    and \`config.h.top\', to define templates for \`config.h.in\'
Packit 47b4ca
    is deprecated and discouraged.
Packit 47b4ca
Packit 47b4ca
    Using the third argument of \`AC_DEFINE\' and
Packit 47b4ca
    \`AC_DEFINE_UNQUOTED\' allows one to define a template without
Packit 47b4ca
    \`acconfig.h\':
Packit 47b4ca
Packit 47b4ca
      AC_DEFINE([NEED_FUNC_MAIN], 1,
Packit 47b4ca
		[Define if a function \`main\' is needed.])
Packit 47b4ca
Packit 47b4ca
    More sophisticated templates can also be produced, see the
Packit 47b4ca
    documentation.
Packit 47b4ca
END
Packit 47b4ca
    $msg =~ s/^    /WARNING: /gm;
Packit 47b4ca
    msg 'obsolete', $msg;
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
# Set up autoconf.
Packit 47b4ca
my $autoconf = "'$autom4te' --language=autoconf ";
Packit 47b4ca
$autoconf .= join (' --include=', '', map { shell_quote ($_) } @include);
Packit 47b4ca
$autoconf .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include);
Packit 47b4ca
$autoconf .= ' --debug' if $debug;
Packit 47b4ca
$autoconf .= ' --force' if $force;
Packit 47b4ca
$autoconf .= ' --verbose' if $verbose;
Packit 47b4ca
Packit 47b4ca
# ----------------------- #
Packit 47b4ca
# Real work starts here.  #
Packit 47b4ca
# ----------------------- #
Packit 47b4ca
Packit 47b4ca
# Source what the traces are trying to tell us.
Packit 47b4ca
verb "$me: running $autoconf to trace from $ARGV[0]";
Packit 47b4ca
my $quoted_tmp = shell_quote ($tmp);
Packit 47b4ca
xsystem ("$autoconf"
Packit 47b4ca
	 # If you change this list, update the
Packit 47b4ca
	 # `Autoheader-preselections' section of autom4te.in.
Packit 47b4ca
	 . ' --trace AC_CONFIG_HEADERS:\'$$config_h ||= \'"\'"\'$1\'"\'"\';\''
Packit 47b4ca
	 . ' --trace AH_OUTPUT:\'$$verbatim{\'"\'"\'$1\'"\'"\'} = \'"\'"\'$2\'"\'"\';\''
Packit 47b4ca
	 . ' --trace AC_DEFINE_TRACE_LITERAL:\'$$symbol{\'"\'"\'$1\'"\'"\'} = 1;\''
Packit 47b4ca
	 . " " . shell_quote ($ARGV[0]) . " >$quoted_tmp/traces.pl");
Packit 47b4ca
Packit 47b4ca
local (%verbatim, %symbol);
Packit 47b4ca
debug "$me: \`do'ing $tmp/traces.pl:\n" . `sed 's/^/| /' $quoted_tmp/traces.pl`;
Packit 47b4ca
do "$tmp/traces.pl";
Packit 47b4ca
warn "couldn't parse $tmp/traces.pl: $@" if $@;
Packit 47b4ca
unless ($config_h)
Packit 47b4ca
  {
Packit 47b4ca
    error "error: AC_CONFIG_HEADERS not found in $ARGV[0]";
Packit 47b4ca
    exit 1;
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
# We template only the first CONFIG_HEADER.
Packit 47b4ca
$config_h =~ s/ .*//;
Packit 47b4ca
# Support "outfile[:infile]", defaulting infile="outfile.in".
Packit 47b4ca
($config_h, $config_h_in) = split (':', $config_h, 2);
Packit 47b4ca
$config_h_in ||= "$config_h.in";
Packit 47b4ca
Packit 47b4ca
# %SYMBOL might contain things like `F77_FUNC(name,NAME)', but we keep
Packit 47b4ca
# only the name of the macro.
Packit 47b4ca
%symbol = map { s/\(.*//; $_ => 1 } keys %symbol;
Packit 47b4ca
Packit 47b4ca
my $out = new Autom4te::XFile ("> " . open_quote ("$tmp/config.hin"));
Packit 47b4ca
Packit 47b4ca
# Don't write "do not edit" -- it will get copied into the
Packit 47b4ca
# config.h, which it's ok to edit.
Packit 47b4ca
print $out "/* $config_h_in.  Generated from $ARGV[0] by autoheader.  */\n";
Packit 47b4ca
Packit 47b4ca
# Dump the top.
Packit 47b4ca
if ($config_h_top)
Packit 47b4ca
  {
Packit 47b4ca
    my $in = new Autom4te::XFile ("< " . open_quote ($config_h_top));
Packit 47b4ca
    while ($_ = $in->getline)
Packit 47b4ca
      {
Packit 47b4ca
	print $out $_;
Packit 47b4ca
      }
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
# Dump `acconfig.h', except for its bottom portion.
Packit 47b4ca
if ($acconfig_h)
Packit 47b4ca
  {
Packit 47b4ca
    my $in = new Autom4te::XFile ("< " . open_quote ($acconfig_h));
Packit 47b4ca
    while ($_ = $in->getline)
Packit 47b4ca
      {
Packit 47b4ca
	last if /\@BOTTOM\@/;
Packit 47b4ca
	next if /\@TOP\@/;
Packit 47b4ca
	print $out $_;
Packit 47b4ca
      }
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
# Dump the templates from `configure.ac'.
Packit 47b4ca
foreach (sort keys %verbatim)
Packit 47b4ca
  {
Packit 47b4ca
    print $out "\n$verbatim{$_}\n";
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
# Dump bottom portion of `acconfig.h'.
Packit 47b4ca
if ($acconfig_h)
Packit 47b4ca
  {
Packit 47b4ca
    my $in = new Autom4te::XFile ("< " . open_quote ($acconfig_h));
Packit 47b4ca
    my $dump = 0;
Packit 47b4ca
    while ($_ = $in->getline)
Packit 47b4ca
      {
Packit 47b4ca
	print $out $_ if $dump;
Packit 47b4ca
	$dump = 1  if /\@BOTTOM\@/;
Packit 47b4ca
      }
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
# Dump the bottom.
Packit 47b4ca
if ($config_h_bot)
Packit 47b4ca
  {
Packit 47b4ca
    my $in = new Autom4te::XFile ("< " . open_quote ($config_h_bot));
Packit 47b4ca
    while ($_ = $in->getline)
Packit 47b4ca
      {
Packit 47b4ca
	print $out $_;
Packit 47b4ca
      }
Packit 47b4ca
  }
Packit 47b4ca
Packit 47b4ca
$out->close;
Packit 47b4ca
Packit 47b4ca
# Check that all the symbols have a template.
Packit 47b4ca
{
Packit 47b4ca
  my $in = new Autom4te::XFile ("< " . open_quote ("$tmp/config.hin"));
Packit 47b4ca
  my $suggest_ac_define = 1;
Packit 47b4ca
  while ($_ = $in->getline)
Packit 47b4ca
    {
Packit 47b4ca
      my ($symbol) = /^\#\s*\w+\s+(\w+)/
Packit 47b4ca
	or next;
Packit 47b4ca
      delete $symbol{$symbol};
Packit 47b4ca
    }
Packit 47b4ca
  foreach (sort keys %symbol)
Packit 47b4ca
    {
Packit 47b4ca
      msg 'syntax', "warning: missing template: $_";
Packit 47b4ca
      if ($suggest_ac_define)
Packit 47b4ca
	{
Packit 47b4ca
	  msg 'syntax',  "Use AC_DEFINE([$_], [], [Description])";
Packit 47b4ca
	  $suggest_ac_define = 0;
Packit 47b4ca
	}
Packit 47b4ca
Packit 47b4ca
    }
Packit 47b4ca
  exit 1
Packit 47b4ca
    if keys %symbol;
Packit 47b4ca
}
Packit 47b4ca
Packit 47b4ca
update_file ("$tmp/config.hin", "$config_h_in", $force);
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: