
On Thu, 2017-06-01 at 12:21 +0100, Daniel P. Berrange wrote:
This is not that attractive from POV the language bindings. eg in the Go code, I need to make usage of the new APIs conditional at compile time. For example for the new APIs added in 3.4.0 I have code like func (v *Stream) RecvFlags(p []byte, flags StreamRecvFlagsValues) (int, error) { if C.LIBVIR_VERSION_NUMBER < 3004000 { return 0, GetNotImplementedError("virStreamRecvFlags") } n := C.virStreamRecvFlagsCompat(v.ptr, (*C.char)(unsafe.Pointer(&p[0])), C.size_t(len(p)), C.uint(flags)) ...snip... } and int virStreamRecvFlagsCompat(virStreamPtr st, char *data, size_t nbytes, unsigned int flags) { #if LIBVIR_VERSION_NUMBER < 3004000 assert(0); // Caller should have checked version #else return virStreamRecvFlags(st, data, nbytes, flags); #endif } The suggested versioning scheme would require changing all these version numbers checks to 3003090 is rather unpleasant IMHO.
Well, that shouldn't be needed for released versions of the bindings as they would of course depend on a released version of libvirt, but I see how it would make it more difficult than necessary to develop the bindings in parallel to the new libvirt version. So I guess disregard my proposal :) -- Andrea Bolognani / Red Hat / Virtualization