~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-04-07 07:52:50 UTC
  • mfrom: (3340.1.1 208418-1.4)
  • Revision ID: pqm@pqm.ubuntu.com-20080407075250-phs53xnslo8boaeo
Return the correct knit serialisation method in _StreamAccess.
        (Andrew Bennetts, Martin Pool, Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
"""
8
8
 
9
9
import os
 
10
import os.path
10
11
import sys
11
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...
12
20
import bzrlib
13
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
 
14
32
##
15
33
# META INFORMATION FOR SETUP
16
 
 
17
 
META_INFO = {'name':         'bzr',
18
 
             'version':      bzrlib.__version__,
19
 
             'author':       'Canonical Ltd',
20
 
             'author_email': 'bazaar@lists.canonical.com',
21
 
             'url':          'http://www.bazaar-vcs.org/',
22
 
             'description':  'Friendly distributed version control system',
23
 
             'license':      'GNU GPL v2',
24
 
            }
 
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
    }
25
59
 
26
60
# The list of packages is automatically generated later. Add other things
27
61
# that are part of BZRLIB here.
30
64
PKG_DATA = {# install files from selftest suite
31
65
            'package_data': {'bzrlib': ['doc/api/*.txt',
32
66
                                        'tests/test_patches_data/*',
 
67
                                        'help_topics/en/*.txt',
33
68
                                       ]},
34
69
           }
35
70
 
36
 
######################################################################
37
 
# Reinvocation stolen from bzr, we need python2.4 by virtue of bzr_man
38
 
# including bzrlib.help
39
 
 
40
 
try:
41
 
    version_info = sys.version_info
42
 
except AttributeError:
43
 
    version_info = 1, 5 # 1.5 or older
44
 
 
45
 
REINVOKE = "__BZR_REINVOKE"
46
 
NEED_VERS = (2, 4)
47
 
KNOWN_PYTHONS = ('python2.4',)
48
 
 
49
 
if version_info < NEED_VERS:
50
 
    if not os.environ.has_key(REINVOKE):
51
 
        # mutating os.environ doesn't work in old Pythons
52
 
        os.putenv(REINVOKE, "1")
53
 
        for python in KNOWN_PYTHONS:
54
 
            try:
55
 
                os.execvp(python, [python] + sys.argv)
56
 
            except OSError:
57
 
                pass
58
 
    print >>sys.stderr, "bzr: error: cannot find a suitable python interpreter"
59
 
    print >>sys.stderr, "  (need %d.%d or later)" % NEED_VERS
60
 
    sys.exit(1)
61
 
if getattr(os, "unsetenv", None) is not None:
62
 
    os.unsetenv(REINVOKE)
63
 
 
64
71
 
65
72
def get_bzrlib_packages():
66
73
    """Recurse through the bzrlib directory, and extract the package names"""
103
110
 
104
111
        if sys.platform == "win32":
105
112
            try:
106
 
                scripts_dir = self.install_dir
 
113
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
107
114
                script_path = self._quoted_path(os.path.join(scripts_dir,
108
115
                                                             "bzr"))
109
116
                python_exe = self._quoted_path(sys.executable)
110
117
                args = self._win_batch_args()
111
118
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
112
 
                batch_path = script_path + ".bat"
 
119
                batch_path = os.path.join(self.install_dir, "bzr.bat")
113
120
                f = file(batch_path, "w")
114
121
                f.write(batch_str)
115
122
                f.close()
148
155
########################
149
156
 
150
157
command_classes = {'install_scripts': my_install_scripts,
151
 
                  'build': bzr_build}
 
158
                   'build': bzr_build}
 
159
from distutils import log
 
160
from distutils.errors import CCompilerError, DistutilsPlatformError
 
161
from distutils.extension import Extension
152
162
ext_modules = []
153
163
try:
154
164
    from Pyrex.Distutils import build_ext
155
165
except ImportError:
 
166
    have_pyrex = False
156
167
    # try to build the extension from the prior generated source.
157
 
    print ("Pyrex not available, while bzr will build, "
158
 
           "you cannot modify the C extensions.")
 
168
    print
 
169
    print ("The python package 'Pyrex' is not available."
 
170
           " If the .c files are available,")
 
171
    print ("they will be built,"
 
172
           " but modifying the .pyx files will not rebuild them.")
 
173
    print
159
174
    from distutils.command.build_ext import build_ext
160
 
    from distutils.extension import Extension
161
 
    ext_modules.extend([
162
 
        Extension("bzrlib.compiled.dirstate_helpers",
163
 
                  ["bzrlib/compiled/dirstate_helpers.c"],
164
 
                  libraries=[],
165
 
                  ),
166
 
    ])
167
175
else:
168
 
    from distutils.extension import Extension
169
 
    ext_modules.extend([
170
 
        Extension("bzrlib.compiled.dirstate_helpers",
171
 
                  ["bzrlib/compiled/dirstate_helpers.pyx"],
172
 
                  libraries=[],
173
 
                  ),
174
 
    ])
175
 
command_classes['build_ext'] = build_ext
 
176
    have_pyrex = True
 
177
 
 
178
 
 
179
class build_ext_if_possible(build_ext):
 
180
 
 
181
    def run(self):
 
182
        try:
 
183
            build_ext.run(self)
 
184
        except DistutilsPlatformError, e:
 
185
            log.warn(str(e))
 
186
            log.warn('Extensions cannot be built, '
 
187
                     'will use the Python versions instead')
 
188
 
 
189
    def build_extension(self, ext):
 
190
        try:
 
191
            build_ext.build_extension(self, ext)
 
192
        except CCompilerError:
 
193
            log.warn('Building of "%s" extension failed, '
 
194
                     'will use the Python version instead' % (ext.name,))
 
195
 
 
196
 
 
197
# Override the build_ext if we have Pyrex available
 
198
command_classes['build_ext'] = build_ext_if_possible
 
199
unavailable_files = []
 
200
 
 
201
 
 
202
def add_pyrex_extension(module_name, **kwargs):
 
203
    """Add a pyrex module to build.
 
204
 
 
205
    This will use Pyrex to auto-generate the .c file if it is available.
 
206
    Otherwise it will fall back on the .c file. If the .c file is not
 
207
    available, it will warn, and not add anything.
 
208
 
 
209
    You can pass any extra options to Extension through kwargs. One example is
 
210
    'libraries = []'.
 
211
 
 
212
    :param module_name: The python path to the module. This will be used to
 
213
        determine the .pyx and .c files to use.
 
214
    """
 
215
    path = module_name.replace('.', '/')
 
216
    pyrex_name = path + '.pyx'
 
217
    c_name = path + '.c'
 
218
    if have_pyrex:
 
219
        ext_modules.append(Extension(module_name, [pyrex_name]))
 
220
    else:
 
221
        if not os.path.isfile(c_name):
 
222
            unavailable_files.append(c_name)
 
223
        else:
 
224
            ext_modules.append(Extension(module_name, [c_name]))
 
225
 
 
226
 
 
227
add_pyrex_extension('bzrlib._dirstate_helpers_c')
 
228
add_pyrex_extension('bzrlib._knit_load_data_c')
 
229
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
 
230
 
 
231
 
 
232
if unavailable_files:
 
233
    print 'C extension(s) not found:'
 
234
    print '   %s' % ('\n  '.join(unavailable_files),)
 
235
    print 'The python versions will be used instead.'
 
236
    print
 
237
 
176
238
 
177
239
if 'bdist_wininst' in sys.argv:
178
 
    import glob
179
 
    # doc files
180
 
    docs = glob.glob('doc/*.htm') + ['doc/default.css']
 
240
    def find_docs():
 
241
        docs = []
 
242
        for root, dirs, files in os.walk('doc'):
 
243
            r = []
 
244
            for f in files:
 
245
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
 
246
                    or f == 'quick-start-summary.svg'):
 
247
                    r.append(os.path.join(root, f))
 
248
            if r:
 
249
                relative = root[4:]
 
250
                if relative:
 
251
                    target = os.path.join('Doc\\Bazaar', relative)
 
252
                else:
 
253
                    target = 'Doc\\Bazaar'
 
254
                docs.append((target, r))
 
255
        return docs
 
256
 
181
257
    # python's distutils-based win32 installer
182
258
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
259
            'ext_modules': ext_modules,
183
260
            # help pages
184
 
            'data_files': [('Doc/Bazaar', docs)],
 
261
            'data_files': find_docs(),
 
262
            # for building pyrex extensions
 
263
            'cmdclass': {'build_ext': build_ext_if_possible},
185
264
           }
186
265
 
187
266
    ARGS.update(META_INFO)
191
270
    setup(**ARGS)
192
271
 
193
272
elif 'py2exe' in sys.argv:
 
273
    import glob
194
274
    # py2exe setup
195
275
    import py2exe
196
276
 
218
298
                                     comments = META_INFO['description'],
219
299
                                    )
220
300
 
221
 
    additional_packages =  []
 
301
    packages = BZRLIB['packages']
 
302
    packages.remove('bzrlib')
 
303
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
 
304
    includes = []
 
305
    for i in glob.glob('bzrlib\\*.py'):
 
306
        module = i[:-3].replace('\\', '.')
 
307
        if module.endswith('__init__'):
 
308
            module = module[:-len('__init__')]
 
309
        includes.append(module)
 
310
 
 
311
    additional_packages = set()
222
312
    if sys.version.startswith('2.4'):
223
313
        # adding elementtree package
224
 
        additional_packages.append('elementtree')
 
314
        additional_packages.add('elementtree')
225
315
    elif sys.version.startswith('2.5'):
226
 
        additional_packages.append('xml.etree')
 
316
        additional_packages.add('xml.etree')
227
317
    else:
228
318
        import warnings
229
319
        warnings.warn('Unknown Python version.\n'
230
320
                      'Please check setup.py script for compatibility.')
231
 
 
232
 
    options_list = {"py2exe": {"packages": BZRLIB['packages'] +
233
 
                                           additional_packages,
234
 
                               "excludes": ["Tkinter", "medusa"],
 
321
    # email package from std python library use lazy import,
 
322
    # so we need to explicitly add all package
 
323
    additional_packages.add('email')
 
324
 
 
325
    # text files for help topis
 
326
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
327
    topics_files = [('lib/help_topics/en', text_topics)]
 
328
 
 
329
    # built-in plugins
 
330
    plugins_files = []
 
331
    for root, dirs, files in os.walk('bzrlib/plugins'):
 
332
        x = []
 
333
        for i in files:
 
334
            if not i.endswith('.py'):
 
335
                continue
 
336
            if i == '__init__.py' and root == 'bzrlib/plugins':
 
337
                continue
 
338
            x.append(os.path.join(root, i))
 
339
        if x:
 
340
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
 
341
            plugins_files.append((target_dir, x))
 
342
    # find modules for built-in plugins
 
343
    import tools.package_mf
 
344
    mf = tools.package_mf.CustomModuleFinder()
 
345
    mf.run_package('bzrlib/plugins')
 
346
    packs, mods = mf.get_result()
 
347
    additional_packages.update(packs)
 
348
 
 
349
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
 
350
                               "includes": includes + mods,
 
351
                               "excludes": ["Tkinter", "medusa", "tools"],
235
352
                               "dist_dir": "win32_bzr.exe",
236
353
                              },
237
354
                   }
239
356
          console=[target,
240
357
                   'tools/win32/bzr_postinstall.py',
241
358
                  ],
242
 
          zipfile='lib/library.zip')
 
359
          zipfile='lib/library.zip',
 
360
          data_files=topics_files + plugins_files,
 
361
          )
243
362
 
244
363
else:
 
364
    # ad-hoc for easy_install
 
365
    DATA_FILES = []
 
366
    if not 'bdist_egg' in sys.argv:
 
367
        # generate and install bzr.1 only with plain install, not easy_install one
 
368
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
369
 
245
370
    # std setup
246
371
    ARGS = {'scripts': ['bzr'],
247
 
            'data_files': [('man/man1', ['bzr.1'])],
 
372
            'data_files': DATA_FILES,
248
373
            'cmdclass': command_classes,
249
374
            'ext_modules': ext_modules,
250
375
           }
251
 
    
 
376
 
252
377
    ARGS.update(META_INFO)
253
378
    ARGS.update(BZRLIB)
254
379
    ARGS.update(PKG_DATA)