diff --git a/setup.py b/setup.py old mode 100755 new mode 100644 index beb7c1012..7b10df33d --- a/setup.py +++ b/setup.py @@ -1,270 +1,10 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -"""Setup script for IPython. - -Under Posix environments it works like a typical setup.py script. -Under Windows, the command sdist is not supported, since IPython -requires utilities which are not available under Windows.""" - -#----------------------------------------------------------------------------- -# Copyright (c) 2008-2011, IPython Development Team. -# Copyright (c) 2001-2007, Fernando Perez -# Copyright (c) 2001, Janko Hauser -# Copyright (c) 2001, Nathaniel Gray -# -# Distributed under the terms of the Modified BSD License. -# -# The full license is in the file COPYING.txt, distributed with this software. -#----------------------------------------------------------------------------- - -#----------------------------------------------------------------------------- -# Minimal Python version sanity check -#----------------------------------------------------------------------------- +"""This calls the setup routine for Python 2 or 3 as required.""" import sys -# This check is also made in IPython/__init__, don't forget to update both when -# changing Python version requirements. -if sys.version[0:3] < '2.6': - error = """\ -ERROR: 'IPython requires Python Version 2.6 or above.' -Exiting.""" - print >> sys.stderr, error - sys.exit(1) - -# At least we're on the python version we need, move on. - -#------------------------------------------------------------------------------- -# Imports -#------------------------------------------------------------------------------- - -# Stdlib imports -import os -import shutil - -from glob import glob - -# BEFORE importing distutils, remove MANIFEST. distutils doesn't properly -# update it when the contents of directories change. -if os.path.exists('MANIFEST'): os.remove('MANIFEST') - -from distutils.core import setup - -# Our own imports -from IPython.utils.path import target_update - -from setupbase import ( - setup_args, - find_packages, - find_package_data, - find_scripts, - find_data_files, - check_for_dependencies, - record_commit_info, -) -from setupext import setupext - -isfile = os.path.isfile -pjoin = os.path.join - -#----------------------------------------------------------------------------- -# Function definitions -#----------------------------------------------------------------------------- - -def cleanup(): - """Clean up the junk left around by the build process""" - if "develop" not in sys.argv: - try: - shutil.rmtree('ipython.egg-info') - except: - try: - os.unlink('ipython.egg-info') - except: - pass - -#------------------------------------------------------------------------------- -# Handle OS specific things -#------------------------------------------------------------------------------- - -if os.name == 'posix': - os_name = 'posix' -elif os.name in ['nt','dos']: - os_name = 'windows' +if sys.version_info[0] >= 3: + from setup3 import main else: - print 'Unsupported operating system:',os.name - sys.exit(1) + from setup2 import main -# Under Windows, 'sdist' has not been supported. Now that the docs build with -# Sphinx it might work, but let's not turn it on until someone confirms that it -# actually works. -if os_name == 'windows' and 'sdist' in sys.argv: - print 'The sdist command is not available under Windows. Exiting.' - sys.exit(1) - -#------------------------------------------------------------------------------- -# Things related to the IPython documentation -#------------------------------------------------------------------------------- - -# update the manuals when building a source dist -if len(sys.argv) >= 2 and sys.argv[1] in ('sdist','bdist_rpm'): - import textwrap - - # List of things to be updated. Each entry is a triplet of args for - # target_update() - to_update = [ - # FIXME - Disabled for now: we need to redo an automatic way - # of generating the magic info inside the rst. - #('docs/magic.tex', - #['IPython/Magic.py'], - #"cd doc && ./update_magic.sh" ), - - ('docs/man/ipcluster.1.gz', - ['docs/man/ipcluster.1'], - 'cd docs/man && gzip -9c ipcluster.1 > ipcluster.1.gz'), - - ('docs/man/ipcontroller.1.gz', - ['docs/man/ipcontroller.1'], - 'cd docs/man && gzip -9c ipcontroller.1 > ipcontroller.1.gz'), - - ('docs/man/ipengine.1.gz', - ['docs/man/ipengine.1'], - 'cd docs/man && gzip -9c ipengine.1 > ipengine.1.gz'), - - ('docs/man/iplogger.1.gz', - ['docs/man/iplogger.1'], - 'cd docs/man && gzip -9c iplogger.1 > iplogger.1.gz'), - - ('docs/man/ipython.1.gz', - ['docs/man/ipython.1'], - 'cd docs/man && gzip -9c ipython.1 > ipython.1.gz'), - - ('docs/man/irunner.1.gz', - ['docs/man/irunner.1'], - 'cd docs/man && gzip -9c irunner.1 > irunner.1.gz'), - - ('docs/man/pycolor.1.gz', - ['docs/man/pycolor.1'], - 'cd docs/man && gzip -9c pycolor.1 > pycolor.1.gz'), - ] - - # Only build the docs if sphinx is present - try: - import sphinx - except ImportError: - pass - else: - # The Makefile calls the do_sphinx scripts to build html and pdf, so - # just one target is enough to cover all manual generation - - # First, compute all the dependencies that can force us to rebuild the - # docs. Start with the main release file that contains metadata - docdeps = ['IPython/core/release.py'] - # Inculde all the reST sources - pjoin = os.path.join - for dirpath,dirnames,filenames in os.walk('docs/source'): - if dirpath in ['_static','_templates']: - continue - docdeps += [ pjoin(dirpath,f) for f in filenames - if f.endswith('.txt') ] - # and the examples - for dirpath,dirnames,filenames in os.walk('docs/example'): - docdeps += [ pjoin(dirpath,f) for f in filenames - if not f.endswith('~') ] - # then, make them all dependencies for the main html docs - to_update.append( - ('docs/dist/index.html', - docdeps, - "cd docs && make dist") - ) - - [ target_update(*t) for t in to_update ] - -#--------------------------------------------------------------------------- -# Find all the packages, package data, and data_files -#--------------------------------------------------------------------------- - -packages = find_packages() -package_data = find_package_data() -data_files = find_data_files() - -#--------------------------------------------------------------------------- -# Handle scripts, dependencies, and setuptools specific things -#--------------------------------------------------------------------------- - -# For some commands, use setuptools. Note that we do NOT list install here! -# If you want a setuptools-enhanced install, just run 'setupegg.py install' -needs_setuptools = set(('develop', 'sdist', 'release', 'bdist_egg', 'bdist_rpm', - 'bdist', 'bdist_dumb', 'bdist_wininst', 'install_egg_info', - 'build_sphinx', 'egg_info', 'easy_install', 'upload', - )) -if sys.platform == 'win32': - # Depend on setuptools for install on *Windows only* - # If we get script-installation working without setuptools, - # then we can back off, but until then use it. - # See Issue #369 on GitHub for more - needs_setuptools.add('install') - -if len(needs_setuptools.intersection(sys.argv)) > 0: - import setuptools - -# This dict is used for passing extra arguments that are setuptools -# specific to setup -setuptools_extra_args = {} - -if 'setuptools' in sys.modules: - setuptools_extra_args['zip_safe'] = False - setuptools_extra_args['entry_points'] = find_scripts(True) - setup_args['extras_require'] = dict( - parallel = 'pyzmq>=2.1.4', - zmq = 'pyzmq>=2.1.4', - doc = 'Sphinx>=0.3', - test = 'nose>=0.10.1', - notebook = 'tornado>=2.0' - ) - requires = setup_args.setdefault('install_requires', []) - setupext.display_status = False - if not setupext.check_for_readline(): - if sys.platform == 'darwin': - requires.append('readline') - elif sys.platform.startswith('win') and sys.maxsize < 2**32: - # only require pyreadline on 32b Windows, due to 64b bug in pyreadline: - # https://bugs.launchpad.net/pyreadline/+bug/787574 - requires.append('pyreadline') - else: - pass - # do we want to install readline here? - - # Script to be run by the windows binary installer after the default setup - # routine, to add shortcuts and similar windows-only things. Windows - # post-install scripts MUST reside in the scripts/ dir, otherwise distutils - # doesn't find them. - if 'bdist_wininst' in sys.argv: - if len(sys.argv) > 2 and \ - ('sdist' in sys.argv or 'bdist_rpm' in sys.argv): - print >> sys.stderr, "ERROR: bdist_wininst must be run alone. Exiting." - sys.exit(1) - setup_args['scripts'] = [pjoin('scripts','ipython_win_post_install.py')] - setup_args['options'] = {"bdist_wininst": - {"install_script": - "ipython_win_post_install.py"}} -else: - # If we are running without setuptools, call this function which will - # check for dependencies an inform the user what is needed. This is - # just to make life easy for users. - check_for_dependencies() - setup_args['scripts'] = find_scripts(False) - -#--------------------------------------------------------------------------- -# Do the actual setup now -#--------------------------------------------------------------------------- - -setup_args['cmdclass'] = {'build_py': record_commit_info('IPython')} -setup_args['packages'] = packages -setup_args['package_data'] = package_data -setup_args['data_files'] = data_files -setup_args.update(setuptools_extra_args) - - -if __name__ == '__main__': - setup(**setup_args) - cleanup() +main() diff --git a/setupbase.py b/setupbase.py index 3def278e5..f9e6e08fc 100644 --- a/setupbase.py +++ b/setupbase.py @@ -23,7 +23,10 @@ from __future__ import print_function import os import sys -from ConfigParser import ConfigParser +try: + from configparser import ConfigParser +except: + from ConfigParser import ConfigParser from distutils.command.build_py import build_py from glob import glob @@ -40,6 +43,13 @@ pjoin = os.path.join def oscmd(s): print(">", s) os.system(s) + +try: + execfile +except NameError: + def execfile(fname, globs, locs=None): + locs = locs or globs + exec(compile(open(fname).read(), fname, "exec"), globs, locs) # A little utility we'll need below, since glob() does NOT allow you to do # exclusion on multiple endings! @@ -58,7 +68,7 @@ def file_doesnt_endwith(test,endings): #--------------------------------------------------------------------------- # release.py contains version, authors, license, url, keywords, etc. -execfile(pjoin('IPython','core','release.py')) +execfile(pjoin('IPython','core','release.py'), globals()) # Create a dict with the basic information # This dict is eventually passed to setup after additional keys are added. @@ -74,6 +84,7 @@ setup_args = dict( license = license, platforms = platforms, keywords = keywords, + classifiers = classifiers, cmdclass = {'install_data': install_data_ext}, ) @@ -235,28 +246,31 @@ def make_man_update_target(manpage): # Find scripts #--------------------------------------------------------------------------- -def find_scripts(entry_points=False): +def find_scripts(entry_points=False, suffix=''): """Find IPython's scripts. if entry_points is True: return setuptools entry_point-style definitions else: return file paths of plain scripts [default] + + suffix is appended to script names if entry_points is True, so that the + Python 3 scripts get named "ipython3" etc. """ if entry_points: - console_scripts = [ - 'ipython = IPython.frontend.terminal.ipapp:launch_new_instance', - 'pycolor = IPython.utils.PyColorize:main', - 'ipcontroller = IPython.parallel.apps.ipcontrollerapp:launch_new_instance', - 'ipengine = IPython.parallel.apps.ipengineapp:launch_new_instance', - 'iplogger = IPython.parallel.apps.iploggerapp:launch_new_instance', - 'ipcluster = IPython.parallel.apps.ipclusterapp:launch_new_instance', - 'iptest = IPython.testing.iptest:main', - 'irunner = IPython.lib.irunner:main' - ] - gui_scripts = [ - 'ipython-qtconsole = IPython.frontend.qt.console.qtconsoleapp:main', - ] + console_scripts = [s % suffix for s in [ + 'ipython%s = IPython.frontend.terminal.ipapp:launch_new_instance', + 'pycolor%s = IPython.utils.PyColorize:main', + 'ipcontroller%s = IPython.parallel.apps.ipcontrollerapp:launch_new_instance', + 'ipengine%s = IPython.parallel.apps.ipengineapp:launch_new_instance', + 'iplogger%s = IPython.parallel.apps.iploggerapp:launch_new_instance', + 'ipcluster%s = IPython.parallel.apps.ipclusterapp:launch_new_instance', + 'iptest%s = IPython.testing.iptest:main', + 'irunner%s = IPython.lib.irunner:main' + ]] + gui_scripts = [s % suffix for s in [ + 'ipython%s-qtconsole = IPython.frontend.qt.console.qtconsoleapp:main', + ]] scripts = dict(console_scripts=console_scripts, gui_scripts=gui_scripts) else: parallel_scripts = pjoin('IPython','parallel','scripts')