[glib: 2/7] Fix symbol visibility macros on Windows




commit dcfc9f689e2483d7735bdc90fb36201838c1854f
Author: Xavier Claessens <xavier claessens collabora com>
Date:   Mon Oct 3 10:36:04 2022 -0400

    Fix symbol visibility macros on Windows
    
    There is currently no `dllimport` attribute on any of our function,
    which prevents MSVC to optimize function calls.
    
    To fix that issue, we need to redeclare all our visibility macros for
    each of our libraries, because when compiling e.g. GIO code, we need
    dllimport in GLIB headers and dllexport in GIO headers. That means they
    cannot use the same GLIB_AVAILABLE_* macro.
    
    Since that's a lot of boilerplate to copy/paste after each version bump,
    this MR generate all those macros using a python script.
    
    Also simplify the meson side by using `gnu_symbol_visibility : 'hidden'`
    keyword argument instead of passing the cflag manually.
    
    This leaves only API index to add manually into glib-docs.xml when
    bumping GLib version. That file cannot be generated because Meson does
    not allow passing a buit file to gnome.gtkdoc()'s main_xml kwarg
    unfortunately.

 .../gio/gdbus-object-manager-example/meson.build   |    2 +-
 docs/reference/gio/meson.build                     |    4 +-
 .../{glib-sections.txt => glib-sections.txt.in}    |  335 +-----
 docs/reference/glib/meson.build                    |   11 +-
 docs/reference/gobject/gobject-sections.txt        |    3 -
 docs/reference/gobject/meson.build                 |    4 +-
 docs/reference/meson.build                         |    4 +-
 gio/gioenums.h                                     |    1 +
 gio/gioenumtypes.h.template                        |    1 +
 gio/gnetworking.h.in                               |    1 +
 gio/gsettingsschema.h                              |    1 +
 gio/meson.build                                    |    9 +-
 gio/xdgmime/meson.build                            |    4 +-
 glib/glibconfig.h.in                               |   13 +-
 glib/gmacros.h                                     |   16 -
 glib/gnulib/meson.build                            |    5 +-
 glib/gtypes.h                                      |   23 -
 glib/gversionmacros.h                              | 1213 --------------------
 glib/gversionmacros.h.in                           |  140 +++
 glib/libcharset/meson.build                        |    4 +-
 glib/meson.build                                   |   22 +-
 gmodule/gmodule.h                                  |    1 +
 gmodule/meson.build                                |    9 +-
 gobject/gparamspecs.h                              |   24 -
 gobject/gtype.h                                    |    3 +-
 gobject/meson.build                                |   11 +-
 gthread/meson.build                                |    3 +-
 meson.build                                        |   24 +-
 tools/gen-visibility-macros.py                     |  171 +++
 tools/meson.build                                  |    2 +
 30 files changed, 409 insertions(+), 1655 deletions(-)
