Execute the dumper program through libtool if it's installed, so we avoid
authorJohan Dahlin <jdahlin@async.com.br>
Tue, 25 Nov 2008 13:01:58 +0000 (13:01 +0000)
committerJohan Dahlin <johan@src.gnome.org>
Tue, 25 Nov 2008 13:01:58 +0000 (13:01 +0000)
2008-11-25  Johan Dahlin  <jdahlin@async.com.br>

        * giscanner/glibtransformer.py:
        * tools/g-ir-scanner:
        Execute the dumper program through libtool if it's installed,
        so we avoid loading the installed version.

svn path=/trunk/; revision=964

ChangeLog
giscanner/glibtransformer.py
tools/g-ir-scanner

index ca93f70..d3f1a21 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-25  Johan Dahlin  <jdahlin@async.com.br>
+
+       * giscanner/glibtransformer.py:
+       * tools/g-ir-scanner:
+       Execute the dumper program through libtool if it's installed,
+       so we avoid loading the installed version.
+
 2008-11-24  Johan Dahlin  <jdahlin@async.com.br>
 
        * girepository/gdump.c (dump_type): Remove a warning,
index 263f6dc..33983e3 100644 (file)
@@ -82,8 +82,10 @@ class UnknownTypeError(Exception):
 
 class GLibTransformer(object):
 
-    def __init__(self, transformer, noclosure=False):
+    def __init__(self, transformer, noclosure=False, nolibtool=False):
         self._transformer = transformer
+        self._noclosure = noclosure
+        self._nolibtool = nolibtool
         self._transformer.set_container_types(['GList*', 'GSList*'],
                                               ['GHashTable*'])
         self._namespace_name = None
@@ -95,7 +97,6 @@ class GLibTransformer(object):
         self._failed_types = {}
         self._boxed_types = {}
         self._private_internal_types = {}
-        self._noclosure = noclosure
         self._validating = False
 
     # Public API
@@ -213,6 +214,19 @@ class GLibTransformer(object):
         except KeyError, e:
             return Unresolved(gtype_name)
 
+    def _use_libtool_infection(self):
+        libtool_infection = not self._nolibtool
+        if not libtool_infection:
+            return False
+
+        try:
+            subprocess.check_call(['libtool', '--version'])
+        except subprocess.CalledProcessError, e:
+            # If libtool's not installed, assume we don't need it
+            return False
+
+        return True
+
     def _execute_binary(self):
         in_path = os.path.join(self._binary.tmpdir, 'types.txt')
         f = open(in_path, 'w')
@@ -222,9 +236,12 @@ class GLibTransformer(object):
         f.close()
         out_path = os.path.join(self._binary.tmpdir, 'dump.xml')
 
-        introspect_arg = '--introspect-dump=%s,%s' % (in_path, out_path)
-        args = self._binary.args
-        args.append(introspect_arg)
+        args = []
+        if self._use_libtool_infection():
+            args.extend(['libtool', '--mode=execute'])
+        args.extend(self._binary.args)
+        args.append('--introspect-dump=%s,%s' % (in_path, out_path))
+
         # Invoke the binary, having written our get_type functions to types.txt
         subprocess.check_call(args, stdout=sys.stdout, stderr=sys.stderr)
         self._read_introspect_dump(out_path)
index 0f46018..0e2d414 100755 (executable)
@@ -304,7 +304,9 @@ def main(args):
 
     # Transform the C AST nodes into higher level
     # GLib/GObject nodes
-    glibtransformer = GLibTransformer(transformer, noclosure=options.noclosure)
+    glibtransformer = GLibTransformer(transformer,
+                                      noclosure=options.noclosure,
+                                      nolibtool=options.nolibtool)
     glibtransformer.set_introspection_binary(binary)
 
     namespace = glibtransformer.parse()