~bzr-pqm/bzr/bzr.dev

45 by Martin Pool
- add setup.py and install instructions
1
#! /usr/bin/env python
2
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
3
"""Installation script for bzr.
4
Run it with
5
 './setup.py install', or
6
 './setup.py --help' for more options
7
"""
8
1930.3.1 by John Arbash Meinel
Change setup.py to auto-generate the list of packages to install
9
import os
3185.1.7 by Martin Pool
Always take README text from the right directory (thanks jam)
10
import os.path
1930.3.1 by John Arbash Meinel
Change setup.py to auto-generate the list of packages to install
11
import sys
5340.4.1 by Gary van der Merwe
Add bzrw as gui_target.
12
import copy
6093.3.1 by Jonathan Riddell
install .mo translation files
13
import glob
1930.3.1 by John Arbash Meinel
Change setup.py to auto-generate the list of packages to install
14
5848.2.1 by John Arbash Meinel
Break compatibility with python <2.6.
15
if sys.version_info < (2, 6):
16
    sys.stderr.write("[ERROR] Not a supported Python version. Need 2.6+\n")
3260.1.1 by Alexander Belchenko
setup.py script explicitly checks for Python version. (#200569)
17
    sys.exit(1)
18
3185.1.7 by Martin Pool
Always take README text from the right directory (thanks jam)
19
# NOTE: The directory containing setup.py, whether run by 'python setup.py' or
20
# './setup.py' or the equivalent with another path, should always be at the
21
# start of the path, so this should find the right one...
1861.2.21 by Alexander Belchenko
setup.py: automatically grab version info from bzrlib
22
import bzrlib
23
3185.1.7 by Martin Pool
Always take README text from the right directory (thanks jam)
24
def get_long_description():
25
    dirname = os.path.dirname(__file__)
26
    readme = os.path.join(dirname, 'README')
27
    f = open(readme, 'rb')
28
    try:
29
        return f.read()
30
    finally:
31
        f.close()
32
33
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
34
##
35
# META INFORMATION FOR SETUP
3185.1.2 by Martin Pool
Add more metadata to setup.py (#183391)
36
# see http://docs.python.org/dist/meta-data.html
37
META_INFO = {
38
    'name':         'bzr',
39
    'version':      bzrlib.__version__,
40
    'author':       'Canonical Ltd',
41
    'author_email': 'bazaar@lists.canonical.com',
4797.36.2 by Ian Clatworthy
tweak project URL and copyright years
42
    'url':          'http://bazaar.canonical.com/',
3185.1.2 by Martin Pool
Add more metadata to setup.py (#183391)
43
    'description':  'Friendly distributed version control system',
44
    'license':      'GNU GPL v2',
4634.92.1 by John Arbash Meinel
Update the download location registered with pypi.
45
    'download_url': 'https://launchpad.net/bzr/+download',
3185.1.7 by Martin Pool
Always take README text from the right directory (thanks jam)
46
    'long_description': get_long_description(),
3185.1.2 by Martin Pool
Add more metadata to setup.py (#183391)
47
    'classifiers': [
48
        'Development Status :: 6 - Mature',
49
        'Environment :: Console',
50
        'Intended Audience :: Developers',
51
        'Intended Audience :: System Administrators',
52
        'License :: OSI Approved :: GNU General Public License (GPL)',
53
        'Operating System :: Microsoft :: Windows',
54
        'Operating System :: OS Independent',
55
        'Operating System :: POSIX',
56
        'Programming Language :: Python',
57
        'Programming Language :: C',
58
        'Topic :: Software Development :: Version Control',
59
        ],
60
    }
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
61
1930.3.3 by John Arbash Meinel
Fix a stupid error in code declaration order
62
# The list of packages is automatically generated later. Add other things
63
# that are part of BZRLIB here.
64
BZRLIB = {}
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
65
1911.1.1 by Alexander Belchenko
setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data
66
PKG_DATA = {# install files from selftest suite
67
            'package_data': {'bzrlib': ['doc/api/*.txt',
68
                                        'tests/test_patches_data/*',
3089.3.6 by Ian Clatworthy
make help topics more discoverable
69
                                        'help_topics/en/*.txt',
5050.41.1 by Vincent Ladeuil
tests/ssl_certs/ca.crt is needed for running https tests
70
                                        'tests/ssl_certs/ca.crt',
4610.1.1 by Denys Duchier
install keys and certs. fixes bug #392401.
71
                                        'tests/ssl_certs/server_without_pass.key',
72
                                        'tests/ssl_certs/server_with_pass.key',
5830.3.1 by INADA Naoki
Add build_mo command to setup. It makes .mo files into bzrlib/<lang>/LC_MESSAGES/bzr.mo
73
                                        'tests/ssl_certs/server.crt',
1911.1.1 by Alexander Belchenko
setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data
74
                                       ]},
75
           }
6093.3.1 by Jonathan Riddell
install .mo translation files
76
I18N_FILES = []
77
for filepath in glob.glob("bzrlib/locale/*/LC_MESSAGES/*.mo"):
6093.3.3 by Jonathan Riddell
give variable a nicer name, add crucial space
78
    langfile = filepath[len("bzrlib/locale/"):]
79
    targetpath = os.path.dirname(os.path.join("share/locale", langfile))
6093.3.1 by Jonathan Riddell
install .mo translation files
80
    I18N_FILES.append((targetpath, [filepath]))
1185.29.5 by Wouter van Heyst
Add reinvocation code to ensure setup.py is run by python2.4
81
1930.3.1 by John Arbash Meinel
Change setup.py to auto-generate the list of packages to install
82
def get_bzrlib_packages():
83
    """Recurse through the bzrlib directory, and extract the package names"""
84
85
    packages = []
86
    base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
87
    for root, dirs, files in os.walk(base_path):
88
        if '__init__.py' in files:
89
            assert root.startswith(base_path)
90
            # Get just the path below bzrlib
91
            package_path = root[len(base_path):]
92
            # Remove leading and trailing slashes
93
            package_path = package_path.strip('\\/')
94
            if not package_path:
95
                package_name = 'bzrlib'
96
            else:
97
                package_name = ('bzrlib.' +
98
                            package_path.replace('/', '.').replace('\\', '.'))
99
            packages.append(package_name)
100
    return sorted(packages)
101
102
1930.3.3 by John Arbash Meinel
Fix a stupid error in code declaration order
103
BZRLIB['packages'] = get_bzrlib_packages()
104
105
4584.1.1 by Alexander Belchenko
Bundle imageformats plugins for PyQt4 into bzr.exe installer to enable support of many image formats in QBzr.
106
from distutils import log
45 by Martin Pool
- add setup.py and install instructions
107
from distutils.core import setup
6591.1.1 by Andrew Starr-Bochicchio
Use LooseVersion from distutils to check Cython version in order to handle non-integers in the version string.
108
from distutils.version import LooseVersion
1185.23.1 by Aaron Bentley
win32 setup fixes from Belchenko
109
from distutils.command.install_scripts import install_scripts
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
110
from distutils.command.install_data import install_data
1185.29.3 by Wouter van Heyst
Create bzr.1 manpage from setup.py
111
from distutils.command.build import build
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
112
113
###############################
114
# Overridden distutils actions
115
###############################
116
1185.23.1 by Aaron Bentley
win32 setup fixes from Belchenko
117
class my_install_scripts(install_scripts):
118
    """ Customized install_scripts distutils action.
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
119
    Create bzr.bat for win32.
120
    """
121
    def run(self):
1185.23.1 by Aaron Bentley
win32 setup fixes from Belchenko
122
        install_scripts.run(self)   # standard action
123
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
124
        if sys.platform == "win32":
1185.23.1 by Aaron Bentley
win32 setup fixes from Belchenko
125
            try:
2662.1.1 by Alexander Belchenko
allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)
126
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
1861.2.10 by Alexander Belchenko
setup.py: improved bzr.bat creation
127
                script_path = self._quoted_path(os.path.join(scripts_dir,
128
                                                             "bzr"))
129
                python_exe = self._quoted_path(sys.executable)
130
                args = self._win_batch_args()
131
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
2662.1.1 by Alexander Belchenko
allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)
132
                batch_path = os.path.join(self.install_dir, "bzr.bat")
1185.23.1 by Aaron Bentley
win32 setup fixes from Belchenko
133
                f = file(batch_path, "w")
134
                f.write(batch_str)
135
                f.close()
5311.3.3 by Robert Collins
Another tuple-printing case fixed.
136
                print("Created: %s" % batch_path)
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
137
            except Exception:
138
                e = sys.exc_info()[1]
139
                print("ERROR: Unable to create %s: %s" % (batch_path, e))
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
140
1861.2.10 by Alexander Belchenko
setup.py: improved bzr.bat creation
141
    def _quoted_path(self, path):
142
        if ' ' in path:
143
            return '"' + path + '"'
144
        else:
145
            return path
146
147
    def _win_batch_args(self):
2245.4.4 by Alexander Belchenko
setup.py: fix plain 'python setup.py install' for win98
148
        from bzrlib.win32utils import winver
149
        if winver == 'Windows NT':
1861.2.10 by Alexander Belchenko
setup.py: improved bzr.bat creation
150
            return '%*'
151
        else:
152
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
153
#/class my_install_scripts
154
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
155
1185.29.3 by Wouter van Heyst
Create bzr.1 manpage from setup.py
156
class bzr_build(build):
157
    """Customized build distutils action.
158
    Generate bzr.1.
159
    """
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
160
5830.3.2 by INADA Naoki
Run build_mo when build is called.
161
    sub_commands = build.sub_commands + [
162
            ('build_mo', lambda _: True),
163
            ]
164
1185.29.3 by Wouter van Heyst
Create bzr.1 manpage from setup.py
165
    def run(self):
166
        build.run(self)
167
4070.12.1 by Martin Pool
Minor review correction from John
168
        from tools import generate_docs
1551.3.11 by Aaron Bentley
Merge from Robert
169
        generate_docs.main(argv=["bzr", "man"])
1185.29.3 by Wouter van Heyst
Create bzr.1 manpage from setup.py
170
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
171
1185.1.40 by Robert Collins
Merge what applied of Alexander Belchenko's win32 patch.
172
########################
173
## Setup
174
########################
175
6162.4.4 by Jonathan Riddell
move build_mo into bzrlib for reuse in plugins
176
from bzrlib.bzr_distutils import build_mo
5830.3.1 by INADA Naoki
Add build_mo command to setup. It makes .mo files into bzrlib/<lang>/LC_MESSAGES/bzr.mo
177
1739.1.1 by Robert Collins
First cut at adding pyrex facilities.
178
command_classes = {'install_scripts': my_install_scripts,
5830.3.1 by INADA Naoki
Add build_mo command to setup. It makes .mo files into bzrlib/<lang>/LC_MESSAGES/bzr.mo
179
                   'build': bzr_build,
180
                   'build_mo': build_mo,
181
                   }
2814.4.1 by Lukáš Lalinský
Don't abort ``python setup.py install`` if building of a C extension is not possible.
182
from distutils import log
2814.4.2 by Alexander Belchenko
support for win32
183
from distutils.errors import CCompilerError, DistutilsPlatformError
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
184
from distutils.extension import Extension
1739.1.1 by Robert Collins
First cut at adding pyrex facilities.
185
ext_modules = []
186
try:
4719.3.1 by Chris Mellon
Add Cython fallback in case Pyrex is not present
187
    try:
5848.1.1 by John Arbash Meinel
Try using Cython to compile before we use Pyrex
188
        from Cython.Distutils import build_ext
189
        from Cython.Compiler.Version import version as pyrex_version
190
    except ImportError:
191
        print("No Cython, trying Pyrex...")
4719.3.1 by Chris Mellon
Add Cython fallback in case Pyrex is not present
192
        from Pyrex.Distutils import build_ext
193
        from Pyrex.Compiler.Version import version as pyrex_version
1739.1.1 by Robert Collins
First cut at adding pyrex facilities.
194
except ImportError:
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
195
    have_pyrex = False
1739.1.1 by Robert Collins
First cut at adding pyrex facilities.
196
    # try to build the extension from the prior generated source.
5311.3.2 by Robert Collins
Do not print tuples from setup.py in Python 2.x.
197
    print("")
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
198
    print("The python package 'Pyrex' is not available."
199
          " If the .c files are available,")
200
    print("they will be built,"
201
          " but modifying the .pyx files will not rebuild them.")
5311.3.2 by Robert Collins
Do not print tuples from setup.py in Python 2.x.
202
    print("")
1739.1.4 by Robert Collins
Fix building of C modules without pyrex installed.
203
    from distutils.command.build_ext import build_ext
1739.1.1 by Robert Collins
First cut at adding pyrex facilities.
204
else:
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
205
    have_pyrex = True
6591.1.1 by Andrew Starr-Bochicchio
Use LooseVersion from distutils to check Cython version in order to handle non-integers in the version string.
206
    pyrex_version_info = LooseVersion(pyrex_version)
2814.4.1 by Lukáš Lalinský
Don't abort ``python setup.py install`` if building of a C extension is not possible.
207
208
209
class build_ext_if_possible(build_ext):
210
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
211
    user_options = build_ext.user_options + [
212
        ('allow-python-fallback', None,
213
         "When an extension cannot be built, allow falling"
214
         " back to the pure-python implementation.")
215
        ]
216
217
    def initialize_options(self):
218
        build_ext.initialize_options(self)
219
        self.allow_python_fallback = False
220
2814.4.2 by Alexander Belchenko
support for win32
221
    def run(self):
222
        try:
223
            build_ext.run(self)
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
224
        except DistutilsPlatformError:
225
            e = sys.exc_info()[1]
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
226
            if not self.allow_python_fallback:
227
                log.warn('\n  Cannot build extensions.\n'
3928.4.1 by John Arbash Meinel
Change the warning from setup.py to make it a bit more obvious how to install
228
                         '  Use "build_ext --allow-python-fallback" to use'
229
                         ' slower python implementations instead.\n')
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
230
                raise
2814.4.4 by Alexander Belchenko
changes suggested by Aaron and Martin
231
            log.warn(str(e))
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
232
            log.warn('\n  Extensions cannot be built.\n'
233
                     '  Using the slower Python implementations instead.\n')
2814.4.2 by Alexander Belchenko
support for win32
234
2814.4.1 by Lukáš Lalinský
Don't abort ``python setup.py install`` if building of a C extension is not possible.
235
    def build_extension(self, ext):
236
        try:
237
            build_ext.build_extension(self, ext)
238
        except CCompilerError:
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
239
            if not self.allow_python_fallback:
4086.2.1 by John Arbash Meinel
Fix a small bug in setup.py when an extension fails to build
240
                log.warn('\n  Cannot build extension "%s".\n'
3928.4.1 by John Arbash Meinel
Change the warning from setup.py to make it a bit more obvious how to install
241
                         '  Use "build_ext --allow-python-fallback" to use'
3928.4.3 by John Arbash Meinel
fix typo in setup.py
242
                         ' slower python implementations instead.\n'
3759.1.1 by John Arbash Meinel
Default to requiring extensions.
243
                         % (ext.name,))
244
                raise
245
            log.warn('\n  Building of "%s" extension failed.\n'
246
                     '  Using the slower Python implementation instead.'
247
                     % (ext.name,))
2814.4.1 by Lukáš Lalinský
Don't abort ``python setup.py install`` if building of a C extension is not possible.
248
249
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
250
# Override the build_ext if we have Pyrex available
2814.4.1 by Lukáš Lalinský
Don't abort ``python setup.py install`` if building of a C extension is not possible.
251
command_classes['build_ext'] = build_ext_if_possible
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
252
unavailable_files = []
253
2617.1.2 by John Arbash Meinel
Try another form of comment
254
4241.6.1 by Ian Clatworthy
chk_map code from brisbane-core
255
def add_pyrex_extension(module_name, libraries=None, extra_source=[]):
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
256
    """Add a pyrex module to build.
257
258
    This will use Pyrex to auto-generate the .c file if it is available.
259
    Otherwise it will fall back on the .c file. If the .c file is not
260
    available, it will warn, and not add anything.
261
262
    You can pass any extra options to Extension through kwargs. One example is
263
    'libraries = []'.
264
265
    :param module_name: The python path to the module. This will be used to
266
        determine the .pyx and .c files to use.
267
    """
268
    path = module_name.replace('.', '/')
269
    pyrex_name = path + '.pyx'
270
    c_name = path + '.c'
3763.5.3 by Martin Pool
Review feedback on add_pyrex_extension
271
    define_macros = []
3763.5.2 by Martin Pool
Set -DWIN32 for all pyrex extensions, not one by one
272
    if sys.platform == 'win32':
4459.2.1 by Vincent Ladeuil
Use a consistent scheme for naming pyrex source files.
273
        # pyrex uses the macro WIN32 to detect the platform, even though it
274
        # should be using something like _WIN32 or MS_WINDOWS, oh well, we can
275
        # give it the right value.
3763.5.2 by Martin Pool
Set -DWIN32 for all pyrex extensions, not one by one
276
        define_macros.append(('WIN32', None))
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
277
    if have_pyrex:
4241.6.1 by Ian Clatworthy
chk_map code from brisbane-core
278
        source = [pyrex_name]
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
279
    else:
280
        if not os.path.isfile(c_name):
281
            unavailable_files.append(c_name)
4241.6.1 by Ian Clatworthy
chk_map code from brisbane-core
282
            return
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
283
        else:
4241.6.1 by Ian Clatworthy
chk_map code from brisbane-core
284
            source = [c_name]
285
    source.extend(extra_source)
286
    ext_modules.append(Extension(module_name, source,
287
        define_macros=define_macros, libraries=libraries))
3763.5.2 by Martin Pool
Set -DWIN32 for all pyrex extensions, not one by one
288
289
4454.3.43 by John Arbash Meinel
Initial implementation of a Pyrex annotator.
290
add_pyrex_extension('bzrlib._annotator_pyx')
4398.5.4 by John Arbash Meinel
A bit of code restructuring.
291
add_pyrex_extension('bzrlib._bencode_pyx')
292
add_pyrex_extension('bzrlib._chunks_to_lines_pyx')
3735.31.1 by John Arbash Meinel
Bring the groupcompress plugin into the brisbane-core branch.
293
add_pyrex_extension('bzrlib._groupcompress_pyx',
294
                    extra_source=['bzrlib/diff-delta.c'])
4459.2.1 by Vincent Ladeuil
Use a consistent scheme for naming pyrex source files.
295
add_pyrex_extension('bzrlib._knit_load_data_pyx')
4371.3.19 by John Arbash Meinel
Get an initial pyrex implementation.
296
add_pyrex_extension('bzrlib._known_graph_pyx')
4354.3.2 by Jelmer Vernooij
Provide custom implementation of _read_stanza_utf8 in Pyrex.
297
add_pyrex_extension('bzrlib._rio_pyx')
3504.4.3 by John Arbash Meinel
Start working on an extension specifically for win32,
298
if sys.platform == 'win32':
4459.2.1 by Vincent Ladeuil
Use a consistent scheme for naming pyrex source files.
299
    add_pyrex_extension('bzrlib._dirstate_helpers_pyx',
3763.5.2 by Martin Pool
Set -DWIN32 for all pyrex extensions, not one by one
300
                        libraries=['Ws2_32'])
301
    add_pyrex_extension('bzrlib._walkdirs_win32')
3696.3.10 by Robert Collins
Review feedback.
302
else:
6591.1.1 by Andrew Starr-Bochicchio
Use LooseVersion from distutils to check Cython version in order to handle non-integers in the version string.
303
    if have_pyrex and pyrex_version_info == LooseVersion("0.9.4.1"):
3757.2.1 by John Arbash Meinel
Work around bug #276868 by blacklisting pyrex 0.9.4.1 for that extension
304
        # Pyrex 0.9.4.1 fails to compile this extension correctly
3757.2.2 by John Arbash Meinel
Request from Martin, clearly comment the problem.
305
        # The code it generates re-uses a "local" pointer and
306
        # calls "PY_DECREF" after having set it to NULL. (It mixes PY_XDECREF
307
        # which is NULL safe with PY_DECREF which is not.)
4634.165.4 by Vincent Ladeuil
Fix all comments where bugs.edge.launchpad.net was used.
308
        # <https://bugs.launchpad.net/bzr/+bug/449372>
309
        # <https://bugs.launchpad.net/bzr/+bug/276868>
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
310
        print('Cannot build extension "bzrlib._dirstate_helpers_pyx" using')
5050.45.13 by Vincent Ladeuil
Merge fix for bug #583667 from 2.1
311
        print('your version of pyrex "%s". Please upgrade your pyrex'
312
              % (pyrex_version,))
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
313
        print('install. For now, the non-compiled (python) version will')
314
        print('be used instead.')
3757.2.1 by John Arbash Meinel
Work around bug #276868 by blacklisting pyrex 0.9.4.1 for that extension
315
    else:
4459.2.1 by Vincent Ladeuil
Use a consistent scheme for naming pyrex source files.
316
        add_pyrex_extension('bzrlib._dirstate_helpers_pyx')
3696.3.10 by Robert Collins
Review feedback.
317
    add_pyrex_extension('bzrlib._readdir_pyx')
5165.1.1 by Martin
Use python builtin crc32 function rather than zlib C api for _chk_map_pyx
318
add_pyrex_extension('bzrlib._chk_map_pyx')
4459.2.1 by Vincent Ladeuil
Use a consistent scheme for naming pyrex source files.
319
ext_modules.append(Extension('bzrlib._patiencediff_c',
320
                             ['bzrlib/_patiencediff_c.c']))
6591.1.1 by Andrew Starr-Bochicchio
Use LooseVersion from distutils to check Cython version in order to handle non-integers in the version string.
321
if have_pyrex and pyrex_version_info < LooseVersion("0.9.6.3"):
5311.3.2 by Robert Collins
Do not print tuples from setup.py in Python 2.x.
322
    print("")
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
323
    print('Your Pyrex/Cython version %s is too old to build the simple_set' % (
324
        pyrex_version))
325
    print('and static_tuple extensions.')
326
    print('Please upgrade to at least Pyrex 0.9.6.3')
5311.3.2 by Robert Collins
Do not print tuples from setup.py in Python 2.x.
327
    print("")
4797.32.1 by John Arbash Meinel
Require pyrex 0.9.6.3 as the minimum version to build the static_tuple extensions.
328
    # TODO: Should this be a fatal error?
329
else:
330
    # We only need 0.9.6.3 to build _simple_set_pyx, but static_tuple depends
331
    # on simple_set
332
    add_pyrex_extension('bzrlib._simple_set_pyx')
333
    ext_modules.append(Extension('bzrlib._static_tuple_c',
334
                                 ['bzrlib/_static_tuple_c.c']))
4679.7.1 by John Arbash Meinel
Merge the 2.1-static-tuple-no-use branch, but restore the
335
add_pyrex_extension('bzrlib._btree_serializer_pyx')
336
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
337
338
if unavailable_files:
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
339
    print('C extension(s) not found:')
340
    print('   %s' % ('\n  '.join(unavailable_files),))
341
    print('The python versions will be used instead.')
5311.3.2 by Robert Collins
Do not print tuples from setup.py in Python 2.x.
342
    print("")
2617.1.1 by John Arbash Meinel
Update setup.py to just skip extensions that are not available.
343
3565.5.9 by Mark Hammond
Address John's review comments
344
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
345
def get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
3871.1.6 by Mark Hammond
remerge setup changes
346
                         gui_targets, data_files):
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
347
    packages.append('tbzrcommands')
348
349
    # ModuleFinder can't handle runtime changes to __path__, but
350
    # win32com uses them.  Hook this in so win32com.shell is found.
351
    import modulefinder
352
    import win32com
3684.2.1 by Mark Hammond
include tbzr icons in windows binary distributions
353
    import cPickle as pickle
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
354
    for p in win32com.__path__[1:]:
355
        modulefinder.AddPackagePath("win32com", p)
356
    for extra in ["win32com.shell"]:
357
        __import__(extra)
358
        m = sys.modules[extra]
359
        for p in m.__path__[1:]:
360
            modulefinder.AddPackagePath(extra, p)
361
362
    # TBZR points to the TBZR directory
363
    tbzr_root = os.environ["TBZR"]
364
365
    # Ensure tbzrlib itself is on sys.path
366
    sys.path.append(tbzr_root)
367
368
    packages.append("tbzrlib")
3684.2.1 by Mark Hammond
include tbzr icons in windows binary distributions
369
370
    # collect up our icons.
371
    cwd = os.getcwd()
372
    ico_root = os.path.join(tbzr_root, 'tbzrlib', 'resources')
3688.3.2 by Mark Hammond
build the list of icons without changing directory.
373
    icos = [] # list of (path_root, relative_ico_path)
374
    # First always bzr's icon and its in the root of the bzr tree.
375
    icos.append(('', 'bzr.ico'))
376
    for root, dirs, files in os.walk(ico_root):
377
        icos.extend([(ico_root, os.path.join(root, f)[len(ico_root)+1:])
378
                     for f in files if f.endswith('.ico')])
379
    # allocate an icon ID for each file and the full path to the ico
380
    icon_resources = [(rid, os.path.join(ico_dir, ico_name))
381
                      for rid, (ico_dir, ico_name) in enumerate(icos)]
382
    # create a string resource with the mapping.  Might as well save the
383
    # runtime some effort and write a pickle.
384
    # Runtime expects unicode objects with forward-slash seps.
385
    fse = sys.getfilesystemencoding()
386
    map_items = [(f.replace('\\', '/').decode(fse), rid)
387
                 for rid, (_, f) in enumerate(icos)]
388
    ico_map = dict(map_items)
389
    # Create a new resource type of 'ICON_MAP', and use ID=1
390
    other_resources = [ ("ICON_MAP", 1, pickle.dumps(ico_map))]
3684.2.1 by Mark Hammond
include tbzr icons in windows binary distributions
391
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
392
    excludes.extend("""pywin pywin.dialogs pywin.dialogs.list
393
                       win32ui crawler.Crawler""".split())
394
395
    # tbzrcache executables - a "console" version for debugging and a
396
    # GUI version that is generally used.
397
    tbzrcache = dict(
3871.1.6 by Mark Hammond
remerge setup changes
398
        script = os.path.join(tbzr_root, "scripts", "tbzrcache.py"),
3684.2.1 by Mark Hammond
include tbzr icons in windows binary distributions
399
        icon_resources = icon_resources,
400
        other_resources = other_resources,
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
401
    )
402
    console_targets.append(tbzrcache)
403
404
    # Make a windows version which is the same except for the base name.
405
    tbzrcachew = tbzrcache.copy()
406
    tbzrcachew["dest_base"]="tbzrcachew"
407
    gui_targets.append(tbzrcachew)
408
409
    # ditto for the tbzrcommand tool
410
    tbzrcommand = dict(
3871.1.6 by Mark Hammond
remerge setup changes
411
        script = os.path.join(tbzr_root, "scripts", "tbzrcommand.py"),
5555.3.1 by IWATA Hidetaka
add icon resources tbzrcommand(w)
412
        icon_resources = icon_resources,
413
        other_resources = other_resources,
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
414
    )
415
    console_targets.append(tbzrcommand)
416
    tbzrcommandw = tbzrcommand.copy()
417
    tbzrcommandw["dest_base"]="tbzrcommandw"
418
    gui_targets.append(tbzrcommandw)
419
    
3871.1.6 by Mark Hammond
remerge setup changes
420
    # A utility to see python output from both C++ and Python based shell
421
    # extensions
422
    tracer = dict(script=os.path.join(tbzr_root, "scripts", "tbzrtrace.py"))
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
423
    console_targets.append(tracer)
424
3871.1.6 by Mark Hammond
remerge setup changes
425
    # The C++ implemented shell extensions.
4634.76.1 by Naoki INADA
TBZR: Remove tbzr_old.dll, refactoring directory tree.
426
    dist_dir = os.path.join(tbzr_root, "shellext", "build")
3871.1.6 by Mark Hammond
remerge setup changes
427
    data_files.append(('', [os.path.join(dist_dir, 'tbzrshellext_x86.dll')]))
428
    data_files.append(('', [os.path.join(dist_dir, 'tbzrshellext_x64.dll')]))
429
3565.5.9 by Mark Hammond
Address John's review comments
430
4584.1.1 by Alexander Belchenko
Bundle imageformats plugins for PyQt4 into bzr.exe installer to enable support of many image formats in QBzr.
431
def get_qbzr_py2exe_info(includes, excludes, packages, data_files):
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
432
    # PyQt4 itself still escapes the plugin detection code for some reason...
5333.1.2 by Gary van der Merwe
Use includes rather than packages for PyQt modules.
433
    includes.append('PyQt4.QtCore')
434
    includes.append('PyQt4.QtGui')
6437.45.1 by Alexander Belchenko
Standalone bzr.exe includes QtTest library from PyQt4 framework that required for QBzr tests. (Alexander Belchenko, #928963)
435
    includes.append('PyQt4.QtTest')
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
436
    includes.append('sip') # extension module required for Qt.
437
    packages.append('pygments') # colorizer for qbzr
3697.9.1 by Mark Hammond
include docutils for tbzr to use formatting bzr help topics as HTML
438
    packages.append('docutils') # html formatting
4634.48.1 by Alexander Belchenko
trivial improvement re collecting dependencies for QBzr.
439
    includes.append('win32event')  # for qsubprocess stuff
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
440
    # the qt binaries might not be on PATH...
4584.1.2 by John Arbash Meinel
Rework the setup.py a little bit, to support other versions of PyQt
441
    # They seem to install to a place like C:\Python25\PyQt4\*
442
    # Which is not the same as C:\Python25\Lib\site-packages\PyQt4
443
    pyqt_dir = os.path.join(sys.prefix, "PyQt4")
444
    pyqt_bin_dir = os.path.join(pyqt_dir, "bin")
445
    if os.path.isdir(pyqt_bin_dir):
446
        path = os.environ.get("PATH", "")
447
        if pyqt_bin_dir.lower() not in [p.lower() for p in path.split(os.pathsep)]:
448
            os.environ["PATH"] = path + os.pathsep + pyqt_bin_dir
449
    # also add all imageformat plugins to distribution
450
    # We will look in 2 places, dirname(PyQt4.__file__) and pyqt_dir
451
    base_dirs_to_check = []
452
    if os.path.isdir(pyqt_dir):
453
        base_dirs_to_check.append(pyqt_dir)
4584.1.1 by Alexander Belchenko
Bundle imageformats plugins for PyQt4 into bzr.exe installer to enable support of many image formats in QBzr.
454
    try:
455
        import PyQt4
456
    except ImportError:
4584.1.2 by John Arbash Meinel
Rework the setup.py a little bit, to support other versions of PyQt
457
        pass
458
    else:
459
        pyqt4_base_dir = os.path.dirname(PyQt4.__file__)
460
        if pyqt4_base_dir != pyqt_dir:
461
            base_dirs_to_check.append(pyqt4_base_dir)
462
    if not base_dirs_to_check:
463
        log.warn("Can't find PyQt4 installation -> not including imageformat"
464
                 " plugins")
465
    else:
466
        files = []
467
        for base_dir in base_dirs_to_check:
468
            plug_dir = os.path.join(base_dir, 'plugins', 'imageformats')
469
            if os.path.isdir(plug_dir):
470
                for fname in os.listdir(plug_dir):
471
                    # Include plugin dlls, but not debugging dlls
472
                    fullpath = os.path.join(plug_dir, fname)
473
                    if fname.endswith('.dll') and not fname.endswith('d4.dll'):
474
                        files.append(fullpath)
475
        if files:
476
            data_files.append(('imageformats', files))
477
        else:
478
            log.warn('PyQt4 was found, but we could not find any imageformat'
479
                     ' plugins. Are you sure your configuration is correct?')
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
480
1739.1.1 by Robert Collins
First cut at adding pyrex facilities.
481
3995.6.1 by John Arbash Meinel
add subvertpy as a necessary library.
482
def get_svn_py2exe_info(includes, excludes, packages):
483
    packages.append('subvertpy')
5116.1.2 by Ian Clatworthy
it's sqlite3, not just sqlite
484
    packages.append('sqlite3')
3995.6.1 by John Arbash Meinel
add subvertpy as a necessary library.
485
486
6318.1.1 by Martin Packman
Require the dulwich package when using py2exe with the git plugin enabled
487
def get_git_py2exe_info(includes, excludes, packages):
488
    packages.append('dulwich')
489
490
5050.76.1 by John Arbash Meinel
Make sure the 'python-fastimport' package gets bundled with the py2exe code.
491
def get_fastimport_py2exe_info(includes, excludes, packages):
492
    # This is the python-fastimport package, not to be confused with the
493
    # bzr-fastimport plugin.
494
    packages.append('fastimport')
495
496
1860.1.2 by Alexander Belchenko
setup.py:
497
if 'bdist_wininst' in sys.argv:
2691.1.18 by Alexander Belchenko
teach windows python installer to find docs in all subdirectories
498
    def find_docs():
499
        docs = []
500
        for root, dirs, files in os.walk('doc'):
501
            r = []
502
            for f in files:
3224.2.1 by Alexander Belchenko
(bialix) Include quick-start-summary.svg file to python-based installer for Windows (bug #192924)
503
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
504
                    or f == 'quick-start-summary.svg'):
2691.1.18 by Alexander Belchenko
teach windows python installer to find docs in all subdirectories
505
                    r.append(os.path.join(root, f))
506
            if r:
507
                relative = root[4:]
508
                if relative:
509
                    target = os.path.join('Doc\\Bazaar', relative)
510
                else:
511
                    target = 'Doc\\Bazaar'
512
                docs.append((target, r))
513
        return docs
514
1860.1.2 by Alexander Belchenko
setup.py:
515
    # python's distutils-based win32 installer
516
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
2571.3.1 by Alexander Belchenko
Building Python-based installer for bot Python 2.4 and 2.5
517
            'ext_modules': ext_modules,
6093.3.4 by Jonathan Riddell
install .mo files into bzrlib for standalone windows installer
518
            # help pages
519
            'data_files': find_docs(),
2571.3.1 by Alexander Belchenko
Building Python-based installer for bot Python 2.4 and 2.5
520
            # for building pyrex extensions
5918.1.2 by John Arbash Meinel
Pass the build_mo command class to more of the setup() calls.
521
            'cmdclass': command_classes,
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
522
           }
1821.1.2 by Alexander Belchenko
resurrected python's distutils based installer for win32
523
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
524
    ARGS.update(META_INFO)
525
    ARGS.update(BZRLIB)
6093.3.4 by Jonathan Riddell
install .mo files into bzrlib for standalone windows installer
526
    PKG_DATA['package_data']['bzrlib'].append('locale/*/LC_MESSAGES/*.mo')
1911.1.1 by Alexander Belchenko
setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data
527
    ARGS.update(PKG_DATA)
5918.1.2 by John Arbash Meinel
Pass the build_mo command class to more of the setup() calls.
528
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
529
    setup(**ARGS)
530
1860.1.2 by Alexander Belchenko
setup.py:
531
elif 'py2exe' in sys.argv:
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
532
    # py2exe setup
533
    import py2exe
534
535
    # pick real bzr version
536
    import bzrlib
537
538
    version_number = []
539
    for i in bzrlib.version_info[:4]:
540
        try:
541
            i = int(i)
542
        except ValueError:
543
            i = 0
544
        version_number.append(str(i))
545
    version_str = '.'.join(version_number)
546
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
547
    # An override to install_data used only by py2exe builds, which arranges
548
    # to byte-compile any .py files in data_files (eg, our plugins)
549
    # Necessary as we can't rely on the user having the relevant permissions
550
    # to the "Program Files" directory to generate them on the fly.
551
    class install_data_with_bytecompile(install_data):
552
        def run(self):
553
            from distutils.util import byte_compile
554
555
            install_data.run(self)
556
557
            py2exe = self.distribution.get_command_obj('py2exe', False)
5195.5.1 by Martin
Build windows standalone installer with docstrings stripped
558
            # GZ 2010-04-19: Setup has py2exe.optimize as 2, but give plugins
559
            #                time before living with docstring stripping
560
            optimize = 1
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
561
            compile_names = [f for f in self.outfiles if f.endswith('.py')]
5331.2.1 by Martin
For windows installer plugin script files, round mtime to make happy FAT
562
            # Round mtime to nearest even second so that installing on a FAT
563
            # filesystem bytecode internal and script timestamps will match
564
            for f in compile_names:
565
                mtime = os.stat(f).st_mtime
5331.2.2 by Martin
Use same timestamp rounding logic as Inno, just in case
566
                remainder = mtime % 2
567
                if remainder:
568
                    mtime -= remainder
5331.2.1 by Martin
For windows installer plugin script files, round mtime to make happy FAT
569
                    os.utime(f, (mtime, mtime))
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
570
            byte_compile(compile_names,
571
                         optimize=optimize,
572
                         force=self.force, prefix=self.install_dir,
573
                         dry_run=self.dry_run)
5195.5.1 by Martin
Build windows standalone installer with docstrings stripped
574
            self.outfiles.extend([f + 'o' for f in compile_names])
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
575
    # end of class install_data_with_bytecompile
576
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
577
    target = py2exe.build_exe.Target(script = "bzr",
578
                                     dest_base = "bzr",
579
                                     icon_resources = [(0,'bzr.ico')],
580
                                     name = META_INFO['name'],
581
                                     version = version_str,
582
                                     description = META_INFO['description'],
583
                                     author = META_INFO['author'],
4797.36.2 by Ian Clatworthy
tweak project URL and copyright years
584
                                     copyright = "(c) Canonical Ltd, 2005-2010",
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
585
                                     company_name = "Canonical Ltd.",
586
                                     comments = META_INFO['description'],
587
                                    )
5340.4.1 by Gary van der Merwe
Add bzrw as gui_target.
588
    gui_target = copy.copy(target)
589
    gui_target.dest_base = "bzrw"
2231.1.1 by Alexander Belchenko
Python 2.5 fixes for win32 installer
590
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
591
    packages = BZRLIB['packages']
592
    packages.remove('bzrlib')
593
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
594
    includes = []
595
    for i in glob.glob('bzrlib\\*.py'):
596
        module = i[:-3].replace('\\', '.')
3193.7.9 by Alexander Belchenko
Ian's review
597
        if module.endswith('__init__'):
598
            module = module[:-len('__init__')]
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
599
        includes.append(module)
600
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
601
    additional_packages = set()
2231.1.1 by Alexander Belchenko
Python 2.5 fixes for win32 installer
602
    if sys.version.startswith('2.4'):
603
        # adding elementtree package
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
604
        additional_packages.add('elementtree')
5111.1.1 by Ian Clatworthy
Support Python 2.6 in our py2exe scripts
605
    elif sys.version.startswith('2.6') or sys.version.startswith('2.5'):
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
606
        additional_packages.add('xml.etree')
2234.5.2 by Wouter van Heyst
(Alexander Belchenko) add windows installer check for python2.5
607
    else:
608
        import warnings
609
        warnings.warn('Unknown Python version.\n'
610
                      'Please check setup.py script for compatibility.')
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
611
612
    # Although we currently can't enforce it, we consider it an error for
613
    # py2exe to report any files are "missing".  Such modules we know aren't
614
    # used should be listed here.
615
    excludes = """Tkinter psyco ElementPath r_hmac
616
                  ImaginaryModule cElementTree elementtree.ElementTree
617
                  Crypto.PublicKey._fastmath
618
                  medusa medusa.filesys medusa.ftp_server
4070.11.12 by Martin Pool
Move tools.doc_generate into bzrlib
619
                  tools
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
620
                  resource validate""".split()
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
621
    dll_excludes = []
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
622
2571.3.2 by Alexander Belchenko
Build pyrex/C extensions for bzr.exe
623
    # email package from std python library use lazy import,
624
    # so we need to explicitly add all package
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
625
    additional_packages.add('email')
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
626
    # And it uses funky mappings to conver to 'Oldname' to 'newname'.  As
627
    # a result, packages like 'email.Parser' show as missing.  Tell py2exe
628
    # to exclude them.
629
    import email
630
    for oldname in getattr(email, '_LOWERNAMES', []):
631
        excludes.append("email." + oldname)
632
    for oldname in getattr(email, '_MIMENAMES', []):
633
        excludes.append("email.MIME" + oldname)
2231.1.1 by Alexander Belchenko
Python 2.5 fixes for win32 installer
634
3087.2.4 by Alexander Belchenko
Help topics can now be loaded from files (based on Ian's patch, adapted to proper support various windows installers).
635
    # text files for help topis
3089.3.6 by Ian Clatworthy
make help topics more discoverable
636
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
637
    topics_files = [('lib/help_topics/en', text_topics)]
638
639
    # built-in plugins
640
    plugins_files = []
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
641
    # XXX - should we consider having the concept of an 'official' build,
642
    # which hard-codes the list of plugins, gets more upset if modules are
643
    # missing, etc?
644
    plugins = None # will be a set after plugin sniffing...
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
645
    for root, dirs, files in os.walk('bzrlib/plugins'):
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
646
        if root == 'bzrlib/plugins':
647
            plugins = set(dirs)
3871.1.7 by Mark Hammond
change comment as requested by John
648
            # We ship plugins as normal files on the file-system - however,
649
            # the build process can cause *some* of these plugin files to end
650
            # up in library.zip. Thus, we saw (eg) "plugins/svn/test" in
651
            # library.zip, and then saw import errors related to that as the
652
            # rest of the svn plugin wasn't. So we tell py2exe to leave the
653
            # plugins out of the .zip file
3871.1.6 by Mark Hammond
remerge setup changes
654
            excludes.extend(["bzrlib.plugins." + d for d in dirs])
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
655
        x = []
656
        for i in files:
4797.36.1 by Ian Clatworthy
Fix plugin data file packaging
657
            # Throw away files we don't want packaged. Note that plugins may
658
            # have data files with all sorts of extensions so we need to
659
            # be conservative here about what we ditch.
660
            ext = os.path.splitext(i)[1]
661
            if ext.endswith('~') or ext in [".pyc", ".swp"]:
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
662
                continue
663
            if i == '__init__.py' and root == 'bzrlib/plugins':
664
                continue
665
            x.append(os.path.join(root, i))
666
        if x:
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
667
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
668
            plugins_files.append((target_dir, x))
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
669
    # find modules for built-in plugins
670
    import tools.package_mf
671
    mf = tools.package_mf.CustomModuleFinder()
672
    mf.run_package('bzrlib/plugins')
673
    packs, mods = mf.get_result()
674
    additional_packages.update(packs)
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
675
    includes.extend(mods)
676
677
    console_targets = [target,
678
                       'tools/win32/bzr_postinstall.py',
679
                       ]
5340.4.1 by Gary van der Merwe
Add bzrw as gui_target.
680
    gui_targets = [gui_target]
6093.3.1 by Jonathan Riddell
install .mo translation files
681
    data_files = topics_files + plugins_files + I18N_FILES
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
682
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
683
    if 'qbzr' in plugins:
4584.1.1 by Alexander Belchenko
Bundle imageformats plugins for PyQt4 into bzr.exe installer to enable support of many image formats in QBzr.
684
        get_qbzr_py2exe_info(includes, excludes, packages, data_files)
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
685
3995.6.1 by John Arbash Meinel
add subvertpy as a necessary library.
686
    if 'svn' in plugins:
687
        get_svn_py2exe_info(includes, excludes, packages)
688
6318.1.1 by Martin Packman
Require the dulwich package when using py2exe with the git plugin enabled
689
    if 'git' in plugins:
690
        get_git_py2exe_info(includes, excludes, packages)
691
5050.76.1 by John Arbash Meinel
Make sure the 'python-fastimport' package gets bundled with the py2exe code.
692
    if 'fastimport' in plugins:
693
        get_fastimport_py2exe_info(includes, excludes, packages)
694
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
695
    if "TBZR" in os.environ:
3565.5.9 by Mark Hammond
Address John's review comments
696
        # TORTOISE_OVERLAYS_MSI_WIN32 must be set to the location of the
697
        # TortoiseOverlays MSI installer file. It is in the TSVN svn repo and
698
        # can be downloaded from (username=guest, blank password):
4343.2.1 by John Arbash Meinel
Give a better error message when we cannot find the TortoiseOverlays files.
699
        # http://tortoisesvn.tigris.org/svn/tortoisesvn/TortoiseOverlays
700
        # look for: version-1.0.4/bin/TortoiseOverlays-1.0.4.11886-win32.msi
3871.1.6 by Mark Hammond
remerge setup changes
701
        # Ditto for TORTOISE_OVERLAYS_MSI_X64, pointing at *-x64.msi.
702
        for needed in ('TORTOISE_OVERLAYS_MSI_WIN32',
703
                       'TORTOISE_OVERLAYS_MSI_X64'):
4343.2.1 by John Arbash Meinel
Give a better error message when we cannot find the TortoiseOverlays files.
704
            url = ('http://guest:@tortoisesvn.tigris.org/svn/tortoisesvn'
705
                   '/TortoiseOverlays')
3871.1.6 by Mark Hammond
remerge setup changes
706
            if not os.path.isfile(os.environ.get(needed, '<nofile>')):
4343.2.1 by John Arbash Meinel
Give a better error message when we cannot find the TortoiseOverlays files.
707
                raise RuntimeError(
708
                    "\nPlease set %s to the location of the relevant"
709
                    "\nTortoiseOverlays .msi installer file."
710
                    " The installers can be found at"
711
                    "\n  %s"
712
                    "\ncheck in the version-X.Y.Z/bin/ subdir" % (needed, url))
3565.5.6 by Mark Hammond
move tbzr and qbzr py2exe config code into their own functions.
713
        get_tbzr_py2exe_info(includes, excludes, packages, console_targets,
3871.1.6 by Mark Hammond
remerge setup changes
714
                             gui_targets, data_files)
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
715
    else:
716
        # print this warning to stderr as output is redirected, so it is seen
717
        # at build time.  Also to stdout so it appears in the log
718
        for f in (sys.stderr, sys.stdout):
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
719
            f.write("Skipping TBZR binaries - "
720
                "please set TBZR to a directory to enable\n")
3193.7.3 by Alexander Belchenko
bzr.exe: move builtin plugins (launchpad, multiparent) out of library.zip to plugins directory
721
3514.1.1 by John Arbash Meinel
Updates to allow building with mingw, and to exclude Vista system dlls
722
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
723
    # in on Vista.
5050.35.3 by Gary van der Merwe
Exclude MSVCP90.dll from py2exe builds.
724
    dll_excludes.extend(["MSWSOCK.dll",
725
                         "MSVCP60.dll",
726
                         "MSVCP90.dll",
5524.2.1 by Gary van der Merwe
Exclude SHFOLDER.dll from py2exe builds, as it breaks subvertpy.
727
                         "powrprof.dll",
728
                         "SHFOLDER.dll"])
3193.7.7 by Alexander Belchenko
custom module finder to find additional dependencies for built-in plugins (to bundle additional packages and modules into bzr.exe's library.zip)
729
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
3565.5.1 by Mark Hammond
merge setup.py changes for tbzr
730
                               "includes": includes,
731
                               "excludes": excludes,
3565.5.4 by Mark Hammond
byte-compile plugins; tweaks so qbzr and bzrsvn can be packaged.
732
                               "dll_excludes": dll_excludes,
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
733
                               "dist_dir": "win32_bzr.exe",
5195.5.1 by Martin
Build windows standalone installer with docstrings stripped
734
                               "optimize": 2,
5340.5.1 by Gary van der Merwe
Move boot_common.py => tools/win32/py2exe_boot_common.py
735
                               "custom_boot_script":
736
                                        "tools/win32/py2exe_boot_common.py",
1821.1.1 by Alexander Belchenko
win32 installer for bzr.dev.0.9
737
                              },
738
                   }
5340.1.2 by Martin
Hack py2exe so that we can have a library.zip built with optimize=2, but every thing else has optimize=1.
739
5340.1.4 by Gary van der Merwe
Add comment about why this change is done.
740
    # We want the libaray.zip to have optimize = 2, but the exe to have
741
    # optimize = 1, so that .py files that get compilied at run time
742
    # (e.g. user installed plugins) dont have their doc strings removed.
5340.1.2 by Martin
Hack py2exe so that we can have a library.zip built with optimize=2, but every thing else has optimize=1.
743
    class py2exe_no_oo_exe(py2exe.build_exe.py2exe):
5340.1.3 by Gary van der Merwe
Fix prev rev.
744
        def build_executable(self, *args, **kwargs):
5340.1.2 by Martin
Hack py2exe so that we can have a library.zip built with optimize=2, but every thing else has optimize=1.
745
            self.optimize = 1
5340.1.3 by Gary van der Merwe
Fix prev rev.
746
            py2exe.build_exe.py2exe.build_executable(self, *args, **kwargs)
5340.1.2 by Martin
Hack py2exe so that we can have a library.zip built with optimize=2, but every thing else has optimize=1.
747
            self.optimize = 2
748
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
749
    if __name__ == '__main__':
5918.1.2 by John Arbash Meinel
Pass the build_mo command class to more of the setup() calls.
750
        command_classes['install_data'] = install_data_with_bytecompile
751
        command_classes['py2exe'] = py2exe_no_oo_exe
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
752
        setup(options=options_list,
753
              console=console_targets,
754
              windows=gui_targets,
755
              zipfile='lib/library.zip',
756
              data_files=data_files,
5918.1.2 by John Arbash Meinel
Pass the build_mo command class to more of the setup() calls.
757
              cmdclass=command_classes,
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
758
              )
1860.1.2 by Alexander Belchenko
setup.py:
759
760
else:
2662.1.1 by Alexander Belchenko
allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)
761
    # ad-hoc for easy_install