---
diff --git a/docs/reference/gio/gdbus-object-manager-example/meson.build 
b/docs/reference/gio/gdbus-object-manager-example/meson.build
index 13cae5b48e..8a80501c98 100644
--- a/docs/reference/gio/gdbus-object-manager-example/meson.build
+++ b/docs/reference/gio/gdbus-object-manager-example/meson.build
@@ -3,7 +3,7 @@ gdbus_object_manager_example_doc = gnome.gtkdoc('gdbus-object-manager-example',
   namespace : 'example',
   dependencies : [libgdbus_example_objectmanager_dep],
   src_dir : 'gio/tests/gdbus-object-manager-example',
-  scan_args : gtkdoc_common_scan_args + [
+  scan_args : [
     '--rebuild-types',
   ],
   install : false,
diff --git a/docs/reference/gio/meson.build b/docs/reference/gio/meson.build
index 8c8e15fd81..b6ce1788f9 100644
--- a/docs/reference/gio/meson.build
+++ b/docs/reference/gio/meson.build
@@ -98,6 +98,7 @@ if get_option('gtk_doc')
     'gwin32volumemonitor.h',
     'thumbnail-verify.h',
     'xdp-dbus.h',
+    'gio-visibility.h',
   ]
 
   sections_files = files('gio-sections-common.txt')
@@ -187,7 +188,8 @@ if get_option('gtk_doc')
     mode : 'none',
     dependencies : [libgio_dep, libgobject_dep, libglib_dep],
     src_dir : 'gio',
-    scan_args : gtkdoc_common_scan_args + [
+    scan_args : [
+      '--ignore-decorators=' + ignore_decorators.replace('GLIB', 'GIO'),
       '--rebuild-types',
       '--ignore-headers=' + ' '.join(ignore_headers),
     ],
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt.in
similarity index 86%
rename from docs/reference/glib/glib-sections.txt
rename to docs/reference/glib/glib-sections.txt.in
index 38b35386e3..2b500257c4 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt.in
@@ -116,355 +116,22 @@ GLIB_MICRO_VERSION
 GLIB_CHECK_VERSION
 
 <SUBSECTION>
-GLIB_VERSION_2_26
-GLIB_VERSION_2_28
-GLIB_VERSION_2_30
-GLIB_VERSION_2_32
-GLIB_VERSION_2_34
-GLIB_VERSION_2_36
-GLIB_VERSION_2_38
-GLIB_VERSION_2_40
-GLIB_VERSION_2_42
-GLIB_VERSION_2_44
-GLIB_VERSION_2_46
-GLIB_VERSION_2_48
-GLIB_VERSION_2_50
-GLIB_VERSION_2_52
-GLIB_VERSION_2_54
-GLIB_VERSION_2_56
-GLIB_VERSION_2_58
-GLIB_VERSION_2_60
-GLIB_VERSION_2_62
-GLIB_VERSION_2_64
-GLIB_VERSION_2_66
-GLIB_VERSION_2_68
-GLIB_VERSION_2_70
-GLIB_VERSION_2_72
-GLIB_VERSION_2_74
 GLIB_VERSION_CUR_STABLE
 GLIB_VERSION_PREV_STABLE
 GLIB_VERSION_MIN_REQUIRED
 GLIB_VERSION_MAX_ALLOWED
 GLIB_DISABLE_DEPRECATION_WARNINGS
+@GLIB_VERSIONS@
 
 <SUBSECTION Private>
 G_ENCODE_VERSION
-GLIB_AVAILABLE_ENUMERATOR_IN_2_26
-GLIB_AVAILABLE_ENUMERATOR_IN_2_28
-GLIB_AVAILABLE_ENUMERATOR_IN_2_30
-GLIB_AVAILABLE_ENUMERATOR_IN_2_32
-GLIB_AVAILABLE_ENUMERATOR_IN_2_34
-GLIB_AVAILABLE_ENUMERATOR_IN_2_36
-GLIB_AVAILABLE_ENUMERATOR_IN_2_38
-GLIB_AVAILABLE_ENUMERATOR_IN_2_40
-GLIB_AVAILABLE_ENUMERATOR_IN_2_42
-GLIB_AVAILABLE_ENUMERATOR_IN_2_44
-GLIB_AVAILABLE_ENUMERATOR_IN_2_46
-GLIB_AVAILABLE_ENUMERATOR_IN_2_48
-GLIB_AVAILABLE_ENUMERATOR_IN_2_50
-GLIB_AVAILABLE_ENUMERATOR_IN_2_52
-GLIB_AVAILABLE_ENUMERATOR_IN_2_54
-GLIB_AVAILABLE_ENUMERATOR_IN_2_56
-GLIB_AVAILABLE_ENUMERATOR_IN_2_58
-GLIB_AVAILABLE_ENUMERATOR_IN_2_60
-GLIB_AVAILABLE_ENUMERATOR_IN_2_62
-GLIB_AVAILABLE_ENUMERATOR_IN_2_64
-GLIB_AVAILABLE_ENUMERATOR_IN_2_66
-GLIB_AVAILABLE_ENUMERATOR_IN_2_68
-GLIB_AVAILABLE_ENUMERATOR_IN_2_70
-GLIB_AVAILABLE_ENUMERATOR_IN_2_72
-GLIB_AVAILABLE_ENUMERATOR_IN_2_74
 GLIB_AVAILABLE_IN_ALL
-GLIB_AVAILABLE_IN_2_26
-GLIB_AVAILABLE_IN_2_28
-GLIB_AVAILABLE_IN_2_30
-GLIB_AVAILABLE_IN_2_32
-GLIB_AVAILABLE_IN_2_34
-GLIB_AVAILABLE_IN_2_36
-GLIB_AVAILABLE_IN_2_38
-GLIB_AVAILABLE_IN_2_40
-GLIB_AVAILABLE_IN_2_42
-GLIB_AVAILABLE_IN_2_44
-GLIB_AVAILABLE_IN_2_46
-GLIB_AVAILABLE_IN_2_48
-GLIB_AVAILABLE_IN_2_50
-GLIB_AVAILABLE_IN_2_52
-GLIB_AVAILABLE_IN_2_54
-GLIB_AVAILABLE_IN_2_56
-GLIB_AVAILABLE_IN_2_58
-GLIB_AVAILABLE_IN_2_60
-GLIB_AVAILABLE_IN_2_62
-GLIB_AVAILABLE_IN_2_64
-GLIB_AVAILABLE_IN_2_66
-GLIB_AVAILABLE_IN_2_68
-GLIB_AVAILABLE_IN_2_70
-GLIB_AVAILABLE_IN_2_72
-GLIB_AVAILABLE_IN_2_74
-GLIB_AVAILABLE_MACRO_IN_2_26
-GLIB_AVAILABLE_MACRO_IN_2_28
-GLIB_AVAILABLE_MACRO_IN_2_30
-GLIB_AVAILABLE_MACRO_IN_2_32
-GLIB_AVAILABLE_MACRO_IN_2_34
-GLIB_AVAILABLE_MACRO_IN_2_36
-GLIB_AVAILABLE_MACRO_IN_2_38
-GLIB_AVAILABLE_MACRO_IN_2_40
-GLIB_AVAILABLE_MACRO_IN_2_42
-GLIB_AVAILABLE_MACRO_IN_2_44
-GLIB_AVAILABLE_MACRO_IN_2_46
-GLIB_AVAILABLE_MACRO_IN_2_48
-GLIB_AVAILABLE_MACRO_IN_2_50
-GLIB_AVAILABLE_MACRO_IN_2_52
-GLIB_AVAILABLE_MACRO_IN_2_54
-GLIB_AVAILABLE_MACRO_IN_2_56
-GLIB_AVAILABLE_MACRO_IN_2_58
-GLIB_AVAILABLE_MACRO_IN_2_60
-GLIB_AVAILABLE_MACRO_IN_2_62
-GLIB_AVAILABLE_MACRO_IN_2_64
-GLIB_AVAILABLE_MACRO_IN_2_66
-GLIB_AVAILABLE_MACRO_IN_2_68
-GLIB_AVAILABLE_MACRO_IN_2_70
-GLIB_AVAILABLE_MACRO_IN_2_72
-GLIB_AVAILABLE_MACRO_IN_2_74
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_44
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_60
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_62
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_64
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_66
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_68
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_70
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_72
-GLIB_AVAILABLE_STATIC_INLINE_IN_2_74
-GLIB_AVAILABLE_TYPE_IN_2_26
-GLIB_AVAILABLE_TYPE_IN_2_28
-GLIB_AVAILABLE_TYPE_IN_2_30
-GLIB_AVAILABLE_TYPE_IN_2_32
-GLIB_AVAILABLE_TYPE_IN_2_34
-GLIB_AVAILABLE_TYPE_IN_2_36
-GLIB_AVAILABLE_TYPE_IN_2_38
-GLIB_AVAILABLE_TYPE_IN_2_40
-GLIB_AVAILABLE_TYPE_IN_2_42
-GLIB_AVAILABLE_TYPE_IN_2_44
-GLIB_AVAILABLE_TYPE_IN_2_46
-GLIB_AVAILABLE_TYPE_IN_2_48
-GLIB_AVAILABLE_TYPE_IN_2_50
-GLIB_AVAILABLE_TYPE_IN_2_52
-GLIB_AVAILABLE_TYPE_IN_2_54
-GLIB_AVAILABLE_TYPE_IN_2_56
-GLIB_AVAILABLE_TYPE_IN_2_58
-GLIB_AVAILABLE_TYPE_IN_2_60
-GLIB_AVAILABLE_TYPE_IN_2_62
-GLIB_AVAILABLE_TYPE_IN_2_64
-GLIB_AVAILABLE_TYPE_IN_2_66
-GLIB_AVAILABLE_TYPE_IN_2_68
-GLIB_AVAILABLE_TYPE_IN_2_70
-GLIB_AVAILABLE_TYPE_IN_2_72
-GLIB_AVAILABLE_TYPE_IN_2_74
 GLIB_DEPRECATED_ENUMERATOR
 GLIB_DEPRECATED_ENUMERATOR_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_26
-GLIB_DEPRECATED_ENUMERATOR_IN_2_26_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_28
-GLIB_DEPRECATED_ENUMERATOR_IN_2_28_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_30
-GLIB_DEPRECATED_ENUMERATOR_IN_2_30_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_32
-GLIB_DEPRECATED_ENUMERATOR_IN_2_32_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_34
-GLIB_DEPRECATED_ENUMERATOR_IN_2_34_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_36
-GLIB_DEPRECATED_ENUMERATOR_IN_2_36_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_38
-GLIB_DEPRECATED_ENUMERATOR_IN_2_38_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_40
-GLIB_DEPRECATED_ENUMERATOR_IN_2_40_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_42
-GLIB_DEPRECATED_ENUMERATOR_IN_2_42_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_44
-GLIB_DEPRECATED_ENUMERATOR_IN_2_44_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_46
-GLIB_DEPRECATED_ENUMERATOR_IN_2_46_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_48
-GLIB_DEPRECATED_ENUMERATOR_IN_2_48_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_50
-GLIB_DEPRECATED_ENUMERATOR_IN_2_50_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_52
-GLIB_DEPRECATED_ENUMERATOR_IN_2_52_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_54
-GLIB_DEPRECATED_ENUMERATOR_IN_2_54_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_56
-GLIB_DEPRECATED_ENUMERATOR_IN_2_56_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_58
-GLIB_DEPRECATED_ENUMERATOR_IN_2_58_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_60
-GLIB_DEPRECATED_ENUMERATOR_IN_2_60_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_62
-GLIB_DEPRECATED_ENUMERATOR_IN_2_62_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_64
-GLIB_DEPRECATED_ENUMERATOR_IN_2_64_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_66
-GLIB_DEPRECATED_ENUMERATOR_IN_2_66_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_68
-GLIB_DEPRECATED_ENUMERATOR_IN_2_68_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_70
-GLIB_DEPRECATED_ENUMERATOR_IN_2_70_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_72
-GLIB_DEPRECATED_ENUMERATOR_IN_2_72_FOR
-GLIB_DEPRECATED_ENUMERATOR_IN_2_74
-GLIB_DEPRECATED_ENUMERATOR_IN_2_74_FOR
-GLIB_DEPRECATED_IN_2_26
-GLIB_DEPRECATED_IN_2_26_FOR
-GLIB_DEPRECATED_IN_2_28
-GLIB_DEPRECATED_IN_2_28_FOR
-GLIB_DEPRECATED_IN_2_30
-GLIB_DEPRECATED_IN_2_30_FOR
-GLIB_DEPRECATED_IN_2_32
-GLIB_DEPRECATED_IN_2_32_FOR
-GLIB_DEPRECATED_IN_2_34
-GLIB_DEPRECATED_IN_2_34_FOR
-GLIB_DEPRECATED_IN_2_36
-GLIB_DEPRECATED_IN_2_36_FOR
-GLIB_DEPRECATED_IN_2_38
-GLIB_DEPRECATED_IN_2_38_FOR
-GLIB_DEPRECATED_IN_2_40
-GLIB_DEPRECATED_IN_2_40_FOR
-GLIB_DEPRECATED_IN_2_42
-GLIB_DEPRECATED_IN_2_42_FOR
-GLIB_DEPRECATED_IN_2_44
-GLIB_DEPRECATED_IN_2_44_FOR
-GLIB_DEPRECATED_IN_2_46
-GLIB_DEPRECATED_IN_2_46_FOR
-GLIB_DEPRECATED_IN_2_48
-GLIB_DEPRECATED_IN_2_48_FOR
-GLIB_DEPRECATED_IN_2_50
-GLIB_DEPRECATED_IN_2_50_FOR
-GLIB_DEPRECATED_IN_2_52
-GLIB_DEPRECATED_IN_2_52_FOR
-GLIB_DEPRECATED_IN_2_54
-GLIB_DEPRECATED_IN_2_54_FOR
-GLIB_DEPRECATED_IN_2_56
-GLIB_DEPRECATED_IN_2_56_FOR
-GLIB_DEPRECATED_IN_2_58
-GLIB_DEPRECATED_IN_2_58_FOR
-GLIB_DEPRECATED_IN_2_60
-GLIB_DEPRECATED_IN_2_60_FOR
-GLIB_DEPRECATED_IN_2_62
-GLIB_DEPRECATED_IN_2_62_FOR
-GLIB_DEPRECATED_IN_2_64
-GLIB_DEPRECATED_IN_2_64_FOR
-GLIB_DEPRECATED_IN_2_66
-GLIB_DEPRECATED_IN_2_66_FOR
-GLIB_DEPRECATED_IN_2_68
-GLIB_DEPRECATED_IN_2_68_FOR
-GLIB_DEPRECATED_IN_2_70
-GLIB_DEPRECATED_IN_2_70_FOR
-GLIB_DEPRECATED_IN_2_72
-GLIB_DEPRECATED_IN_2_72_FOR
-GLIB_DEPRECATED_IN_2_74
-GLIB_DEPRECATED_IN_2_74_FOR
 GLIB_DEPRECATED_MACRO
 GLIB_DEPRECATED_MACRO_FOR
-GLIB_DEPRECATED_MACRO_IN_2_26
-GLIB_DEPRECATED_MACRO_IN_2_26_FOR
-GLIB_DEPRECATED_MACRO_IN_2_28
-GLIB_DEPRECATED_MACRO_IN_2_28_FOR
-GLIB_DEPRECATED_MACRO_IN_2_30
-GLIB_DEPRECATED_MACRO_IN_2_30_FOR
-GLIB_DEPRECATED_MACRO_IN_2_32
-GLIB_DEPRECATED_MACRO_IN_2_32_FOR
-GLIB_DEPRECATED_MACRO_IN_2_34
-GLIB_DEPRECATED_MACRO_IN_2_34_FOR
-GLIB_DEPRECATED_MACRO_IN_2_36
-GLIB_DEPRECATED_MACRO_IN_2_36_FOR
-GLIB_DEPRECATED_MACRO_IN_2_38
-GLIB_DEPRECATED_MACRO_IN_2_38_FOR
-GLIB_DEPRECATED_MACRO_IN_2_40
-GLIB_DEPRECATED_MACRO_IN_2_40_FOR
-GLIB_DEPRECATED_MACRO_IN_2_42
-GLIB_DEPRECATED_MACRO_IN_2_42_FOR
-GLIB_DEPRECATED_MACRO_IN_2_44
-GLIB_DEPRECATED_MACRO_IN_2_44_FOR
-GLIB_DEPRECATED_MACRO_IN_2_46
-GLIB_DEPRECATED_MACRO_IN_2_46_FOR
-GLIB_DEPRECATED_MACRO_IN_2_48
-GLIB_DEPRECATED_MACRO_IN_2_48_FOR
-GLIB_DEPRECATED_MACRO_IN_2_50
-GLIB_DEPRECATED_MACRO_IN_2_50_FOR
-GLIB_DEPRECATED_MACRO_IN_2_52
-GLIB_DEPRECATED_MACRO_IN_2_52_FOR
-GLIB_DEPRECATED_MACRO_IN_2_54
-GLIB_DEPRECATED_MACRO_IN_2_54_FOR
-GLIB_DEPRECATED_MACRO_IN_2_56
-GLIB_DEPRECATED_MACRO_IN_2_56_FOR
-GLIB_DEPRECATED_MACRO_IN_2_58
-GLIB_DEPRECATED_MACRO_IN_2_58_FOR
-GLIB_DEPRECATED_MACRO_IN_2_60
-GLIB_DEPRECATED_MACRO_IN_2_60_FOR
-GLIB_DEPRECATED_MACRO_IN_2_62
-GLIB_DEPRECATED_MACRO_IN_2_62_FOR
-GLIB_DEPRECATED_MACRO_IN_2_64
-GLIB_DEPRECATED_MACRO_IN_2_64_FOR
-GLIB_DEPRECATED_MACRO_IN_2_66
-GLIB_DEPRECATED_MACRO_IN_2_66_FOR
-GLIB_DEPRECATED_MACRO_IN_2_68
-GLIB_DEPRECATED_MACRO_IN_2_68_FOR
-GLIB_DEPRECATED_MACRO_IN_2_70
-GLIB_DEPRECATED_MACRO_IN_2_70_FOR
-GLIB_DEPRECATED_MACRO_IN_2_72
-GLIB_DEPRECATED_MACRO_IN_2_72_FOR
-GLIB_DEPRECATED_MACRO_IN_2_74
-GLIB_DEPRECATED_MACRO_IN_2_74_FOR
 GLIB_DEPRECATED_TYPE
 GLIB_DEPRECATED_TYPE_FOR
-GLIB_DEPRECATED_TYPE_IN_2_26
-GLIB_DEPRECATED_TYPE_IN_2_26_FOR
-GLIB_DEPRECATED_TYPE_IN_2_28
-GLIB_DEPRECATED_TYPE_IN_2_28_FOR
-GLIB_DEPRECATED_TYPE_IN_2_30
-GLIB_DEPRECATED_TYPE_IN_2_30_FOR
-GLIB_DEPRECATED_TYPE_IN_2_32
-GLIB_DEPRECATED_TYPE_IN_2_32_FOR
-GLIB_DEPRECATED_TYPE_IN_2_34
-GLIB_DEPRECATED_TYPE_IN_2_34_FOR
-GLIB_DEPRECATED_TYPE_IN_2_36
-GLIB_DEPRECATED_TYPE_IN_2_36_FOR
-GLIB_DEPRECATED_TYPE_IN_2_38
-GLIB_DEPRECATED_TYPE_IN_2_38_FOR
-GLIB_DEPRECATED_TYPE_IN_2_40
-GLIB_DEPRECATED_TYPE_IN_2_40_FOR
-GLIB_DEPRECATED_TYPE_IN_2_42
-GLIB_DEPRECATED_TYPE_IN_2_42_FOR
-GLIB_DEPRECATED_TYPE_IN_2_44
-GLIB_DEPRECATED_TYPE_IN_2_44_FOR
-GLIB_DEPRECATED_TYPE_IN_2_46
-GLIB_DEPRECATED_TYPE_IN_2_46_FOR
-GLIB_DEPRECATED_TYPE_IN_2_48
-GLIB_DEPRECATED_TYPE_IN_2_48_FOR
-GLIB_DEPRECATED_TYPE_IN_2_50
-GLIB_DEPRECATED_TYPE_IN_2_50_FOR
-GLIB_DEPRECATED_TYPE_IN_2_52
-GLIB_DEPRECATED_TYPE_IN_2_52_FOR
-GLIB_DEPRECATED_TYPE_IN_2_54
-GLIB_DEPRECATED_TYPE_IN_2_54_FOR
-GLIB_DEPRECATED_TYPE_IN_2_56
-GLIB_DEPRECATED_TYPE_IN_2_56_FOR
-GLIB_DEPRECATED_TYPE_IN_2_58
-GLIB_DEPRECATED_TYPE_IN_2_58_FOR
-GLIB_DEPRECATED_TYPE_IN_2_60
-GLIB_DEPRECATED_TYPE_IN_2_60_FOR
-GLIB_DEPRECATED_TYPE_IN_2_62
-GLIB_DEPRECATED_TYPE_IN_2_62_FOR
-GLIB_DEPRECATED_TYPE_IN_2_64
-GLIB_DEPRECATED_TYPE_IN_2_64_FOR
-GLIB_DEPRECATED_TYPE_IN_2_66
-GLIB_DEPRECATED_TYPE_IN_2_66_FOR
-GLIB_DEPRECATED_TYPE_IN_2_68
-GLIB_DEPRECATED_TYPE_IN_2_68_FOR
-GLIB_DEPRECATED_TYPE_IN_2_70
-GLIB_DEPRECATED_TYPE_IN_2_70_FOR
-GLIB_DEPRECATED_TYPE_IN_2_72
-GLIB_DEPRECATED_TYPE_IN_2_72_FOR
-GLIB_DEPRECATED_TYPE_IN_2_74
-GLIB_DEPRECATED_TYPE_IN_2_74_FOR
 GLIB_VERSION_CUR_STABLE
 GLIB_VERSION_PREV_STABLE
 </SECTION>
diff --git a/docs/reference/glib/meson.build b/docs/reference/glib/meson.build
index 838a4f7779..64c867f59b 100644
--- a/docs/reference/glib/meson.build
+++ b/docs/reference/glib/meson.build
@@ -38,6 +38,8 @@ if get_option('gtk_doc')
     'gutilsprivate.h',
     'gvalgrind.h',
     'dirent.h',
+    'glib-visibility.h',
+    'gmodule-visibility.h',
   ]
 
   docpath = join_paths(glib_datadir, 'gtk-doc', 'html')
@@ -49,13 +51,20 @@ if get_option('gtk_doc')
     configuration: version_conf
   )
 
