/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: Robert Collins
  • Date: 2008-09-02 00:01:34 UTC
  • mfrom: (3671 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3724.
  • Revision ID: robertc@robertcollins.net-20080902000134-qz8r6v1mltygeg6t
Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
95
95
 
96
96
from distutils.core import setup
97
97
from distutils.command.install_scripts import install_scripts
 
98
from distutils.command.install_data import install_data
98
99
from distutils.command.build import build
99
100
 
100
101
###############################
224
225
            ext_modules.append(Extension(module_name, [c_name], **kwargs))
225
226
 
226
227
 
 
228
add_pyrex_extension('bzrlib._btree_serializer_c')
227
229
add_pyrex_extension('bzrlib._dirstate_helpers_c')
228
230
add_pyrex_extension('bzrlib._knit_load_data_c')
229
231
if sys.platform == 'win32':
242
244
    print
243
245
 
244
246
 
 
247
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
 
248
                         gui_targets):
 
249
    packages.append('tbzrcommands')
 
250
 
 
251
    # ModuleFinder can't handle runtime changes to __path__, but
 
252
    # win32com uses them.  Hook this in so win32com.shell is found.
 
253
    import modulefinder
 
254
    import win32com
 
255
    for p in win32com.__path__[1:]:
 
256
        modulefinder.AddPackagePath("win32com", p)
 
257
    for extra in ["win32com.shell"]:
 
258
        __import__(extra)
 
259
        m = sys.modules[extra]
 
260
        for p in m.__path__[1:]:
 
261
            modulefinder.AddPackagePath(extra, p)
 
262
 
 
263
    # TBZR points to the TBZR directory
 
264
    tbzr_root = os.environ["TBZR"]
 
265
 
 
266
    # Ensure tbzrlib itself is on sys.path
 
267
    sys.path.append(tbzr_root)
 
268
 
 
269
    # Ensure our COM "entry-point" is on sys.path
 
270
    sys.path.append(os.path.join(tbzr_root, "shellext", "python"))
 
271
 
 
272
    packages.append("tbzrlib")
 
273
    excludes.extend("""pywin pywin.dialogs pywin.dialogs.list
 
274
                       win32ui crawler.Crawler""".split())
 
275
 
 
276
    tbzr = dict(
 
277
        modules=["tbzr"],
 
278
        create_exe = False, # we only want a .dll
 
279
    )
 
280
    com_targets.append(tbzr)
 
281
 
 
282
    # tbzrcache executables - a "console" version for debugging and a
 
283
    # GUI version that is generally used.
 
284
    tbzrcache = dict(
 
285
        script = os.path.join(tbzr_root, "Scripts", "tbzrcache.py"),
 
286
        icon_resources = [(0,'bzr.ico')],
 
287
    )
 
288
    console_targets.append(tbzrcache)
 
289
 
 
290
    # Make a windows version which is the same except for the base name.
 
291
    tbzrcachew = tbzrcache.copy()
 
292
    tbzrcachew["dest_base"]="tbzrcachew"
 
293
    gui_targets.append(tbzrcachew)
 
294
 
 
295
    # ditto for the tbzrcommand tool
 
296
    tbzrcommand = dict(
 
297
        script = os.path.join(tbzr_root, "Scripts", "tbzrcommand.py"),
 
298
        icon_resources = [(0,'bzr.ico')],
 
299
    )
 
300
    console_targets.append(tbzrcommand)
 
301
    tbzrcommandw = tbzrcommand.copy()
 
302
    tbzrcommandw["dest_base"]="tbzrcommandw"
 
303
    gui_targets.append(tbzrcommandw)
 
304
    
 
305
    # tbzr tests
 
306
    tbzrtest = dict(
 
307
        script = os.path.join(tbzr_root, "Scripts", "tbzrtest.py"),
 
308
    )
 
309
    console_targets.append(tbzrtest)
 
310
 
 
311
    # A utility to see python output from the shell extension - this will
 
312
    # die when we get a c++ extension
 
