/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-09-23 19:18:42 UTC
  • mfrom: (3723.1.1 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20080923191842-0hfq8zykwwm1oo9k
(jam) Merge bzr 1.7-final into bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#! /usr/bin/env python
2
2
 
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.
 
4
Run it with
 
5
 './setup.py install', or
 
6
 './setup.py --help' for more options
 
7
"""
 
8
 
 
9
import os
 
10
import os.path
 
11
import sys
 
12
 
 
13
if sys.version_info < (2, 4):
 
14
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.4+\n")
 
15
    sys.exit(1)
 
16
 
 
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...
 
20
import bzrlib
 
21
 
 
22
def get_long_description():
 
23
    dirname = os.path.dirname(__file__)
 
24
    readme = os.path.join(dirname, 'README')
 
25
    f = open(readme, 'rb')
 
26
    try:
 
27
        return f.read()
 
28
    finally:
 
29
        f.close()
 
30
 
 
31
 
 
32
##
 
33
# META INFORMATION FOR SETUP
 
34
# see http://docs.python.org/dist/meta-data.html
 
35
META_INFO = {
 
36
    'name':         'bzr',
 
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(),
 
45
    'classifiers': [
 
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',
 
57
        ],
 
58
    }
 
59
 
 
60
# The list of packages is automatically generated later. Add other things
 
61
# that are part of BZRLIB here.
 
62
BZRLIB = {}
 
63
 
 
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',
 
68
                                       ]},
 
69
           }
 
70
 
 
71
 
 
72
def get_bzrlib_packages():
 
73
    """Recurse through the bzrlib directory, and extract the package names"""
 
74
 
 
75
    packages = []
 
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('\\/')
 
84
            if not package_path:
 
85
                package_name = 'bzrlib'
 
86
            else:
 
87
                package_name = ('bzrlib.' +
 
88
                            package_path.replace('/', '.').replace('\\', '.'))
 
89
            packages.append(package_name)
 
90
    return sorted(packages)
 
91
 
 
92
 
 
93
BZRLIB['packages'] = get_bzrlib_packages()
 
94
 
6
95
 
7
96
from distutils.core import setup
8
 
 
9
 
setup(name='bzr',
10
 
      version='0.0.0',
11
 
      author='Martin Pool',
12
 
      author_email='mbp@sourcefrog.net',
13
 
      url='http://www.bazaar-ng.org/',
14
 
      description='Friendly distributed version control system',
15
 
      license='GNU GPL v2',
16
 
      packages=['bzrlib'],
17
 
      scripts=['bzr'])
 
97
from distutils.command.install_scripts import install_scripts
 
98
from distutils.command.install_data import install_data
 
99
from distutils.command.build import build
 
100
 
 
101
###############################
 
102
# Overridden distutils actions
 
103
###############################
 
104
 
 
105
class my_install_scripts(install_scripts):
 
106
    """ Customized install_scripts distutils action.
 
107
    Create bzr.bat for win32.
 
108
    """
 
109
    def run(self):
 
110
        install_scripts.run(self)   # standard action
 
111
 
 
112
        if sys.platform == "win32":
 
113
            try:
 
114
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
 
115
                script_path = self._quoted_path(os.path.join(scripts_dir,
 
116
                                                             "bzr"))
 
117
                python_exe = self._quoted_path(sys.executable)
 
118
                args = self._win_batch_args()
 
119
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
 
120
                batch_path = os.path.join(self.install_dir, "bzr.bat")
 
121
                f = file(batch_path, "w")
 
122
                f.write(batch_str)
 
123
                f.close()
 
124
                print "Created:", batch_path
 
125
            except Exception, e:
 
126
                print "ERROR: Unable to create %s: %s" % (batch_path, e)
 
127
 
 
128
    def _quoted_path(self, path):
 
129
        if ' ' in path:
 
130
            return '"' + path + '"'
 
131
        else:
 
132
            return path
 
133
 
 
134
    def _win_batch_args(self):
 
135
        from bzrlib.win32utils import winver
 
136
        if winver == 'Windows NT':
 
137
            return '%*'
 
138
        else:
 
139
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
 
140
#/class my_install_scripts
 
141
 
 
142
 
 
143
class bzr_build(build):
 
144
    """Customized build distutils action.
 
145
    Generate bzr.1.
 
146
    """
 
147
    def run(self):
 
148
        build.run(self)
 
149
 
 
150
        import generate_docs
 
151
        generate_docs.main(argv=["bzr", "man"])
 
152
 
 
153
 
 
154
########################
 
155
## Setup
 
156
########################
 
157
 
 
158
command_classes = {'install_scripts': my_install_scripts,
 
159
                   'build': bzr_build}
 
160
from distutils import log
 
161
from distutils.errors import CCompilerError, DistutilsPlatformError
 
162
from distutils.extension import Extension
 
163
ext_modules = []
 
164
try:
 
165
    from Pyrex.Distutils import build_ext
 
166
except ImportError:
 
167
    have_pyrex = False
 
168
    # try to build the extension from the prior generated source.
 
169
    print
 
170
    print ("The python package 'Pyrex' is not available."
 
171
           " If the .c files are available,")
 
172
    print ("they will be built,"
 
173
           " but modifying the .pyx files will not rebuild them.")
 
174
    print
 
175
    from distutils.command.build_ext import build_ext
 
176
else:
 
177
    have_pyrex = True
 
178
 
 
179
 
 
180
class build_ext_if_possible(build_ext):
 
181
 
 
182
    def run(self):
 
183
        try:
 
184
            build_ext.run(self)
 
185
        except DistutilsPlatformError, e:
 
186
            log.warn(str(e))
 
187
            log.warn('Extensions cannot be built, '
 
188
                     'will use the Python versions instead')
 
189
 
 
190
    def build_extension(self, ext):
 
191
        try:
 
192
            build_ext.build_extension(self, ext)
 
193
        except CCompilerError:
 
194
            log.warn('Building of "%s" extension failed, '
 
195
                     'will use the Python version instead' % (ext.name,))
 
196
 
 
197
 
 
198
# Override the build_ext if we have Pyrex available
 
199
command_classes['build_ext'] = build_ext_if_possible
 
200
unavailable_files = []
 
201
 
 
202
 
 
203
def add_pyrex_extension(module_name, **kwargs):
 
204
    """Add a pyrex module to build.
 
205
 
 
206
    This will use Pyrex to auto-generate the .c file if it is available.
 
207
    Otherwise it will fall back on the .c file. If the .c file is not
 
208
    available, it will warn, and not add anything.
 
209
 
 
210
    You can pass any extra options to Extension through kwargs. One example is
 
211
    'libraries = []'.
 
212
 
 
213
    :param module_name: The python path to the module. This will be used to
 
214
        determine the .pyx and .c files to use.
 
215
    """
 
216
    path = module_name.replace('.', '/')
 
217
    pyrex_name = path + '.pyx'
 
218
    c_name = path + '.c'
 
219
    if have_pyrex:
 
220
        ext_modules.append(Extension(module_name, [pyrex_name], **kwargs))
 
221
    else:
 
222
        if not os.path.isfile(c_name):
 
223
            unavailable_files.append(c_name)
 
224
        else:
 
225
            ext_modules.append(Extension(module_name, [c_name], **kwargs))
 
226
 
 
227
 
 
228
add_pyrex_extension('bzrlib._btree_serializer_c')
 
229
add_pyrex_extension('bzrlib._dirstate_helpers_c')
 
230
add_pyrex_extension('bzrlib._knit_load_data_c')
 
231
add_pyrex_extension('bzrlib._readdir_pyx')
 
232
if sys.platform == 'win32':
 
233
    # pyrex uses the macro WIN32 to detect the platform, even though it should
 
234
    # be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
 
235
    # right value.
 
236
    add_pyrex_extension('bzrlib._walkdirs_win32',
 
237
                        define_macros=[('WIN32', None)])
 
238
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
 
239
 
 
240
 
 
241
if unavailable_files:
 
242
    print 'C extension(s) not found:'
 
243
    print '   %s' % ('\n  '.join(unavailable_files),)
 
244
    print 'The python versions will be used instead.'
 
245
    print
 
246
 
 
247
 
 
248
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
 
249
                         gui_targets):
 
250
    packages.append('tbzrcommands')
 
251
 
 
252
    # ModuleFinder can't handle runtime changes to __path__, but
 
253
    # win32com uses them.  Hook this in so win32com.shell is found.
 
254
    import modulefinder
 
255
    import win32com
 
256
    import cPickle as pickle
 
257
    for p in win32com.__path__[1:]:
 
258
        modulefinder.AddPackagePath("win32com", p)
 
259
    for extra in ["win32com.shell"]:
 
260
        __import__(extra)
 
261
        m = sys.modules[extra]
 
262
        for p in m.__path__[1:]:
 
263
            modulefinder.AddPackagePath(extra, p)
 
264
 
 
265
    # TBZR points to the TBZR directory
 
266
    tbzr_root = os.environ["TBZR"]
 
267
 
 
268
    # Ensure tbzrlib itself is on sys.path
 
269
    sys.path.append(tbzr_root)
 
270
 
 
271
    # Ensure our COM "entry-point" is on sys.path
 
272
    sys.path.append(os.path.join(tbzr_root, "shellext", "python"))
 
273
 
 
274
    packages.append("tbzrlib")
 
275
 
 
276
    # collect up our icons.
 
277
    cwd = os.getcwd()
 
278
    ico_root = os.path.join(tbzr_root, 'tbzrlib', 'resources')
 
279
    icos = [] # list of (path_root, relative_ico_path)
 
280
    # First always bzr's icon and its in the root of the bzr tree.
 
281
    icos.append(('', 'bzr.ico'))
 
282
    for root, dirs, files in os.walk(ico_root):
 
283
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root)+1:])
 
284
                     for f in files if f.endswith('.ico')])
 
285
    # allocate an icon ID for each file and the full path to the ico
 
286
    icon_resources = [(rid, os.path.join(ico_dir, ico_name))
 
287
                      for rid, (ico_dir, ico_name) in enumerate(icos)]
 
288
    # create a string resource with the mapping.  Might as well save the
 
289
    # runtime some effort and write a pickle.
 
290
    # Runtime expects unicode objects with forward-slash seps.
 
291
    fse = sys.getfilesystemencoding()
 
292
    map_items = [(f.replace('\\', '/').decode(fse), rid)
 
293
                 for rid, (_, f) in enumerate(icos)]
 
294
    ico_map = dict(map_items)
 
295
    # Create a new resource type of 'ICON_MAP', and use ID=1
 
296
    other_resources = [ ("ICON_MAP", 1, pickle.dumps(ico_map))]
 
297
 
 
298
    excludes.extend("""pywin pywin.dialogs pywin.dialogs.list
 
299
                       win32ui crawler.Crawler""".split())
 
300
 
 
301
    tbzr = dict(
 
302
        modules=["tbzr"],
 
303
        create_exe = False, # we only want a .dll
 
304
    )
 
305
    com_targets.append(tbzr)
 
306
 
 
307
    # tbzrcache executables - a "console" version for debugging and a
 
308
    # GUI version that is generally used.
 
309
    tbzrcache = dict(
 
310
        script = os.path.join(tbzr_root, "Scripts", "tbzrcache.py"),
 
311
        icon_resources = icon_resources,
 
312
        other_resources = other_resources,
 
313
    )
 
314
    console_targets.append(tbzrcache)
 
315
 
 
316
    # Make a windows version which is the same except for the base name.
 
317
    tbzrcachew = tbzrcache.copy()
 
318
    tbzrcachew["dest_base"]="tbzrcachew"
 
319
    gui_targets.append(tbzrcachew)
 
320
 
 
321
    # ditto for the tbzrcommand tool
 
322
    tbzrcommand = dict(
 
323
        script = os.path.join(tbzr_root, "Scripts", "tbzrcommand.py"),
 
324
        icon_resources = [(0,'bzr.ico')],
 
325
    )
 
326
    console_targets.append(tbzrcommand)
 
327
    tbzrcommandw = tbzrcommand.copy()
 
328
    tbzrcommandw["dest_base"]="tbzrcommandw"
 
329
    gui_targets.append(tbzrcommandw)
 
330
    
 
331
    # tbzr tests
 
332
    tbzrtest = dict(
 
333
        script = os.path.join(tbzr_root, "Scripts", "tbzrtest.py"),
 
334
    )
 
335
    console_targets.append(tbzrtest)
 
336
 
 
337
    # A utility to see python output from the shell extension - this will
 
338
    # die when we get a c++ extension
 
339
    # any .py file from pywin32's win32 lib will do (other than
 
340
    # win32traceutil itself that is)
 
341
    import winerror
 
342
    win32_lib_dir = os.path.dirname(winerror.__file__)
 
343
    tracer = dict(script = os.path.join(win32_lib_dir, "win32traceutil.py"),
 
344
                  dest_base="tbzr_tracer")
 
345
    console_targets.append(tracer)
 
346
 
 
347
 
 
348
def get_qbzr_py2exe_info(includes, excludes, packages):
 
349
    # PyQt4 itself still escapes the plugin detection code for some reason...
 
350
    packages.append('PyQt4')
 
351
    excludes.append('PyQt4.elementtree.ElementTree')
 
352
    includes.append('sip') # extension module required for Qt.
 
353
    packages.append('pygments') # colorizer for qbzr
 
354
    packages.append('docutils') # html formatting
 
355
    # but we can avoid many Qt4 Dlls.
 
356
    dll_excludes.extend(
 
357
        """QtAssistantClient4.dll QtCLucene4.dll QtDesigner4.dll
 
358
        QtHelp4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll
 
359
        QtSql4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll
 
360
        qscintilla2.dll""".split())
 
361
    # the qt binaries might not be on PATH...
 
362
    qt_dir = os.path.join(sys.prefix, "PyQt4", "bin")
 
363
    path = os.environ.get("PATH","")
 
364
    if qt_dir.lower() not in [p.lower() for p in path.split(os.pathsep)]:
 
365
        os.environ["PATH"] = path + os.pathsep + qt_dir
 
366
 
 
367
 
 
368
if 'bdist_wininst' in sys.argv:
 
369
    def find_docs():
 
370
        docs = []
 
371
        for root, dirs, files in os.walk('doc'):
 
372
            r = []
 
373
            for f in files:
 
374
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
 
375
                    or f == 'quick-start-summary.svg'):
 
376
                    r.append(os.path.join(root, f))
 
377
            if r:
 
378
                relative = root[4:]
 
379
                if relative:
 
380
                    target = os.path.join('Doc\\Bazaar', relative)
 
381
                else:
 
382
                    target = 'Doc\\Bazaar'
 
383
                docs.append((target, r))
 
384
        return docs
 
385
 
 
386
    # python's distutils-based win32 installer
 
387
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
388
            'ext_modules': ext_modules,
 
389
            # help pages
 
390
            'data_files': find_docs(),
 
391
            # for building pyrex extensions
 
392
            'cmdclass': {'build_ext': build_ext_if_possible},
 
393
           }
 
394
 
 
395
    ARGS.update(META_INFO)
 
396
    ARGS.update(BZRLIB)
 
397
    ARGS.update(PKG_DATA)
 
398
    
 
399
    setup(**ARGS)
 
400
 
 
401
elif 'py2exe' in sys.argv:
 
402
    import glob
 
403
    # py2exe setup
 
404
    import py2exe
 
405
 
 
406
    # pick real bzr version
 
407
    import bzrlib
 
408
 
 
409
    version_number = []
 
410
    for i in bzrlib.version_info[:4]:
 
411
        try:
 
412
            i = int(i)
 
413
        except ValueError:
 
414
            i = 0
 
415
        version_number.append(str(i))
 
416
    version_str = '.'.join(version_number)
 
417
 
 
418
    # An override to install_data used only by py2exe builds, which arranges
 
419
    # to byte-compile any .py files in data_files (eg, our plugins)
 
420
    # Necessary as we can't rely on the user having the relevant permissions
 
421
    # to the "Program Files" directory to generate them on the fly.
 
422
    class install_data_with_bytecompile(install_data):
 
423
        def run(self):
 
424
            from distutils.util import byte_compile
 
425
 
 
426
            install_data.run(self)
 
427
 
 
428
            py2exe = self.distribution.get_command_obj('py2exe', False)
 
429
            optimize = py2exe.optimize
 
430
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
 
431
            byte_compile(compile_names,
 
432
                         optimize=optimize,
 
433
                         force=self.force, prefix=self.install_dir,
 
434
                         dry_run=self.dry_run)
 
435
            if optimize:
 
436
                suffix = 'o'
 
437
            else:
 
438
                suffix = 'c'
 
439
            self.outfiles.extend([f + suffix for f in compile_names])
 
440
    # end of class install_data_with_bytecompile
 
441
 
 
442
    target = py2exe.build_exe.Target(script = "bzr",
 
443
                                     dest_base = "bzr",
 
444
                                     icon_resources = [(0,'bzr.ico')],
 
445
                                     name = META_INFO['name'],
 
446
                                     version = version_str,
 
447
                                     description = META_INFO['description'],
 
448
                                     author = META_INFO['author'],
 
449
                                     copyright = "(c) Canonical Ltd, 2005-2007",
 
450
                                     company_name = "Canonical Ltd.",
 
451
                                     comments = META_INFO['description'],
 
452
                                    )
 
453
 
 
454
    packages = BZRLIB['packages']
 
455
    packages.remove('bzrlib')
 
456
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
 
457
    includes = []
 
458
    for i in glob.glob('bzrlib\\*.py'):
 
459
        module = i[:-3].replace('\\', '.')
 
460
        if module.endswith('__init__'):
 
461
            module = module[:-len('__init__')]
 
462
        includes.append(module)
 
463
 
 
464
    additional_packages = set()
 
465
    if sys.version.startswith('2.4'):
 
466
        # adding elementtree package
 
467
        additional_packages.add('elementtree')
 
468
    elif sys.version.startswith('2.5'):
 
469
        additional_packages.add('xml.etree')
 
470
    else:
 
471
        import warnings
 
472
        warnings.warn('Unknown Python version.\n'
 
473
                      'Please check setup.py script for compatibility.')
 
474
 
 
475
    # Although we currently can't enforce it, we consider it an error for
 
476
    # py2exe to report any files are "missing".  Such modules we know aren't
 
477
    # used should be listed here.
 
478
    excludes = """Tkinter psyco ElementPath r_hmac
 
479
                  ImaginaryModule cElementTree elementtree.ElementTree
 
480
                  Crypto.PublicKey._fastmath
 
481
                  medusa medusa.filesys medusa.ftp_server
 
482
                  tools tools.doc_generate
 
483
                  resource validate""".split()
 
484
    dll_excludes = []
 
485
 
 
486
    # email package from std python library use lazy import,
 
487
    # so we need to explicitly add all package
 
488
    additional_packages.add('email')
 
489
    # And it uses funky mappings to conver to 'Oldname' to 'newname'.  As
 
490
    # a result, packages like 'email.Parser' show as missing.  Tell py2exe
 
491
    # to exclude them.
 
492
    import email
 
493
    for oldname in getattr(email, '_LOWERNAMES', []):
 
494
        excludes.append("email." + oldname)
 
495
    for oldname in getattr(email, '_MIMENAMES', []):
 
496
        excludes.append("email.MIME" + oldname)
 
497
 
 
498
    # text files for help topis
 
499
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
500
    topics_files = [('lib/help_topics/en', text_topics)]
 
501
 
 
502
    # built-in plugins
 
503
    plugins_files = []
 
504
    # XXX - should we consider having the concept of an 'official' build,
 
505
    # which hard-codes the list of plugins, gets more upset if modules are
 
506
    # missing, etc?
 
507
    plugins = None # will be a set after plugin sniffing...
 
508
    for root, dirs, files in os.walk('bzrlib/plugins'):
 
509
        if root == 'bzrlib/plugins':
 
510
            plugins = set(dirs)
 
511
        x = []
 
512
        for i in files:
 
513
            if os.path.splitext(i)[1] not in [".py", ".pyd", ".dll", ".mo"]:
 
514
                continue
 
515
            if i == '__init__.py' and root == 'bzrlib/plugins':
 
516
                continue
 
517
            x.append(os.path.join(root, i))
 
518
        if x:
 
519
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
 
520
            plugins_files.append((target_dir, x))
 
521
    # find modules for built-in plugins
 
522
    import tools.package_mf
 
523
    mf = tools.package_mf.CustomModuleFinder()
 
524
    mf.run_package('bzrlib/plugins')
 
525
    packs, mods = mf.get_result()
 
526
    additional_packages.update(packs)
 
527
    includes.extend(mods)
 
528
 
 
529
    console_targets = [target,
 
530
                       'tools/win32/bzr_postinstall.py',
 
531
                       ]
 
532
    gui_targets = []
 
533
    com_targets = []
 
534
 
 
535
    if 'qbzr' in plugins:
 
536
        get_qbzr_py2exe_info(includes, excludes, packages)
 
537
 
 
538
    if "TBZR" in os.environ:
 
539
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
 
540
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
 
541
        # can be downloaded from (username=guest, blank password):
 
542
        # http://tortoisesvn.tigris.org/svn/tortoisesvn/TortoiseOverlays/version-1.0.4/bin/TortoiseOverlays-1.0.4.11886-win32.msi
 
543
        if not os.path.isfile(os.environ.get('TORTOISE_OVERLAYS_MSI_WIN32',
 
544
                                             '<nofile>')):
 
545
            raise RuntimeError("Please set TORTOISE_OVERLAYS_MSI_WIN32 to the"
 
546
                               " location of the Win32 TortoiseOverlays .msi"
 
547
                               " installer file")
 
548
        get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
 
549
                             gui_targets)
 
550
    else:
 
551
        # print this warning to stderr as output is redirected, so it is seen
 
552
        # at build time.  Also to stdout so it appears in the log
 
553
        for f in (sys.stderr, sys.stdout):
 
554
            print >> f, \
 
555
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
 
556
 
 
557
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
 
558
    # in on Vista.
 
559
    dll_excludes.append("MSWSOCK.dll")
 
560
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
 
561
                               "includes": includes,
 
562
                               "excludes": excludes,
 
563
                               "dll_excludes": dll_excludes,
 
564
                               "dist_dir": "win32_bzr.exe",
 
565
                               "optimize": 1,
 
566
                              },
 
567
                   }
 
568
 
 
569
    setup(options=options_list,
 
570
          console=console_targets,
 
571
          windows=gui_targets,
 
572
          com_server=com_targets,
 
573
          zipfile='lib/library.zip',
 
574
          data_files=topics_files + plugins_files,
 
575
          cmdclass={'install_data': install_data_with_bytecompile},
 
576
          )
 
577
 
 
578
else:
 
579
    # ad-hoc for easy_install
 
580
    DATA_FILES = []
 
581
    if not 'bdist_egg' in sys.argv:
 
582
        # generate and install bzr.1 only with plain install, not easy_install one
 
583
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
584
 
 
585
    # std setup
 
586
    ARGS = {'scripts': ['bzr'],
 
587
            'data_files': DATA_FILES,
 
588
            'cmdclass': command_classes,
 
589
            'ext_modules': ext_modules,
 
590
           }
 
591
 
 
592
    ARGS.update(META_INFO)
 
593
    ARGS.update(BZRLIB)
 
594
    ARGS.update(PKG_DATA)
 
595
 
 
596
    setup(**ARGS)