Re: [PATCH] autoheader: check templates of all config headers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [GCC Help]     [Kernel Discussion]     [RPM Discussion]     [Red Hat Development]     [Yosemite News]     [Linux USB]     [Samba]

  Powered by Linux