1. ariovistus
  2. pyd


pyd / support.py

__all__ = ('setup', 'Extension')

from celerid import patch_distutils # Cause distutils to be hot-patched.

from distutils.core import setup, Extension as std_Extension
from distutils.errors import DistutilsOptionError

class Extension(std_Extension):
    def __init__(self, *args, **kwargs):
        if 'define_macros' in kwargs or 'undef_macros' in kwargs:
            raise DistutilsOptionError('D does not support macros, so the'
                ' "define_macros" and "undef_macros" arguments are not'
                ' supported.  Instead, consider using the "Version Condition"'
                ' and "Debug Condition" conditional compilation features'
                ' documented at http://www.digitalmars.com/d/version.html'
                '\n  Version flags can be passed to the compiler via the'
                ' "version_flags" keyword argument to DExtension; debug flags'
                ' via the "debug_flags" keyword argument.  For example, when'
                ' used with the DMD compiler,'
                '\n    DExtension(..., version_flags=["a", "b"])'
                '\nwill cause'
                '\n    -version=a -version=b'
                '\nto be passed to the compiler.'

        # If the user has requested any version_flags or debug_flags, we use
        # the distutils 'define_macros' keyword argument to carry them (they're
        # later unpacked in the dcompiler module).
        define_macros = []
        if 'version_flags' in kwargs or 'debug_flags' in kwargs:
            if 'version_flags' in kwargs:
                for flag in kwargs['version_flags']:
                    define_macros.append((flag, 'version'))
                del kwargs['version_flags']

            if 'debug_flags' in kwargs:
                for flag in kwargs['debug_flags']:
                    define_macros.append((flag, 'debug'))
                del kwargs['debug_flags']

        # Pass in the extension name so the compiler class can know it
        if 'name' in kwargs:
            define_macros.append((kwargs['name'], 'name'))
        elif len(args) > 0:
            define_macros.append((args[0], 'name'))

        # Pass in the 'tango' flag, also
        with_tango = kwargs.pop('tango', False)
        if with_tango:
            define_macros.append(('Pyd_with_Tango', 'version'))
        kwargs['define_macros'] = define_macros

        # Similarly, pass in with_pyd, &c, via define_macros.
        if 'raw_only' in kwargs:
            kwargs['with_pyd'] = False
            kwargs['with_st'] = False
            kwargs['with_meta'] = False
            kwargs['with_main'] = False
            del kwargs['raw_only']
        with_pyd  = kwargs.pop('with_pyd', True)
        build_deimos = kwargs.pop('build_deimos', False)
        with_st   = kwargs.pop('with_st', False) # 5/23/07 st off by default.
        # StackThreads doesn't work with Tango at the moment.
        if with_tango:
            with_st = False
        with_meta = kwargs.pop('with_meta', True)
        with_main = kwargs.pop('with_main', True)
        if with_pyd and not with_meta:
            raise DistutilsOptionError(
                'Cannot specify with_meta=False while using Pyd. Specify'
                ' raw_only=True or with_pyd=False if you want to compile a raw Python/C'
                ' extension.'
        if with_main and not with_pyd:
            # The special PydMain function should only be used when using Pyd
            with_main = False

        define_macros.append(((with_pyd, with_st, with_meta, with_main, build_deimos), 'aux'))

        std_Extension.__init__(self, *args, **kwargs)