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