/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: Martin Pool
  • Date: 2011-05-20 14:46:02 UTC
  • mto: This revision was merged to the branch mainline in revision 5923.
  • Revision ID: mbp@canonical.com-20110520144602-bqli0t6dj01gl0pv
Various pyflakes import fixes.

Some modules were used for subclassing or at module load time, so there is no
point loading them lazily.

Some were not imported when they should be.

Show diffs side-by-side

added added

removed removed

Lines of Context:
9
9
import os
10
10
import os.path
11
11
import sys
 
12
import copy
12
13
 
13
 
if sys.version_info < (2, 4):
14
 
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.4+\n")
 
14
if sys.version_info < (2, 6):
 
15
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.6+\n")
15
16
    sys.exit(1)
16
17
 
17
18
# NOTE: The directory containing setup.py, whether run by 'python setup.py' or
65
66
            'package_data': {'bzrlib': ['doc/api/*.txt',
66
67
                                        'tests/test_patches_data/*',
67
68
                                        'help_topics/en/*.txt',
 
69
                                        'tests/ssl_certs/ca.crt',
68
70
                                        'tests/ssl_certs/server_without_pass.key',
69
71
                                        'tests/ssl_certs/server_with_pass.key',
70
 
                                        'tests/ssl_certs/server.crt'
 
72
                                        'tests/ssl_certs/server.crt',
 
73
                                        'locale/*/LC_MESSAGES/*.mo',
71
74
                                       ]},
72
75
           }
73
76
 
125
128
                f = file(batch_path, "w")
126
129
                f.write(batch_str)
127
130
                f.close()
128
 
                print "Created:", batch_path
129
 
            except Exception, e:
130
 
                print "ERROR: Unable to create %s: %s" % (batch_path, e)
 
131
                print("Created: %s" % batch_path)
 
132
            except Exception:
 
133
                e = sys.exc_info()[1]
 
134
                print("ERROR: Unable to create %s: %s" % (batch_path, e))
131
135
 
132
136
    def _quoted_path(self, path):
133
137
        if ' ' in path:
149
153
    Generate bzr.1.
