[Libguestfs] [PATCH nbdkit 2/2] tests: Test that public headers are ANSI (ISO C90) compatible.

Richard W.M. Jones rjones at redhat.com
Fri Jan 18 14:50:41 UTC 2019


On Fri, Jan 18, 2019 at 08:44:44AM -0600, Eric Blake wrote:
> On 1/14/19 6:15 AM, Richard W.M. Jones wrote:
> > In commit 3775916120749e935d287f35cb29ff6c586656df (and before that in
> > discussions with Eric) we decided that we should try to allow plugins
> > to be compiled with C compilers other than GCC or Clang (or with very
> > old / peculiar / incompatible versions of those compilers).
> > 
> > However until we test this we cannot guarantee that changes to the
> > code will not break this in future, hence this test.
> > 
> > Note that GCC or Clang is still required to compile nbdkit itself.
> > ---
> >  tests/test-ansi-c-plugin.c | 167 +++++++++++++++++++++++++++++++++++++
> >  tests/Makefile.am          |  24 ++++++
> >  tests/test-ansi-c.sh       |  39 +++++++++
> >  3 files changed, 230 insertions(+)
> > 
> > diff --git a/tests/test-ansi-c-plugin.c b/tests/test-ansi-c-plugin.c
> > new file mode 100644
> > index 0000000..8596ca5
> > --- /dev/null
> > +++ b/tests/test-ansi-c-plugin.c
> 
> > +
> > +#include <config.h>
> 
> Do we really want to be including <config.h> in this file?  This is the
> one case where we know we are standalone; I'm also worried that the
> macros defined in config.h were determined based on the existence of
> extensions during configure probes, and may be inaccurately-defined for
> compilation under a different set of compiler flags.  I'd omit this (but
> perhaps leave a comment why), as proof that we are truly independent of
> how nbdkit was configured.

No we shouldn't have it - this was a bug.

I removed it and it turned out it _was_ being used for to define
PACKAGE_VERSION in the plugin struct, but I'll replace that.  And fix
the NULL / 0 pointer business too.

Thanks,

Rich.

> > +/* Strictly speaking (and we're compiling with -pedantic, so we _are_
> 
> lol
> 
> > + * strictly speaking), ANSI C did not allow struct initialization
> > + * using labels.  However it was a common extension to C compilers of
> > + * the period.
> > + *
> > + * Therefore we rely here on the order of fields in struct
> > + * nbdkit_plugin.  But that's OK because of nbdkit's stable ABI
> > + * guarantee.
> > + *
> > + * If you are really writing an nbdkit plugin which can only use C90
> > + * then you are advised to find the extension to your compiler which
> > + * allows you to initialize named fields.
> > + */
> > +static struct nbdkit_plugin plugin = {
> > +  0, 0, 0,
> 
> I'd typically use NULL for pointers, but using 0 is strictly portable,
> so I'm fine with it.
> 
> > +  "ansic",
> > +  0,
> > +  PACKAGE_VERSION,
> > +  0,
> > +  ansi_c_load,
> > +  0,
> > +  0, 0, 0,
> > +  ansi_c_open,
> > +  0,
> > +  ansi_c_get_size,
> > +  0, 0, 0, 0,
> > +  ansi_c_pread
> > +};
> > +
> > +NBDKIT_REGISTER_PLUGIN(plugin)
> 
> > +++ b/tests/Makefile.am
> 
> >  
> > +# This builds a plugin using an ANSI (ISO C90) compiler to ensure that
> > +# the header file is compatible.  The plugin does nothing very
> > +# interesting, it's mainly a compile test.
> > +TESTS += \
> > +	test-ansi-c.sh
> > +# check_LTLIBRARIES won't build a shared library (see automake manual).
> > +# So we have to do this and add a dependency.
> > +noinst_LTLIBRARIES += test-ansi-c-plugin.la
> > +test-ansi-c.sh: test-ansi-c-plugin.la
> > +
> > +test_ansi_c_plugin_la_SOURCES = \
> > +	test-ansi-c-plugin.c \
> > +	$(top_srcdir)/include/nbdkit-plugin.h
> > +test_ansi_c_plugin_la_CPPFLAGS = \
> > +	-std=c90 -pedantic \
> > +	-I$(top_srcdir)/include
> > +test_ansi_c_plugin_la_CFLAGS = \
> > +        $(WARNINGS_CFLAGS)
> > +# For use of the -rpath option, see:
> > +# https://lists.gnu.org/archive/html/libtool/2007-07/msg00067.html
> > +test_ansi_c_plugin_la_LDFLAGS = \
> > +	-module -avoid-version -shared -rpath /nowhere
> 
> Looks sane, if it still works without <config.h>.
> 
> -- 
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.           +1-919-301-3226
> Virtualization:  qemu.org | libvirt.org
> 




-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list