[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