762
    DATA_FILES = []
763
    if not 'bdist_egg' in sys.argv:
4459.2.1 by Vincent Ladeuil
Use a consistent scheme for naming pyrex source files.
764
        # generate and install bzr.1 only with plain install, not the
765
        # easy_install one
2662.1.1 by Alexander Belchenko
allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)
766
        DATA_FILES = [('man/man1', ['bzr.1'])]
767
6093.3.1 by Jonathan Riddell
install .mo translation files
768
    DATA_FILES = DATA_FILES + I18N_FILES
1860.1.2 by Alexander Belchenko
setup.py:
769
    # std setup
770
    ARGS = {'scripts': ['bzr'],
2662.1.1 by Alexander Belchenko
allow ``easy_install bzr`` runs without fatal errors. (Alexander Belchenko, #125521)
771
            'data_files': DATA_FILES,
1739.1.3 by Robert Collins
Merge bzr.dev.
772
            'cmdclass': command_classes,
773
            'ext_modules': ext_modules,
1860.1.2 by Alexander Belchenko
setup.py:
774
           }
2666.2.1 by Alexander Belchenko
change generated documentation extension from htm to html
775
1860.1.2 by Alexander Belchenko
setup.py:
776
    ARGS.update(META_INFO)
777
    ARGS.update(BZRLIB)
1911.1.1 by Alexander Belchenko
setup.py: need to install data files for selftest from bzrlib/tests/test_patched_data
778
    ARGS.update(PKG_DATA)
1860.1.2 by Alexander Belchenko
setup.py:
779
5311.3.1 by Robert Collins
Make setup.py python 3.1 compatible.
780
    if __name__ == '__main__':
781
        setup(**ARGS)