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
13
if sys.version_info < (2, 4):
14
sys.stderr.write("[ERROR] Not a supported Python version. Need 2.4+\n")
17
# NOTE: The directory containing setup.py, whether run by 'python setup.py' or
18
# './setup.py' or the equivalent with another path, should always be at the
19
# start of the path, so this should find the right one...
22
def get_long_description():
23
dirname = os.path.dirname(__file__)
24
readme = os.path.join(dirname, 'README')
25
f = open(readme, 'rb')
33
# META INFORMATION FOR SETUP
34
# see http://docs.python.org/dist/meta-data.html
37
'version': bzrlib.__version__,
38
'author': 'Canonical Ltd',
39
'author_email': 'bazaar@lists.canonical.com',
40
'url': 'http://www.bazaar-vcs.org/',
41
'description': 'Friendly distributed version control system',
42
'license': 'GNU GPL v2',
43
'download_url': 'http://bazaar-vcs.org/Download',
44
'long_description': get_long_description(),
46
'Development Status :: 6 - Mature',
47
'Environment :: Console',
48
'Intended Audience :: Developers',
49
'Intended Audience :: System Administrators',
50
'License :: OSI Approved :: GNU General Public License (GPL)',
51
'Operating System :: Microsoft :: Windows',
52
'Operating System :: OS Independent',
53
'Operating System :: POSIX',
54
'Programming Language :: Python',
55
'Programming Language :: C',
56
'Topic :: Software Development :: Version Control',
60
# The list of packages is automatically generated later. Add other things
61
# that are part of BZRLIB here.
64
PKG_DATA = {# install files from selftest suite
65
'package_data': {'bzrlib': ['doc/api/*.txt',
66
'tests/test_patches_data/*',
67
'help_topics/en/*.txt',
72
def get_bzrlib_packages():
73
"""Recurse through the bzrlib directory, and extract the package names"""
76
base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
77
for root, dirs, files in os.walk(base_path):
78
if '__init__.py' in files:
79
assert root.startswith(base_path)
80
# Get just the path below bzrlib
81
package_path = root[len(base_path):]
82
# Remove leading and trailing slashes
83
package_path = package_path.strip('\\/')
85
package_name = 'bzrlib'
87
package_name = ('bzrlib.' +
88
package_path.replace('/', '.').replace('\\', '.'))
89
packages.append(package_name)
90
return sorted(packages)
93
BZRLIB['packages'] = get_bzrlib_packages()
7
96
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',
97
from distutils.command.install_scripts import install_scripts
98
from distutils.command.build import build
100
###############################
101
# Overridden distutils actions
102
###############################
104
class my_install_scripts(install_scripts):
105
""" Customized install_scripts distutils action.
106
Create bzr.bat for win32.
109
install_scripts.run(self) # standard action
111
if sys.platform == "win32":
113
scripts_dir = os.path.join(sys.prefix, 'Scripts')
114
script_path = self._quoted_path(os.path.join(scripts_dir,
116
python_exe = self._quoted_path(sys.executable)
117
args = self._win_batch_args()
118
batch_str = "@%s %s %s" % (python_exe, script_path, args)
119
batch_path = os.path.join(self.install_dir, "bzr.bat")
120
f = file(batch_path, "w")
123
print "Created:", batch_path
125
print "ERROR: Unable to create %s: %s" % (batch_path, e)
127
def _quoted_path(self, path):
129
return '"' + path + '"'
133
def _win_batch_args(self):
134
from bzrlib.win32utils import winver
135
if winver == 'Windows NT':
138
return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
139
#/class my_install_scripts
142
class bzr_build(build):
143
"""Customized build distutils action.
150
generate_docs.main(argv=["bzr", "man"])
153
########################
155
########################
157
command_classes = {'install_scripts': my_install_scripts,
159
from distutils import log
160
from distutils.errors import CCompilerError, DistutilsPlatformError
161
from distutils.extension import Extension
164
from Pyrex.Distutils import build_ext
167
# try to build the extension from the prior generated source.
169
print ("The python package 'Pyrex' is not available."
170
" If the .c files are available,")
171
print ("they will be built,"
172
" but modifying the .pyx files will not rebuild them.")
174
from distutils.command.build_ext import build_ext
179
class build_ext_if_possible(build_ext):
184
except DistutilsPlatformError, e:
186
log.warn('Extensions cannot be built, '
187
'will use the Python versions instead')
189
def build_extension(self, ext):
191
build_ext.build_extension(self, ext)
192
except CCompilerError:
193
log.warn('Building of "%s" extension failed, '
194
'will use the Python version instead' % (ext.name,))
197
# Override the build_ext if we have Pyrex available
198
command_classes['build_ext'] = build_ext_if_possible
199
unavailable_files = []
202
def add_pyrex_extension(module_name, **kwargs):
203
"""Add a pyrex module to build.
205
This will use Pyrex to auto-generate the .c file if it is available.
206
Otherwise it will fall back on the .c file. If the .c file is not
207
available, it will warn, and not add anything.
209
You can pass any extra options to Extension through kwargs. One example is
212
:param module_name: The python path to the module. This will be used to
213
determine the .pyx and .c files to use.
215
path = module_name.replace('.', '/')
216
pyrex_name = path + '.pyx'
219
ext_modules.append(Extension(module_name, [pyrex_name], **kwargs))
221
if not os.path.isfile(c_name):
222
unavailable_files.append(c_name)
224
ext_modules.append(Extension(module_name, [c_name], **kwargs))
227
add_pyrex_extension('bzrlib._dirstate_helpers_c')
228
add_pyrex_extension('bzrlib._knit_load_data_c')
229
if sys.platform == 'win32':
230
# pyrex uses the macro WIN32 to detect the platform, even though it should
231
# be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
233
add_pyrex_extension('bzrlib._walkdirs_win32',
234
define_macros=[('WIN32', None)])
235
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
238
if unavailable_files:
239
print 'C extension(s) not found:'
240
print ' %s' % ('\n '.join(unavailable_files),)
241
print 'The python versions will be used instead.'
245
if 'bdist_wininst' in sys.argv:
248
for root, dirs, files in os.walk('doc'):
251
if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
252
or f == 'quick-start-summary.svg'):
253
r.append(os.path.join(root, f))
257
target = os.path.join('Doc\\Bazaar', relative)
259
target = 'Doc\\Bazaar'
260
docs.append((target, r))
263
# python's distutils-based win32 installer
264
ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
265
'ext_modules': ext_modules,
267
'data_files': find_docs(),
268
# for building pyrex extensions
269
'cmdclass': {'build_ext': build_ext_if_possible},
272
ARGS.update(META_INFO)
274
ARGS.update(PKG_DATA)
278
elif 'py2exe' in sys.argv:
283
# pick real bzr version
287
for i in bzrlib.version_info[:4]:
292
version_number.append(str(i))
293
version_str = '.'.join(version_number)
295
target = py2exe.build_exe.Target(script = "bzr",
297
icon_resources = [(0,'bzr.ico')],
298
name = META_INFO['name'],
299
version = version_str,
300
description = META_INFO['description'],
301
author = META_INFO['author'],
302
copyright = "(c) Canonical Ltd, 2005-2007",
303
company_name = "Canonical Ltd.",
304
comments = META_INFO['description'],
307
packages = BZRLIB['packages']
308
packages.remove('bzrlib')
309
packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
311
for i in glob.glob('bzrlib\\*.py'):
312
module = i[:-3].replace('\\', '.')
313
if module.endswith('__init__'):
314
module = module[:-len('__init__')]
315
includes.append(module)
317
additional_packages = set()
318
if sys.version.startswith('2.4'):
319
# adding elementtree package
320
additional_packages.add('elementtree')
321
elif sys.version.startswith('2.5'):
322
additional_packages.add('xml.etree')
325
warnings.warn('Unknown Python version.\n'
326
'Please check setup.py script for compatibility.')
327
# email package from std python library use lazy import,
328
# so we need to explicitly add all package
329
additional_packages.add('email')
331
# text files for help topis
332
text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
333
topics_files = [('lib/help_topics/en', text_topics)]
337
for root, dirs, files in os.walk('bzrlib/plugins'):
340
if not i.endswith('.py'):
342
if i == '__init__.py' and root == 'bzrlib/plugins':
344
x.append(os.path.join(root, i))
346
target_dir = root[len('bzrlib/'):] # install to 'plugins/...'
347
plugins_files.append((target_dir, x))
348
# find modules for built-in plugins
349
import tools.package_mf
350
mf = tools.package_mf.CustomModuleFinder()
351
mf.run_package('bzrlib/plugins')
352
packs, mods = mf.get_result()
353
additional_packages.update(packs)
355
# MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
357
options_list = {"py2exe": {"packages": packages + list(additional_packages),
358
"includes": includes + mods,
359
"excludes": ["Tkinter", "medusa", "tools"],
360
"dll_excludes": ["MSWSOCK.dll"],
361
"dist_dir": "win32_bzr.exe",
364
setup(options=options_list,
366
'tools/win32/bzr_postinstall.py',
368
zipfile='lib/library.zip',
369
data_files=topics_files + plugins_files,
373
# ad-hoc for easy_install
375
if not 'bdist_egg' in sys.argv:
376
# generate and install bzr.1 only with plain install, not easy_install one
377
DATA_FILES = [('man/man1', ['bzr.1'])]
380
ARGS = {'scripts': ['bzr'],
381
'data_files': DATA_FILES,
382
'cmdclass': command_classes,
383
'ext_modules': ext_modules,
386
ARGS.update(META_INFO)
388
ARGS.update(PKG_DATA)