glib/girepository/introspection/meson.build
Philip Withnall 5021d002ab introspection: Generate separate GIR files for platform specific APIs
For both GLib and GIO. (GObject, GIRepository and GModule don’t have any
platform specific APIs.)

This is needed for two reasons:
 * If the same GIR file is shipped on multiple platforms, it has no way
   to conditionally define/not-define an API based on the platform (like
   an `#ifdef` in a C header). So we either end up shipping differing
   GIR APIs on different platforms, or shipping a GIR file which
   declares APIs which aren’t resolvable by `dlopen()` on certain
   platforms, and will cause a language runtime error.
 * The API reference documentation is now generated from the GIR, and
   similar problems are present there: if the GIR contains different
   symbols depending on the platform, there is no way to generate API
   documentation for the union of all of them.

The fix is to ensure that there are no conditional symbols in a GIR, by
splitting out the platform specific symbols into platform specific GIR
files. Platform specific documentation can then be generated from these,
in addition to the main, platform agnostic, documentation.

The documentation changes will following in a subsequent commit.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3037
2024-02-12 17:54:10 +00:00

274 lines
6.6 KiB
Meson

gi_identifier_prefix = 'G'
gi_symbol_prefix = 'g'
gi_gen_shared_sources = [
# Required to compile gdump
gmodule_visibility_h,
]
gi_gen_env_variables = environment()
if get_option('b_sanitize') != ''
gi_gen_env_variables.append(
'ASAN_OPTIONS', 'verify_asan_link_order=0', separator: ',')
endif
# GLib
glib_gir = gnome.generate_gir(libglib,
sources: [
gi_gen_shared_sources,
glibconfig_h,
gversionmacros_h,
glib_visibility_h,
glib_headers,
glib_deprecated_headers,
glib_sub_headers,
glib_enumtypes_h,
glib_types_h,
glib_deprecated_sources,
glib_sources,
],
namespace: 'GLib',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: 'glib-2.0',
header: 'glib.h',
install: true,
dependencies: [
libgobject_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + [
'-DGLIB_COMPILATION',
'-DGETTEXT_PACKAGE="dummy"',
'--symbol-prefix=glib',
'--library-path=' + meson.current_build_dir(),
'--library=gobject-2.0',
],
)
if host_system == 'windows'
glib_win32_gir = gnome.generate_gir(libglib,
sources: [
gi_gen_shared_sources,
glib_win32_headers,
],
namespace: 'GLibWin32',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: 'glib-2.0',
header: 'glib.h',
includes: [ glib_gir[0] ],
install: true,
dependencies: [
libgobject_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + [
'-DGLIB_COMPILATION',
'-DGETTEXT_PACKAGE="dummy"',
'--symbol-prefix=glib',
'--library-path=' + meson.current_build_dir(),
'--library=gobject-2.0',
],
)
else
glib_unix_gir = gnome.generate_gir(libglib,
sources: [
gi_gen_shared_sources,
glib_unix_headers,
],
namespace: 'GLibUnix',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: 'glib-2.0',
header: 'glib.h',
includes: [ glib_gir[0] ],
install: true,
dependencies: [
libgobject_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + [
'-DGLIB_COMPILATION',
'-DGETTEXT_PACKAGE="dummy"',
'--symbol-prefix=glib',
'--library-path=' + meson.current_build_dir(),
'--library=gobject-2.0',
'--c-include=glib-unix.h',
],
)
endif
# GObject
gobject_gir = gnome.generate_gir(libgobject,
sources: [
gi_gen_shared_sources,
gobject_visibility_h,
gobject_install_headers,
gobject_sources,
],
namespace: 'GObject',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: 'gobject-2.0',
header: 'glib-object.h',
includes: [ glib_gir[0] ],
install: true,
env: gi_gen_env_variables,
extra_args: gir_args + [
'-DGOBJECT_COMPILATION',
'--symbol-prefix=gobject',
],
)
# GModule
gmodule_gir = gnome.generate_gir(libgmodule,
sources: [
gi_gen_shared_sources,
gmoduleconf_h,
gmodule_h,
gmodule_c,
gmodule_deprecated_c,
gmodule_visibility_h,
],
namespace: 'GModule',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: 'gmodule-2.0',
header: 'gmodule.h',
includes: [ glib_gir[0] ],
install: true,
dependencies: [
libglib_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + [
'-DGMODULE_COMPILATION',
'-DGETTEXT_PACKAGE="dummy"',
'--symbol-prefix=gmodule',
],
)
# Gio
gio_gir_sources = [
gi_gen_shared_sources,
gio_visibility_h,
gioenumtypes_h,
gnetworking_h,
gio_headers,
gio_base_sources,
application_sources,
gdbus_sources,
contenttype_sources,
settings_sources,
]
gio_gir_args = [
'-DGIO_COMPILATION',
'-DG_SETTINGS_ENABLE_BACKEND',
'--symbol-prefix=gio',
]
gio_gir = gnome.generate_gir(libgio,
sources: gio_gir_sources,
namespace: 'Gio',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: [ 'gio-2.0' ],
header: 'gio/gio.h',
includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0] ],
install: true,
dependencies: [
libglib_dep,
libgobject_dep,
libgmodule_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + gio_gir_args,
)
if host_system == 'windows'
gio_win32_gir_c_includes = []
foreach h: gio_win32_include_headers
gio_win32_gir_c_includes += '--c-include=@0@'.format(h)
endforeach
gio_win32_gir = gnome.generate_gir(libgio,
sources: gio_win32_include_headers + win32_sources,
namespace: 'GioWin32',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: [ 'gio-win32-2.0' ],
header: 'gio/gio.h',
includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ],
install: true,
dependencies: [
libglib_dep,
libgobject_dep,
libgmodule_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + gio_gir_args + [ '--pkg=gio-win32-2.0' ] + gio_win32_gir_c_includes,
)
else
gio_unix_gir_c_includes = []
foreach h: gio_unix_include_headers
gio_unix_gir_c_includes += '--c-include=@0@'.format(h)
endforeach
gio_unix_gir = gnome.generate_gir(libgio,
sources: gio_unix_include_headers + unix_sources,
namespace: 'GioUnix',
nsversion: '2.0',
identifier_prefix: gi_identifier_prefix,
symbol_prefix: gi_symbol_prefix,
export_packages: [ 'gio-unix-2.0' ],
header: 'gio/gio.h',
includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ],
install: true,
dependencies: [
libglib_dep,
libgobject_dep,
libgmodule_dep,
],
env: gi_gen_env_variables,
extra_args: gir_args + gio_gir_args + [ '--pkg=gio-unix-2.0' ] + gio_unix_gir_c_includes,
)
endif
# GIRepository
libgirepository_gir_sources = [
gi_visibility_h,
girepo_headers,
girepo_sources,
]
libgirepository_gir_packages = [ 'girepository-2.0' ]
libgirepository_gir_args = [
'-DGI_COMPILATION',
'--symbol-prefix=gi',
'--identifier-prefix=GI',
]
girepository_gir = gnome.generate_gir(libgirepository,
sources: libgirepository_gir_sources,
namespace: 'GIRepository',
nsversion: '3.0',
identifier_prefix: 'GI',
symbol_prefix: 'gi',
export_packages: libgirepository_gir_packages,
header: 'girepository/girepository.h',
includes: [ glib_gir[0], gmodule_gir[0], gobject_gir[0], gio_gir[0] ],
install: true,
dependencies: [ libglib_dep, libgobject_dep, libgmodule_dep, libgio_dep ],
extra_args: gir_args + libgirepository_gir_args,
)