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