Eric Blake
2019-Jun-03 22:05 UTC
[Libguestfs] [libnbd PATCH] generator: Add #define witnesses for all API
Make it easier for C libraries to consume arbitrary versions of
libnbd, by giving a probe for which functions the current version of
the library exports.
---
I'm fuzzy enough on OCaml that I'll get review for this, although I
like the resulting libnbd.h.
generator/generator | 24 +++++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
diff --git a/generator/generator b/generator/generator
index db7c10f..7d0ea3f 100755
--- a/generator/generator
+++ b/generator/generator
@@ -2712,6 +2712,12 @@ let print_extern name args ret print_call name args
ret;
pr ";\n"
+let print_extern_and_define name args ret + let name_upper =
String.uppercase_ascii name in
+ print_extern name args ret;
+ pr "#define LIBNBD_HAVE_NBD_%s 1\n" name_upper;
+ pr "\n"
+
let generate_include_libnbd_h () generate_header CStyle;
@@ -2729,14 +2735,23 @@ let generate_include_libnbd_h () List.iter (fun (n,
i) -> pr "#define LIBNBD_%-30s %d\n" n i) constants;
pr "\n";
pr "extern struct nbd_handle *nbd_create (void);\n";
+ pr "#define LIBNBD_HAVE_NBD_CREATE 1\n";
+ pr "\n";
pr "extern void nbd_close (struct nbd_handle *h);\n";
+ pr "#define LIBNBD_HAVE_NBD_CLOSE 1\n";
+ pr "\n";
pr "extern const char *nbd_get_error (void);\n";
+ pr "#define LIBNBD_HAVE_NBD_GET_ERROR 1\n";
+ pr "\n";
pr "extern int nbd_get_errno (void);\n";
+ pr "#define LIBNBD_HAVE_NBD_GET_ERRNO 1\n";
+ pr "\n";
pr "extern int nbd_add_close_callback (struct nbd_handle *h,\n";
pr " nbd_close_callback cb, void
*data);\n";
+ pr "#define LIBNBD_HAVE_NBD_ADD_CLOSE_CALLBACK 1\n";
pr "\n";
List.iter (
- fun (name, { args; ret }) -> print_extern name args ret
+ fun (name, { args; ret }) -> print_extern_and_define name args ret
) handle_calls;
pr "\n";
pr "#endif /* LIBNBD_H */\n"
@@ -2933,6 +2948,13 @@ in detail. If you want an overview of using the API, or
to see
how to call the API from other programming languages, start
with libnbd(3).
+For the sake of conditional compilation across a range of libnbd
+versions, where a client may take advantage of newer API when present
+but gracefully continue to compile even when it is not, all functions
+declared in B<E<lt>libnbd.hE<gt>> have a corresponding
witness macro
+with prefix C<LIBNBD_HAVE_>. For example, C<nbd_create> has a
+counterpart macro C<LIBNBD_HAVE_NBD_CREATE> defined to C<1>.
+
=head1 CREATE, GET AND CLOSE HANDLES
struct nbd_handle *nbd;
--
2.20.1
Richard W.M. Jones
2019-Jun-04 09:34 UTC
Re: [Libguestfs] [libnbd PATCH] generator: Add #define witnesses for all API
On Mon, Jun 03, 2019 at 05:05:12PM -0500, Eric Blake wrote:> Make it easier for C libraries to consume arbitrary versions of > libnbd, by giving a probe for which functions the current version of > the library exports. > --- > > I'm fuzzy enough on OCaml that I'll get review for this, although I > like the resulting libnbd.h.I don't see any problems, OCaml or otherwise, ACK. Thanks, Rich.> generator/generator | 24 +++++++++++++++++++++++- > 1 file changed, 23 insertions(+), 1 deletion(-) > > diff --git a/generator/generator b/generator/generator > index db7c10f..7d0ea3f 100755 > --- a/generator/generator > +++ b/generator/generator > @@ -2712,6 +2712,12 @@ let print_extern name args ret > print_call name args ret; > pr ";\n" > > +let print_extern_and_define name args ret > + let name_upper = String.uppercase_ascii name in > + print_extern name args ret; > + pr "#define LIBNBD_HAVE_NBD_%s 1\n" name_upper; > + pr "\n" > + > let generate_include_libnbd_h () > generate_header CStyle; > > @@ -2729,14 +2735,23 @@ let generate_include_libnbd_h () > List.iter (fun (n, i) -> pr "#define LIBNBD_%-30s %d\n" n i) constants; > pr "\n"; > pr "extern struct nbd_handle *nbd_create (void);\n"; > + pr "#define LIBNBD_HAVE_NBD_CREATE 1\n"; > + pr "\n"; > pr "extern void nbd_close (struct nbd_handle *h);\n"; > + pr "#define LIBNBD_HAVE_NBD_CLOSE 1\n"; > + pr "\n"; > pr "extern const char *nbd_get_error (void);\n"; > + pr "#define LIBNBD_HAVE_NBD_GET_ERROR 1\n"; > + pr "\n"; > pr "extern int nbd_get_errno (void);\n"; > + pr "#define LIBNBD_HAVE_NBD_GET_ERRNO 1\n"; > + pr "\n"; > pr "extern int nbd_add_close_callback (struct nbd_handle *h,\n"; > pr " nbd_close_callback cb, void *data);\n"; > + pr "#define LIBNBD_HAVE_NBD_ADD_CLOSE_CALLBACK 1\n"; > pr "\n"; > List.iter ( > - fun (name, { args; ret }) -> print_extern name args ret > + fun (name, { args; ret }) -> print_extern_and_define name args ret > ) handle_calls; > pr "\n"; > pr "#endif /* LIBNBD_H */\n" > @@ -2933,6 +2948,13 @@ in detail. If you want an overview of using the API, or to see > how to call the API from other programming languages, start > with libnbd(3). > > +For the sake of conditional compilation across a range of libnbd > +versions, where a client may take advantage of newer API when present > +but gracefully continue to compile even when it is not, all functions > +declared in B<E<lt>libnbd.hE<gt>> have a corresponding witness macro > +with prefix C<LIBNBD_HAVE_>. For example, C<nbd_create> has a > +counterpart macro C<LIBNBD_HAVE_NBD_CREATE> defined to C<1>. > + > =head1 CREATE, GET AND CLOSE HANDLES > > struct nbd_handle *nbd; > -- > 2.20.1 > > _______________________________________________ > Libguestfs mailing list > Libguestfs@redhat.com > https://www.redhat.com/mailman/listinfo/libguestfs-- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com virt-df lists disk usage of guests without needing to install any software inside the virtual machine. Supports Linux and Windows. http://people.redhat.com/~rjones/virt-df/
Possibly Parallel Threads
- [PATCH libnbd 2/2] generator: Change handling of Flags to be a true optional argument.
- [libnbd PATCH] generator: Add support for namespace constants
- [PATCH libnbd 0/2] generator: Preparatory changes to the generator.
- [PATCH libnbd] generator: Generate typedefs automatically for Closure arguments.
- [libnbd PATCH 1/2] generator: Refactor handling of closures in unlocked functions