150
154
    """
151
155
 
 
156
    sub_commands = build.sub_commands + [
 
157
            ('build_mo', lambda _: True),
 
158
            ]
 
159
 
152
160
    def run(self):
153
161
        build.run(self)
154
162
 
160
168
## Setup
161
169
########################
162
170
 
 
171
from tools.build_mo import build_mo
 
172
 
163
173
command_classes = {'install_scripts': my_install_scripts,
164
 
                   'build': bzr_build}
 
174
                   'build': bzr_build,
 
175
                   'build_mo': build_mo,
 
176
                   }
165
177
from distutils import log
166
178
from distutils.errors import CCompilerError, DistutilsPlatformError
167
179
from distutils.extension import Extension
168
180
ext_modules = []
169
181
try:
170
182
    try:
 
183
        from Cython.Distutils import build_ext
 
184
        from Cython.Compiler.Version import version as pyrex_version
 
185
    except ImportError:
 
186
        print("No Cython, trying Pyrex...")
171
187
        from Pyrex.Distutils import build_ext
172
188
        from Pyrex.Compiler.Version import version as pyrex_version
173
 
    except ImportError:
174
 
        print "No Pyrex, trying Cython..."
175
 
        from Cython.Distutils import build_ext
176
 
        from Cython.Compiler.Version import version as pyrex_version
177
189
except ImportError:
178
190
    have_pyrex = False
179
191
    # try to build the extension from the prior generated source.
180
 
    print
181
 
    print ("The python package 'Pyrex' is not available."
182
 
           " If the .c files are available,")
183
 
    print ("they will be built,"
184
 
           " but modifying the .pyx files will not rebuild them.")
185
 
    print
 
192
    print("")
 
193
    print("The python package 'Pyrex' is not available."
 
194
          " If the .c files are available,")
 
195
    print("they will be built,"
 
196
          " but modifying the .pyx files will not rebuild them.")
 
197
    print("")
186
198
    from distutils.command.build_ext import build_ext
187
199
else:
188
200
    have_pyrex = True
204
216
    def run(self):
205
217
        try:
206
218
            build_ext.run(self)
207
 
        except DistutilsPlatformError, e:
 
219
        except DistutilsPlatformError:
 
220
            e = sys.exc_info()[1]
208
221
            if not self.allow_python_fallback:
209
222
                log.warn('\n  Cannot build extensions.\n'
210
223
                         '  Use "build_ext --allow-python-fallback" to use'
281
294
    add_pyrex_extension('bzrlib._dirstate_helpers_pyx',
282
295
                        libraries=['Ws2_32'])
283
296
    add_pyrex_extension('bzrlib._walkdirs_win32')
284
 
    z_lib = 'zdll'
285
297
else:
286
298
    if have_pyrex and pyrex_version_info[:3] == (0,9,4):
287
299
        # Pyrex 0.9.4.1 fails to compile this extension correctly
288
300
        # The code it generates re-uses a "local" pointer and
289
301
        # calls "PY_DECREF" after having set it to NULL. (It mixes PY_XDECREF
290
302
        # which is NULL safe with PY_DECREF which is not.)
291
 
        # <https://bugs.edge.launchpad.net/bzr/+bug/449372>
292
 
        # <https://bugs.edge.launchpad.net/bzr/+bug/276868>
293
 
        print 'Cannot build extension "bzrlib._dirstate_helpers_pyx" using'
294
 
        print 'your version of pyrex "%s". Please upgrade your pyrex' % (
295
 
            pyrex_version,)
296
 
        print 'install. For now, the non-compiled (python) version will'
297
 
        print 'be used instead.'
 
303
        # <https://bugs.launchpad.net/bzr/+bug/449372>
 
304
        # <https://bugs.launchpad.net/bzr/+bug/276868>
 
305
        print('Cannot build extension "bzrlib._dirstate_helpers_pyx" using')
 
306
        print('your version of pyrex "%s". Please upgrade your pyrex'
 
307
              % (pyrex_version,))
 
308
        print('install. For now, the non-compiled (python) version will')
 
309
        print('be used instead.')
298
310
    else:
299
311
        add_pyrex_extension('bzrlib._dirstate_helpers_pyx')
300
312
    add_pyrex_extension('bzrlib._readdir_pyx')
301
 
    z_lib = 'z'
302
 
add_pyrex_extension('bzrlib._chk_map_pyx', libraries=[z_lib])
 
313
add_pyrex_extension('bzrlib._chk_map_pyx')
303
314
ext_modules.append(Extension('bzrlib._patiencediff_c',
304
315
                             ['bzrlib/_patiencediff_c.c']))
305
316
if have_pyrex and pyrex_version_info < (0, 9, 6, 3):
306
 
    print
307
 
    print 'Your Pyrex/Cython version %s is too old to build the simple_set' % (
308
 
        pyrex_version)
309
 
    print 'and static_tuple extensions.'
310
 
    print 'Please upgrade to at least Pyrex 0.9.6.3'
311
 
    print
 
317
    print("")
 
318
    print('Your Pyrex/Cython version %s is too old to build the simple_set' % (
 
319
        pyrex_version))
 
320
    print('and static_tuple extensions.')
 
321
    print('Please upgrade to at least Pyrex 0.9.6.3')
 
322
    print("")
312
323
    # TODO: Should this be a fatal error?
313
324
else:
314
325
    # We only need 0.9.6.3 to build _simple_set_pyx, but static_tuple depends
320
331
 
321
332
 
322
333
if unavailable_files:
323
 
    print 'C extension(s) not found:'
324
 
    print '   %s' % ('\n  '.join(unavailable_files),)
325
 
    print 'The python versions will be used instead.'
326
 
    print
 
334
    print('C extension(s) not found:')
 
335
    print('   %s' % ('\n  '.join(unavailable_files),))
 
336
    print('The python versions will be used instead.')
 
337
    print("")
327
338
 
328
339
 
329
340
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
393
404
    # ditto for the tbzrcommand tool
394
405
    tbzrcommand = dict(
395
406
        script = os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
396
 
        icon_resources = [(0,'bzr.ico')],
 
407
        icon_resources = icon_resources,
 
408
        other_resources = other_resources,
397
409
    )
398
410
    console_targets.append(tbzrcommand)
399
411
    tbzrcommandw = tbzrcommand.copy()
413
425
 
414
426
def get_qbzr_py2exe_info(includes, excludes, packages, data_files):
415
427
    # PyQt4 itself still escapes the plugin detection code for some reason...
416
 
    packages.append('PyQt4')
417
 
    excludes.append('PyQt4.elementtree.ElementTree')
418
 
    excludes.append('PyQt4.uic.port_v3')
 
428
    includes.append('PyQt4.QtCore')
 
429
    includes.append('PyQt4.QtGui')
419
430
    includes.append('sip') # extension module required for Qt.
420
431
    packages.append('pygments') # colorizer for qbzr
421
432
    packages.append('docutils') # html formatting
422
433
    includes.append('win32event')  # for qsubprocess stuff
423
 
    # but we can avoid many Qt4 Dlls.
424
 
    dll_excludes.extend(
425
 
        """QtAssistantClient4.dll QtCLucene4.dll QtDesigner4.dll
