aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2016-11-12 18:01:28 -0500
committerGitHub <noreply@github.com>2016-11-12 18:01:28 -0500
commit59a414283c5caf006745aefff44489e689223050 (patch)
tree47b045536781aad2a5cefa4a49fa01583d5734d2
parente1ecb95d1dcd70f2165d4005f48ee60bce9db279 (diff)
parent4b7ddfbce7537b83e0dcb6190ae22d58d09137f4 (diff)
downloadmeson-59a414283c5caf006745aefff44489e689223050.zip
meson-59a414283c5caf006745aefff44489e689223050.tar.gz
meson-59a414283c5caf006745aefff44489e689223050.tar.bz2
Merge pull request #1022 from centricular/fix-girtarget-deps-includes
gnome.generate_gir: Add gir deps and includes recursively
-rw-r--r--mesonbuild/modules/gnome.py53
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/dep1/dep1.c56
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/dep1/dep1.h23
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/dep1/dep2/dep2.c124
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/dep1/dep2/dep2.h21
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/dep1/dep2/meson.build22
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/dep1/meson.build29
-rwxr-xr-x[-rw-r--r--]test cases/frameworks/7 gnome/gir/meson-sample.c15
-rwxr-xr-x[-rw-r--r--]test cases/frameworks/7 gnome/gir/meson-sample.h7
-rwxr-xr-x[-rw-r--r--]test cases/frameworks/7 gnome/gir/meson.build16
-rwxr-xr-x[-rw-r--r--]test cases/frameworks/7 gnome/gir/prog.c8
-rwxr-xr-xtest cases/frameworks/7 gnome/gir/prog.py8
-rw-r--r--test cases/frameworks/7 gnome/installed_files.txt8
13 files changed, 351 insertions, 39 deletions
diff --git a/mesonbuild/modules/gnome.py b/mesonbuild/modules/gnome.py
index faca857..2806014 100644
--- a/mesonbuild/modules/gnome.py
+++ b/mesonbuild/modules/gnome.py
@@ -403,6 +403,41 @@ class GnomeModule:
deps = [deps]
deps = (girtarget.get_all_link_deps() + girtarget.get_external_deps() +
deps)
+ # Need to recursively add deps on GirTarget sources from our
+ # dependencies and also find the include directories needed for the
+ # typelib generation custom target below.
+ typelib_includes = []
+ for dep in deps:
+ if hasattr(dep, 'held_object'):
+ dep = dep.held_object
+ # Add a dependency on each GirTarget listed in dependencies and add
+ # the directory where it will be generated to the typelib includes
+ if isinstance(dep, dependencies.InternalDependency):
+ for source in dep.sources:
+ if hasattr(source, 'held_object'):
+ source = source.held_object
+ if isinstance(source, GirTarget) and source not in depends:
+ depends.append(source)
+ subdir = os.path.join(state.environment.get_build_dir(),
+ source.get_subdir())
+ if subdir not in typelib_includes:
+ typelib_includes.append(subdir)
+ # Do the same, but for dependencies of dependencies. These are
+ # stored in the list of generated sources for each link dep (from
+ # girtarget.get_all_link_deps() above).
+ # FIXME: Store this in the original form from declare_dependency()
+ # so it can be used here directly.
+ elif isinstance(dep, build.SharedLibrary):
+ for source in dep.generated:
+ if isinstance(source, GirTarget):
+ subdir = os.path.join(state.environment.get_build_dir(),
+ source.get_subdir())
+ if subdir not in typelib_includes:
+ typelib_includes.append(subdir)
+ elif isinstance(dep, dependencies.PkgConfigDependency):
+ girdir = dep.get_pkgconfig_variable("girdir")
+ if girdir and girdir not in typelib_includes:
+ typelib_includes.append(girdir)
# ldflags will be misinterpreted by gir scanner (showing
# spurious dependencies) but building GStreamer fails if they
# are not used here.
@@ -448,22 +483,8 @@ class GnomeModule:
typelib_cmd = ['g-ir-compiler', scan_target, '--output', '@OUTPUT@']
typelib_cmd += self._get_include_args(state, gir_inc_dirs,
prefix='--includedir=')
- for dep in deps:
- if hasattr(dep, 'held_object'):
- dep = dep.held_object
- if isinstance(dep, dependencies.InternalDependency):
- for source in dep.sources:
- if isinstance(source.held_object, GirTarget):
- typelib_cmd += [
- "--includedir=%s" % (
- os.path.join(state.environment.get_build_dir(),
- source.held_object.get_subdir()),
- )
- ]
- elif isinstance(dep, dependencies.PkgConfigDependency):
- girdir = dep.get_pkgconfig_variable("girdir")
- if girdir:
- typelib_cmd += ["--includedir=%s" % (girdir, )]
+ for incdir in typelib_includes:
+ typelib_cmd += ["--includedir=" + incdir]
typelib_kwargs = {
'output': typelib_output,
diff --git a/test cases/frameworks/7 gnome/gir/dep1/dep1.c b/test cases/frameworks/7 gnome/gir/dep1/dep1.c
new file mode 100755
index 0000000..8d4ca4b
--- /dev/null
+++ b/test cases/frameworks/7 gnome/gir/dep1/dep1.c
@@ -0,0 +1,56 @@
+#include "dep1.h"
+
+struct _MesonDep1
+{
+ GObject parent_instance;
+};
+
+G_DEFINE_TYPE (MesonDep1, meson_dep1, G_TYPE_OBJECT)
+
+/**
+ * meson_dep1_new:
+ *
+ * Allocates a new #MesonDep1.
+ *
+ * Returns: (transfer full): a #MesonDep1.
+ */
+MesonDep1 *
+meson_dep1_new (void)
+{
+ return g_object_new (MESON_TYPE_DEP1, NULL);
+}
+
+static void
+meson_dep1_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (meson_dep1_parent_class)->finalize (object);
+}
+
+static void
+meson_dep1_class_init (MesonDep1Class *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = meson_dep1_finalize;
+}
+
+static void
+meson_dep1_init (MesonDep1 *self)
+{
+}
+
+/**
+ * meson_dep1_just_return_it:
+ * @dep: a #MesonDep2.
+ *
+ * Returns the #MesonDep2 that is passed in
+ *
+ * Returns: (transfer none): a #MesonDep2
+ */
+MesonDep2*
+meson_dep1_just_return_it (MesonDep1 *self, MesonDep2 *dep)
+{
+ g_return_val_if_fail (MESON_IS_DEP1 (self), NULL);
+
+ return dep;
+}
diff --git a/test cases/frameworks/7 gnome/gir/dep1/dep1.h b/test cases/frameworks/7 gnome/gir/dep1/dep1.h
new file mode 100755
index 0000000..92fc44c
--- /dev/null
+++ b/test cases/frameworks/7 gnome/gir/dep1/dep1.h
@@ -0,0 +1,23 @@
+#ifndef MESON_DEP1_H
+#define MESON_DEP1_H
+
+#if !defined (MESON_TEST)
+#error "MESON_TEST not defined."
+#endif
+
+#include <glib-object.h>
+#include "dep2/dep2.h"
+
+G_BEGIN_DECLS
+
+#define MESON_TYPE_DEP1 (meson_dep1_get_type())
+
+G_DECLARE_FINAL_TYPE (MesonDep1, meson_dep1, MESON, DEP1, GObject)
+
+MesonDep1 *meson_dep1_new (void);
+MesonDep2 *meson_dep1_just_return_it (MesonDep1 *self,
+ MesonDep2 *dep);
+
+G_END_DECLS
+
+#endif /* MESON_DEP1_H */
diff --git a/test cases/frameworks/7 gnome/gir/dep1/dep2/dep2.c b/test cases/frameworks/7 gnome/gir/dep1/dep2/dep2.c
new file mode 100755
index 0000000..754c6d7
--- /dev/null
+++ b/test cases/frameworks/7 gnome/gir/dep1/dep2/dep2.c
@@ -0,0 +1,124 @@
+#include "dep2.h"
+
+struct _MesonDep2
+{
+ GObject parent_instance;
+
+ gchar *msg;
+};
+
+G_DEFINE_TYPE (MesonDep2, meson_dep2, G_TYPE_OBJECT)
+
+enum {
+ PROP_0,
+ PROP_MSG,
+ LAST_PROP
+};
+
+static GParamSpec *gParamSpecs [LAST_PROP];
+
+/**
+ * meson_dep2_new:
+ * @msg: The message to set.
+ *
+ * Allocates a new #MesonDep2.
+ *
+ * Returns: (transfer full): a #MesonDep2.
+ */
+MesonDep2 *
+meson_dep2_new (const gchar *msg)
+{
+ g_return_val_if_fail (msg != NULL, NULL);
+
+ return g_object_new (MESON_TYPE_DEP2,
+ "message", msg,
+ NULL);
+}
+
+static void
+meson_dep2_finalize (GObject *object)
+{
+ MesonDep2 *self = (MesonDep2 *)object;
+
+ g_clear_pointer (&self->msg, g_free);
+
+ G_OBJECT_CLASS (meson_dep2_parent_class)->finalize (object);
+}
+
+static void
+meson_dep2_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MesonDep2 *self = MESON_DEP2 (object);
+
+ switch (prop_id)
+ {
+ case PROP_MSG:
+ g_value_set_string (value, self->msg);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+meson_dep2_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MesonDep2 *self = MESON_DEP2 (object);
+
+ switch (prop_id)
+ {
+ case PROP_MSG:
+ self->msg = g_value_dup_string (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+meson_dep2_class_init (MesonDep2Class *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = meson_dep2_finalize;
+ object_class->get_property = meson_dep2_get_property;
+ object_class->set_property = meson_dep2_set_property;
+
+ gParamSpecs [PROP_MSG] =
+ g_param_spec_string ("message",
+ "Message",
+ "The message to print.",
+ NULL,
+ (G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_properties (object_class, LAST_PROP, gParamSpecs);
+}
+
+static void
+meson_dep2_init (MesonDep2 *self)
+{
+}
+
+/**
+ * meson_dep2_return_message:
+ * @self: a #MesonDep2.
+ *
+ * Returns the message.
+ *
+ * Returns: (transfer none): a const gchar*
+ */
+const gchar*
+meson_dep2_return_message (MesonDep2 *self)
+{
+ g_return_val_if_fail (MESON_IS_DEP2 (self), NULL);
+
+ return (const gchar*) self->msg;
+}
diff --git a/test cases/frameworks/7 gnome/gir/dep1/dep2/dep2.h b/test cases/frameworks/7 gnome/gir/dep1/dep2/dep2.h
new file mode 100755
index 0000000..0afea90
--- /dev/null
+++ b/test cases/frameworks/7 gnome/gir/dep1/dep2/dep2.h
@@ -0,0 +1,21 @@
+#ifndef MESON_DEP2_H
+#define MESON_DEP2_H
+
+#if !defined (MESON_TEST)
+#error "MESON_TEST not defined."
+#endif
+
+#include <glib-object.h>
+
+G_BEGIN_DECLS
+
+#define MESON_TYPE_DEP2 (meson_dep2_get_type())
+
+G_DECLARE_FINAL_TYPE (MesonDep2, meson_dep2, MESON, DEP2, GObject)
+
+MesonDep2 *meson_dep2_new (const gchar *msg);
+const gchar *meson_dep2_return_message (MesonDep2 *self);
+
+G_END_DECLS
+
+#endif /* MESON_DEP2_H */
diff --git a/test cases/frameworks/7 gnome/gir/dep1/dep2/meson.build b/test cases/frameworks/7 gnome/gir/dep1/dep2/meson.build
new file mode 100755
index 0000000..4004f22
--- /dev/null
+++ b/test cases/frameworks/7 gnome/gir/dep1/dep2/meson.build
@@ -0,0 +1,22 @@
+dep2sources = ['dep2.c', 'dep2.h']
+
+dep2lib = shared_library(
+ 'dep2lib',
+ sources : dep2sources,
+ dependencies : gobj,
+ install : true
+)
+
+dep2gir = gnome.generate_gir(
+ dep2lib,
+ sources : dep2sources,
+ nsversion : '1.0',
+ namespace : 'MesonDep2',
+ symbol_prefix : 'meson',
+ identifier_prefix : 'Meson',
+ includes : ['GObject-2.0'],
+ install : true
+)
+
+dep2_dep = declare_dependency(link_with : dep2lib,
+ sources : [dep2gir])
diff --git a/test cases/frameworks/7 gnome/gir/dep1/meson.build b/test cases/frameworks/7 gnome/gir/dep1/meson.build
new file mode 100755
index 0000000..75dd731
--- /dev/null
+++ b/test cases/frameworks/7 gnome/gir/dep1/meson.build
@@ -0,0 +1,29 @@
+subdir('dep2')
+
+dep1sources = ['dep1.c', 'dep1.h']
+
+# Do not need to link to dep2lib because we don't use any symbols from it
+dep1lib = shared_library(
+ 'dep1lib',
+ sources : dep1sources,
+ dependencies : gobj,
+ install : true
+)
+
+# But the gir does need it because it we use the MesonDep2* structure defined
+# in the header
+dep1gir = gnome.generate_gir(
+ dep1lib,
+ sources : dep1sources,
+ nsversion : '1.0',
+ namespace : 'MesonDep1',
+ symbol_prefix : 'meson',
+ identifier_prefix : 'Meson',
+ includes : ['GObject-2.0', 'MesonDep2-1.0'],
+ dependencies : [dep2_dep],
+ install : true
+)
+
+dep1_dep = declare_dependency(link_with : dep1lib,
+ dependencies : [dep2_dep],
+ sources : [dep1gir])
diff --git a/test cases/frameworks/7 gnome/gir/meson-sample.c b/test cases/frameworks/7 gnome/gir/meson-sample.c
index dbf3625..850b850 100644..100755
--- a/test cases/frameworks/7 gnome/gir/meson-sample.c
+++ b/test cases/frameworks/7 gnome/gir/meson-sample.c
@@ -19,20 +19,15 @@ static GParamSpec *gParamSpecs [LAST_PROP];
/**
* meson_sample_new:
- * @msg: The message to set.
*
* Allocates a new #MesonSample.
*
* Returns: (transfer full): a #MesonSample.
*/
MesonSample *
-meson_sample_new (const gchar *msg)
+meson_sample_new (void)
{
- g_return_val_if_fail (msg != NULL, NULL);
-
- return g_object_new (MESON_TYPE_SAMPLE,
- "message", msg,
- NULL);
+ return g_object_new (MESON_TYPE_SAMPLE, NULL);
}
static void
@@ -116,9 +111,11 @@ meson_sample_init (MesonSample *self)
* Returns: Nothing.
*/
void
-meson_sample_print_message (MesonSample *self)
+meson_sample_print_message (MesonSample *self, MesonDep1 *dep1, MesonDep2 *dep2)
{
+ MesonDep2 *samedep;
g_return_if_fail (MESON_IS_SAMPLE (self));
- g_print ("Message: %s\n", self->msg);
+ samedep = meson_dep1_just_return_it (dep1, dep2);
+ g_print ("Message: %s\n", meson_dep2_return_message (samedep));
}
diff --git a/test cases/frameworks/7 gnome/gir/meson-sample.h b/test cases/frameworks/7 gnome/gir/meson-sample.h
index cd2bbc6..04e79b8 100644..100755
--- a/test cases/frameworks/7 gnome/gir/meson-sample.h
+++ b/test cases/frameworks/7 gnome/gir/meson-sample.h
@@ -6,6 +6,7 @@
#endif
#include <glib-object.h>
+#include "dep1/dep1.h"
G_BEGIN_DECLS
@@ -13,8 +14,10 @@ G_BEGIN_DECLS
G_DECLARE_FINAL_TYPE (MesonSample, meson_sample, MESON, SAMPLE, GObject)
-MesonSample *meson_sample_new (const gchar *msg);
-void meson_sample_print_message (MesonSample *self);
+MesonSample *meson_sample_new (void);
+void meson_sample_print_message (MesonSample *self,
+ MesonDep1 *dep1,
+ MesonDep2 *dep2);
G_END_DECLS
diff --git a/test cases/frameworks/7 gnome/gir/meson.build b/test cases/frameworks/7 gnome/gir/meson.build
index 51bbbab..beddc81 100644..100755
--- a/test cases/frameworks/7 gnome/gir/meson.build
+++ b/test cases/frameworks/7 gnome/gir/meson.build
@@ -1,9 +1,11 @@
+subdir('dep1')
+
libsources = ['meson-sample.c', 'meson-sample.h']
girlib = shared_library(
'gir_lib',
sources : libsources,
- dependencies : gobj,
+ dependencies : [gobj, dep1_dep],
install : true
)
@@ -21,15 +23,17 @@ gnome.generate_gir(
sources : libsources,
nsversion : '1.0',
namespace : 'Meson',
- symbol_prefix : 'meson_',
+ symbol_prefix : 'meson',
identifier_prefix : 'Meson',
- includes : ['GObject-2.0'],
- dependencies : [fake_dep],
+ includes : ['GObject-2.0', 'MesonDep1-1.0'],
+ # dep1_dep pulls in dep2_dep for us
+ dependencies : [fake_dep, dep1_dep],
install : true
)
test('gobject introspection/c', girexe)
+gir_paths = ':'.join([girlib.outdir(), dep1lib.outdir(), dep2lib.outdir()])
test('gobject introspection/py', find_program('prog.py'),
- env : ['GI_TYPELIB_PATH=' + girlib.outdir(),
- 'LD_LIBRARY_PATH=' + girlib.outdir(),
+ env : ['GI_TYPELIB_PATH=' + gir_paths,
+ 'LD_LIBRARY_PATH=' + gir_paths,
])
diff --git a/test cases/frameworks/7 gnome/gir/prog.c b/test cases/frameworks/7 gnome/gir/prog.c
index c855a6b..001f6d0 100644..100755
--- a/test cases/frameworks/7 gnome/gir/prog.c
+++ b/test cases/frameworks/7 gnome/gir/prog.c
@@ -21,10 +21,14 @@ main (gint argc,
return 1;
}
- MesonSample * i = meson_sample_new ("Hello, meson/c!");
- meson_sample_print_message (i);
+ MesonSample * i = meson_sample_new ();
+ MesonDep1 * dep1 = meson_dep1_new ();
+ MesonDep2 * dep2 = meson_dep2_new ("Hello, meson/c!");
+ meson_sample_print_message (i, dep1, dep2);
g_object_unref (i);
+ g_object_unref (dep1);
+ g_object_unref (dep2);
g_option_context_free (ctx);
return 0;
diff --git a/test cases/frameworks/7 gnome/gir/prog.py b/test cases/frameworks/7 gnome/gir/prog.py
index 717d08a..7ce2aa7 100755
--- a/test cases/frameworks/7 gnome/gir/prog.py
+++ b/test cases/frameworks/7 gnome/gir/prog.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python3
-from gi.repository import Meson
+from gi.repository import Meson, MesonDep1, MesonDep2
if __name__ == "__main__":
- s = Meson.Sample.new("Hello, meson/py!")
- s.print_message()
+ s = Meson.Sample.new()
+ dep1 = MesonDep1.Dep1.new()
+ dep2 = MesonDep2.Dep2.new("Hello, meson/py!")
+ s.print_message(dep1, dep2)
diff --git a/test cases/frameworks/7 gnome/installed_files.txt b/test cases/frameworks/7 gnome/installed_files.txt
index a18e445..06f4163 100644
--- a/test cases/frameworks/7 gnome/installed_files.txt
+++ b/test cases/frameworks/7 gnome/installed_files.txt
@@ -2,7 +2,13 @@ usr/include/enums.h
usr/include/enums2.h
usr/include/enums3.h
usr/include/marshaller.h
-usr/lib/girepository-1.0/Meson-1.0.typelib
usr/lib/libgir_lib.so
+usr/lib/libdep1lib.so
+usr/lib/libdep2lib.so
+usr/lib/girepository-1.0/Meson-1.0.typelib
+usr/lib/girepository-1.0/MesonDep1-1.0.typelib
+usr/lib/girepository-1.0/MesonDep2-1.0.typelib
usr/share/gir-1.0/Meson-1.0.gir
+usr/share/gir-1.0/MesonDep1-1.0.gir
+usr/share/gir-1.0/MesonDep2-1.0.gir
usr/share/glib-2.0/schemas/com.github.meson.gschema.xml