modules: Fix build on Visual Studio
authorChun-wei Fan <fanchunwei@src.gnome.org>
Thu, 4 Jun 2020 08:27:56 +0000 (16:27 +0800)
committerChun-wei Fan <fanchunwei@src.gnome.org>
Fri, 5 Jun 2020 03:16:45 +0000 (11:16 +0800)
Visual Studio does not allow decorating functions with '__declspec (dllexport)'
if a prototype exists and is not decorated with '__declspec (dllexport)' as
well, so we cannot just decorate g_io_module_[load|unload|query] in the various
module sources with G_MODULE_EXPORT because the prototypes of these functions
have been marked with _GLIB_EXTERN, which equates to 'extern' unless overridden

Fix this by overriding _GLIB_EXTERN with the appropriate visibility flag, as we
have used to define _GDK_EXTERN.  Unfortunately, we can't just use _GDK_EXTERN
G_MODULE_EXPORT as they may have not been defined yet for our use

Do this across the board for all modules, even if they are not buildable on
Visual Studio nor Windows, for consistency's sake.

meson.build
modules/media/gtkgstmediafile.c
modules/media/meson.build
modules/printbackends/gtkprintbackendcloudprint.c
modules/printbackends/gtkprintbackendcups.c
modules/printbackends/gtkprintbackendfile.c
modules/printbackends/gtkprintbackendlpr.c
modules/printbackends/meson.build

index 92951636034052559d2d04153a870ce9790ba996..946027a2785b305acdbb7a71a0ed10c21ec27668 100644 (file)
@@ -286,15 +286,19 @@ endif
 common_cflags = cc.get_supported_arguments(test_cflags)
 
 # Symbol visibility
+
+if os_win32
+  visibility_define = '__declspec(dllexport) extern'
+else
+  visibility_define = '__attribute__((visibility("default"))) extern'
+endif
+
 if get_option('default_library') != 'static'
+  cdata.set('_GDK_EXTERN', visibility_define)
   if os_win32
     cdata.set('DLL_EXPORT', true)
-    cdata.set('_GDK_EXTERN', '__declspec(dllexport) extern')
-    if cc.get_id() != 'msvc'
-      common_cflags += ['-fvisibility=hidden']
-    endif
-  else
-    cdata.set('_GDK_EXTERN', '__attribute__((visibility("default"))) extern')
+  endif
+  if cc.get_id() != 'msvc'
     common_cflags += ['-fvisibility=hidden']
   endif
 endif
index 5988ef38c33002bb17a076bb0907a8780bf19844..b094796fd57a589dd5d59f681f91ea9f79516b9b 100644 (file)
@@ -97,7 +97,6 @@ G_DEFINE_TYPE_EXTENDED (GtkGstMediaFile, gtk_gst_media_file, GTK_TYPE_MEDIA_FILE
                         G_IMPLEMENT_INTERFACE (GDK_TYPE_PAINTABLE,
                                                gtk_gst_media_file_paintable_init))
 
-G_MODULE_EXPORT
 void
 g_io_module_load (GIOModule *module)
 {
@@ -109,7 +108,6 @@ g_io_module_load (GIOModule *module)
                                   10);
 }
 
-G_MODULE_EXPORT
 G_GNUC_NORETURN
 void
 g_io_module_unload (GIOModule *module)
@@ -117,7 +115,6 @@ g_io_module_unload (GIOModule *module)
   g_assert_not_reached ();
 }
 
