/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: Vincent Ladeuil
  • Date: 2008-09-11 19:39:04 UTC
  • mto: (3705.1.1 trunk2)
  • mto: This revision was merged to the branch mainline in revision 3708.
  • Revision ID: v.ladeuil+lp@free.fr-20080911193904-7qb81wbo10l4nbfs
Update NEWS.

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
    # but we can avoid many Qt4 Dlls.
 
355
    dll_excludes.extend(
 
356
        """QtAssistantClient4.dll QtCLucene4.dll QtDesigner4.dll
 
357
        QtHelp4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll
 
358
        QtSql4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll
 
359
        qscintilla2.dll""".split())
 
360
    # the qt binaries might not be on PATH...
 
361
    qt_dir = os.path.join(sys.prefix, "PyQt4", "bin")
 
362
    path = os.environ.get("PATH","")
 
363
    if qt_dir.lower() not in [p.lower() for p in path.split(os.pathsep)]:
 
364
        os.environ["PATH"] = path + os.pathsep + qt_dir
 
365
 
 
366
 
 
367
if 'bdist_wininst' in sys.argv:
 
368
    def find_docs():
 
369
        docs = []
 
370
        for root, dirs, files in os.walk('doc'):
 
371
            r = []
 
372
            for f in files:
 
373
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
 
374
                    or f == 'quick-start-summary.svg'):
 
375
                    r.append(os.path.join(root, f))
 
376
            if r:
 
377
                relative = root[4:]
 
378
                if relative:
 
379
                    target = os.path.join('Doc\\Bazaar', relative)
 
380
                else:
 
381
                    target = 'Doc\\Bazaar'
 
382
                docs.append((target, r))
 
383
        return docs
 
384
 
 
385
    # python's distutils-based win32 installer
 
386
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
387
            'ext_modules': ext_modules,
 
388
            # help pages
 
389
            'data_files': find_docs(),
 
390
            # for building pyrex extensions
 
391
            'cmdclass': {'build_ext': build_ext_if_possible},
 
392
           }
 
393
 
 
394
    ARGS.update(META_INFO)
 
395
    ARGS.update(BZRLIB)
 
396
    ARGS.update(PKG_DATA)
 
397
    
 
398
    setup(**ARGS)
 
399
 
 
400
elif 'py2exe' in sys.argv:
 
401
    import glob
 
402
    # py2exe setup
 
403
    import py2exe
 
404
 
 
405
    # pick real bzr version
 
406
    import bzrlib
 
407
 
 
408
    version_number = []
 
409
    for i in bzrlib.version_info[:4]:
 
410
        try:
 
411
            i = int(i)
 
412
        except ValueError:
 
413
            i = 0
 
414
        version_number.append(str(i))
 
415
    version_str = '.'.join(version_number)
 
416
 
 
417
    # An override to install_data used only by py2exe builds, which arranges
 
418
    # to byte-compile any .py files in data_files (eg, our plugins)
 
419
    # Necessary as we can't rely on the user having the relevant permissions
 
420
    # to the "Program Files" directory to generate them on the fly.
 
421
    class install_data_with_bytecompile(install_data):
 
422
        def run(self):
 
423
            from distutils.util import byte_compile
 
424
 
 
425
            install_data.run(self)
 
426
 
 
427
            py2exe = self.distribution.get_command_obj('py2exe', False)
 
428
            optimize = py2exe.optimize
 
429
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
 
430
            byte_compile(compile_names,
 
431
                         optimize=optimize,
 
432
                         force=self.force, prefix=self.install_dir,
 
433
                         dry_run=self.dry_run)
 
434
            if optimize:
 
435
                suffix = 'o'
 
436
            else:
 
437
                suffix = 'c'
 
438
            self.outfiles.extend([f + suffix for f in compile_names])
 
439
    # end of class install_data_with_bytecompile
 
440
 
 
441
    target = py2exe.build_exe.Target(script = "bzr",
 
442
                                     dest_base = "bzr",
 
443
                                     icon_resources = [(0,'bzr.ico')],
 
444
                                     name = META_INFO['name'],
 
445
                                     version = version_str,
 
446
                                     description = META_INFO['description'],
 
447
                                     author = META_INFO['author'],
 
448
                                     copyright = "(c) Canonical Ltd, 2005-2007",
 
449
                                     company_name = "Canonical Ltd.",
 
450
                                     comments = META_INFO['description'],
 
451
                                    )
 
452
 
 
453
    packages = BZRLIB['packages']
 
454
    packages.remove('bzrlib')
 
455
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
 
456
    includes = []
 
457
    for i in glob.glob('bzrlib\\*.py'):
 
458
        module = i[:-3].replace('\\', '.')
 
459
        if module.endswith('__init__'):
 
460
            module = module[:-len('__init__')]
 
461
        includes.append(module)
 
462
 
 
463
    additional_packages = set()
 
464
    if sys.version.startswith('2.4'):
 
465
        # adding elementtree package
 
466
        additional_packages.add('elementtree')
 
467
    elif sys.version.startswith('2.5'):
 
468
        additional_packages.add('xml.etree')
 
469
    else:
 
470
        import warnings
 
471
        warnings.warn('Unknown Python version.\n'
 
472
                      'Please check setup.py script for compatibility.')
 
473
 
 
474
    # Although we currently can't enforce it, we consider it an error for
 
475
    # py2exe to report any files are "missing".  Such modules we know aren't
 
476
    # used should be listed here.
 
477
    excludes = """Tkinter psyco ElementPath r_hmac
 
478
                  ImaginaryModule cElementTree elementtree.ElementTree
 
479
                  Crypto.PublicKey._fastmath
 
480
                  medusa medusa.filesys medusa.ftp_server
 
481
                  tools tools.doc_generate
 
482
                  resource validate""".split()
 
483
    dll_excludes = []
 
484
 
 
485
    # email package from std python library use lazy import,
 
486
    # so we need to explicitly add all package
 
487
    additional_packages.add('email')
 
488
    # And it uses funky mappings to conver to 'Oldname' to 'newname'.  As
 
489
    # a result, packages like 'email.Parser' show as missing.  Tell py2exe
 
490
    # to exclude them.
 
491
    import email
 
492
    for oldname in getattr(email, '_LOWERNAMES', []):
 
493
        excludes.append("email." + oldname)
 
494
    for oldname in getattr(email, '_MIMENAMES', []):
 
495
        excludes.append("email.MIME" + oldname)
 
496
 
 
497
    # text files for help topis
 
498
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
499
    topics_files = [('lib/help_topics/en', text_topics)]
 
500
 
 
501
    # built-in plugins
 
502
    plugins_files = []
 
503
    # XXX - should we consider having the concept of an 'official' build,
 
504
    # which hard-codes the list of plugins, gets more upset if modules are
 
505
    # missing, etc?
 
506
    plugins = None # will be a set after plugin sniffing...
 
507
    for root, dirs, files in os.walk('bzrlib/plugins'):
 
508
        if root == 'bzrlib/plugins':
 
509
            plugins = set(dirs)
 
510
        x = []
 
511
        for i in files:
 
512
            if os.path.splitext(i)[1] not in [".py", ".pyd", ".dll"]:
 
513
                continue
 
514
            if i == '__init__.py' and root == 'bzrlib/plugins':
 
515
                continue
 
516
            x.append(os.path.join(root, i))
 
517
        if x:
 
518
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
 
519
            plugins_files.append((target_dir, x))
 
520
    # find modules for built-in plugins
 
521
    import tools.package_mf
 
522
    mf = tools.package_mf.CustomModuleFinder()
 
523
    mf.run_package('bzrlib/plugins')
 
524
    packs, mods = mf.get_result()
 
525
    additional_packages.update(packs)
 
526
    includes.extend(mods)
 
527
 
 
528
    console_targets = [target,
 
529
                       'tools/win32/bzr_postinstall.py',
 
530
                       ]
 
531
    gui_targets = []
 
532
    com_targets = []
 
533
 
 
534
    if 'qbzr' in plugins:
 
535
        get_qbzr_py2exe_info(includes, excludes, packages)
 
536
 
 
537
    if "TBZR" in os.environ:
 
538
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
 
539
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
 
540
        # can be downloaded from (username=guest, blank password):
 
541
        # http://tortoisesvn.tigris.org/svn/tortoisesvn/TortoiseOverlays/version-1.0.4/bin/TortoiseOverlays-1.0.4.11886-win32.msi
 
542
        if not os.path.isfile(os.environ.get('TORTOISE_OVERLAYS_MSI_WIN32',
 
543
                                             '<nofile>')):
 
544
            raise RuntimeError("Please set TORTOISE_OVERLAYS_MSI_WIN32 to the"
 
545
                               " location of the Win32 TortoiseOverlays .msi"
 
546
                               " installer file")
 
547
        get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
 
548
                             gui_targets)
 
549
    else:
 
550
        # print this warning to stderr as output is redirected, so it is seen
 
551
        # at build time.  Also to stdout so it appears in the log
 
552
        for f in (sys.stderr, sys.stdout):
 
553
            print >> f, \
 
554
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
 
555
 
 
556
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
 
557
    # in on Vista.
 
558
    dll_excludes.append("MSWSOCK.dll")
 
559
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
 
560
                               "includes": includes,
 
561
                               "excludes": excludes,
 
562
                               "dll_excludes": dll_excludes,
 
563
                               "dist_dir": "win32_bzr.exe",
 
564
                               "optimize": 1,
 
565
                              },
 
566
                   }
 
567
 
 
568
    setup(options=options_list,
 
569
          console=console_targets,
 
570
          windows=gui_targets,
 
571
          com_server=com_targets,
 
572
          zipfile='lib/library.zip',
 
573
          data_files=topics_files + plugins_files,
 
574
          cmdclass={'install_data': install_data_with_bytecompile},
 
575
          )
 
576
 
 
577
else:
 
578
    # ad-hoc for easy_install
 
579
    DATA_FILES = []
 
580
    if not 'bdist_egg' in sys.argv:
 
581
        # generate and install bzr.1 only with plain install, not easy_install one
 
582
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
583
 
 
584
    # std setup
 
585
    ARGS = {'scripts': ['bzr'],
 
586
            'data_files': DATA_FILES,
 
587
            'cmdclass': command_classes,
 
588
            'ext_modules': ext_modules,
 
589
           }
 
590
 
 
591
    ARGS.update(META_INFO)
 
592
    ARGS.update(BZRLIB)
 
593
    ARGS.update(PKG_DATA)
 
594
 
 
595
    setup(**ARGS)