+  configure_file(
+    input: 'glib-sections.txt.in',
+    output: 'glib-sections.txt',
+    command: [gen_visibility_macros, meson.project_version(), 'doc-sections', '@INPUT@', '@OUTPUT@'],
+  )
+
   gnome.gtkdoc('glib',
                main_xml : 'glib-docs.xml',
                namespace : 'g',
                mode : 'none',
                src_dir : [ 'glib', 'gmodule' ],
                dependencies : libglib_dep,
-               scan_args : gtkdoc_common_scan_args + [
+               scan_args : [
+                 '--ignore-decorators=' + ignore_decorators + '|' + ignore_decorators.replace('GLIB', 
'GMODULE'),
                  '--ignore-headers=' + ' '.join(ignore_headers),
                ],
                content_files : [
diff --git a/docs/reference/gobject/gobject-sections.txt b/docs/reference/gobject/gobject-sections.txt
index 4107f8356d..6fd6503940 100644
--- a/docs/reference/gobject/gobject-sections.txt
+++ b/docs/reference/gobject/gobject-sections.txt
@@ -185,9 +185,6 @@ G_TYPE_RESERVED_GLIB_LAST
 G_TYPE_RESERVED_BSE_FIRST
 G_TYPE_RESERVED_BSE_LAST
 G_TYPE_RESERVED_USER_FIRST
-
-<SUBSECTION Private>
-GOBJECT_VAR
 </SECTION>
 
 <SECTION>
diff --git a/docs/reference/gobject/meson.build b/docs/reference/gobject/meson.build
index a9a6543549..dd3e53dbf3 100644
--- a/docs/reference/gobject/meson.build
+++ b/docs/reference/gobject/meson.build
@@ -8,6 +8,7 @@ if get_option('gtk_doc')
     'gobject_trace.h',
     'gtype-private.h',
     'glib-enumtypes.h',
+    'gobject-visibility.h',
   ]
 
   docpath = join_paths(glib_datadir, 'gtk-doc', 'html')
@@ -28,7 +29,8 @@ if get_option('gtk_doc')
     dependencies : [libgobject_dep, libglib_dep],
     include_directories : [gtkdocincl],
     src_dir : 'gobject',
-    scan_args : gtkdoc_common_scan_args + [
+    scan_args : [
+      '--ignore-decorators=' + '|'.join(ignore_decorators.replace('GLIB', 'GOBJECT')),
       '--rebuild-types',
       '--ignore-headers=' + ' '.join(ignore_headers),
     ],
diff --git a/docs/reference/meson.build b/docs/reference/meson.build
index dcaa5c2765..fb4b26bc96 100644
--- a/docs/reference/meson.build
+++ b/docs/reference/meson.build
@@ -37,9 +37,7 @@ foreach i : range(first_version, last_version + 2, 2)
   ]
 endforeach
 
-gtkdoc_common_scan_args = [
-  '--ignore-decorators=' + '|'.join(ignore_decorators),
-]
+ignore_decorators = '|'.join(ignore_decorators)
 
 if get_option('gtk_doc')
   # Check we have the minimum gtk-doc version required. Older versions won't
diff --git a/gio/gioenums.h b/gio/gioenums.h
index 1d109aad25..24b67df812 100644
--- a/gio/gioenums.h
+++ b/gio/gioenums.h
@@ -28,6 +28,7 @@
 #endif
 
 #include <glib-object.h>
+#include <gio/gio-visibility.h>
 
 G_BEGIN_DECLS
 
diff --git a/gio/gioenumtypes.h.template b/gio/gioenumtypes.h.template
index 1ab3c3727d..dc51b90cf9 100644
--- a/gio/gioenumtypes.h.template
+++ b/gio/gioenumtypes.h.template
@@ -24,6 +24,7 @@
 #define __GIO_ENUM_TYPES_H__
 
 #include <glib-object.h>
+#include <gio/gio-visibility.h>
 
 G_BEGIN_DECLS
 /*** END file-header ***/
diff --git a/gio/gnetworking.h.in b/gio/gnetworking.h.in
index 96430bdeca..a59180673a 100644
--- a/gio/gnetworking.h.in
+++ b/gio/gnetworking.h.in
@@ -22,6 +22,7 @@
 #define __G_NETWORKING_H__
 
 #include <glib.h>
+#include <gio/gio-visibility.h>
 
 #ifdef G_OS_WIN32
 #include <winsock2.h>
diff --git a/gio/gsettingsschema.h b/gio/gsettingsschema.h
index ff2da29867..bcb7bb0588 100644
--- a/gio/gsettingsschema.h
+++ b/gio/gsettingsschema.h
@@ -22,6 +22,7 @@
 #define __G_SETTINGS_SCHEMA_H__
 
 #include <glib-object.h>
+#include <gio/gio-visibility.h>
 
 G_BEGIN_DECLS
 
diff --git a/gio/meson.build b/gio/meson.build
index 14f0d82598..afe865f453 100644
--- a/gio/meson.build
+++ b/gio/meson.build
@@ -6,8 +6,6 @@ gio_c_args = [
   '-DLOCALSTATEDIR="@0@"'.format(glib_localstatedir),
 ]
 
-gio_c_args += glib_hidden_visibility_args
-
 # FIXME: Install empty glib_giomodulesdir
 
 gnetworking_h_conf = configuration_data()
@@ -742,6 +740,12 @@ gio_headers = files(
   'gliststore.h',
 )
 
+gvisibility_h = configure_file(
+  output: 'gio-visibility.h',
+  command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GIO', '@OUTPUT@'],
+)
+
+gio_headers += gvisibility_h
 gio_headers += application_headers
 gio_headers += settings_headers
 gio_headers += gdbus_headers
@@ -835,6 +839,7 @@ libgio = library('gio-2.0',
                   gioenumtypes_dep, gvdb_dep],
   c_args : gio_c_args,
   objc_args : gio_c_args,
+  gnu_symbol_visibility : 'hidden',
   # intl.lib is not compatible with SAFESEH
   link_args : [noseh_link_args, glib_link_flags],
 )
diff --git a/gio/xdgmime/meson.build b/gio/xdgmime/meson.build
index 4c8a552a2f..1f7e88f33f 100644
--- a/gio/xdgmime/meson.build
+++ b/gio/xdgmime/meson.build
@@ -14,4 +14,6 @@ xdgmime_lib = static_library('xdgmime',
   include_directories : [configinc],
   pic : true,
   c_args : [ '-DHAVE_CONFIG_H',
-             '-DXDG_PREFIX=_gio_xdg' ] + glib_hidden_visibility_args)
+             '-DXDG_PREFIX=_gio_xdg' ],
+  gnu_symbol_visibility : 'hidden',
+)
diff --git a/glib/glibconfig.h.in b/glib/glibconfig.h.in
index 0632e0b2f4..fb85daf990 100644
--- a/glib/glibconfig.h.in
+++ b/glib/glibconfig.h.in
@@ -12,17 +12,20 @@
 #include <float.h>
 #mesondefine GLIB_HAVE_ALLOCA_H
 
