diff options
author | John Ehresman <jpe@wingware.com> | 2010-04-13 16:30:56 -0400 |
---|---|---|
committer | John Ehresman <jpe@wingware.com> | 2010-04-15 12:16:49 -0400 |
commit | b28ac0322bf7b1316b5ed8b19492a3848b090ab0 (patch) | |
tree | e2d1ca2749134e367a4e713f532b224efd6cba9e | |
parent | c45311ac3845f42488590acc83c90034066efbde (diff) | |
download | pygobject-b28ac0322bf7b1316b5ed8b19492a3848b090ab0.tar.gz pygobject-b28ac0322bf7b1316b5ed8b19492a3848b090ab0.tar.xz pygobject-b28ac0322bf7b1316b5ed8b19492a3848b090ab0.zip |
Partially working setup.py
-rw-r--r-- | dsextras.py | 36 | ||||
-rwxr-xr-x | setup.py | 102 |
2 files changed, 118 insertions, 20 deletions
diff --git a/dsextras.py b/dsextras.py index 2f8d89a..10973e2 100644 --- a/dsextras.py +++ b/dsextras.py @@ -66,7 +66,7 @@ def list_files(dir): that matches *.glade. It also looks up the full path""" if dir.find(os.sep) != -1: parts = dir.split(os.sep) - dir = os.sep.join(parts[:-1]) + dir = string.join(parts[:-1], os.sep) pattern = parts[-1] else: pattern = dir @@ -95,6 +95,21 @@ def pkgc_version_check(name, req_version): return 0 +def pkgc_get_libraries(name): + """returns a list of libraries as returned by pkg-config --libs-only-l""" + output = getoutput('pkg-config --libs-only-l %s' % name) + return output.replace('-l', '').split() + +def pkgc_get_library_dirs(name): + """returns a list of library dirs as returned by pkg-config --libs-only-L""" + output = getoutput('pkg-config --libs-only-L %s' % name) + return output.replace('-L', '').split() + +def pkgc_get_include_dirs(name): + """returns a list of include dirs as returned by pkg-config --cflags-only-I""" + output = getoutput('pkg-config --cflags-only-I %s' % name) + return output.replace('-I', '').split() + class BuildExt(build_ext): def init_extra_compile_args(self): self.extra_compile_args = [] @@ -220,10 +235,19 @@ class PkgConfigExtension(Extension): can_build_ok = None def __init__(self, **kwargs): name = kwargs['pkc_name'] - kwargs['include_dirs'] = self.get_include_dirs(name) + GLOBAL_INC + if 'include_dirs' in kwargs: + kwargs['include_dirs'] += self.get_include_dirs(name) + GLOBAL_INC + else: + kwargs['include_dirs'] = self.get_include_dirs(name) + GLOBAL_INC kwargs['define_macros'] = GLOBAL_MACROS - kwargs['libraries'] = self.get_libraries(name) - kwargs['library_dirs'] = self.get_library_dirs(name) + if 'libraries' in kwargs: + kwargs['libraries'] += self.get_libraries(name) + else: + kwargs['libraries'] = self.get_libraries(name) + if 'library_dirs' in kwargs: + kwargs['library_dirs'] += self.get_library_dirs(name) + else: + kwargs['library_dirs'] = self.get_library_dirs(name) if 'pygobject_pkc' in kwargs: self.pygobject_pkc = kwargs.pop('pygobject_pkc') if self.pygobject_pkc: @@ -290,7 +314,7 @@ class PkgConfigExtension(Extension): else: print "Warning: Too old version of %s" % self.pkc_name print " Need %s, but %s is installed" % \ - (package, orig_version) + (version, orig_version) self.can_build_ok = 0 return 0 @@ -421,7 +445,7 @@ class TemplateExtension(PkgConfigExtension): if load_types: del kwargs['load_types'] - if 'output' in kwargs: + if kwargs.has_key('output'): kwargs['name'] = kwargs['output'] del kwargs['output'] @@ -5,6 +5,8 @@ """Python Bindings for GObject.""" from distutils.command.build import build +from distutils.command.build_clib import build_clib +from distutils.sysconfig import get_python_inc from distutils.core import setup import glob import os @@ -12,7 +14,8 @@ import sys from dsextras import get_m4_define, getoutput, have_pkgconfig, \ GLOBAL_INC, GLOBAL_MACROS, InstallLib, InstallData, BuildExt, \ - PkgConfigExtension + PkgConfigExtension, TemplateExtension, \ + pkgc_get_libraries, pkgc_get_library_dirs, pkgc_get_include_dirs if '--yes-i-know-its-not-supported' in sys.argv: sys.argv.remove('--yes-i-know-its-not-supported') @@ -39,7 +42,7 @@ MICRO_VERSION = int(get_m4_define('pygobject_micro_version')) VERSION = "%d.%d.%d" % (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION) -GOBJECT_REQUIRED = get_m4_define('glib_required_version') +GLIB_REQUIRED = get_m4_define('glib_required_version') PYGOBJECT_SUFFIX = '2.0' PYGOBJECT_SUFFIX_LONG = 'gtk-' + PYGOBJECT_SUFFIX @@ -49,11 +52,12 @@ GLOBAL_MACROS += [('PYGOBJECT_MAJOR_VERSION', MAJOR_VERSION), ('PYGOBJECT_MINOR_VERSION', MINOR_VERSION), ('PYGOBJECT_MICRO_VERSION', MICRO_VERSION)] -if sys.platform == 'win33': +if sys.platform == 'win32': GLOBAL_MACROS.append(('VERSION', '"""%s"""' % VERSION)) else: GLOBAL_MACROS.append(('VERSION', '"%s"' % VERSION)) +DEFS_DIR = os.path.join('share', 'pygobject', PYGOBJECT_SUFFIX, 'defs') INCLUDE_DIR = os.path.join('include', 'pygtk-%s' % PYGOBJECT_SUFFIX) XSL_DIR = os.path.join('share', 'pygobject','xsl') HTML_DIR = os.path.join('share', 'gtk-doc', 'html', 'pygobject') @@ -91,6 +95,7 @@ class PyGObjectInstallData(InstallData): def run(self): self.add_template_option('VERSION', VERSION) self.add_template_option('FFI_LIBS', '') + self.add_template_option('LIBFFI_PC', '') self.prepare() # Install templates @@ -110,47 +115,113 @@ class PyGObjectBuild(build): PyGObjectBuild.user_options.append(('enable-threading', None, 'enable threading support')) +# glib +glib = PkgConfigExtension(name='glib._glib', + pkc_name='glib-2.0', + pkc_version=GLIB_REQUIRED, + pygobject_pkc=None, + include_dirs=['glib'], + libraries=['pyglib'], + sources=['glib/glibmodule.c', + 'glib/pygiochannel.c', + 'glib/pygmaincontext.c', + 'glib/pygmainloop.c', + 'glib/pygoptioncontext.c', + 'glib/pygoptiongroup.c', + 'glib/pygsource.c', + 'glib/pygspawn.c', + ]) + # GObject -gobject = PkgConfigExtension(name='gobject._gobject', pkc_name='gobject-2.0', - pkc_version=GOBJECT_REQUIRED, +gobject = PkgConfigExtension(name='gobject._gobject', + pkc_name='gobject-2.0', + pkc_version=GLIB_REQUIRED, pygobject_pkc=None, + include_dirs=['glib'], + libraries=['pyglib'], sources=['gobject/gobjectmodule.c', 'gobject/pygboxed.c', 'gobject/pygenum.c', 'gobject/pygflags.c', + 'gobject/pyginterface.c', 'gobject/pygobject.c', - 'gobject/pygmaincontext.c', - 'gobject/pygmainloop.c', - 'gobject/pygoptioncontext.c', - 'gobject/pygoptiongroup.c', 'gobject/pygparamspec.c', 'gobject/pygpointer.c', 'gobject/pygtype.c', - 'gobject/pygsource.c', - 'gobject/pygiochannel.c', ]) +# gio +gio = TemplateExtension(name='gio', + pkc_name='gio-2.0', + pkc_version=GLIB_REQUIRED, + output='gio._gio', + defs=('gio/gio.defs', ['gio/gio-types.defs']), + include_dirs=['glib'], + libraries=['pyglib'], + sources=['gio/giomodule.c', + 'gio/gio.c', + 'gio/pygio-utils.c'], + register=[('gio/gio.defs', ['gio/gio-types.defs'])], + override='gio/gio.override') + +clibs = [] data_files = [] ext_modules = [] -py_modules = [] -py_modules.append('dsextras') + +#Install dsextras and codegen so that the pygtk installer +#can find them +py_modules = ['dsextras'] +packages = ['codegen'] if not have_pkgconfig(): print "Error, could not find pkg-config" raise SystemExit +if glib.can_build(): + #It would have been nice to create another class, such as PkgConfigCLib to + #encapsulate this dictionary, but it is impossible. build_clib.py does + #a dumb check to see if its only arguments are a 2-tuple containing a + #string and a Dictionary type - which makes it impossible to hide behind a + #subclass + # + #So we are stuck with this ugly thing + clibs.append(( + 'pyglib',{ + 'sources':['glib/pyglib.c'], + 'macros':GLOBAL_MACROS, + 'include_dirs': + ['glib', get_python_inc()]+pkgc_get_include_dirs('glib-2.0')})) + #this library is not installed, so probbably should not include its header + #data_files.append((INCLUDE_DIR, ('glib/pyglib.h',))) + + ext_modules.append(glib) + py_modules += ['glib.__init__', 'glib.option'] +else: + print + print 'ERROR: Nothing to do, glib could not be found and is essential.' + raise SystemExit + if gobject.can_build(): ext_modules.append(gobject) - py_modules.append('gobject.option') data_files.append((INCLUDE_DIR, ('gobject/pygobject.h',))) data_files.append((HTML_DIR, glob.glob('docs/html/*.html'))) data_files.append((HTML_DIR, ['docs/style.css'])) data_files.append((XSL_DIR, glob.glob('docs/xsl/*.xsl'))) + py_modules += ['gobject.__init__', 'gobject.propertyhelper', 'gobject.constants'] else: print print 'ERROR: Nothing to do, gobject could not be found and is essential.' raise SystemExit +if gio.can_build(): + ext_modules.append(gio) + py_modules += ['gio.__init__'] + data_files.append((DEFS_DIR,('gio/gio-types.defs',))) +else: + print + print 'ERROR: Nothing to do, gio could not be found and is essential.' + raise SystemExit + # Threading support if '--disable-threading' in sys.argv: sys.argv.remove('--disable-threading') @@ -199,11 +270,14 @@ setup(name="pygobject", description = doclines[0], long_description = "\n".join(doclines[2:]), py_modules=py_modules, + packages=packages, ext_modules=ext_modules, + libraries=clibs, data_files=data_files, scripts = ["pygobject_postinstall.py"], options=options, cmdclass={'install_lib': PyGObjectInstallLib, 'install_data': PyGObjectInstallData, + 'build_clib' : build_clib, 'build_ext': BuildExt, 'build': PyGObjectBuild}) |