1"""
2Generic setup.py file for PyObjC framework wrappers.
3
4This file should only be changed in pyobjc-core and then copied
5to all framework wrappers.
6"""
7
8__all__ = ('setup', 'Extension', 'Command')
9
10import ez_setup
11ez_setup.use_setuptools()
12
13from setuptools import setup as _setup, Extension as _Extension, Command
14from distutils.errors import DistutilsPlatformError
15from distutils.command import build, install, install_lib
16from setuptools.command import develop, test, build_ext
17import plistlib
18import sys
19import __main__
20
21def get_os_level():
22    pl = plistlib.readPlist('/System/Library/CoreServices/SystemVersion.plist')
23    v = pl['ProductVersion']
24    return '.'.join(v.split('.')[:2])
25
26class pyobjc_install_lib (install_lib.install_lib):
27    def get_exclusions(self):
28        result = install_lib.install_lib.get_exclusions(self)
29        for fn in install_lib._install_lib.get_outputs(self):
30            if 'PyObjCTest' in fn:
31                result[fn] = 1
32
33        return result
34
35class pyobjc_build_ext (build_ext.build_ext):
36    def run(self):
37        build_ext.build_ext.run(self)
38        extensions = self.extensions
39        self.extensions = [
40            e for e in extensions if e.name.startswith('PyObjCTest') ]
41        self.copy_extensions_to_source()
42        self.extensions = extensions
43
44
45
46def Extension(*args, **kwds):
47    """
48    Simple wrapper about distutils.core.Extension that adds additional PyObjC
49    specific flags.
50    """
51    os_level = get_os_level()
52    cflags =  ["-DPyObjC_BUILD_RELEASE=%02d%02d"%(tuple(map(int, os_level.split('.'))))]
53    ldflags = []
54    if os_level != '10.4':
55        pass
56        pass
57    else:
58        cflags.append('-DNO_OBJC2_RUNTIME')
59
60    if 'extra_compile_args' in kwds:
61        kwds['extra_compile_args'] = kwds['extra_compile_args'] + cflags
62    else:
63        kwds['extra_compile_args'] = cflags
64
65    if 'extra_link_args' in kwds:
66        kwds['extra_link_args'] = kwds['extra_link_args'] + ldflags
67    else:
68        kwds['extra_link_args'] = ldflags
69
70    return _Extension(*args, **kwds)
71
72
73def setup(
74        min_os_level=None,
75        max_os_level=None,
76        cmdclass=None,
77        **kwds):
78
79    os_level = get_os_level()
80    os_compatible = True
81    if sys.platform != 'darwin':
82        os_compatible = False
83
84    else:
85        if min_os_level is not None:
86            if os_level < min_os_level:
87                os_compatible = False
88        if max_os_level is not None:
89            if os_level > max_os_level:
90                os_compatible = False
91
92    if cmdclass is None:
93        cmdclass = {}
94    else:
95        cmdclass = cmdclass.copy()
96
97    if not os_compatible:
98        def create_command_subclass(base_class):
99            if min_os_level != None:
100                if max_os_level != None:
101                    msg = "This distribution is only supported on MacOSX versions %s upto and including %s"%(
102                            min_os_level, max_os_level)
103                else:
104                    msg = "This distribution is only support on MacOSX >= %s"%(min_os_level,)
105            elif max_os_level != None:
106                    msg = "This distribution is only support on MacOSX <= %s"%(max_os_level,)
107            else:
108                    msg = "This distribution is only support on MacOSX"
109
110            class subcommand (base_class):
111                def run(self):
112                    raise DistutilsPlatformError(msg)
113
114            return subcommand
115
116        cmdclass['build'] = create_command_subclass(build.build)
117        cmdclass['test'] = create_command_subclass(test.test)
118        cmdclass['install'] = create_command_subclass(install.install)
119        cmdclass['develop'] = create_command_subclass(develop.develop)
120    else:
121        cmdclass['build_ext'] = pyobjc_build_ext
122        cmdclass['install_lib'] = pyobjc_install_lib
123
124    _setup(
125        cmdclass=cmdclass,
126        long_description=__main__.__doc__,
127        author='Ronald Oussoren',
128        author_email='pyobjc-dev@lists.sourceforge.net',
129        url='http://pyobjc.sourceforge.net',
130        platforms = [ "MacOS X" ],
131        package_dir = { '': 'Lib', 'PyObjCTest': 'PyObjCTest' },
132        dependency_links = [],
133        package_data = { '': ['*.bridgesupport'] },
134        test_suite='PyObjCTest',
135        zip_safe = True,
136        **kwds
137    )
138