+#mesondefine GLIB_STATIC_COMPILATION
+#mesondefine GOBJECT_STATIC_COMPILATION
+#mesondefine GIO_STATIC_COMPILATION
+#mesondefine GMODULE_STATIC_COMPILATION
+#mesondefine G_INTL_STATIC_COMPILATION
+#mesondefine FFI_STATIC_BUILD
+#include <glib/glib-visibility.h>
+
 /* Specifies that GLib's g_print*() functions wrap the
  * system printf functions.  This is useful to know, for example,
  * when using glibc's register_printf_function().
  */
 #mesondefine GLIB_USING_SYSTEM_PRINTF
 
-#mesondefine GLIB_STATIC_COMPILATION
-#mesondefine GOBJECT_STATIC_COMPILATION
-#mesondefine G_INTL_STATIC_COMPILATION
-#mesondefine FFI_STATIC_BUILD
-
 G_BEGIN_DECLS
 
 #define G_MINFLOAT     FLT_MIN
diff --git a/glib/gmacros.h b/glib/gmacros.h
index 2ef7587ce4..f9e20407ee 100644
--- a/glib/gmacros.h
+++ b/glib/gmacros.h
@@ -1227,28 +1227,12 @@
 #define G_UNAVAILABLE(maj,min) G_DEPRECATED
 #endif
 