-G_MODULE_EXPORT
 char **
 g_io_module_query (void)
 {
index c6dbed1f263015a948fcd9b65df911b7610a4960..59124d315476c1c0930f26736afa22153465f02c 100644 (file)
@@ -23,7 +23,11 @@ endif
 media_subdir = 'gtk-4.0/@0@/media'.format(gtk_binary_version)
 media_install_dir = join_paths(get_option('libdir'), media_subdir)
 
-extra_c_args = ['-DGTK_COMPILATION']
+extra_c_args = [
+  '-DGTK_COMPILATION',
+  '-D_GLIB_EXTERN=@0@'.format(visibility_define),
+]
+
 extra_c_args += common_cflags
 
 if media_backends.contains('ffmpeg')
index 99dc5f3665543d771746fd5333c649939c7ac92e..6a5d7755afb32743ea682a4ea7270c0dc1ca631b 100644 (file)
@@ -103,7 +103,6 @@ void                 t_goa_account_free                 (gpointer data);
 
 G_DEFINE_DYNAMIC_TYPE (GtkPrintBackendCloudprint, gtk_print_backend_cloudprint, GTK_TYPE_PRINT_BACKEND)
 
-G_MODULE_EXPORT
 void
 g_io_module_load (GIOModule *module)
 {
@@ -119,13 +118,11 @@ g_io_module_load (GIOModule *module)
                                   10);
 }
 
-G_MODULE_EXPORT
 void
 g_io_module_unload (GIOModule *module)
 {
 }
 
-G_MODULE_EXPORT
 char **
 g_io_module_query (void)
 {
index 58dd95bbbe7683c678e5fb3eb3bec158d231a824..893ced4c1604f0df2c5fd5bca84cc7dc5287235a 100644 (file)
@@ -236,7 +236,6 @@ static void                 secrets_service_vanished_cb             (GDBusConnec
 
 G_DEFINE_DYNAMIC_TYPE(GtkPrintBackendCups, gtk_print_backend_cups, GTK_TYPE_PRINT_BACKEND)
 
-G_MODULE_EXPORT
 void
 g_io_module_load (GIOModule *module)
 {
@@ -251,13 +250,11 @@ g_io_module_load (GIOModule *module)
                                   10);
 }
 
-G_MODULE_EXPORT
 void
 g_io_module_unload (GIOModule *module)
 {
 }
 
-G_MODULE_EXPORT
 char **
 g_io_module_query (void)
 {
index 3486805688127c4e05a3c12daee383de335890e6..071ebec3597de726b33bac78392b5b27edddb0e1 100644 (file)
@@ -102,7 +102,6 @@ static GtkPageSetup *       file_printer_get_default_page_size     (GtkPrinter
 
 G_DEFINE_DYNAMIC_TYPE(GtkPrintBackendFile, gtk_print_backend_file, GTK_TYPE_PRINT_BACKEND)
 
-G_MODULE_EXPORT
 void
 g_io_module_load (GIOModule *module)
 {
@@ -116,13 +115,11 @@ g_io_module_load (GIOModule *module)
                                   10);
 }
 
-G_MODULE_EXPORT
 void
 g_io_module_unload (GIOModule *module)
 {
 }
 
-G_MODULE_EXPORT
 char **
 g_io_module_query (void)
 {
index 0626e594fa51b6f868e9e69c392cff44a6ada262..cef1501c3006294a10e7188cd820de15c5888029 100644 (file)
@@ -83,7 +83,6 @@ static void                 gtk_print_backend_lpr_print_stream    (GtkPrintBacke
 
 G_DEFINE_DYNAMIC_TYPE (GtkPrintBackendLpr, gtk_print_backend_lpr, GTK_TYPE_PRINT_BACKEND)
 
-G_MODULE_EXPORT
 void
 g_io_module_load (GIOModule *module)
 {
@@ -97,13 +96,11 @@ g_io_module_load (GIOModule *module)
                                   10);
 }
 
-G_MODULE_EXPORT
 void
 g_io_module_unload (GIOModule *module)
 {
 }
 
-G_MODULE_EXPORT
 char **
 g_io_module_query (void)
 {
index 643a8ba8886743df85063a051fa189aab419ba7c..40a9379b47a898273d1336ddbf8ecca4be3236ba 100644 (file)
@@ -68,6 +68,7 @@ printbackends_args = [
   '-DGTK_COMPILATION',
   '-DGTK_DISABLE_DEPRECATION_WARNINGS',
   '-DGTK_PRINT_BACKEND_ENABLE_UNSUPPORTED',
+  '-D_GLIB_EXTERN=@0@'.format(visibility_define),
 ] + common_cflags
 
 if print_backends.contains('cups')