Hi, sorry for taking so long to get back to this. But I see a release is imminent, so I figured better late than never. I've updated my patch and rebased it onto current master. I would be cool if it could make the release. On Tue, 2015-12-15 at 18:13 -0700, Warren Young wrote: > On Oct 9, 2015, at 10:48 PM, Paul Eggert <eggert@xxxxxxxxxxx> wrote: > > > > The basic idea for this sounds good; thanks. It'd be nice if > > someone else who uses Perl more than I could look over the details. > > Well, I know Perl, but I don’t know the autotools internals, so all I > can do is nitpick style details. If that’s all you want, then: OK, I addressed some of these issues in my updated and rebased patch. > > sub templates_for_header ($) > Don’t use subroutine prototypes. Got rid of it. > > return @templates if (@templates); > Just a nit, but I typically leave the parens off when using the > postfix form of “if”, especially when the expression is simple, as in > this case. Done. > > my $in = new Autom4te::XFile ("< " . open_quote ($template)); > > The space in that string literal looks like you’re trying to avoid > some of the problems with the 1-argument form of IO::File- > new(). Unless $template can be a dash to open STDIN, there is no > good reason to use the 1-argument form of IO::File->new(). Agreed, and it turns out that it has already been changed to the two- argument form in current master. I followed suit in my updated patch. > > my ($sym) = /^\#\s*\w+\s+(\w+)/ > One of the things perlcritic --harsh will insist on are ‘x’ modifiers > on regexes, and this RE is a good reason why. Left it as is for now as I just took it over from the original code. Cheers, --Daniel
From fd1be2151563e878f4f1c44a77b2258ae3f4099a Mon Sep 17 00:00:00 2001 From: Daniel Elstner <daniel.kitta@xxxxxxxxx> Date: Wed, 21 Dec 2016 17:05:21 +0100 Subject: [PATCH] autoheader: check templates of all config headers * bin/autoheader.in: When checking for missing templates, take all config headers into account, not just the one generated by autoheader. This makes it possible to use AC_DEFINE() for secondary headers without duplicating the template into the first header. * tests/tools.at: Add a check for autoheader with multiple config headers. * NEWS: Document the new behavior. --- NEWS | 5 +++++ bin/autoheader.in | 37 ++++++++++++++++++++++++++----------- tests/tools.at | 25 +++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/NEWS b/NEWS index b82c1e3..a1f741f 100644 --- a/NEWS +++ b/NEWS @@ -27,6 +27,11 @@ GNU Autoconf NEWS - User visible changes. is now deprecated. If you really need that behavior use AC_PREPROC_IFELSE. +** When checking for missing templates, autoheader now takes any + templates defined in the inputs of secondary config headers into + account. This makes it possible to use AC_DEFINE for secondary + headers without duplicating the template in the main config header. + ** Macros - New macro AC_C__GENERIC. diff --git a/bin/autoheader.in b/bin/autoheader.in index 528e22c..2d2f943 100644 --- a/bin/autoheader.in +++ b/bin/autoheader.in @@ -191,11 +191,21 @@ unless ($config_h) exit 1; } -# 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"; +sub templates_for_header +{ + my ($spec) = @_; + my ($header, @templates) = split(':', $spec); + + return @templates if @templates; + return $header . '.in'; +} + +my @config_templates = map(templates_for_header($_), split(' ', $config_h)); + +# We template only the first CONFIG_HEADER. +$config_h_in = shift(@config_templates); +$config_h =~ s/[ :].*//; # %SYMBOL might contain things like 'F77_FUNC(name,NAME)', but we keep # only the name of the macro. @@ -261,14 +271,20 @@ $out->close; # Check that all the symbols have a template. { - my $in = new Autom4te::XFile ("$tmp/config.hin", "<"); - my $suggest_ac_define = 1; - while ($_ = $in->getline) + foreach my $template ("$tmp/config.hin", @config_templates) { - my ($symbol) = /^\#\s*\w+\s+(\w+)/ - or next; - delete $symbol{$symbol}; + my $in = new Autom4te::XFile ($template, "<"); + + while ($_ = $in->getline) + { + my ($sym) = /^\#\s*\w+\s+(\w+)/ + or next; + delete $symbol{$sym}; + } } + + my $suggest_ac_define = 1; + foreach (sort keys %symbol) { msg 'syntax', "warning: missing template: $_"; @@ -277,7 +293,6 @@ $out->close; msg 'syntax', "Use AC_DEFINE([$_], [], [Description])"; $suggest_ac_define = 0; } - } exit 1 if keys %symbol; diff --git a/tests/tools.at b/tests/tools.at index 4993b3f..2592a20 100644 --- a/tests/tools.at +++ b/tests/tools.at @@ -860,6 +860,31 @@ config.h.in:0 AT_CLEANUP +# autoheader should take all config header inputs into account when +# checking for missing templates. +AT_SETUP([autoheader with multiple headers]) + +AT_DATA([config-extra.h.in], +[[/* Define this to whatever you want. */ +#undef HANNA +]]) +AT_DATA([configure.ac], +[[AC_INIT +AC_CONFIG_HEADERS([config.h config-extra.h]) +AC_DEFINE([HANNA], ["Hanna"]) +AC_DEFINE([SEAN], ["Sean"], [Sean's name]) +AC_OUTPUT +]]) + +AT_CHECK_AUTOCONF +AT_CHECK_AUTOHEADER +AT_CHECK([grep HANNA configure], [0], [ignore], [ignore]) +AT_CHECK([grep HANNA config.h.in], [1], [ignore], [ignore]) +AT_CHECK([grep SEAN configure], [0], [ignore], [ignore]) +AT_CHECK([grep SEAN config.h.in], [0], [ignore], [ignore]) + +AT_CLEANUP + ## ------------ ## -- 2.9.3
_______________________________________________ Autoconf mailing list Autoconf@xxxxxxx https://lists.gnu.org/mailman/listinfo/autoconf