5 eval 'case $# in 0) exec @PERL@ -S "$0";; *) exec @PERL@ -S "$0" "$@";; esac'
8 # autoheader -- create 'config.h.in' from 'configure.ac'.
10 # Copyright (C) 1992-1994, 1996, 1998-2017, 2020-2024 Free Software
13 # This program is free software: you can redistribute it and/or modify
14 # it under the terms of the GNU General Public License as published by
15 # the Free Software Foundation, either version 3 of the License, or
16 # (at your option) any later version.
18 # This program is distributed in the hope that it will be useful,
19 # but WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 # GNU General Public License for more details.
23 # You should have received a copy of the GNU General Public License
24 # along with this program. If not, see <https://www.gnu.org/licenses/>.
26 # Written by Roland McGrath.
27 # Rewritten in Perl by Akim Demaille.
31 use warnings FATAL => 'all';
35 my $pkgdatadir = $ENV{'autom4te_perllibdir'} || '@pkgdatadir@';
36 unshift @INC, "$pkgdatadir";
38 # Override SHELL. On DJGPP SHELL may not be set to a shell
39 # that can handle redirection and quote arguments correctly,
40 # e.g.: COMMAND.COM. For DJGPP always use the shell that configure
42 $ENV{'SHELL'} = '@SHELL@' if ($^O eq 'dos');
45 use Autom4te::ChannelDefs;
46 use Autom4te::Channels;
47 use Autom4te::Configure_ac;
48 use Autom4te::FileUtils;
49 use Autom4te::General;
52 # These vars must be package globals so they can be accessed by code
53 # evaluated via 'do FILE', below.
54 our ($config_h, %symbol, %verbatim);
57 my $autom4te = $ENV{'AUTOM4TE'} || '@bindir@/@autom4te-name@';
65 $help = "Usage: $0 [OPTION]... [TEMPLATE-FILE]
67 Create a template file of C '\#define' statements for 'configure' to
68 use. To this end, scan TEMPLATE-FILE, or 'configure.ac' if present,
69 or else 'configure.in'.
71 -h, --help print this help, then exit
72 -V, --version print version number, then exit
73 -v, --verbose verbosely report processing
74 -d, --debug don\'t remove temporary files
75 -f, --force consider all files obsolete
76 -W, --warnings=CATEGORY report the warnings falling in CATEGORY
77 (comma-separated list accepted)
79 " . Autom4te::ChannelDefs::usage . "
82 -B, --prepend-include=DIR prepend directory DIR to search path
83 -I, --include=DIR append directory DIR to search path
85 Report bugs to <bug-autoconf\@gnu.org>.
87 The full documentation for Autoconf can be read via 'info autoconf',
88 or on the Web at <https://www.gnu.org/software/autoconf/manual/>.
94 $version = "autoheader (@PACKAGE_NAME@) @VERSION@
95 Copyright (C) @RELEASE_YEAR@ Free Software Foundation, Inc.
96 License GPLv3+/Autoconf: GNU GPL version 3 or later
97 <https://gnu.org/licenses/gpl.html>, <https://gnu.org/licenses/exceptions.html>
98 This is free software: you are free to change and redistribute it.
99 There is NO WARRANTY, to the extent permitted by law.
101 Written by Roland McGrath and Akim Demaille.
112 # Process any command line arguments.
117 getopt ('I|include=s' => \@include,
118 'B|prepend-include=s' => \@prepend_include,
119 'W|warnings=s' => \@warnings);
122 parse_warnings @warnings;
126 my $configure_ac = require_configure_ac;
127 push @ARGV, $configure_ac;
140 my $config_h_top = find_file ("config.h.top?",
141 reverse (@prepend_include), @include);
142 my $config_h_bot = find_file ("config.h.bot?",
143 reverse (@prepend_include), @include);
144 my $acconfig_h = find_file ("acconfig.h?",
145 reverse (@prepend_include), @include);
146 if ($config_h_top || $config_h_bot || $acconfig_h)
149 Using auxiliary files such as 'acconfig.h', 'config.h.bot'
150 and 'config.h.top', to define templates for 'config.h.in'
151 is deprecated and discouraged.
153 Using the third argument of 'AC_DEFINE_UNQUOTED' and
154 'AC_DEFINE' allows one to define a template without
157 AC_DEFINE([NEED_FUNC_MAIN], 1,
158 [Define if a function 'main' is needed.])
160 More sophisticated templates can also be produced, see the
163 $msg =~ s/^ /WARNING: /gm;
164 msg 'obsolete', $msg;
168 my $autoconf = "'$autom4te' --language=autoconf ";
169 $autoconf .= join (' --include=', '', map { shell_quote ($_) } @include);
170 $autoconf .= join (' --prepend-include=', '', map { shell_quote ($_) } @prepend_include);
171 $autoconf .= ' --debug' if $debug;
172 $autoconf .= ' --force' if $force;
173 $autoconf .= ' --verbose' if $verbose;
175 # ----------------------- #
176 # Real work starts here. #
177 # ----------------------- #
179 # Source what the traces are trying to tell us.
180 verb "$me: running $autoconf to trace from $ARGV[0]";
181 my $quoted_tmp = shell_quote ($tmp);
183 # Suppress all warnings from the subsidiary autoconf invocation.
184 local $ENV{WARNINGS} = 'none';
186 # If you change this list, update the
187 # 'Autoheader-preselections' section of autom4te.in.
188 . ' --trace AC_CONFIG_HEADERS:\'$$config_h ||= \'"\'"\'$1\'"\'"\';\''
189 . ' --trace AH_OUTPUT:\'$$verbatim{\'"\'"\'$1\'"\'"\'} = \'"\'"\'$2\'"\'"\';\''
190 . ' --trace AC_DEFINE_TRACE_LITERAL:\'$$symbol{\'"\'"\'$1\'"\'"\'} = 1;\''
191 . " " . shell_quote ($ARGV[0]) . " >$quoted_tmp/traces.pl");
194 local (%verbatim, %symbol);
195 debug "$me: 'do'ing $tmp/traces.pl:\n" . `sed 's/^/| /' $quoted_tmp/traces.pl`;
197 warn "couldn't parse $tmp/traces.pl: $@" if $@;
200 error "error: AC_CONFIG_HEADERS not found in $ARGV[0]";
204 # Support "outfile[:infile]", defaulting infile="outfile.in".
205 sub templates_for_header
208 my ($header, @templates) = split(':', $spec);
210 return @templates if @templates;
211 return $header . '.in';
214 my @config_templates = map(templates_for_header($_), split(' ', $config_h));
216 # We template only the first CONFIG_HEADER.
217 $config_h_in = shift(@config_templates);
218 $config_h =~ s/[ :].*//;
220 # %SYMBOL might contain things like 'F77_FUNC(name,NAME)', but we keep
221 # only the name of the macro.
222 %symbol = map { s/\(.*//; $_ => 1 } keys %symbol;
224 my $out = new Autom4te::XFile ("$tmp/config.hin", ">");
226 # Don't write "do not edit" -- it will get copied into the
227 # config.h, which it's ok to edit.
228 print $out "/* $config_h_in. Generated from $ARGV[0] by autoheader. */\n";
233 my $in = new Autom4te::XFile ($config_h_top, "<");
234 while ($_ = $in->getline)
240 # Dump 'acconfig.h', except for its bottom portion.
243 my $in = new Autom4te::XFile ($acconfig_h, "<");
244 while ($_ = $in->getline)
246 last if /\@BOTTOM\@/;
252 # Dump the templates from 'configure.ac'.
253 foreach (sort keys %verbatim)
255 print $out "\n$verbatim{$_}\n";
258 # Dump bottom portion of 'acconfig.h'.
261 my $in = new Autom4te::XFile ($acconfig_h, "<");
263 while ($_ = $in->getline)
265 print $out $_ if $dump;
266 $dump = 1 if /\@BOTTOM\@/;
273 my $in = new Autom4te::XFile ($config_h_bot, "<");
274 while ($_ = $in->getline)
282 # Check that all the symbols have a template.
284 foreach my $template ("$tmp/config.hin", @config_templates)
288 msg 'syntax', "cannot read $template: $!";
292 my $in = new Autom4te::XFile ($template, "<");
294 while ($_ = $in->getline)
296 my ($sym) = /^\#\s*\w+\s+(\w+)/
298 delete $symbol{$sym};
303 my $suggest_ac_define = 1;
305 foreach (sort keys %symbol)
307 msg 'syntax', "missing template: $_";
308 if ($suggest_ac_define)
310 msg 'syntax', "Use AC_DEFINE([$_], [], [Description])";
311 $suggest_ac_define = 0;
318 update_file ("$tmp/config.hin", "$config_h_in", $force);
320 ### Setup "GNU" style for perl-mode and cperl-mode.
322 ## perl-indent-level: 2
323 ## perl-continued-statement-offset: 2
324 ## perl-continued-brace-offset: 0
325 ## perl-brace-offset: 0
326 ## perl-brace-imaginary-offset: 0
327 ## perl-label-offset: -2
328 ## cperl-indent-level: 2
329 ## cperl-brace-offset: 0
330 ## cperl-continued-brace-offset: 0
331 ## cperl-label-offset: -2
332 ## cperl-extra-newline-before-brace: t
333 ## cperl-merge-trailing-else: nil
334 ## cperl-continued-statement-offset: 2