summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuele Bassi <ebassi@gnome.org>2021-07-28 00:45:32 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2021-07-28 16:24:21 +0100
commit793b46cc0458da6c04a8037db6aabb10f4409c21 (patch)
tree277b3ddcef829cc84b13683c7bc728e22cbcad49
parent4deecd658f18ed49d8b1a468e105c0d7cc4873cc (diff)
downloadgobject-introspection-793b46cc0458da6c04a8037db6aabb10f4409c21.tar.gz
Clean up the subproject rules for GLib
Make the variable names intelligible, and include a bunch of built files that are necessary to ensure that the generated GIR data actually matches the GLib API.
-rw-r--r--gir/meson.build121
1 files changed, 87 insertions, 34 deletions
diff --git a/gir/meson.build b/gir/meson.build
index 61fbdfb1..5d646335 100644
--- a/gir/meson.build
+++ b/gir/meson.build
@@ -58,8 +58,12 @@ if dep_type == 'internal'
# paths, library paths, and more that we now have to handle manually when
# building with subprojects.
subprojdir = 'subprojects'
- scanner_command += ['--extra-library=gio-2.0', '--extra-library=gmodule-2.0',
- '--extra-library=glib-2.0', '--extra-library=gobject-2.0']
+ scanner_command += [
+ '--extra-library=glib-2.0',
+ '--extra-library=gmodule-2.0',
+ '--extra-library=gobject-2.0',
+ '--extra-library=gio-2.0',
+ ]
endif
if get_option('gi_cross_binary_wrapper') != ''
@@ -118,36 +122,65 @@ if dep_type == 'pkgconfig'
glib_files += ret.stdout().strip().split('\n')
endif
glib_includes = ['-I' + glib_incdir, '-I' + glib_libincdir]
+ glib_gir_dep = []
elif dep_type == 'internal'
- glib_command += ['--pkg-export=glib-2.0']
- # XXX: Assumes that the builddir layout is 'mirror'
- glib_libdir = join_paths(meson.build_root(), subprojdir, 'glib', 'glib')
- # XXX: Assumes the location of the glib subproject dir
- # We should add API to meson to get a specific file from a specific subproject
- glibproj_incdir = join_paths(meson.source_root(), subprojdir, 'glib')
- glib_incdir = join_paths(glibproj_incdir, 'glib')
- glib_libincdir = glib_libdir
- glib_files += join_paths(glibproj_incdir, 'gobject', 'glib-types.h')
- glib_files += join_paths(glib_libincdir, 'glibconfig.h')
- if giounix_dep.found()
- glib_files += join_paths(glib_incdir, 'glib-unix.h')
- endif
+ # XXX: This is a pile of hacks to allow gobject-introspection to parse the
+ # GLib source files when GLib is used as a subproject
+ # Assumes that the builddir layout is 'mirror'
+ # Assumes the location of the glib subproject dir
+ # We should add API to meson to get a specific file from a specific
+ # subproject
# We know exactly what headers will be installed, so just fetch that
glib_subproject = subproject('glib')
+
+ glibproj_sourcedir = join_paths(meson.source_root(), subprojdir, 'glib')
+ glibproj_builddir = join_paths(meson.build_root(), subprojdir, 'glib')
+
+ glib_files += join_paths(glibproj_sourcedir, 'gobject', 'glib-types.h')
+
+ # Generated files, relative to the build directory
+ glib_files += [
+ join_paths(glibproj_builddir, 'glib', 'glibconfig.h'),
+ glib_subproject.get_variable('glib_enumtypes_h'),
+ ]
+
+ if giounix_dep.found()
+ glib_files += [
+ join_paths(glibproj_sourcedir, 'glib', 'glib-unix.h'),
+ ]
+ endif
+
glib_headers = glib_subproject.get_variable('glib_sub_headers')
glib_files += glib_subproject.get_variable('glib_sources')
+
# XXX: Assumes that the builddir layout is 'mirror'
- gobject_libdir = join_paths(meson.build_root(), subprojdir, 'glib', 'gobject')
- gmodule_libdir = join_paths(meson.build_root(), subprojdir, 'glib', 'gmodule')
- gio_libdir = join_paths(meson.build_root(), subprojdir, 'glib', 'gio')
- glib_libpaths = ['-L' + glib_libdir, '-L' + gobject_libdir,
- '-L' + gmodule_libdir, '-L' + gio_libdir]
+ glib_libdir = join_paths(glibproj_builddir, 'glib')
+ gobject_libdir = join_paths(glibproj_builddir, 'gobject')
+ gmodule_libdir = join_paths(glibproj_builddir, 'gmodule')
+ gio_libdir = join_paths(glibproj_builddir, 'gio')
+
+ glib_libpaths = [
+ '-L' + glib_libdir,
+ '-L' + gobject_libdir,
+ '-L' + gmodule_libdir,
+ '-L' + gio_libdir,
+ ]
# Includes that will be used to compile the scanner executable
- glib_buildinc = join_paths(meson.build_root(), subprojdir, 'glib')
- gmodule_incdir = join_paths(glibproj_incdir, 'gmodule')
- gio_incdir = join_paths(glibproj_incdir, 'gio')
- glib_includes = ['-I' + glibproj_incdir, '-I' + glib_incdir, '-I' + glib_libincdir,
- '-I' + glib_buildinc, '-I' + gmodule_incdir, '-I' + gio_incdir]
+ glib_incdir = join_paths(glibproj_sourcedir, 'glib')
+ gobject_incdir = join_paths(glibproj_sourcedir, 'gobject')
+ gmodule_incdir = join_paths(glibproj_sourcedir, 'gmodule')
+ gio_incdir = join_paths(glibproj_sourcedir, 'gio')
+
+ glib_includes = [
+ '-I' + glibproj_sourcedir,
+ '-I' + glibproj_builddir,
+ '-I' + glib_libdir,
+ '-I' + glib_incdir,
+ '-I' + gobject_incdir,
+ '-I' + gmodule_incdir,
+ '-I' + gio_incdir,
+ ]
+
# XXX: We need include paths to all glib dependencies too. We assume that the
# dependencies are only libffi and proxy-libintl, and that they are used as
# subprojects. In the worst case we add paths to non-existent directories.
@@ -158,10 +191,15 @@ elif dep_type == 'internal'
ffi_libdir = join_paths(meson.build_root(), subprojdir, 'libffi', 'src')
intl_libdir = join_paths(meson.build_root(), subprojdir, 'proxy-libintl')
- glib_libpaths = ['-L' + ffi_libdir, '-L' + intl_libdir] + glib_libpaths
+ glib_libpaths = [
+ '-L' + ffi_libdir,
+ '-L' + intl_libdir,
+ ] + glib_libpaths
+ glib_command += ['--pkg-export=glib-2.0']
glib_command += glib_libpaths
+ glib_gir_dep = glib_subproject.get_variable('libglib')
else
error('Unknown glib dependency type: ' + dep_type)
endif
@@ -190,7 +228,7 @@ endif
glib_gir = custom_target('gir-glib',
input: glib_files,
output: 'GLib-2.0.gir',
- depends: gir_giscanner_pymod,
+ depends: [gir_giscanner_pymod, glib_gir_dep],
depend_files: gir_giscanner_built_files,
install: true,
install_dir: girdir,
@@ -231,11 +269,15 @@ if dep_type == 'pkgconfig'
endif
gobject_files += ret.stdout().strip().split('\n')
endif
+ gobject_gir_dep = []
else
gobject_command += ['--pkg-export=gobject-2.0']
gobject_headers = glib_subproject.get_variable('gobject_install_headers')
- gobject_files += glib_subproject.get_variable('gobject_sources')
+ gobject_files += [
+ glib_subproject.get_variable('gobject_sources'),
+ ]
gobject_command += glib_libpaths
+ gobject_gir_dep = glib_subproject.get_variable('libgobject')
endif
foreach h : gobject_headers
@@ -253,7 +295,7 @@ gobject_files += files('gobject-2.0.c')
gobject_gir = custom_target('gir-gobject',
input: gobject_files,
output: 'GObject-2.0.gir',
- depends: [glib_gir, gir_giscanner_pymod],
+ depends: [glib_gir, gir_giscanner_pymod, gobject_gir_dep],
depend_files: gir_giscanner_built_files,
install: true,
install_dir: girdir,
@@ -285,11 +327,16 @@ if dep_type == 'pkgconfig'
if glib_srcdir != ''
gmodule_files += join_paths(glib_srcdir, 'gmodule', 'gmodule.c')
endif
+ gmodule_gir_dep = []
else
gmodule_command += ['--pkg-export=gmodule-2.0']
gmodule_command += glib_libpaths
- gmodule_files += [join_paths(glibproj_incdir, 'gmodule', 'gmodule.h'),
- join_paths(glibproj_incdir, 'gmodule', 'gmodule.c')]
+ gmodule_files += [
+ join_paths(glibproj_sourcedir, 'gmodule', 'gmodule.h'),
+ join_paths(glibproj_sourcedir, 'gmodule', 'gmodule.c'),
+ glib_subproject.get_variable('gmoduleconf_h'),
+ ]
+ gmodule_gir_dep = glib_subproject.get_variable('libgmodule')
endif
# NOTE: Always add this last so that we prefer the annotations in the sources
@@ -300,7 +347,7 @@ gmodule_files += files('gmodule-2.0.c')
gir_files += custom_target('gir-gmodule',
input: gmodule_files,
output: 'GModule-2.0.gir',
- depends: [glib_gir, gir_giscanner_pymod],
+ depends: [glib_gir, gir_giscanner_pymod, gmodule_gir_dep],
depend_files: gir_giscanner_built_files,
install: true,
install_dir: girdir,
@@ -341,11 +388,17 @@ if dep_type == 'pkgconfig'
endif
gio_files += ret.stdout().strip().split('\n')
endif
+ gio_gir_dep = []
else
gio_command += ['--pkg-export=gio-2.0']
gio_headers = glib_subproject.get_variable('gio_headers')
- gio_files += glib_subproject.get_variable('gio_sources')
+ gio_files += [
+ glib_subproject.get_variable('gio_sources'),
+ glib_subproject.get_variable('gioenumtypes_h'),
+ glib_subproject.get_variable('gnetworking_h'),
+ ]
gio_command += glib_libpaths
+ gio_gir_dep = glib_subproject.get_variable('libgio')
endif
foreach h : gio_headers
@@ -389,7 +442,7 @@ gio_files += files('gio-2.0.c')
gio_gir = custom_target('gir-gio',
input: gio_files,
output: 'Gio-2.0.gir',
- depends: [gobject_gir, gir_giscanner_pymod],
+ depends: [gobject_gir, gir_giscanner_pymod, gio_gir_dep],
depend_files: gir_giscanner_built_files,
install: true,
install_dir: girdir,