##// END OF EJS Templates
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.

File last commit:

r6315:da2f282d
r6315:da2f282d
Show More
setupbase.py
397 lines | 13.4 KiB | text/x-python | PythonLexer
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 # encoding: utf-8
Brian E Granger
Adding documentation to setup* files.
r1239 """
This module defines the things that are used in setup.py for building IPython
This includes:
* The basic arguments to setup
* Functions for finding things like packages, package data, etc.
* A function for checking dependencies.
"""
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 from __future__ import print_function
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
#-------------------------------------------------------------------------------
# Copyright (C) 2008 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-------------------------------------------------------------------------------
#-------------------------------------------------------------------------------
# Imports
#-------------------------------------------------------------------------------
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315 import io
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 import os
import sys
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
Thomas Kluyver
Make installation with Python 3 possible.
r4750 try:
from configparser import ConfigParser
except:
from ConfigParser import ConfigParser
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 from distutils.command.build_py import build_py
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 from glob import glob
from setupext import install_data_ext
#-------------------------------------------------------------------------------
# Useful globals and utility functions
#-------------------------------------------------------------------------------
# A few handy globals
isfile = os.path.isfile
pjoin = os.path.join
def oscmd(s):
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 print(">", s)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 os.system(s)
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Make installation with Python 3 possible.
r4750 try:
execfile
except NameError:
def execfile(fname, globs, locs=None):
locs = locs or globs
exec(compile(open(fname).read(), fname, "exec"), globs, locs)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
# A little utility we'll need below, since glob() does NOT allow you to do
# exclusion on multiple endings!
def file_doesnt_endwith(test,endings):
"""Return true if test is a file and its name does NOT end with any
of the strings listed in endings."""
if not isfile(test):
return False
for e in endings:
if test.endswith(e):
return False
return True
#---------------------------------------------------------------------------
# Basic project information
#---------------------------------------------------------------------------
Brian Granger
Merging -r 1192 from lp:ipython.
r2146 # release.py contains version, authors, license, url, keywords, etc.
Thomas Kluyver
Make installation with Python 3 possible.
r4750 execfile(pjoin('IPython','core','release.py'), globals())
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
# Create a dict with the basic information
# This dict is eventually passed to setup after additional keys are added.
setup_args = dict(
name = name,
version = version,
description = description,
long_description = long_description,
author = author,
author_email = author_email,
url = url,
download_url = download_url,
license = license,
platforms = platforms,
keywords = keywords,
Thomas Kluyver
Add Trove classifiers for PyPI.
r4771 classifiers = classifiers,
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 cmdclass = {'install_data': install_data_ext},
)
#---------------------------------------------------------------------------
# Find packages
#---------------------------------------------------------------------------
def find_packages():
Brian E Granger
Adding documentation to setup* files.
r1239 """
Find all of IPython's packages.
"""
MinRK
Generate package list automatically in find_packages...
r4466 excludes = ['deathrow']
packages = []
for dir,subdirs,files in os.walk('IPython'):
package = dir.replace(os.path.sep, '.')
if any([ package.startswith('IPython.'+exc) for exc in excludes ]):
# package is to be excluded (e.g. deathrow)
continue
if '__init__.py' not in files:
# not a package
continue
packages.append(package)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 return packages
#---------------------------------------------------------------------------
# Find package data
#---------------------------------------------------------------------------
def find_package_data():
Brian E Granger
Adding documentation to setup* files.
r1239 """
Find IPython's package_data.
"""
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 # This is not enough for these things to appear in an sdist.
# We need to muck with the MANIFEST to get this to work
MinRK
exclude mathjax from notebook package_data...
r5625
# exclude static things that we don't ship (e.g. mathjax)
excludes = ['mathjax']
# add 'static/' prefix to exclusions, and tuplify for use in startswith
excludes = tuple([os.path.join('static', ex) for ex in excludes])
MinRK
include html frontend in packages/package_data...
r4322 # walk notebook resources:
cwd = os.getcwd()
os.chdir(os.path.join('IPython', 'frontend', 'html', 'notebook'))
static_walk = list(os.walk('static'))
os.chdir(cwd)
static_data = []
for parent, dirs, files in static_walk:
MinRK
exclude mathjax from notebook package_data...
r5625 if parent.startswith(excludes):
continue
MinRK
include html frontend in packages/package_data...
r4322 for f in files:
static_data.append(os.path.join(parent, f))
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
package_data was missing the .txt files in the testing directories. This was causing ...
r1317 package_data = {
MinRK
add README to startup dir
r5247 'IPython.config.profile' : ['README*', '*/*.py'],
MinRK
reorganize default config files to match profiles as directories...
r3954 'IPython.testing' : ['*.txt'],
Fernando Perez
Add SVG qt console icon to package data.
r5160 'IPython.frontend.html.notebook' : ['templates/*'] + static_data,
'IPython.frontend.qt.console' : ['resources/icon/*.svg'],
Brian E Granger
package_data was missing the .txt files in the testing directories. This was causing ...
r1317 }
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 return package_data
#---------------------------------------------------------------------------
# Find data files
#---------------------------------------------------------------------------
Fernando Perez
Fixes to build/setup machinery....
r1525 def make_dir_struct(tag,base,out_base):
"""Make the directory structure of all files below a starting dir.
This is just a convenience routine to help build a nested directory
hierarchy because distutils is too stupid to do this by itself.
XXX - this needs a proper docstring!
"""
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 # we'll use these a lot below
lbase = len(base)
pathsep = os.path.sep
lpathsep = len(pathsep)
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 out = []
for (dirpath,dirnames,filenames) in os.walk(base):
# we need to strip out the dirpath from the base to map it to the
# output (installation) path. This requires possibly stripping the
# path separator, because otherwise pjoin will not work correctly
# (pjoin('foo/','/bar') returns '/bar').
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 dp_eff = dirpath[lbase:]
if dp_eff.startswith(pathsep):
dp_eff = dp_eff[lpathsep:]
Bernardo B. Marques
remove all trailling spaces
r4872 # The output path must be anchored at the out_base marker
Fernando Perez
Fixes to build/setup machinery....
r1525 out_path = pjoin(out_base,dp_eff)
# Now we can generate the final filenames. Since os.walk only produces
# filenames, we must join back with the dirpath to get full valid file
# paths:
pfiles = [pjoin(dirpath,f) for f in filenames]
Fernando Perez
Fix bug in our specification of data_files....
r3205 # Finally, generate the entry we need, which is a pari of (output
Fernando Perez
Fixes to build/setup machinery....
r1525 # path, files) for use as a data_files parameter in install_data.
Fernando Perez
Fix bug in our specification of data_files....
r3205 out.append((out_path, pfiles))
Fernando Perez
Fixes to build/setup machinery....
r1525
return out
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 def find_data_files():
Brian E Granger
Adding documentation to setup* files.
r1239 """
Find IPython's data_files.
Fernando Perez
Fixes to build/setup machinery....
r1525
Most of these are docs.
Brian E Granger
Adding documentation to setup* files.
r1239 """
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Fixing installation related issues.
r2058 docdirbase = pjoin('share', 'doc', 'ipython')
manpagebase = pjoin('share', 'man', 'man1')
Bernardo B. Marques
remove all trailling spaces
r4872
Fernando Perez
Fixes to build/setup machinery....
r1525 # Simple file lists can be made by hand
Brian Granger
Fixing installation related issues.
r2058 manpages = filter(isfile, glob(pjoin('docs','man','*.1.gz')))
Fernando Perez
Fix installation of manpages.
r4420 if not manpages:
# When running from a source tree, the manpages aren't gzipped
manpages = filter(isfile, glob(pjoin('docs','man','*.1')))
Fernando Perez
Fix bug in our specification of data_files....
r3205 igridhelpfiles = filter(isfile,
glob(pjoin('IPython','extensions','igrid_help.*')))
Fernando Perez
Fixes to build/setup machinery....
r1525
# For nested structures, use the utility above
Brian Granger
Fixing installation related issues.
r2058 example_files = make_dir_struct(
'data',
pjoin('docs','examples'),
pjoin(docdirbase,'examples')
)
manual_files = make_dir_struct(
'data',
Fernando Perez
Disable PDF manual building for distribution and installation....
r4453 pjoin('docs','html'),
Brian Granger
Fixing installation related issues.
r2058 pjoin(docdirbase,'manual')
)
Fernando Perez
Fixes to build/setup machinery....
r1525
# And assemble the entire output list
Fernando Perez
Fix bug in our specification of data_files....
r3205 data_files = [ (manpagebase, manpages),
(pjoin(docdirbase, 'extensions'), igridhelpfiles),
Fernando Perez
Fixes to build/setup machinery....
r1525 ] + manual_files + example_files
Brian Granger
Lots of work on the display system, focused on pylab stuff....
r3280
Fernando Perez
Fixes to build system.
r1522 return data_files
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237
Fernando Perez
Update setup and support tools to include new man pages.
r2100
def make_man_update_target(manpage):
"""Return a target_update-compliant tuple for the given manpage.
Parameters
----------
manpage : string
Name of the manpage, must include the section number (trailing number).
Example
-------
>>> make_man_update_target('ipython.1') #doctest: +NORMALIZE_WHITESPACE
('docs/man/ipython.1.gz',
['docs/man/ipython.1'],
'cd docs/man && gzip -9c ipython.1 > ipython.1.gz')
"""
man_dir = pjoin('docs', 'man')
manpage_gz = manpage + '.gz'
manpath = pjoin(man_dir, manpage)
manpath_gz = pjoin(man_dir, manpage_gz)
gz_cmd = ( "cd %(man_dir)s && gzip -9c %(manpage)s > %(manpage_gz)s" %
locals() )
return (manpath_gz, [manpath], gz_cmd)
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Make single setup script work on Python 2 and Python 3.
r5828 # The two functions below are copied from IPython.utils.path, so we don't need
# to import IPython during setup, which fails on Python 3.
def target_outdated(target,deps):
"""Determine whether a target is out of date.
target_outdated(target,deps) -> 1/0
deps: list of filenames which MUST exist.
target: single filename which may or may not exist.
If target doesn't exist or is older than any file listed in deps, return
true, otherwise return false.
"""
try:
target_time = os.path.getmtime(target)
except os.error:
return 1
for dep in deps:
dep_time = os.path.getmtime(dep)
if dep_time > target_time:
#print "For target",target,"Dep failed:",dep # dbg
#print "times (dep,tar):",dep_time,target_time # dbg
return 1
return 0
def target_update(target,deps,cmd):
"""Update a target with a given command given a list of dependencies.
target_update(target,deps,cmd) -> runs cmd if target is outdated.
This is just a wrapper around target_outdated() which calls the given
command if target is outdated."""
if target_outdated(target,deps):
system(cmd)
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 #---------------------------------------------------------------------------
# Find scripts
#---------------------------------------------------------------------------
Thomas Kluyver
Allow 'python setup.py install' to work correctly for either Python 2 or 3.
r4765 def find_scripts(entry_points=False, suffix=''):
MinRK
prevent duplicate script installs in setuptools...
r3681 """Find IPython's scripts.
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
prevent duplicate script installs in setuptools...
r3681 if entry_points is True:
return setuptools entry_point-style definitions
else:
return file paths of plain scripts [default]
Bernardo B. Marques
remove all trailling spaces
r4872
Thomas Kluyver
Allow 'python setup.py install' to work correctly for either Python 2 or 3.
r4765 suffix is appended to script names if entry_points is True, so that the
Python 3 scripts get named "ipython3" etc.
Brian E Granger
Adding documentation to setup* files.
r1239 """
MinRK
prevent duplicate script installs in setuptools...
r3681 if entry_points:
Thomas Kluyver
Allow 'python setup.py install' to work correctly for either Python 2 or 3.
r4765 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',
]]
epatters
Clean up entry point definition is setup.py.
r3839 scripts = dict(console_scripts=console_scripts, gui_scripts=gui_scripts)
MinRK
prevent duplicate script installs in setuptools...
r3681 else:
parallel_scripts = pjoin('IPython','parallel','scripts')
main_scripts = pjoin('IPython','scripts')
scripts = [
pjoin(parallel_scripts, 'ipengine'),
pjoin(parallel_scripts, 'ipcontroller'),
pjoin(parallel_scripts, 'ipcluster'),
pjoin(parallel_scripts, 'iplogger'),
pjoin(main_scripts, 'ipython'),
pjoin(main_scripts, 'pycolor'),
pjoin(main_scripts, 'irunner'),
pjoin(main_scripts, 'iptest')
Evan Patterson
Make ipython-qtconsole a GUI script in setuptools.
r3838 ]
return scripts
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 #---------------------------------------------------------------------------
Fernando Perez
Fixes to build/setup machinery....
r1525 # Verify all dependencies
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 #---------------------------------------------------------------------------
def check_for_dependencies():
Brian E Granger
Adding documentation to setup* files.
r1239 """Check for IPython's dependencies.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
Adding documentation to setup* files.
r1239 This function should NOT be called if running under setuptools!
"""
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 from setupext.setupext import (
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 print_line, print_raw, print_status,
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 check_for_sphinx, check_for_pygments,
MinRK
add scripts for non-setuptools install of zmq.parallel
r3634 check_for_nose, check_for_pexpect,
MinRK
make readline a dependency on OSX and pyreadline on Windows...
r3699 check_for_pyzmq, check_for_readline
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 )
print_line()
print_raw("BUILDING IPYTHON")
print_status('python', sys.version)
print_status('platform', sys.platform)
if sys.platform == 'win32':
print_status('Windows version', sys.getwindowsversion())
Bernardo B. Marques
remove all trailling spaces
r4872
Brian E Granger
Initial work towards refactoring the setup.py scripts to accept the new ipython1 packages...
r1237 print_raw("")
print_raw("OPTIONAL DEPENDENCIES")
check_for_sphinx()
check_for_pygments()
check_for_nose()
gvaroquaux
Add the subpackage to the setupbase.py
r1486 check_for_pexpect()
MinRK
add scripts for non-setuptools install of zmq.parallel
r3634 check_for_pyzmq()
MinRK
make readline a dependency on OSX and pyreadline on Windows...
r3699 check_for_readline()
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198
def record_commit_info(pkg_dir, build_cmd=build_py):
""" Return extended build command class for recording commit
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315
records git commit in IPython.utils._sysinfo.commit
for use in IPython.utils.sysinfo.sys_info() calls after installation.
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 """
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 class MyBuildPy(build_cmd):
''' Subclass to write commit data into installation tree '''
def run(self):
Thomas Kluyver
Fix IPython.utils.sysinfo for Python 3.
r4900 build_cmd.run(self)
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 import subprocess
proc = subprocess.Popen('git rev-parse --short HEAD',
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
shell=True)
repo_commit, _ = proc.communicate()
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315 repo_commit = repo_commit.strip()
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 # We write the installation commit even if it's empty
MinRK
store git commit hash in utils._sysinfo instead of hidden git_commit_info.ini data file.
r6315 out_pth = pjoin(self.build_lib, pkg_dir, 'utils', '_sysinfo.py')
with io.open(out_pth, 'w') as out_file:
for line in [
u"# GENERATED BY setup.py",
u"commit = '%s'" % repo_commit,
]:
out_file.write(line + u'\n')
Fernando Perez
Add utility to record commit information in archives/tarballs....
r3198 return MyBuildPy