-#ifndef _GLIB_EXTERN
-#define _GLIB_EXTERN extern
-#endif
-
 /* These macros are used to mark deprecated symbols in GLib headers,
  * and thus have to be exposed in installed headers. But please
  * do *not* use them in other projects. Instead, use G_DEPRECATED
  * or define your own wrappers around it.
  */
 
-#ifdef GLIB_DISABLE_DEPRECATION_WARNINGS
-#define GLIB_DEPRECATED _GLIB_EXTERN
-#define GLIB_DEPRECATED_FOR(f) _GLIB_EXTERN
-#define GLIB_UNAVAILABLE(maj,min) _GLIB_EXTERN
-#define GLIB_UNAVAILABLE_STATIC_INLINE(maj,min)
-#else
-#define GLIB_DEPRECATED G_DEPRECATED _GLIB_EXTERN
-#define GLIB_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _GLIB_EXTERN
-#define GLIB_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _GLIB_EXTERN
-#define GLIB_UNAVAILABLE_STATIC_INLINE(maj,min) G_UNAVAILABLE(maj,min)
-#endif
-
 #if !defined(GLIB_DISABLE_DEPRECATION_WARNINGS) && \
     (G_GNUC_CHECK_VERSION(4, 6) ||                 \
      __clang_major__ > 3 || (__clang_major__ == 3 && __clang_minor__ >= 4))
diff --git a/glib/gnulib/meson.build b/glib/gnulib/meson.build
index 38b530aa0b..8de0958645 100644
--- a/glib/gnulib/meson.build
+++ b/glib/gnulib/meson.build
@@ -366,6 +366,9 @@ gnulib_lib = static_library('gnulib', gnulib_sources,
   dependencies : [libm],
   include_directories : [configinc, glibinc, include_directories ('.')],
   pic : true,
-  c_args : ['-DGCC_LINT=1', '-DLIBDIR="@0@"'.format(glib_libdir), '-DGLIB_COMPILATION', 
'-DG_LOG_DOMAIN="GLib"' ] + glib_hidden_visibility_args + extra_gnulib_args)
+  c_args : ['-DGCC_LINT=1', '-DLIBDIR="@0@"'.format(glib_libdir), '-DG_LOG_DOMAIN="GLib"',
+            glib_c_args_internal, extra_gnulib_args],
+  gnu_symbol_visibility : 'hidden',
+)
 
 gnulib_libm_dependency = [libm]
diff --git a/glib/gtypes.h b/glib/gtypes.h
index 8ef1909616..15ead8da33 100644
--- a/glib/gtypes.h
+++ b/glib/gtypes.h
@@ -584,27 +584,4 @@ typedef gint gatomicrefcount;  /* should be accessed only using atomics */
 
 G_END_DECLS
 
-/* We prefix variable declarations so they can
- * properly get exported in Windows DLLs.
- */
-#ifndef GLIB_VAR
-#  ifdef G_PLATFORM_WIN32
-#    ifdef GLIB_STATIC_COMPILATION
-#      define GLIB_VAR extern
-#    else /* !GLIB_STATIC_COMPILATION */
-#      ifdef GLIB_COMPILATION
-#        ifdef DLL_EXPORT
-#          define GLIB_VAR extern __declspec(dllexport)
-#        else /* !DLL_EXPORT */
-#          define GLIB_VAR extern
-#        endif /* !DLL_EXPORT */
-#      else /* !GLIB_COMPILATION */
-#        define GLIB_VAR extern __declspec(dllimport)
-#      endif /* !GLIB_COMPILATION */
-#    endif /* !GLIB_STATIC_COMPILATION */
-#  else /* !G_PLATFORM_WIN32 */
-#    define GLIB_VAR _GLIB_EXTERN
-#  endif /* !G_PLATFORM_WIN32 */
-#endif /* GLIB_VAR */
-
 #endif /* __G_TYPES_H__ */
