__all__ = ['SetupPy'] import os import sys from numpy.distutils.exec_command import exec_command from base import Component from utils import FileSource def write_files(container): s = ['creating files and directories:'] for filename, i in container.label_map.items(): content = container.list[i] d,f = os.path.split(filename) if d and not os.path.isdir(d): s.append(' %s/' % (d)) if not Component._generate_dry_run: os.makedirs(d) s.append(' %s' % (filename)) if not Component._generate_dry_run: overwrite = True if os.path.isfile(filename): overwrite = False f = file(filename, 'r') i = 0 for line in f: if 'is generated using ExtGen tool' in line: overwrite = True break i += 1 if i>5: break if not overwrite: s[-1] += ' - unknown file exists, skipping' else: s[-1] += ' - extgen generated file exists, overwriting' if overwrite: f = file(filename,'w') f.write(content) f.close() return '\n'.join(s) class SetupPy(Component): """ >>> from __init__ import * >>> s = SetupPy('SetupPy_doctest') >>> s += PyCModule('foo') >>> s,o = s.execute('build_ext', '--inplace') >>> assert s==0,`s` >>> import SetupPy_doctest as mypackage >>> print mypackage.foo.__doc__ #doctest: +ELLIPSIS This module 'foo' is generated with ExtGen from NumPy version... """ template_setup_py_start = '''\ def configuration(parent_package='', top_path = ''): from numpy.distutils.misc_util import Configuration config = Configuration('',parent_package,top_path)''' template_setup_py_end = '''\ return config if __name__ == "__main__": from numpy.distutils.core import setup setup(configuration=configuration) ''' template = '%(SourceWriter)s' container_options = dict( SourceWriter = dict(user_defined_str = write_files), TMP = dict() ) component_container_map = dict( FileSource = 'SourceWriter', ExtensionModule = 'TMP', ) def initialize(self, build_dir, *components, **options): self.name = self.path = build_dir if not self.path: self.setup_py = setup_py = Component.PySource('extgen_setup.py') self.init_py = init_py = Component.PySource('extgen__init__.py') else: self.setup_py = setup_py = Component.PySource('setup.py') self.init_py = init_py = Component.PySource('__init__.py') setup_py += self.template_setup_py_start self += init_py self += setup_py map(self.add, components) return self def finalize(self): self.setup_py += self.template_setup_py_end def execute(self, *args): """ Run generated setup.py file with given arguments. """ if not args: raise ValueError('need setup.py arguments') self.info(self.generate(dry_run=False)) cmd = [sys.executable,'setup.py'] + list(args) self.info('entering %r directory' % (self.path)) self.info('executing command %r' % (' '.join(cmd))) try: r = exec_command(cmd, execute_in=self.path, use_tee=False) except: self.info('leaving %r directory' % (self.path)) raise else: self.info('leaving %r directory' % (self.path)) return r def _test(): import doctest doctest.testmod() if __name__ == "__main__": _test()