313
    # any .py file from pywin32's win32 lib will do (other than
 
314
    # win32traceutil itself that is)
 
315
    import winerror
 
316
    win32_lib_dir = os.path.dirname(winerror.__file__)
 
317
    tracer = dict(script = os.path.join(win32_lib_dir, "win32traceutil.py"),
 
318
                  dest_base="tbzr_tracer")
 
319
    console_targets.append(tracer)
 
320
 
 
321
 
 
322
def get_qbzr_py2exe_info(includes, excludes, packages):
 
323
    # PyQt4 itself still escapes the plugin detection code for some reason...
 
324
    packages.append('PyQt4')
 
325
    excludes.append('PyQt4.elementtree.ElementTree')
 
326
    includes.append('sip') # extension module required for Qt.
 
327
    packages.append('pygments') # colorizer for qbzr
 
328
    # but we can avoid many Qt4 Dlls.
 
329
    dll_excludes.extend(
 
330
        """QtAssistantClient4.dll QtCLucene4.dll QtDesigner4.dll
 
331
        QtHelp4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll
 
332
        QtSql4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll
 
333
        qscintilla2.dll""".split())
 
334
    # the qt binaries might not be on PATH...
 
335
    qt_dir = os.path.join(sys.prefix, "PyQt4", "bin")
 
336
    path = os.environ.get("PATH","")
 
337
    if qt_dir.lower() not in [p.lower() for p in path.split(os.pathsep)]:
 
338
        os.environ["PATH"] = path + os.pathsep + qt_dir
 
339
 
 
340
 
245
341
if 'bdist_wininst' in sys.argv:
246
342
    def find_docs():
247
343
        docs = []
292
388
        version_number.append(str(i))
293
389
    version_str = '.'.join(version_number)
294
390
 
 
391
    # An override to install_data used only by py2exe builds, which arranges
 
392
    # to byte-compile any .py files in data_files (eg, our plugins)
 
393
    # Necessary as we can't rely on the user having the relevant permissions
 
394
    # to the "Program Files" directory to generate them on the fly.
 
395
    class install_data_with_bytecompile(install_data):
 
396
        def run(self):
 
397
            from distutils.util import byte_compile
 
398
 
 
399
            install_data.run(self)
 
400
 
 
401
            py2exe = self.distribution.get_command_obj('py2exe', False)
 
402
            optimize = py2exe.optimize
 
403
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
 
404
            byte_compile(compile_names,
 
405
                         optimize=optimize,
 
406
                         force=self.force, prefix=self.install_dir,
 
407
                         dry_run=self.dry_run)
 
408
            if optimize:
 
409
                suffix = 'o'
 
410
            else:
 
411
                suffix = 'c'
 
412
            self.outfiles.extend([f + suffix for f in compile_names])
 
413
    # end of class install_data_with_bytecompile
 
414
 
