diff --git a/setup.cpyext.py b/setup.cpyext.py new file mode 100644 index 00000000..ee89dbc5 --- /dev/null +++ b/setup.cpyext.py @@ -0,0 +1,131 @@ +# encoding: utf-8 + +""" +This is a hack allowing you installing +uWSGI and uwsgidecorators via pip and easy_install +since 1.9.11 it automatically detects pypy +""" + +import os +import sys +import errno +import shlex +import shutil +import uwsgiconfig + +from setuptools import setup +from setuptools.dist import Distribution +from setuptools.command.install import install +from setuptools.command.install_lib import install_lib +from setuptools.command.build_ext import build_ext +from distutils.core import Extension + + +class uWSGIBuildExt(build_ext): + + UWSGI_NAME = 'uwsgi' + UWSGI_PLUGIN = 'pyuwsgi' + + def build_extensions(self): + self.uwsgi_setup() + #XXX: needs uwsgiconfig fix + self.uwsgi_build() + if 'UWSGI_USE_DISTUTILS' not in os.environ: + #XXX: needs uwsgiconfig fix + #uwsgiconfig.build_uwsgi(self.uwsgi_config) + return + + else: + #XXX: needs uwsgiconfig fix + os.unlink(self.uwsgi_config.get('bin_name')) + + #FIXME: else build fails :( + for baddie in set(self.compiler.compiler_so) & set(( + '-Wstrict-prototypes', + )): + self.compiler.compiler_so.remove(baddie) + + build_ext.build_extensions(self) + + def uwsgi_setup(self): + default = ( + '__pypy__' in sys.builtin_module_names + and 'pypy' + or 'default' + ) + profile = ( + os.environ.get('UWSGI_PROFILE') + or 'buildconf/%s.ini' % default + ) + + if not profile.endswith('.ini'): + profile = profile + '.ini' + if not '/' in profile: + profile = 'buildconf/' + profile + + #FIXME: update uwsgiconfig to properly set _EVERYTHING_! + config = uwsgiconfig.uConf(profile) + # insert in the beginning so UWSGI_PYTHON_NOLIB is exported + # before the python plugin compiles + ep = config.get('embedded_plugins').split(',') + if self.UWSGI_PLUGIN in ep: + ep.remove(self.UWSGI_PLUGIN) + ep.insert(0, self.UWSGI_PLUGIN) + config.set('embedded_plugins', ','.join(ep)) + config.set('as_shared_library', 'true') + config.set('bin_name', self.get_ext_fullpath(self.UWSGI_NAME)) + try: + os.makedirs(os.path.dirname(config.get('bin_name'))) + except OSError as e: + if e.errno != errno.EEXIST: + raise + + self.uwsgi_profile = profile + self.uwsgi_config = config + + def uwsgi_build(self): + uwsgiconfig.build_uwsgi(self.uwsgi_config) + + #XXX: merge uwsgi_setup (see other comments) + for ext in self.extensions: + if ext.name == self.UWSGI_NAME: + ext.sources = [s + '.c' for s in self.uwsgi_config.gcc_list] + ext.library_dirs = self.uwsgi_config.include_path[:] + ext.libraries = list() + ext.extra_compile_args = list() + + for x in uwsgiconfig.uniq_warnings( + self.uwsgi_config.ldflags + self.uwsgi_config.libs, + ): + for y in shlex.split(x): + if y.startswith('-l'): + ext.libraries.append(y[2:]) + elif y.startswith('-L'): + ext.library_dirs.append(y[2:]) + + for x in self.uwsgi_config.cflags: + for y in shlex.split(x): + if y: + ext.extra_compile_args.append(y) + + +setup( + name='uWSGI', + license='GPL2', + version=uwsgiconfig.uwsgi_version, + author='Unbit', + author_email='info@unbit.it', + description='The uWSGI server', + cmdclass={ + 'build_ext': uWSGIBuildExt, + }, + py_modules=[ + 'uwsgidecorators', + ], + ext_modules=[ + Extension(uWSGIBuildExt.UWSGI_NAME, sources=[]), + ], + entry_points={ + 'console_scripts': ['uwsgi=%s:run' % uWSGIBuildExt.UWSGI_NAME], + }, + )