1
1
#! /usr/bin/env python
3
# This is an installation script for bzr. Run it with
4
# './setup.py install', or
5
# './setup.py --help' for more options
3
"""Installation script for bzr.
5
'./setup.py install', or
6
'./setup.py --help' for more options
15
# META INFORMATION FOR SETUP
17
META_INFO = {'name': 'bzr',
18
'version': bzrlib.__version__,
19
'author': 'Canonical Ltd',
20
'author_email': 'bazaar@lists.canonical.com',
21
'url': 'http://www.bazaar-vcs.org/',
22
'description': 'Friendly distributed version control system',
23
'license': 'GNU GPL v2',
26
# The list of packages is automatically generated later. Add other things
27
# that are part of BZRLIB here.
30
PKG_DATA = {# install files from selftest suite
31
'package_data': {'bzrlib': ['doc/api/*.txt',
32
'tests/test_patches_data/*',
36
######################################################################
37
# Reinvocation stolen from bzr, we need python2.4 by virtue of bzr_man
38
# including bzrlib.help
41
version_info = sys.version_info
42
except AttributeError:
43
version_info = 1, 5 # 1.5 or older
45
REINVOKE = "__BZR_REINVOKE"
47
KNOWN_PYTHONS = ('python2.4',)
49
if version_info < NEED_VERS:
50
if not os.environ.has_key(REINVOKE):
51
# mutating os.environ doesn't work in old Pythons
52
os.putenv(REINVOKE, "1")
53
for python in KNOWN_PYTHONS:
55
os.execvp(python, [python] + sys.argv)
58
print >>sys.stderr, "bzr: error: cannot find a suitable python interpreter"
59
print >>sys.stderr, " (need %d.%d or later)" % NEED_VERS
61
if getattr(os, "unsetenv", None) is not None:
65
def get_bzrlib_packages():
66
"""Recurse through the bzrlib directory, and extract the package names"""
69
base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
70
for root, dirs, files in os.walk(base_path):
71
if '__init__.py' in files:
72
assert root.startswith(base_path)
73
# Get just the path below bzrlib
74
package_path = root[len(base_path):]
75
# Remove leading and trailing slashes
76
package_path = package_path.strip('\\/')
78
package_name = 'bzrlib'
80
package_name = ('bzrlib.' +
81
package_path.replace('/', '.').replace('\\', '.'))
82
packages.append(package_name)
83
return sorted(packages)
86
BZRLIB['packages'] = get_bzrlib_packages()
7
89
from distutils.core import setup
12
author_email='mbp@sourcefrog.net',
13
url='http://www.bazaar-ng.org/',
14
description='Friendly distributed version control system',
90
from distutils.command.install_scripts import install_scripts
91
from distutils.command.build import build
93
###############################
94
# Overridden distutils actions
95
###############################
97
class my_install_scripts(install_scripts):
98
""" Customized install_scripts distutils action.
99
Create bzr.bat for win32.
102
install_scripts.run(self) # standard action
104
if sys.platform == "win32":
106
scripts_dir = self.install_dir
107
script_path = self._quoted_path(os.path.join(scripts_dir,
109
python_exe = self._quoted_path(sys.executable)
110
args = self._win_batch_args()
111
batch_str = "@%s %s %s" % (python_exe, script_path, args)
112
batch_path = script_path + ".bat"
113
f = file(batch_path, "w")
116
print "Created:", batch_path
118
print "ERROR: Unable to create %s: %s" % (batch_path, e)
120
def _quoted_path(self, path):
122
return '"' + path + '"'
126
def _win_batch_args(self):
127
from bzrlib.win32utils import winver
128
if winver == 'Windows NT':
131
return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
132
#/class my_install_scripts
135
class bzr_build(build):
136
"""Customized build distutils action.
143
generate_docs.main(argv=["bzr", "man"])
146
########################
148
########################
150
command_classes = {'install_scripts': my_install_scripts,
152
from distutils.extension import Extension
155
from Pyrex.Distutils import build_ext
158
# try to build the extension from the prior generated source.
160
print ("The python package 'Pyrex' is not available."
161
" If the .c files are available,")
162
print ("they will be built,"
163
" but modifying the .pyx files will not rebuild them.")
165
from distutils.command.build_ext import build_ext
168
# Override the build_ext if we have Pyrex available
169
command_classes['build_ext'] = build_ext
170
unavailable_files = []
173
def add_pyrex_extension(module_name, **kwargs):
174
"""Add a pyrex module to build.
176
This will use Pyrex to auto-generate the .c file if it is available.
177
Otherwise it will fall back on the .c file. If the .c file is not
178
available, it will warn, and not add anything.
180
You can pass any extra options to Extension through kwargs. One example is
183
:param module_name: The python path to the module. This will be used to
184
determine the .pyx and .c files to use.
186
path = module_name.replace('.', '/')
187
pyrex_name = path + '.pyx'
190
ext_modules.append(Extension(module_name, [pyrex_name]))
192
if not os.path.isfile(c_name):
193
unavailable_files.append(c_name)
195
ext_modules.append(Extension(module_name, [c_name]))
198
add_pyrex_extension('bzrlib._knit_load_data_c')
201
if unavailable_files:
202
print 'C extension(s) not found:'
203
print ' %s' % ('\n '.join(unavailable_files),)
204
print 'The python versions will be used instead.'
208
if 'bdist_wininst' in sys.argv:
211
docs = glob.glob('doc/*.htm') + ['doc/default.css']
212
dev_docs = glob.glob('doc/developers/*.htm')
213
# python's distutils-based win32 installer
214
ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
215
'ext_modules': ext_modules,
217
'data_files': [('Doc/Bazaar', docs),
218
('Doc/Bazaar/developers', dev_docs),
220
# for building pyrex extensions
221
'cmdclass': {'build_ext': build_ext},
224
ARGS.update(META_INFO)
226
ARGS.update(PKG_DATA)
230
elif 'py2exe' in sys.argv:
234
# pick real bzr version
238
for i in bzrlib.version_info[:4]:
243
version_number.append(str(i))
244
version_str = '.'.join(version_number)
246
target = py2exe.build_exe.Target(script = "bzr",
248
icon_resources = [(0,'bzr.ico')],
249
name = META_INFO['name'],
250
version = version_str,
251
description = META_INFO['description'],
252
author = META_INFO['author'],
253
copyright = "(c) Canonical Ltd, 2005-2007",
254
company_name = "Canonical Ltd.",
255
comments = META_INFO['description'],
258
additional_packages = []
259
if sys.version.startswith('2.4'):
260
# adding elementtree package
261
additional_packages.append('elementtree')
262
elif sys.version.startswith('2.5'):
263
additional_packages.append('xml.etree')
266
warnings.warn('Unknown Python version.\n'
267
'Please check setup.py script for compatibility.')
268
# email package from std python library use lazy import,
269
# so we need to explicitly add all package
270
additional_packages.append('email')
272
options_list = {"py2exe": {"packages": BZRLIB['packages'] +
274
"excludes": ["Tkinter", "medusa", "tools"],
275
"dist_dir": "win32_bzr.exe",
278
setup(options=options_list,
280
'tools/win32/bzr_postinstall.py',
282
zipfile='lib/library.zip')
286
ARGS = {'scripts': ['bzr'],
287
'data_files': [('man/man1', ['bzr.1'])],
288
'cmdclass': command_classes,
289
'ext_modules': ext_modules,
292
ARGS.update(META_INFO)
294
ARGS.update(PKG_DATA)