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

Michal Prívozník mprivozn at redhat.com
Tue Mar 28 10:27:12 UTC 2023


On 3/28/23 10:33, Andrea Bolognani wrote:
> 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.

That's something we're already used to since switching to glib. This but
another quirk that we have to deal with.

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

Maybe don't build mocks on mingw? Do they even work, or better: can they?

Michal



More information about the libvir-list mailing list