summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn Ehresman <jpe@wingware.com>2010-04-13 16:30:56 -0400
committerJohn Ehresman <jpe@wingware.com>2010-04-15 12:16:49 -0400
commitb28ac0322bf7b1316b5ed8b19492a3848b090ab0 (patch)
treee2d1ca2749134e367a4e713f532b224efd6cba9e
parentc45311ac3845f42488590acc83c90034066efbde (diff)
downloadpygobject-b28ac0322bf7b1316b5ed8b19492a3848b090ab0.tar.gz
pygobject-b28ac0322bf7b1316b5ed8b19492a3848b090ab0.tar.xz
pygobject-b28ac0322bf7b1316b5ed8b19492a3848b090ab0.zip
Partially working setup.py
-rw-r--r--dsextras.py36
-rwxr-xr-xsetup.py102
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']
diff --git a/setup.py b/setup.py
index b367c6a..50f7abe 100755
--- a/setup.py
+++ b/setup.py
@@ -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})