[PATCH] tests: Compile virgdbusmock.c with GIO_COMPILATION enabled

Andrea Bolognani abologna at redhat.com
Tue Mar 28 08:33:22 UTC 2023


On Mon, Mar 27, 2023 at 02:47:40PM +0200, Michal Privoznik wrote:
> There are couple of g_dbus_*() functions we provide an
> alternative implementation for in our virgdbusmock.c. However,
> these functions are declared in gio/gdbusconnection.h as:
>
>   GIO_AVAILABLE_IN_ALL
>   GDBusConnection  *g_bus_get_sync (GBusType            bus_type,
>                                     GCancellable       *cancellable,
>                                     GError            **error);
>
> where GIO_AVAILABLE_IN_ALL is declared as (in
> /gio/gio-visibility.h):
>
>   #if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(GIO_STATIC_COMPILATION)
>   #  define _GIO_EXPORT __declspec(dllexport)
>   #  define _GIO_IMPORT __declspec(dllimport)
>   #elif __GNUC__ >= 4
>   #  define _GIO_EXPORT __attribute__((visibility("default")))
>   #  define _GIO_IMPORT
>   #else
>   #  define _GIO_EXPORT
>   #  define _GIO_IMPORT
>   #endif
>   #ifdef GIO_COMPILATION
>   #  define _GIO_API _GIO_EXPORT
>   #else
>   #  define _GIO_API _GIO_IMPORT
>   #endif
>
>   #define _GIO_EXTERN _GIO_API extern
>
>   #define GIO_AVAILABLE_IN_ALL _GIO_EXTERN
>
> Now, on mingw the functions we mock are declared with dllimport
> attribute which makes the compiler unhappy:
>
>   ../tests/virgdbusmock.c:25:24: error: 'g_bus_get_sync'
>   redeclared without dllimport attribute: previous dllimport
>   ignored [-Werror=attributes]
>
> The solution is to do what glib does when it compiles the gio
> module: set GIO_COMPILATION macro which in turn annotates the
> function with dllexport attribute.

I will point out that GIO_COMPILATION is not intended to be used
outside of GLib: it signals that the gio module is in the process of
being built, which can result (as is the case here) in different
behavior compared to what you'd see when building *against* gio.

So defining it as part of building libvirt is quite yucky, and I
wouldn't be surprised if this trick stopped working or ended up
causing other unintended consequences in the future.

Unfortunately, I also don't really have a better alternative to
suggest, so I guess it is what it is :)

-- 
Andrea Bolognani / Red Hat / Virtualization



More information about the libvir-list mailing list