426
 
        QtHelp4.dll QtNetwork4.dll QtOpenGL4.dll QtScript4.dll
427
 
        QtSql4.dll QtTest4.dll QtWebKit4.dll QtXml4.dll
428
 
        qscintilla2.dll""".split())
429
434
    # the qt binaries might not be on PATH...
430
435
    # They seem to install to a place like C:\Python25\PyQt4\*
431
436
    # Which is not the same as C:\Python25\Lib\site-packages\PyQt4
534
539
            install_data.run(self)
535
540
 
536
541
            py2exe = self.distribution.get_command_obj('py2exe', False)
537
 
            optimize = py2exe.optimize
 
542
            # GZ 2010-04-19: Setup has py2exe.optimize as 2, but give plugins
 
543
            #                time before living with docstring stripping
 
544
            optimize = 1
538
545
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
 
546
            # Round mtime to nearest even second so that installing on a FAT
 
547
            # filesystem bytecode internal and script timestamps will match
 
548
            for f in compile_names:
 
549
                mtime = os.stat(f).st_mtime
 
550
                remainder = mtime % 2
 
551
                if remainder:
 
552
                    mtime -= remainder
 
553
                    os.utime(f, (mtime, mtime))
539
554
            byte_compile(compile_names,
540
555
                         optimize=optimize,
541
556
                         force=self.force, prefix=self.install_dir,
542
557
                         dry_run=self.dry_run)
543
 
            if optimize:
544
 
                suffix = 'o'
545
 
            else:
546
 
                suffix = 'c'
547
 
            self.outfiles.extend([f + suffix for f in compile_names])
 
558
            self.outfiles.extend([f + 'o' for f in compile_names])
548
559
    # end of class install_data_with_bytecompile
549
560
 
550
561
    target = py2exe.build_exe.Target(script = "bzr",
558
569
                                     company_name = "Canonical Ltd.",
559
570
                                     comments = META_INFO['description'],
560
571
                                    )
 
572
    gui_target = copy.copy(target)
 
573
    gui_target.dest_base = "bzrw"
561
574
 
562
575
    packages = BZRLIB['packages']
563
576
    packages.remove('bzrlib')
648
661
    console_targets = [target,
649
662
                       'tools/win32/bzr_postinstall.py',
650
663
                       ]
651
 
    gui_targets = []
 
664
    gui_targets = [gui_target]
652
665
    data_files = topics_files + plugins_files
653
666
 
654
667
    if 'qbzr' in plugins:
681
694
        # print this warning to stderr as output is redirected, so it is seen
682
695
        # at build time.  Also to stdout so it appears in the log
683
696
        for f in (sys.stderr, sys.stdout):
684
 
            print >> f, \
685
 
                "Skipping TBZR binaries - please set TBZR to a directory to enable"
 
697
            f.write("Skipping TBZR binaries - "
 
698
                "please set TBZR to a directory to enable\n")
686
699
 
687
700
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
688
701
    # in on Vista.
689
 
    dll_excludes.extend(["MSWSOCK.dll", "MSVCP60.dll", "powrprof.dll"])
 
702
    dll_excludes.extend(["MSWSOCK.dll",
 
703
                         "MSVCP60.dll",
 
704
                         "MSVCP90.dll",
 
705
                         "powrprof.dll",
 
706
                         "SHFOLDER.dll"])
690
707
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
691
708
                               "includes": includes,
692
709
                               "excludes": excludes,
693
710
                               "dll_excludes": dll_excludes,
694
711
                               "dist_dir": "win32_bzr.exe",
695
 
                               "optimize": 1,
 
712
                               "optimize": 2,
 
713
                               "custom_boot_script":
 
714
                                        "tools/win32/py2exe_boot_common.py",
696
715
                              },
697
716
                   }
698
717
 
699
 
    setup(options=options_list,
700
 
          console=console_targets,
701
 
          windows=gui_targets,
702
 
          zipfile='lib/library.zip',
703
 
          data_files=data_files,
704
 
          cmdclass={'install_data': install_data_with_bytecompile},
705
 
          )
 
718
    # We want the libaray.zip to have optimize = 2, but the exe to have
 
719
    # optimize = 1, so that .py files that get compilied at run time
 
720
    # (e.g. user installed plugins) dont have their doc strings removed.
 
721
    class py2exe_no_oo_exe(py2exe.build_exe.py2exe):
 
722
        def build_executable(self, *args, **kwargs):
 
723
            self.optimize = 1
 
724
            py2exe.build_exe.py2exe.build_executable(self, *args, **kwargs)
 
725
            self.optimize = 2
 
726
 
 
727
    if __name__ == '__main__':
 
728
        setup(options=options_list,
 
729
              console=console_targets,
 
730
              windows=gui_targets,
 
731
              zipfile='lib/library.zip',
 
732
              data_files=data_files,
 
733
              cmdclass={'install_data': install_data_with_bytecompile,
 
734
                        'py2exe': py2exe_no_oo_exe},
 
735
              )
706
736
 
707
737
else:
708
738
    # ad-hoc for easy_install
712
742
        # easy_install one
713
743
        DATA_FILES = [('man/man1', ['bzr.1'])]
714
744
 
715
 
    if sys.platform != 'win32':
716
 
        # see https://wiki.kubuntu.org/Apport/DeveloperHowTo
717
 
        #
718
 
        # checking the paths and hardcoding the check for root is a bit gross,
719
 
        # but I don't see a cleaner way to find out the locations in a way
720
 
        # that's going to align with the hardcoded paths in apport.
721
 
        if os.geteuid() == 0:
722
 
            DATA_FILES += [
723
 
                ('/usr/share/apport/package-hooks',
724
 
                    ['apport/source_bzr.py']),
725
 
                ('/etc/apport/crashdb.conf.d/',
726
 
                    ['apport/bzr-crashdb.conf']),]
727
 
 
728
745
    # std setup
729
746
    ARGS = {'scripts': ['bzr'],
730
747
            'data_files': DATA_FILES,
736
753
    ARGS.update(BZRLIB)
737
754
    ARGS.update(PKG_DATA)
738
755
 
739
 
    setup(**ARGS)
 
756
    if __name__ == '__main__':
 
757
        setup(**ARGS)