diff --git a/glib/gversionmacros.h.in b/glib/gversionmacros.h.in
new file mode 100644
index 0000000000..edae63fda8
--- /dev/null
+++ b/glib/gversionmacros.h.in
@@ -0,0 +1,140 @@
+/* GLIB - Library of useful routines for C programming
+ * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
+ *
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
+ * file for a list of people on the GLib Team.  See the ChangeLog
+ * files for a list of changes.  These files are distributed with
+ * GLib at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
+#ifndef __G_VERSION_MACROS_H__
+#define __G_VERSION_MACROS_H__
+
+#if !defined(__GLIB_H_INSIDE__) && !defined(GLIB_COMPILATION)
+#error "Only <glib.h> can be included directly."
+#endif
+
+/* Version boundaries checks */
+
+#define G_ENCODE_VERSION(major, minor) ((major) << 16 | (minor) << 8)
+
+@GLIB_VERSIONS@
+
+/**
+ * GLIB_VERSION_CUR_STABLE:
+ *
+ * A macro that evaluates to the current stable version of GLib, in a format
+ * that can be used by the C pre-processor.
+ *
+ * During an unstable development cycle, this evaluates to the next stable
+ * (unreleased) version which will be the result of the development cycle.
+ *
+ * Since: 2.32
+ */
+#if (GLIB_MINOR_VERSION % 2)
+#define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION + 1))
+#else
+#define GLIB_VERSION_CUR_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION))
+#endif
+
+/**
+ * GLIB_VERSION_PREV_STABLE:
+ *
+ * A macro that evaluates to the previous stable version of GLib, in a format
+ * that can be used by the C pre-processor.
+ *
+ * During an unstable development cycle, this evaluates to the most recent
+ * released stable release, which preceded this development cycle.
+ *
+ * Since: 2.32
+ */
+#if (GLIB_MINOR_VERSION % 2)
+#define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 1))
+#else
+#define GLIB_VERSION_PREV_STABLE (G_ENCODE_VERSION (GLIB_MAJOR_VERSION, GLIB_MINOR_VERSION - 2))
+#endif
+
+/**
+ * GLIB_VERSION_MIN_REQUIRED:
+ *
+ * A macro that should be defined by the user prior to including
+ * the glib.h header.
+ * The definition should be one of the predefined GLib version
+ * macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,...
+ *
+ * This macro defines the earliest version of GLib that the package is
+ * required to be able to compile against.
+ *
+ * If the compiler is configured to warn about the use of deprecated
+ * functions, then using functions that were deprecated in version
+ * %GLIB_VERSION_MIN_REQUIRED or earlier will cause warnings (but
+ * using functions deprecated in later releases will not).
+ *
+ * Since: 2.32
+ */
+/* If the package sets GLIB_VERSION_MIN_REQUIRED to some future
+ * GLIB_VERSION_X_Y value that we don't know about, it will compare as
+ * 0 in preprocessor tests.
+ */
+#ifndef GLIB_VERSION_MIN_REQUIRED
+#define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE)
+#elif GLIB_VERSION_MIN_REQUIRED == 0
+#undef GLIB_VERSION_MIN_REQUIRED
+#define GLIB_VERSION_MIN_REQUIRED (GLIB_VERSION_CUR_STABLE + 2)
+#endif
+
+/**
+ * GLIB_VERSION_MAX_ALLOWED:
+ *
+ * A macro that should be defined by the user prior to including
+ * the glib.h header.
+ * The definition should be one of the predefined GLib version
+ * macros: %GLIB_VERSION_2_26, %GLIB_VERSION_2_28,...
+ *
+ * This macro defines the latest version of the GLib API that the
+ * package is allowed to make use of.
+ *
+ * If the compiler is configured to warn about the use of deprecated
+ * functions, then using functions added after version
+ * %GLIB_VERSION_MAX_ALLOWED will cause warnings.
+ *
+ * Unless you are using GLIB_CHECK_VERSION() or the like to compile
+ * different code depending on the GLib version, then this should be
+ * set to the same value as %GLIB_VERSION_MIN_REQUIRED.
+ *
+ * Since: 2.32
+ */
+#if !defined(GLIB_VERSION_MAX_ALLOWED) || (GLIB_VERSION_MAX_ALLOWED == 0)
+#undef GLIB_VERSION_MAX_ALLOWED
+#define GLIB_VERSION_MAX_ALLOWED (GLIB_VERSION_CUR_STABLE)
+#endif
+
+/* sanity checks */
+#if GLIB_VERSION_MIN_REQUIRED > GLIB_VERSION_CUR_STABLE
+#error "GLIB_VERSION_MIN_REQUIRED must be <= GLIB_VERSION_CUR_STABLE"
+#endif
+#if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_MIN_REQUIRED
+#error "GLIB_VERSION_MAX_ALLOWED must be >= GLIB_VERSION_MIN_REQUIRED"
+#endif
+#if GLIB_VERSION_MIN_REQUIRED < GLIB_VERSION_2_26
+#error "GLIB_VERSION_MIN_REQUIRED must be >= GLIB_VERSION_2_26"
+#endif
+
+#endif /*  __G_VERSION_MACROS_H__ */
diff --git a/glib/libcharset/meson.build b/glib/libcharset/meson.build
index 5a02666dfd..f286b48770 100644
--- a/glib/libcharset/meson.build
+++ b/glib/libcharset/meson.build
@@ -1,4 +1,6 @@
 charset_lib = static_library('charset', 'localcharset.c',
   include_directories : configinc,
   pic : true,
-  c_args : [ '-DGLIB_CHARSETALIAS_DIR="@0@"'.format(glib_charsetaliasdir) ] + glib_hidden_visibility_args)
+  c_args : [ '-DGLIB_CHARSETALIAS_DIR="@0@"'.format(glib_charsetaliasdir) ],
+  gnu_symbol_visibility : 'hidden',
+)
diff --git a/glib/meson.build b/glib/meson.build
index c365901a13..56a8a7d622 100644
--- a/glib/meson.build
+++ b/glib/meson.build
@@ -3,6 +3,21 @@ glibconfig_h = configure_file(input : 'glibconfig.h.in', output : 'glibconfig.h'
   install_tag : 'devel',
   configuration : glibconfig_conf)
 
+gversionmacros_h = configure_file(
+  input: 'gversionmacros.h.in',
+  output: 'gversionmacros.h',
+  command: [gen_visibility_macros, meson.project_version(), 'versions-macros', '@INPUT@', '@OUTPUT@'],
+)
+
+gvisibility_h = configure_file(
+  output: 'glib-visibility.h',
+  command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GLIB', '@OUTPUT@'],
+)
+
+glib_c_args_internal = [
+  '-DGLIB_COMPILATION',
+]
+
 subdir('libcharset')
 
 # libsysprof-capture support
@@ -212,10 +227,12 @@ glib_sub_headers = files(
   'gvarianttype.h',
   'gvariant.h',
   'gversion.h',
-  'gversionmacros.h',
   'gwin32.h',
   'gprintf.h',
 )
+
+glib_sub_headers += [gversionmacros_h, gvisibility_h]
+
 install_headers(glib_sub_headers, subdir : 'glib-2.0/glib')
 
 deprecated_sources = files(
@@ -368,7 +385,7 @@ if use_pcre2_static_flag
   pcre2_static_args = ['-DPCRE2_STATIC']
 endif
 
-glib_c_args = ['-DG_LOG_DOMAIN="GLib"', '-DGLIB_COMPILATION'] + pcre2_static_args + 
glib_hidden_visibility_args
+glib_c_args = ['-DG_LOG_DOMAIN="GLib"'] + glib_c_args_internal + pcre2_static_args
 libglib = library('glib-2.0',
   glib_dtrace_obj, glib_dtrace_hdr,
   sources : [deprecated_sources, glib_sources],
@@ -383,6 +400,7 @@ libglib = library('glib-2.0',
   dependencies : [pcre2, thread_dep, librt] + libintl_deps + libiconv + platform_deps + 
[gnulib_libm_dependency, libm] + [libsysprof_capture_dep],
   c_args : glib_c_args,
   objc_args : glib_c_args,
+  gnu_symbol_visibility : 'hidden',
 )
 
 libglib_dep = declare_dependency(
diff --git a/gmodule/gmodule.h b/gmodule/gmodule.h
index 9744890412..ec14f4e10d 100644
--- a/gmodule/gmodule.h
+++ b/gmodule/gmodule.h
@@ -28,6 +28,7 @@
 #define __GMODULE_H__
 
 #include <glib.h>
+#include <gmodule/gmodule-visibility.h>
 
 G_BEGIN_DECLS
 
diff --git a/gmodule/meson.build b/gmodule/meson.build
index 0c5aad3116..54b25a0c55 100644
--- a/gmodule/meson.build
+++ b/gmodule/meson.build
@@ -66,6 +66,12 @@ gmodule_c = files('gmodule.c')
 
 install_headers([gmodule_h], subdir : 'glib-2.0')
 
+gvisibility_h = configure_file(
+  output: 'gmodule-visibility.h',
+  command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GMODULE', '@OUTPUT@'],
+)
+install_headers(gvisibility_h, subdir : 'glib-2.0/gmodule')
+
 gmodule_sources = [gmodule_c]
 if host_system == 'windows'
   gmodule_win_rc = configure_file(
@@ -85,7 +91,8 @@ libgmodule = library('gmodule-2.0',
   install : true,
   include_directories : [configinc, gmoduleinc],
   dependencies : [libdl_dep, libglib_dep],
-  c_args : ['-DG_LOG_DOMAIN="GModule"'] + glib_hidden_visibility_args,
+  c_args : ['-DG_LOG_DOMAIN="GModule"', '-DGMODULE_COMPILATION'],
+  gnu_symbol_visibility : 'hidden',
   link_args : [glib_link_flags],
 )
 
diff --git a/gobject/gparamspecs.h b/gobject/gparamspecs.h
index 250531eed3..0ef7f8fc88 100644
--- a/gobject/gparamspecs.h
+++ b/gobject/gparamspecs.h
@@ -1144,30 +1144,6 @@ GParamSpec*      g_param_spec_variant     (const gchar        *name,
                                          GVariant           *default_value,
                                          GParamFlags         flags);
 
-/* --- internal --- */
-/* We prefix variable declarations so they can
- * properly get exported in windows dlls.
- */
-#ifndef GOBJECT_VAR
-#  ifdef G_PLATFORM_WIN32
-#    ifdef GOBJECT_STATIC_COMPILATION
-#      define GOBJECT_VAR extern
-#    else /* !GOBJECT_STATIC_COMPILATION */
-#      ifdef GOBJECT_COMPILATION
-#        ifdef DLL_EXPORT
-#          define GOBJECT_VAR extern __declspec(dllexport)
-#        else /* !DLL_EXPORT */
-#          define GOBJECT_VAR extern
-#        endif /* !DLL_EXPORT */
-#      else /* !GOBJECT_COMPILATION */
-#        define GOBJECT_VAR extern __declspec(dllimport)
-#      endif /* !GOBJECT_COMPILATION */
-#    endif /* !GOBJECT_STATIC_COMPILATION */
-#  else /* !G_PLATFORM_WIN32 */
-#    define GOBJECT_VAR _GLIB_EXTERN
-#  endif /* !G_PLATFORM_WIN32 */
-#endif /* GOBJECT_VAR */
-
 GOBJECT_VAR GType *g_param_spec_types;
 
 G_END_DECLS
diff --git a/gobject/gtype.h b/gobject/gtype.h
index 3f2afb31e0..5e28498ceb 100644
--- a/gobject/gtype.h
+++ b/gobject/gtype.h
@@ -23,7 +23,8 @@
 #error "Only <glib-object.h> can be included directly."
 #endif
 
-#include        <glib.h>
+#include  <glib.h>
+#include <gobject/gobject-visibility.h>
 
 G_BEGIN_DECLS
 
diff --git a/gobject/meson.build b/gobject/meson.build
index bc44d5db1a..09c07f3064 100644
--- a/gobject/meson.build
+++ b/gobject/meson.build
@@ -22,6 +22,14 @@ gobject_install_headers = files(
   'gvaluetypes.h',
   'gobjectnotifyqueue.c', # sic
 )
+
+gvisibility_h = configure_file(
+  output: 'gobject-visibility.h',
+  command: [gen_visibility_macros, meson.project_version(), 'visibility-macros', 'GOBJECT', '@OUTPUT@'],
+)
+
+gobject_install_headers += gvisibility_h
+
 install_headers(gobject_install_headers, subdir : 'glib-2.0/gobject')
 
 gobject_sources = files(
@@ -135,7 +143,8 @@ libgobject = library('gobject-2.0',
   install : true,
   include_directories : [configinc],
   dependencies : [libffi_dep, libglib_dep],
-  c_args : ['-DG_LOG_DOMAIN="GLib-GObject"', '-DGOBJECT_COMPILATION'] + glib_hidden_visibility_args,
+  c_args : ['-DG_LOG_DOMAIN="GLib-GObject"', '-DGOBJECT_COMPILATION'],
+  gnu_symbol_visibility : 'hidden',
   link_args : glib_link_flags,
 )
 
diff --git a/gthread/meson.build b/gthread/meson.build
index 94a9ce5b51..4df201f350 100644
--- a/gthread/meson.build
+++ b/gthread/meson.build
@@ -19,7 +19,8 @@ libgthread = library('gthread-2.0',
   darwin_versions : darwin_versions,
   install : true,
   dependencies : [libglib_dep],
-  c_args : ['-DG_LOG_DOMAIN="GThread"' ] + glib_hidden_visibility_args,
+  c_args : ['-DG_LOG_DOMAIN="GThread"', glib_c_args_internal],
+  gnu_symbol_visibility : 'hidden',
   link_args : glib_link_flags,
 )
 
diff --git a/meson.build b/meson.build
index 4307c20dce..c6f7b7a4f9 100644
--- a/meson.build
+++ b/meson.build
@@ -210,29 +210,15 @@ if host_system == 'windows' and cc.get_id() != 'msvc' and cc.get_id() != 'clang-
   glib_conf.set('_FILE_OFFSET_BITS', 64)
 endif
 
-# Detect and set symbol visibility
-glib_hidden_visibility_args = []
-if get_option('default_library') != 'static'
-  if host_system == 'windows' or host_system == 'cygwin'
-    if get_option('default_library') != 'shared'
-      error('On Windows default_library must be "shared" or "static" but not "both"')
-    endif
-    glib_conf.set('DLL_EXPORT', true)
-    if cc.get_id() == 'msvc' or cc.get_id() == 'clang-cl'
-      glib_conf.set('_GLIB_EXTERN', '__declspec(dllexport) extern')
-    elif cc.has_argument('-fvisibility=hidden')
-      glib_conf.set('_GLIB_EXTERN', '__attribute__((visibility("default"))) __declspec(dllexport) extern')
-      glib_hidden_visibility_args = ['-fvisibility=hidden']
-    endif
-  elif cc.has_argument('-fvisibility=hidden')
-    glib_conf.set('_GLIB_EXTERN', '__attribute__((visibility("default"))) extern')
-    glib_hidden_visibility_args = ['-fvisibility=hidden']
-  endif
+if get_option('default_library') == 'both' and (host_system == 'windows' or host_system == 'cygwin')
+  error('On Windows default_library must be "shared" or "static" but not "both"')
 endif
 
 if get_option('default_library') == 'static'
   glibconfig_conf.set('GLIB_STATIC_COMPILATION', '1')
   glibconfig_conf.set('GOBJECT_STATIC_COMPILATION', '1')
+  glibconfig_conf.set('GIO_STATIC_COMPILATION', '1')
+  glibconfig_conf.set('GMODULE_STATIC_COMPILATION', '1')
   glibconfig_conf.set('G_INTL_STATIC_COMPILATION', '1')
   glibconfig_conf.set('FFI_STATIC_BUILD', '1')
 endif
@@ -2349,13 +2335,13 @@ test_timeout_slow = 180
 
 pkg = import('pkgconfig')
 windows = import('windows')
+subdir('tools')
 subdir('glib')
 subdir('gobject')
 subdir('gthread')
 subdir('gmodule')
 subdir('gio')
 subdir('fuzzing')
-subdir('tools')
 
 # xgettext is optional (on Windows for instance)
 if find_program('xgettext', required : get_option('nls')).found()
diff --git a/tools/gen-visibility-macros.py b/tools/gen-visibility-macros.py
new file mode 100755
index 0000000000..e94d7f3e03
--- /dev/null
+++ b/tools/gen-visibility-macros.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python3
+#
+# Copyright © 2022 Collabora Inc.
+#
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# Original author: Xavier Claessens <xclaesse gmail com>
+
+import argparse
+import textwrap
+from pathlib import Path
+
+def gen_versions_macros(args, current_minor_version):
+    with args.out_path.open('w', encoding='utf-8') as ofile, \
+         args.in_path.open('r', encoding='utf-8') as ifile:
+        for line in ifile.readlines():
+            if '@GLIB_VERSIONS@' in line:
+                for minor in range(2, current_minor_version + 2, 2):
+                    ofile.write(textwrap.dedent(f'''\
+                        /**
+                        * GLIB_VERSION_2_{minor}:
+                        *
+                        * A macro that evaluates to the 2.{minor} version of GLib, in a format
+                        * that can be used by the C pre-processor.
+                        *
+                        * Since: 2.{max(minor, 32)}
+                        */
+                        #define GLIB_VERSION_2_{minor}       (G_ENCODE_VERSION (2, {minor}))
+                        '''))
+            else:
+                ofile.write(line)
+
+def gen_doc_sections(args, current_minor_version):
+    with args.out_path.open('w', encoding='utf-8') as ofile, \
+         args.in_path.open('r', encoding='utf-8') as ifile:
+        for line in ifile.readlines():
+            if '@GLIB_VERSIONS@' in line:
+                for minor in range(2, current_minor_version + 2, 2):
+                    ofile.write(textwrap.dedent(f'''\
+                        GLIB_VERSION_2_{minor}
+                        '''))
+            else:
+                ofile.write(line)
+
+def gen_visibility_macros(args, current_minor_version):
+    '''
+    Generates a set of macros for each minor stable version of GLib
+
+    - GLIB_VAR
+
+    - GLIB_DEPRECATED
+    - GLIB_DEPRECATED_IN_…
+    - GLIB_DEPRECATED_MACRO_IN_…
+    - GLIB_DEPRECATED_ENUMERATOR_IN_…
+    - GLIB_DEPRECATED_TYPE_IN_…
+
+    - GLIB_AVAILABLE_IN_ALL
+    - GLIB_AVAILABLE_IN_…
+    - GLIB_AVAILABLE_STATIC_INLINE_IN_…
+    - GLIB_AVAILABLE_MACRO_IN_…
+    - GLIB_AVAILABLE_ENUMERATOR_IN_…
+    - GLIB_AVAILABLE_TYPE_IN_…
+
+    - GLIB_UNAVAILABLE(maj,min)
+    - GLIB_UNAVAILABLE_STATIC_INLINE(maj,min)
+
+    The GLIB namespace can be replaced with one of GOBJECT, GIO, GMODULE.
+    '''
+
+    ns = args.namespace
+    with args.out_path.open('w', encoding='utf-8') as f:
+        f.write(textwrap.dedent(f'''\
+            #pragma once
+
+            #if (defined(_WIN32) || defined(__CYGWIN__)) && !defined({ns}_STATIC_COMPILATION)
+            #  define _{ns}_EXPORT __declspec(dllexport)
+            #  define _{ns}_IMPORT __declspec(dllimport)
+            #elif __GNUC__ >= 4
+            #  define _{ns}_EXPORT __attribute__((visibility("default")))
+            #  define _{ns}_IMPORT
+            #else
+            #  define _{ns}_EXPORT
+            #  define _{ns}_IMPORT
+            #endif
+            #ifdef {ns}_COMPILATION
+            #  define _{ns}_API _{ns}_EXPORT
+            #else
+            #  define _{ns}_API _{ns}_IMPORT
+            #endif
+
+            #define _{ns}_EXTERN _{ns}_API extern
+
+            #define {ns}_VAR _{ns}_EXTERN
+            #define {ns}_AVAILABLE_IN_ALL _{ns}_EXTERN
+
+            #ifdef GLIB_DISABLE_DEPRECATION_WARNINGS
+            #define {ns}_DEPRECATED _{ns}_EXTERN
+            #define {ns}_DEPRECATED_FOR(f) _{ns}_EXTERN
+            #define {ns}_UNAVAILABLE(maj,min) _{ns}_EXTERN
+            #define {ns}_UNAVAILABLE_STATIC_INLINE(maj,min)
+            #else
+            #define {ns}_DEPRECATED G_DEPRECATED _{ns}_EXTERN
+            #define {ns}_DEPRECATED_FOR(f) G_DEPRECATED_FOR(f) _{ns}_EXTERN
+            #define {ns}_UNAVAILABLE(maj,min) G_UNAVAILABLE(maj,min) _{ns}_EXTERN
+            #define {ns}_UNAVAILABLE_STATIC_INLINE(maj,min) G_UNAVAILABLE(maj,min)
+            #endif
+            '''))
+        for minor in range(26, current_minor_version + 2, 2):
+            f.write(textwrap.dedent(f'''
+                #if GLIB_VERSION_MIN_REQUIRED >= GLIB_VERSION_2_{minor}
+                #define {ns}_DEPRECATED_IN_2_{minor} {ns}_DEPRECATED
+                #define {ns}_DEPRECATED_IN_2_{minor}_FOR(f) {ns}_DEPRECATED_FOR (f)
+                #define {ns}_DEPRECATED_MACRO_IN_2_{minor} GLIB_DEPRECATED_MACRO
+                #define {ns}_DEPRECATED_MACRO_IN_2_{minor}_FOR(f) GLIB_DEPRECATED_MACRO_FOR (f)
+                #define {ns}_DEPRECATED_ENUMERATOR_IN_2_{minor} GLIB_DEPRECATED_ENUMERATOR
+                #define {ns}_DEPRECATED_ENUMERATOR_IN_2_{minor}_FOR(f) GLIB_DEPRECATED_ENUMERATOR_FOR (f)
+                #define {ns}_DEPRECATED_TYPE_IN_2_{minor} GLIB_DEPRECATED_TYPE
+                #define {ns}_DEPRECATED_TYPE_IN_2_{minor}_FOR(f) GLIB_DEPRECATED_TYPE_FOR (f)
+                #else
+                #define {ns}_DEPRECATED_IN_2_{minor} _{ns}_EXTERN
+                #define {ns}_DEPRECATED_IN_2_{minor}_FOR(f) _{ns}_EXTERN
+                #define {ns}_DEPRECATED_MACRO_IN_2_{minor}
+                #define {ns}_DEPRECATED_MACRO_IN_2_{minor}_FOR(f)
+                #define {ns}_DEPRECATED_ENUMERATOR_IN_2_{minor}
+                #define {ns}_DEPRECATED_ENUMERATOR_IN_2_{minor}_FOR(f)
+                #define {ns}_DEPRECATED_TYPE_IN_2_{minor}
+                #define {ns}_DEPRECATED_TYPE_IN_2_{minor}_FOR(f)
+                #endif
+
+                #if GLIB_VERSION_MAX_ALLOWED < GLIB_VERSION_2_{minor}
+                #define {ns}_AVAILABLE_IN_2_{minor} {ns}_UNAVAILABLE (2, {minor})
+                #define {ns}_AVAILABLE_STATIC_INLINE_IN_2_{minor} GLIB_UNAVAILABLE_STATIC_INLINE (2, {minor})
+                #define {ns}_AVAILABLE_MACRO_IN_2_{minor} GLIB_UNAVAILABLE_MACRO (2, {minor})
+                #define {ns}_AVAILABLE_ENUMERATOR_IN_2_{minor} GLIB_UNAVAILABLE_ENUMERATOR (2, {minor})
+                #define {ns}_AVAILABLE_TYPE_IN_2_{minor} GLIB_UNAVAILABLE_TYPE (2, {minor})
+                #else
+                #define {ns}_AVAILABLE_IN_2_{minor} _{ns}_EXTERN
+                #define {ns}_AVAILABLE_STATIC_INLINE_IN_2_{minor}
+                #define {ns}_AVAILABLE_MACRO_IN_2_{minor}
+                #define {ns}_AVAILABLE_ENUMERATOR_IN_2_{minor}
+                #define {ns}_AVAILABLE_TYPE_IN_2_{minor}
+                #endif
+                '''))
+
+def main():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('glib_version', help='Current GLib version')
+    subparsers = parser.add_subparsers()
+
+    versions_parser = subparsers.add_parser('versions-macros', help='Generate versions macros')
+    versions_parser.add_argument('in_path', help='input file', type=Path)
+    versions_parser.add_argument('out_path', help='output file', type=Path)
+    versions_parser.set_defaults(func=gen_versions_macros)
+
+    doc_parser = subparsers.add_parser('doc-sections', help='Generate glib-sections.txt')
+    doc_parser.add_argument('in_path', help='input file', type=Path)
+    doc_parser.add_argument('out_path', help='output file', type=Path)
+    doc_parser.set_defaults(func=gen_doc_sections)
+
+    visibility_parser = subparsers.add_parser('visibility-macros', help='Generate visibility macros')
+    visibility_parser.add_argument('namespace', help='Macro namespace')
+    visibility_parser.add_argument('out_path', help='output file', type=Path)
+    visibility_parser.set_defaults(func=gen_visibility_macros)
+
+    args = parser.parse_args()
+    version = [int(i) for i in args.glib_version.split('.')]
+    assert version[0] == 2
+    args.func(args, version[1])
+
+if __name__ == '__main__':
+    main()
diff --git a/tools/meson.build b/tools/meson.build
index e91c8a2f9d..2d4192e462 100644
--- a/tools/meson.build
+++ b/tools/meson.build
@@ -22,3 +22,5 @@ if host_system != 'windows'
     install_tag : 'devel',
   )
 endif
+
+gen_visibility_macros = find_program('gen-visibility-macros.py')


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]