diff options
Diffstat (limited to 'giscanner')
-rw-r--r-- | giscanner/Makefile.am | 8 | ||||
-rw-r--r-- | giscanner/libtoolimporter.py | 52 | ||||
-rw-r--r-- | giscanner/sourcescanner.py | 3 | ||||
-rw-r--r-- | giscanner/utils.py | 4 |
4 files changed, 60 insertions, 7 deletions
diff --git a/giscanner/Makefile.am b/giscanner/Makefile.am index e824b34e..a7e3ad5c 100644 --- a/giscanner/Makefile.am +++ b/giscanner/Makefile.am @@ -42,6 +42,7 @@ pkgpyexec_PYTHON = \ girwriter.py \ glibast.py \ glibtransformer.py \ + libtoolimporter.py \ minixpath.py \ odict.py \ sourcescanner.py \ @@ -77,13 +78,6 @@ install-exec-hook: mv $(pkgpyexecdir)/_giscanner.dll $(pkgpyexecdir)/_giscanner.pyd rm $(pkgpyexecdir)/_giscanner.dll.a rm $(pkgpyexecdir)/_giscanner.la -else -BUILT_SOURCES += _giscanner.so -CLEANFILES += _giscanner.so endif -# Yuck, ugly but... -_giscanner.so: _giscanner.la - ln -sf .libs/_giscanner.so . - include $(top_srcdir)/gcov.mak diff --git a/giscanner/libtoolimporter.py b/giscanner/libtoolimporter.py new file mode 100644 index 00000000..2971815e --- /dev/null +++ b/giscanner/libtoolimporter.py @@ -0,0 +1,52 @@ +# -*- Mode: Python -*- +# GObject-Introspection - a framework for introspecting GObject libraries +# Copyright (C) 2008 Johan Dahlin +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program 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 General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301, USA. +# + +import imp +import os +import sys + +from .utils import extract_libtool + + +class LibToolImporter(object): + def __init__(self, name, path): + self.name = name + self.path = path + + @staticmethod + def find_module(name, path=None): + modname = name.split('.')[-1] + for part in path or sys.path: + full = os.path.join(part, '.libs', modname + '.la') + if os.path.exists(full): + return LibToolImporter(name, full) + raise SystemExit + + def load_module(self, name): + realpath = extract_libtool(self.path) + mod = imp.load_module(name, open(realpath), realpath, + ('.so', 'rb', 3)) + return mod + +def install_libtoolimporter(): + sys.meta_path.append(LibToolImporter) + +def uninstall_libtoolimporter(): + sys.meta_path.remove(LibToolImporter) diff --git a/giscanner/sourcescanner.py b/giscanner/sourcescanner.py index 5c2d704b..df3692cd 100644 --- a/giscanner/sourcescanner.py +++ b/giscanner/sourcescanner.py @@ -22,7 +22,10 @@ import os import subprocess import tempfile +from .libtoolimporter import install_libtoolimporter, uninstall_libtoolimporter +install_libtoolimporter() from . import _giscanner +uninstall_libtoolimporter() (CSYMBOL_TYPE_INVALID, CSYMBOL_TYPE_ELLIPSIS, diff --git a/giscanner/utils.py b/giscanner/utils.py index d03465e3..29fb8d3b 100644 --- a/giscanner/utils.py +++ b/giscanner/utils.py @@ -52,6 +52,10 @@ def extract_libtool(libname): filename = _libtool_pat.search(data).groups()[0] libname = os.path.join(os.path.dirname(libname), '.libs', filename) + # FIXME: This hackish, but I'm not sure how to do this + # in a way which is compatible with both libtool 2.2 + # and pre-2.2. Johan 2008-10-21 + libname = libname.replace('.libs/.libs', '.libs') return libname |