[libvirt] [PATCH] Fix _FILE_OFFSET_BITS re-definition

Daniel P. Berrange berrange at redhat.com
Wed Dec 17 15:21:34 UTC 2008


On Wed, Dec 17, 2008 at 10:55:41AM +0100, Jim Meyering wrote:
> john.levon at sun.com wrote:
> > # HG changeset patch
> > # User john.levon at sun.com
> > # Date 1229399267 28800
> > # Node ID db36391b739c117f5887388f65f31e6a9d2d361b
> > # Parent  020f8b8e9340287a6ab3d869b359e39b905cd0ff
> > Fix _FILE_OFFSET_BITS re-definition
> >
> > Since config.h contains the _FILE_OFFSET_BITS setting (a little dubious
> > in itself), it must be the first header included, otherwise system
> > headers can define _FILE_OFFSET_BITS differently themselves.
> >
> > Signed-off-by: John Levon <john.levon at sun.com>
> >
> > diff --git a/src/node_device_hal.c b/src/node_device_hal.c
> > --- a/src/node_device_hal.c
> > +++ b/src/node_device_hal.c
> > @@ -21,10 +21,11 @@
> >   * Author: David F. Lively <dlively at virtualiron.com>
> >   */
> >
> > +#include <config.h>
> > +
> >  #include <stdio.h>
> >  #include <stdlib.h>
> >
> > -#include <config.h>
> >  #include <libhal.h>
> >
> >  #include "node_device_conf.h"
> 
> ACK
> 
> FYI, there are 3 other cases where the "include <config.h> first"
> rule is broken:
> 
>   docs/examples/info1.c
>   docs/examples/suspend.c
>   qemud/remote_protocol.c
> 
> so I've just written a new syntax-check rule to enforce this.
> It fixes only the last one.  Since the two examples are not
> necessarily built using libvirt's own build system, so they
> are exempted.

Yep, the examples shouldn't really need config.h at all,
using the 

> 
> So with your patch above and the following one,
> the new "make sc_require_config_h_first" part of "make syntax-check"
> passes:
> 
> >From 15afb090ac28ab6b9274fb827eb1c1c939db4104 Mon Sep 17 00:00:00 2001
> From: Jim Meyering <meyering at redhat.com>
> Date: Wed, 17 Dec 2008 10:49:04 +0100
> Subject: [PATCH] enforce the "include <config.h> first" rule
> 
> * qemud/Makefile.am: Ensure that the generated remote_protocol.c
> includes <config.h> first.
> * qemud/remote_protocol.c: Regenerate.
> * Makefile.maint (sc_require_config_h_first): New rule, so that
> "make syntax-check" enforces this.
> * .x-sc_require_config_h_first: New file.
> * Makefile.am (.x-sc_require_config_h_first): Add it.


ACK