295
415
    target = py2exe.build_exe.Target(script = "bzr",
296
416
                                     dest_base = "bzr",
297
417
                                     icon_resources = [(0,'bzr.ico')],
324
444
        import warnings
325
445
        warnings.warn('Unknown Python version.\n'
326
446
                      'Please check setup.py script for compatibility.')
 
447
 
 
448
    # Although we currently can't enforce it, we consider it an error for
 
449
    # py2exe to report any files are "missing".  Such modules we know aren't
 
450
    # used should be listed here.
 
451
    excludes = """Tkinter psyco ElementPath r_hmac
 
452
                  ImaginaryModule cElementTree elementtree.ElementTree
 
453
                  Crypto.PublicKey._fastmath
 
454
                  medusa medusa.filesys medusa.ftp_server
 
455
                  tools tools.doc_generate
 
456
                  resource validate""".split()
 
457
    dll_excludes = []
 
458
 
327
459
    # email package from std python library use lazy import,
328
460
    # so we need to explicitly add all package
329
461
    additional_packages.add('email')
 
462
    # And it uses funky mappings to conver to 'Oldname' to 'newname'.  As
 
463
    # a result, packages like 'email.Parser' show as missing.  Tell py2exe
 
464
    # to exclude them.
 
465
    import email
 
466
    for oldname in getattr(email, '_LOWERNAMES', []):
 
467
        excludes.append("email." + oldname)
 
468
    for oldname in getattr(email, '_MIMENAMES', []):
 
469
        excludes.append("email.MIME" + oldname)
330
470
 
331
471
    # text files for help topis
332
472
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
334
474
 
335
475
    # built-in plugins
336
476
    plugins_files = []
 
477
    # XXX - should we consider having the concept of an 'official' build,
 
478
    # which hard-codes the list of plugins, gets more upset if modules are
 
479
    # missing, etc?
 
480
    plugins = None # will be a set after plugin sniffing...
337
481
    for root, dirs, files in os.walk('bzrlib/plugins'):
 
482
        if root == 'bzrlib/plugins':
 
483
            plugins = set(dirs)
338
484
        x = []
339
485
        for i in files:
340
 
            if not i.endswith('.py'):
 
486
            if os.path.splitext(i)[1] not in [".py", ".pyd", ".dll"]:
341
487
                continue
342
488
            if i == '__init__.py' and root == 'bzrlib/plugins':
343
489
                continue
351
497
    mf.run_package('bzrlib/plugins')
352
498
    packs, mods = mf.get_result()
353
499
    additional_packages.update(packs)
 
500
    includes.extend(mods)
 
501
 
 
502
    console_targets = [target,
 
503
                       'tools/win32/bzr_postinstall.py',
 
504
                       ]
 
505
    gui_targets = []
 
506
    com_targets = []
 
507
 
 
508
    if 'qbzr' in plugins:
 
509
        get_qbzr_py2exe_info(includes, excludes, packages)
 
510
 
 
511
    if "TBZR" in os.environ:
 
512
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
 
513
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
 
514
        # can be downloaded from (username=guest, blank password):
 
515
        # http://tortoisesvn.tigris.org/svn/tortoisesvn/TortoiseOverlays/version-1.0.4/bin/TortoiseOverlays-1.0.4.11886-win32.msi
 
516
        if not os.path.isfile(os.environ.get('TORTOISE_OVERLAYS_MSI_WIN32',
 
517
                                             '<nofile>')):
 
518
            raise RuntimeError("Please set TORTOISE_OVERLAYS_MSI_WIN32 to the"
 
519
                               " location of the Win32 TortoiseOverlays .msi"
 
520
                               " installer file")
 
521
        get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
 
522
                             gui_targets)
 
523
    else:
 
524
        # print this warning to stderr as output is redirected, so it is seen
 
525
        # at build time.  Also to stdout so it appears in the log
 
526
        for f in (sys.stderr, sys.stdout):
 
527
            print >> f, \
 
528
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
354
529
 
355
530
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
356
531
    # in on Vista.
 
532
    dll_excludes.append("MSWSOCK.dll")
357
533
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
358
 
                               "includes": includes + mods,
359
 
                               "excludes": ["Tkinter", "medusa", "tools"],
360
 
                               "dll_excludes": ["MSWSOCK.dll"],
 
534
                               "includes": includes,
 
535
                               "excludes": excludes,
 
536
                               "dll_excludes": dll_excludes,
361
537
                               "dist_dir": "win32_bzr.exe",
 
538
                               "optimize": 1,
362
539
                              },
363
540
                   }
 
541
 
364
542
    setup(options=options_list,
365
 
          console=[target,
366
 
                   'tools/win32/bzr_postinstall.py',
367
 
                  ],
 
543
          console=console_targets,
 
544
          windows=gui_targets,
 
545
          com_server=com_targets,
368
546
          zipfile='lib/library.zip',
369
547
          data_files=topics_files + plugins_files,
 
548
          cmdclass={'install_data': install_data_with_bytecompile},
370
549
          )
371
550
 
372
551
else: