#! @PERL@ # -*- Perl -*- # @configure_input@ eval 'exec @PERL@ -S $0 ${1+"$@"}' if 0; # autoheader -- create `config.h.in' from `configure.ac' # Copyright 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001 # 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 2, 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, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. # Written by Roland McGrath. # Rewritten in Perl by Akim Demaille. BEGIN { my $perllibdir = $ENV{'autom4te_perllibdir'} || '@datadir@'; unshift @INC, "$perllibdir"; } use Autom4te::General; use Autom4te::XFile; use strict; # Using `do FILE', we need `local' vars. use vars qw ($config_h %verbatim %symbol); # Lib files. my $autom4te = $ENV{'AUTOM4TE'} || '@autom4te-name@'; local $config_h; my $config_h_in; my @include; my @warning; # $HELP # ----- $help = <<"END"; Usage: $0 [OPTION] ... [TEMPLATE-FILE] Create a template file of C \`\#define\' statements for \`configure\' to use. To this end, scan TEMPLATE-FILE, or \`configure.ac\' if present, or else \`configure.in\'. -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 -f, --force consider all files obsolete -W, --warnings=CATEGORY report the warnings falling in CATEGORY Warning categories include: \`obsolete\' obsolete constructs \`all\' all the warnings \`no-CATEGORY\' turn off the warnings on CATEGORY \`none\' turn off all the warnings \`error\' warnings are error Library directories: -I, --include=DIR look for files in DIR (cumulative) Report bugs to . END # $VERSION # -------- $version = <<"END"; autoheader (@PACKAGE_NAME@) @VERSION@ Written by Roland McGrath and Akim Demaille. Copyright 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. END ## ---------- ## ## Routines. ## ## ---------- ## # parse_args () # ------------- # Process any command line arguments. sub parse_args () { my $srcdir; getopt ('I|include|A|autoconf-dir|m|macrodir|l|localdir=s' => \@include, 'W|warning' => \@warning); if (! @ARGV) { my $configure_ac = find_configure_ac; die "$me: no input file\n" unless $configure_ac; push @ARGV, $configure_ac; } } ## -------------- ## ## Main program. ## ## -------------- ## mktmpdir ('ah'); parse_args; # Preach. my $config_h_top = find_file ("config.h.top?", @include); my $config_h_bot = find_file ("config.h.bot?", @include); my $acconfig_h = find_file ("acconfig.h?", @include); if ($config_h_top || $config_h_bot || $acconfig_h) { my $msg = << "END"; Using auxiliary files such as \`acconfig.h\', \`config.h.bot\' and \`config.h.top\', to define templates for \`config.h.in\' is deprecated and discouraged. Using the third argument of \`AC_DEFINE\' and \`AC_DEFINE_UNQUOTED\' allows to define a template without \`acconfig.h\': AC_DEFINE([NEED_MAIN], 1, [Define if a function \`main\' is needed.]) More sophisticated templates can also be produced, see the documentation. END $msg =~ s/^ /WARNING: /gm; print STDERR $msg; } # Set up autoconf. my $autoconf = "$autom4te --language=autoconf "; $autoconf .= join (' ', map { "--include=$_" } @include); $autoconf .= ' --debug' if $debug; $autoconf .= ' --force' if $force; $autoconf .= ' --verbose' if $verbose; # ----------------------- # # Real work starts here. # # ----------------------- # # Source what the traces are trying to tell us. verbose "$me: running $autoconf to trace from $ARGV[0]"; xsystem ("$autoconf " . " --trace AC_CONFIG_HEADERS:'\$\$config_h ||= \"\$1\";'" . " --trace AH_OUTPUT:'\$\$verbatim{\"\$1\"} = \"\\\n\$2\";'" . " --trace AC_DEFINE_TRACE_LITERAL:'\$\$symbol{\"\$1\"} = 1;'" . " $ARGV[0] >$tmp/traces.pl"); local (%verbatim, %symbol); do "$tmp/traces.pl"; warn "couldn't parse $tmp/traces.pl: $@" if $@; die "$me: error: AC_CONFIG_HEADERS not found in $ARGV[0]\n" unless $config_h; # We template only the first CONFIG_HEADER. $config_h =~ s/ .*//; # Support "outfile[:infile]", defaulting infile="outfile.in". ($config_h, $config_h_in) = split (':', $config_h, 2); $config_h_in ||= "$config_h.in"; # %SYMBOL might contain things like `F77_FUNC(name,NAME)', but we keep # only the name of the macro. %symbol = map { s/\(.*//; $_ => 1 } keys %symbol; my $out = new Autom4te::XFile (">$tmp/config.hin"); # Don't write "do not edit" -- it will get copied into the # config.h, which it's ok to edit. print $out "/* $config_h_in. Generated from $ARGV[0] by autoheader. */\n"; # Dump the top. if ($config_h_top) { my $in = new Autom4te::XFile ($config_h_top); while ($_ = $in->getline) { print $out $_; } } # Dump `acconfig.h', except for its bottom portion. if ($acconfig_h) { my $in = new Autom4te::XFile ($acconfig_h); while ($_ = $in->getline) { last if /\@BOTTOM\@/; next if /\@TOP\@/; print $out $_; } } # Dump the templates from `configure.ac'. foreach (sort keys %verbatim) { print $out "$verbatim{$_}\n"; } # Dump bottom portion of `acconfig.h'. if ($acconfig_h) { my $in = new Autom4te::XFile ($acconfig_h); my $dump = 0; while ($_ = $in->getline) { print $out $_ if $dump; $dump = 1 if /\@BOTTOM\@/; } } # Dump the bottom. if ($config_h_bot) { my $in = new Autom4te::XFile ($config_h_bot); while ($_ = $in->getline) { print $out $_; } } $out->close; # Check that all the symbols have a template. { my $in = new Autom4te::XFile ("$tmp/config.hin"); while ($_ = $in->getline) { my ($symbol) = /^\#\s*\w+\s+(\w+)/ or next; delete $symbol{$symbol}; } foreach (sort keys %symbol) { print STDERR "$me: missing template: $_\n"; } exit 1 if keys %symbol; } update_file ("$tmp/config.hin", "$config_h_in");