> ---
>  .x-sc_require_config_h_first |    2 ++
>  ChangeLog                    |   11 +++++++++++
>  Makefile.am                  |    1 +
>  Makefile.maint               |   15 +++++++++++++++
>  qemud/Makefile.am            |    9 +++++++--
>  qemud/remote_protocol.c      |    2 +-
>  6 files changed, 37 insertions(+), 3 deletions(-)
>  create mode 100644 .x-sc_require_config_h_first
> 
> diff --git a/.x-sc_require_config_h_first b/.x-sc_require_config_h_first
> new file mode 100644
> index 0000000..58a8878
> --- /dev/null
> +++ b/.x-sc_require_config_h_first
> @@ -0,0 +1,2 @@
> +^docs/examples/info1\.c$
> +^docs/examples/suspend\.c$
> diff --git a/ChangeLog b/ChangeLog
> index 08a1cb5..36c1278 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,14 @@
> +2008-12-17  Jim Meyering  <meyering at redhat.com>
> +
> +	enforce the "include <config.h> first" rule
> +	* qemud/Makefile.am: Ensure that the generated remote_protocol.c
> +	includes <config.h> first.
> +	* qemud/remote_protocol.c: Regenerate.
> +	* Makefile.maint (sc_require_config_h_first): New rule, so that
> +	"make syntax-check" enforces this.
> +	* .x-sc_require_config_h_first: New file.
> +	* Makefile.am (.x-sc_require_config_h_first): Add it.
> +
>  Wed Dec 17 08:02:01 +0100 2008 Jim Meyering <meyering at redhat.com>
> 
>  	fix numa-related (and kernel-dependent) test failures
> diff --git a/Makefile.am b/Makefile.am
> index d40a151..758ad50 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -14,6 +14,7 @@ EXTRA_DIST = \
>    libvirt.pc libvirt.pc.in \
>    $(man_MANS) autobuild.sh \
>    .x-sc_avoid_if_before_free \
> +  .x-sc_require_config_h_first \
>    .x-sc_prohibit_strcmp \
>    .x-sc_require_config_h \
>    autogen.sh
> diff --git a/Makefile.maint b/Makefile.maint
> index 5758215..b7bb680 100644
> --- a/Makefile.maint
> +++ b/Makefile.maint
> @@ -135,6 +135,21 @@ sc_require_config_h:
>  	else :;								\
>  	fi
> 
> +# You must include <config.h> before including any other header file.
> +sc_require_config_h_first:
> +	@if $(VC_LIST_EXCEPT) | grep '\.c$$' > /dev/null; then		\
> +	  fail=0;							\
> +	  for i in $$($(VC_LIST_EXCEPT) | grep '\.c$$'); do		\
> +	    grep '^# *include\>' $$i | sed 1q				\
> +		| grep '^# *include <config\.h>' > /dev/null		\
> +	      || { echo $$i; fail=1; };					\
> +	  done;								\
> +	  test $$fail = 1 &&						\
> +	    { echo '$(ME): the above files include some other header'	\
> +		'before <config.h>' 1>&2; exit 1; } || :;		\
> +	else :;								\
> +	fi
> +
>  # To use this "command" macro, you must first define two shell variables:
>  # h: the header, enclosed in <> or ""
>  # re: a regular expression that matches IFF something provided by $h is used.
> diff --git a/qemud/Makefile.am b/qemud/Makefile.am
> index b8dae88..28fd84a 100644
> --- a/qemud/Makefile.am
> +++ b/qemud/Makefile.am
> @@ -33,11 +33,16 @@ EXTRA_DIST =						\
> 
>  if RPCGEN
>  SUFFIXES = .x
> +# The perl -ne subshell ensures that remote_protocol.c ends up
> +# including <config.h> before "remote_protocol.h".
>  .x.c:
> -	rm -f $@ $@-t $@-t2
> +	rm -f $@ $@-t $@-t1 $@-t2
>  	rpcgen -c -o $@-t $<
> +	(echo '#include <config.h>';			\
> +	 perl -ne '/^#include <config.h>/ or print' $@-t) > $@-t1
>  if GLIBC_RPCGEN
> -	perl -w rpcgen_fix.pl $@-t > $@-t2
> +	perl -w rpcgen_fix.pl $@-t1 > $@-t2
> +	rm $@-t1
>  	chmod 444 $@-t2
>  	mv $@-t2 $@
>  endif
> diff --git a/qemud/remote_protocol.c b/qemud/remote_protocol.c
> index ec8e653..cbd722d 100644
> --- a/qemud/remote_protocol.c
> +++ b/qemud/remote_protocol.c
> @@ -1,10 +1,10 @@
> +#include <config.h>
>  /*
>   * Please do not edit this file.
>   * It was generated using rpcgen.
>   */
> 
>  #include "remote_protocol.h"
> -#include <config.h>
>  #include "internal.h"
>  #include <arpa/inet.h>

Rather than filtering out the bogus 'config.h' from remote_protocol.c
in the Makefile.am rule, just kill this line from the original protocol
definition:

  %#include <config.h>

Then the bogus placed include wouldn't be added in the first place.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list