27
56
os.execvp(python, [python] + sys.argv)
30
print >>sys.stderr, "bzr: error: cannot find a suitable python interpreter"
31
print >>sys.stderr, " (need %d.%d or later)" % NEED_VERS
59
sys.stderr.write("bzr: error: cannot find a suitable python interpreter\n")
60
sys.stderr.write(" (need %d.%d or later)" % NEED_VERS)
61
sys.stderr.write('\n')
33
if hasattr(os, "unsetenv"):
63
if getattr(os, "unsetenv", None) is not None:
34
64
os.unsetenv(REINVOKE)
67
def get_bzrlib_packages():
68
"""Recurse through the bzrlib directory, and extract the package names"""
71
base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
72
for root, dirs, files in os.walk(base_path):
73
if '__init__.py' in files:
74
assert root.startswith(base_path)
75
# Get just the path below bzrlib
76
package_path = root[len(base_path):]
77
# Remove leading and trailing slashes
78
package_path = package_path.strip('\\/')
80
package_name = 'bzrlib'
82
package_name = ('bzrlib.' +
83
package_path.replace('/', '.').replace('\\', '.'))
84
packages.append(package_name)
85
return sorted(packages)
88
BZRLIB['packages'] = get_bzrlib_packages()
37
91
from distutils.core import setup
38
92
from distutils.command.install_scripts import install_scripts
39
93
from distutils.command.build import build
76
144
import generate_docs
77
145
generate_docs.main(argv=["bzr", "man"])
79
148
########################
81
150
########################
86
author_email='mbp@sourcefrog.net',
87
url='http://www.bazaar-ng.org/',
88
description='Friendly distributed version control system',
96
'bzrlib.store.revision',
97
'bzrlib.store.versioned',
99
'bzrlib.tests.blackbox',
100
'bzrlib.tests.branch_implementations',
101
'bzrlib.tests.bzrdir_implementations',
102
'bzrlib.tests.interrepository_implementations',
103
'bzrlib.tests.interversionedfile_implementations',
104
'bzrlib.tests.repository_implementations',
105
'bzrlib.tests.revisionstore_implementations',
106
'bzrlib.tests.workingtree_implementations',
108
'bzrlib.transport.http',
111
'bzrlib.util.elementtree',
112
'bzrlib.util.effbot.org',
113
'bzrlib.util.configobj',
116
cmdclass={'install_scripts': my_install_scripts, 'build': bzr_build},
117
data_files=[('man/man1', ['bzr.1'])],
118
# todo: install the txt files from bzrlib.doc.api.
152
command_classes = {'install_scripts': my_install_scripts,
154
from distutils import log
155
from distutils.errors import CCompilerError, DistutilsPlatformError
156
from distutils.extension import Extension
159
from Pyrex.Distutils import build_ext
162
# try to build the extension from the prior generated source.
164
print ("The python package 'Pyrex' is not available."
165
" If the .c files are available,")
166
print ("they will be built,"
167
" but modifying the .pyx files will not rebuild them.")
169
from distutils.command.build_ext import build_ext
174
class build_ext_if_possible(build_ext):
179
except DistutilsPlatformError, e:
181
log.warn('Extensions cannot be built, '
182
'will use the Python versions instead')
184
def build_extension(self, ext):
186
build_ext.build_extension(self, ext)
187
except CCompilerError:
188
log.warn('Building of "%s" extension failed, '
189
'will use the Python version instead' % (ext.name,))
192
# Override the build_ext if we have Pyrex available
193
command_classes['build_ext'] = build_ext_if_possible
194
unavailable_files = []
197
def add_pyrex_extension(module_name, **kwargs):
198
"""Add a pyrex module to build.
200
This will use Pyrex to auto-generate the .c file if it is available.
201
Otherwise it will fall back on the .c file. If the .c file is not
202
available, it will warn, and not add anything.
204
You can pass any extra options to Extension through kwargs. One example is
207
:param module_name: The python path to the module. This will be used to
208
determine the .pyx and .c files to use.
210
path = module_name.replace('.', '/')
211
pyrex_name = path + '.pyx'
214
ext_modules.append(Extension(module_name, [pyrex_name]))
216
if not os.path.isfile(c_name):
217
unavailable_files.append(c_name)
219
ext_modules.append(Extension(module_name, [c_name]))
222
add_pyrex_extension('bzrlib._dirstate_helpers_c')
223
add_pyrex_extension('bzrlib._knit_load_data_c')
224
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
227
if unavailable_files:
228
print 'C extension(s) not found:'
229
print ' %s' % ('\n '.join(unavailable_files),)
230
print 'The python versions will be used instead.'
234
if 'bdist_wininst' in sys.argv:
237
for root, dirs, files in os.walk('doc'):
240
if os.path.splitext(f)[1] in ('.html','.css','.png','.pdf'):
241
r.append(os.path.join(root, f))
245
target = os.path.join('Doc\\Bazaar', relative)
247
target = 'Doc\\Bazaar'
248
docs.append((target, r))
251
# python's distutils-based win32 installer
252
ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
253
'ext_modules': ext_modules,
255
'data_files': find_docs(),
256
# for building pyrex extensions
257
'cmdclass': {'build_ext': build_ext_if_possible},
260
ARGS.update(META_INFO)
262
ARGS.update(PKG_DATA)
266
elif 'py2exe' in sys.argv:
270
# pick real bzr version
274
for i in bzrlib.version_info[:4]:
279
version_number.append(str(i))
280
version_str = '.'.join(version_number)
282
target = py2exe.build_exe.Target(script = "bzr",
284
icon_resources = [(0,'bzr.ico')],
285
name = META_INFO['name'],
286
version = version_str,
287
description = META_INFO['description'],
288
author = META_INFO['author'],
289
copyright = "(c) Canonical Ltd, 2005-2007",
290
company_name = "Canonical Ltd.",
291
comments = META_INFO['description'],
294
additional_packages = []
295
if sys.version.startswith('2.4'):
296
# adding elementtree package
297
additional_packages.append('elementtree')
298
elif sys.version.startswith('2.5'):
299
additional_packages.append('xml.etree')
302
warnings.warn('Unknown Python version.\n'
303
'Please check setup.py script for compatibility.')
304
# email package from std python library use lazy import,
305
# so we need to explicitly add all package
306
additional_packages.append('email')
308
# text files for help topis
310
text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
312
options_list = {"py2exe": {"packages": BZRLIB['packages'] +
314
"excludes": ["Tkinter", "medusa", "tools"],
315
"dist_dir": "win32_bzr.exe",
318
setup(options=options_list,
320
'tools/win32/bzr_postinstall.py',
322
zipfile='lib/library.zip',
323
data_files=[('lib/help_topics/en', text_topics)],
327
# ad-hoc for easy_install
329
if not 'bdist_egg' in sys.argv:
330
# generate and install bzr.1 only with plain install, not easy_install one
331
DATA_FILES = [('man/man1', ['bzr.1'])]
334
ARGS = {'scripts': ['bzr'],
335
'data_files': DATA_FILES,
336
'cmdclass': command_classes,
337
'ext_modules': ext_modules,
340
ARGS.update(META_INFO)
342
ARGS.update(PKG_DATA)