From f914935474845bda71e5cd7a685e3b73201a8d5b Mon Sep 17 00:00:00 2001 From: Emile Anclin Date: Wed, 10 Nov 2010 11:12:55 +0100 Subject: packaging : add py3k target; update setup.py and other files to make py3k packaging work --- setup.py | 163 +++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 91 insertions(+), 72 deletions(-) (limited to 'setup.py') diff --git a/setup.py b/setup.py index 4a07641..bbf183a 100644 --- a/setup.py +++ b/setup.py @@ -1,75 +1,87 @@ #!/usr/bin/env python +# -*- coding: utf-8 -*- # pylint: disable=W0404,W0622,W0704,W0613 +# copyright 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. +# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr +# +# This file is part of pylint. +# +# pylint is free software: you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation, either version 2.1 of the License, or (at your option) any +# later version. +# +# pylint is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License along +# with pylint. If not, see . """Generic Setup script, takes package info from __pkginfo__.py file. - -:copyright: 2003-2010 LOGILAB S.A. (Paris, FRANCE), all rights reserved. -:contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr -:license: General Public License version 2 - http://www.gnu.org/licenses """ __docformat__ = "restructuredtext en" import os import sys import shutil -from os.path import isdir, exists, join, walk - -# FIXME : setup.py doesn't work with setuptools so we use distutils +from os.path import isdir, exists, join try: if os.environ.get('NO_SETUPTOOLS'): raise ImportError() from setuptools import setup + from setuptools.command import install_lib USE_SETUPTOOLS = 1 except ImportError: from distutils.core import setup + from distutils.command import install_lib USE_SETUPTOOLS = 0 -#assert USE_SETUPTOOLS + sys.modules.pop('__pkginfo__', None) # import required features -from __pkginfo__ import modname, version, license, description, long_desc, \ - web, author, author_email, classifiers +from __pkginfo__ import modname, version, license, description, \ + web, author, author_email # import optional features -try: - from __pkginfo__ import distname -except ImportError: - distname = modname -try: - from __pkginfo__ import scripts -except ImportError: - scripts = [] -try: - from __pkginfo__ import install_requires -except ImportError: - install_requires = None +import __pkginfo__ +distname = getattr(__pkginfo__, 'distname', modname) +scripts = getattr(__pkginfo__, 'scripts', []) +data_files = getattr(__pkginfo__, 'data_files', None) +subpackage_of = getattr(__pkginfo__, 'subpackage_of', None) +include_dirs = getattr(__pkginfo__, 'include_dirs', []) +ext_modules = getattr(__pkginfo__, 'ext_modules', None) +install_requires = getattr(__pkginfo__, 'install_requires', None) +dependency_links = getattr(__pkginfo__, 'dependency_links', []) STD_BLACKLIST = ('CVS', '.svn', '.hg', 'debian', 'dist', 'build') IGNORED_EXTENSIONS = ('.pyc', '.pyo', '.elc', '~') +if exists('README'): + long_description = open('README').read() +else: + long_description = '' def ensure_scripts(linux_scripts): - """ - Creates the proper script names required for each platform + """Creates the proper script names required for each platform (taken from 4Suite) """ from distutils import util if util.get_platform()[:3] == 'win': - scripts_ = linux_scripts + [script + '.bat' - for script in linux_scripts] + scripts_ = [script + '.bat' for script in linux_scripts] else: scripts_ = linux_scripts return scripts_ - def get_packages(directory, prefix): - """return a list of subpackages for the given directory - """ + """return a list of subpackages for the given directory""" result = [] for package in os.listdir(directory): absfile = join(directory, package) if isdir(absfile): - if exists(join(absfile, '__init__.py')): + if exists(join(absfile, '__init__.py')) or \ + package in ('test', 'tests'): if prefix: result.append('%s.%s' % (prefix, package)) else: @@ -77,65 +89,72 @@ def get_packages(directory, prefix): result += get_packages(absfile, result[-1]) return result -def export(from_dir, to_dir, - blacklist=STD_BLACKLIST, - ignore_ext=IGNORED_EXTENSIONS): - """make a mirror of from_dir in to_dir, omitting directories and files - listed in the black list +EMPTY_FILE = '''"""generated file, don't modify or your data will be lost""" +try: + __import__('pkg_resources').declare_namespace(__name__) +except ImportError: + pass +''' + +class MyInstallLib(install_lib.install_lib): + """extend install_lib command to handle package __init__.py and + include_dirs variable if necessary """ - def make_mirror(arg, directory, fnames): - """walk handler""" - for norecurs in blacklist: - try: - fnames.remove(norecurs) - except ValueError: - pass - for filename in fnames: - # don't include binary files - if filename[-4:] in ignore_ext: - continue - if filename[-1] == '~': - continue - src = join(directory, filename) - dest = to_dir + src[len(from_dir):] - print >> sys.stderr, src, '->', dest - if os.path.isdir(src): - if not exists(dest): - os.mkdir(dest) + def run(self): + """overridden from install_lib class""" + install_lib.install_lib.run(self) + # create Products.__init__.py if needed + if subpackage_of: + product_init = join(self.install_dir, subpackage_of, '__init__.py') + if not exists(product_init): + self.announce('creating %s' % product_init) + stream = open(product_init, 'w') + stream.write(EMPTY_FILE) + stream.close() + # manually install included directories if any + if include_dirs: + if subpackage_of: + base = join(subpackage_of, modname) else: - if exists(dest): - os.remove(dest) - shutil.copy2(src, dest) - try: - os.mkdir(to_dir) - except OSError, ex: - # file exists ? - import errno - if ex.errno != errno.EEXIST: - raise - walk(from_dir, make_mirror, None) - + base = modname + for directory in include_dirs: + dest = join(self.install_dir, base, directory) + shutil.rmtree(dest, ignore_errors=True) + shutil.copytree(directory, dest) def install(**kwargs): """setup entry point""" - kwargs['package_dir'] = {modname : '.'} - packages = [modname] + get_packages(os.getcwd(), modname) if USE_SETUPTOOLS: - if install_requires: - kwargs['install_requires'] = install_requires if '--force-manifest' in sys.argv: sys.argv.remove('--force-manifest') + # install-layout option was introduced in 2.5.3-1~exp1 + elif sys.version_info < (2, 5, 4) and '--install-layout=deb' in sys.argv: + sys.argv.remove('--install-layout=deb') + if subpackage_of: + package = subpackage_of + '.' + modname + kwargs['package_dir'] = {package : '.'} + packages = [package] + get_packages(os.getcwd(), package) + if USE_SETUPTOOLS: + kwargs['namespace_packages'] = [subpackage_of] + else: + kwargs['package_dir'] = {modname : '.'} + packages = [modname] + get_packages(os.getcwd(), modname) + if USE_SETUPTOOLS and install_requires: + kwargs['install_requires'] = install_requires + kwargs['dependency_links'] = dependency_links kwargs['packages'] = packages return setup(name = distname, version = version, license = license, description = description, - long_description = long_desc, + long_description = long_description, author = author, author_email = author_email, url = web, - classifiers = classifiers, scripts = ensure_scripts(scripts), + data_files = data_files, + ext_modules = ext_modules, + cmdclass = {'install_lib': MyInstallLib}, **kwargs ) -- cgit v1.2.1