/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: Canonical.com Patch Queue Manager
  • Date: 2008-01-16 05:39:13 UTC
  • mfrom: (1551.19.27 Aaron's mergeable stuff)
  • Revision ID: pqm@pqm.ubuntu.com-20080116053913-ny7sihxkms5v6d7j
Merge now uses the submit_branch by default (abentley)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#! /usr/bin/env python
2
2
 
3
 
# This is an installation script for bzr.  Run it with
4
 
# './setup.py install', or
5
 
# './setup.py --help' for more options
6
 
 
 
3
"""Installation script for bzr.
 
4
Run it with
 
5
 './setup.py install', or
 
6
 './setup.py --help' for more options
 
7
"""
 
8
 
 
9
import os
 
10
import sys
 
11
 
 
12
import bzrlib
 
13
 
 
14
##
 
15
# 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
            }
 
25
 
 
26
# The list of packages is automatically generated later. Add other things
 
27
# that are part of BZRLIB here.
 
28
BZRLIB = {}
 
29
 
 
30
PKG_DATA = {# install files from selftest suite
 
31
            'package_data': {'bzrlib': ['doc/api/*.txt',
 
32
                                        'tests/test_patches_data/*',
 
33
                                        'help_topics/en/*.txt',
 
34
                                       ]},
 
35
           }
 
36
 
 
37
######################################################################
7
38
# Reinvocation stolen from bzr, we need python2.4 by virtue of bzr_man
8
39
# including bzrlib.help
9
40
 
10
 
import os, sys
11
 
 
12
41
try:
13
42
    version_info = sys.version_info
14
43
except AttributeError:
27
56
                os.execvp(python, [python] + sys.argv)
28
57
            except OSError:
29
58
                pass
30
 
    print >>sys.stderr, "bzr: error: cannot find a suitable python interpreter"
31
 
    print >>sys.stderr, "  (need %d.%d or later)" % NEED_VERS
 
59
    sys.stderr.write("bzr: error: cannot find a suitable python interpreter\n")
 
60
    sys.stderr.write("  (need %d.%d or later)" % NEED_VERS)
 
61
    sys.stderr.write('\n')
32
62
    sys.exit(1)
33
 
if hasattr(os, "unsetenv"):
 
63
if getattr(os, "unsetenv", None) is not None:
34
64
    os.unsetenv(REINVOKE)
35
65
 
36
66
 
 
67
def get_bzrlib_packages():
 
68
    """Recurse through the bzrlib directory, and extract the package names"""
 
69
 
 
70
    packages = []
 
71
    base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
 
72
    for root, dirs, files in os.walk(base_path):
 
73
        if '__init__.py' in files:
 
74
            assert root.startswith(base_path)
 
75
            # Get just the path below bzrlib
 
76
            package_path = root[len(base_path):]
 
77
            # Remove leading and trailing slashes
 
78
            package_path = package_path.strip('\\/')
 
79
            if not package_path:
 
80
                package_name = 'bzrlib'
 
81
            else:
 
82
                package_name = ('bzrlib.' +
 
83
                            package_path.replace('/', '.').replace('\\', '.'))
 
84
            packages.append(package_name)
 
85
    return sorted(packages)
 
86
 
 
87
 
 
88
BZRLIB['packages'] = get_bzrlib_packages()
 
89
 
 
90
 
37
91
from distutils.core import setup
38
92
from distutils.command.install_scripts import install_scripts
39
93
from distutils.command.build import build
47
101
    Create bzr.bat for win32.
48
102
    """
49
103
    def run(self):
50
 
        import os
51
 
        import sys
52
 
 
53
104
        install_scripts.run(self)   # standard action
54
105
 
55
106
        if sys.platform == "win32":
56
107
            try:
57
 
                scripts_dir = self.install_dir
58
 
                script_path = os.path.join(scripts_dir, "bzr")
59
 
                batch_str = "@%s %s %%*\n" % (sys.executable, script_path)
60
 
                batch_path = script_path + ".bat"
 
108
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
 
109
                script_path = self._quoted_path(os.path.join(scripts_dir,
 
110
                                                             "bzr"))
 
111
                python_exe = self._quoted_path(sys.executable)
 
112
                args = self._win_batch_args()
 
113
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
 
114
                batch_path = os.path.join(self.install_dir, "bzr.bat")
61
115
                f = file(batch_path, "w")
62
116
                f.write(batch_str)
63
117
                f.close()
65
119
            except Exception, e:
66
120
                print "ERROR: Unable to create %s: %s" % (batch_path, e)
67
121
 
 
122
    def _quoted_path(self, path):
 
123
        if ' ' in path:
 
124
            return '"' + path + '"'
 
125
        else:
 
126
            return path
 
127
 
 
128
    def _win_batch_args(self):
 
129
        from bzrlib.win32utils import winver
 
130
        if winver == 'Windows NT':
 
131
            return '%*'
 
132
        else:
 
133
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
 
134
#/class my_install_scripts
 
135
 
68
136
 
69
137
class bzr_build(build):
70
138
    """Customized build distutils action.
76
144
        import generate_docs
77
145
        generate_docs.main(argv=["bzr", "man"])
78
146
 
 
147
 
79
148
########################
80
149
## Setup
81
150
########################
82
151
 
83
 
setup(name='bzr',
84
 
      version='0.8pre',
85
 
      author='Martin Pool',
86
 
      author_email='mbp@sourcefrog.net',
87
 
      url='http://www.bazaar-ng.org/',
88
 
      description='Friendly distributed version control system',
89
 
      license='GNU GPL v2',
90
 
      packages=['bzrlib',
91
 
                'bzrlib.doc',
92
 
                'bzrlib.doc.api',
93
 
                'bzrlib.export',
94
 
                'bzrlib.plugins',
95
 
                'bzrlib.store',
96
 
                'bzrlib.store.revision',
97
 
                'bzrlib.store.versioned',
98
 
                'bzrlib.tests',
99
 
                'bzrlib.tests.blackbox',
100
 
                'bzrlib.tests.branch_implementations',
101
 
                'bzrlib.tests.bzrdir_implementations',
102
 
                'bzrlib.tests.interrepository_implementations',
103
 
                'bzrlib.tests.interversionedfile_implementations',
104
 
                'bzrlib.tests.repository_implementations',
105
 
                'bzrlib.tests.revisionstore_implementations',
106
 
                'bzrlib.tests.workingtree_implementations',
107
 
                'bzrlib.transport',
108
 
                'bzrlib.transport.http',
109
 
                'bzrlib.ui',
110
 
                'bzrlib.util',
111
 
                'bzrlib.util.elementtree',
112
 
                'bzrlib.util.effbot.org',
113
 
                'bzrlib.util.configobj',
114
 
                ],
115
 
      scripts=['bzr'],
116
 
      cmdclass={'install_scripts': my_install_scripts, 'build': bzr_build},
117
 
      data_files=[('man/man1', ['bzr.1'])],
118
 
    #   todo: install the txt files from bzrlib.doc.api.
119
 
     )
 
152
command_classes = {'install_scripts': my_install_scripts,
 
153
                   'build': bzr_build}
 
154
from distutils import log
 
155
from distutils.errors import CCompilerError, DistutilsPlatformError
 
156
from distutils.extension import Extension
 
157
ext_modules = []
 
158
try:
 
159
    from Pyrex.Distutils import build_ext
 
160
except ImportError:
 
161
    have_pyrex = False
 
162
    # try to build the extension from the prior generated source.
 
163
    print
 
164
    print ("The python package 'Pyrex' is not available."
 
165
           " If the .c files are available,")
 
166
    print ("they will be built,"
 
167
           " but modifying the .pyx files will not rebuild them.")
 
168
    print
 
169
    from distutils.command.build_ext import build_ext
 
170
else:
 
171
    have_pyrex = True
 
172
 
 
173
 
 
174
class build_ext_if_possible(build_ext):
 
175
 
 
176
    def run(self):
 
177
        try:
 
178
            build_ext.run(self)
 
179
        except DistutilsPlatformError, e:
 
180
            log.warn(str(e))
 
181
            log.warn('Extensions cannot be built, '
 
182
                     'will use the Python versions instead')
 
183
 
 
184
    def build_extension(self, ext):
 
185
        try:
 
186
            build_ext.build_extension(self, ext)
 
187
        except CCompilerError:
 
188
            log.warn('Building of "%s" extension failed, '
 
189
                     'will use the Python version instead' % (ext.name,))
 
190
 
 
191
 
 
192
# Override the build_ext if we have Pyrex available
 
193
command_classes['build_ext'] = build_ext_if_possible
 
194
unavailable_files = []
 
195
 
 
196
 
 
197
def add_pyrex_extension(module_name, **kwargs):
 
198
    """Add a pyrex module to build.
 
199
 
 
200
    This will use Pyrex to auto-generate the .c file if it is available.
 
201
    Otherwise it will fall back on the .c file. If the .c file is not
 
202
    available, it will warn, and not add anything.
 
203
 
 
204
    You can pass any extra options to Extension through kwargs. One example is
 
205
    'libraries = []'.
 
206
 
 
207
    :param module_name: The python path to the module. This will be used to
 
208
        determine the .pyx and .c files to use.
 
209
    """
 
210
    path = module_name.replace('.', '/')
 
211
    pyrex_name = path + '.pyx'
 
212
    c_name = path + '.c'
 
213
    if have_pyrex:
 
214
        ext_modules.append(Extension(module_name, [pyrex_name]))
 
215
    else:
 
216
        if not os.path.isfile(c_name):
 
217
            unavailable_files.append(c_name)
 
218
        else:
 
219
            ext_modules.append(Extension(module_name, [c_name]))
 
220
 
 
221
 
 
222
add_pyrex_extension('bzrlib._dirstate_helpers_c')
 
223
add_pyrex_extension('bzrlib._knit_load_data_c')
 
224
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
 
225
 
 
226
 
 
227
if unavailable_files:
 
228
    print 'C extension(s) not found:'
 
229
    print '   %s' % ('\n  '.join(unavailable_files),)
 
230
    print 'The python versions will be used instead.'
 
231
    print
 
232
 
 
233
 
 
234
if 'bdist_wininst' in sys.argv:
 
235
    def find_docs():
 
236
        docs = []
 
237
        for root, dirs, files in os.walk('doc'):
 
238
            r = []
 
239
            for f in files:
 
240
                if os.path.splitext(f)[1] in ('.html','.css','.png','.pdf'):
 
241
                    r.append(os.path.join(root, f))
 
242
            if r:
 
243
                relative = root[4:]
 
244
                if relative:
 
245
                    target = os.path.join('Doc\\Bazaar', relative)
 
246
                else:
 
247
                    target = 'Doc\\Bazaar'
 
248
                docs.append((target, r))
 
249
        return docs
 
250
 
 
251
    # python's distutils-based win32 installer
 
252
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
253
            'ext_modules': ext_modules,
 
254
            # help pages
 
255
            'data_files': find_docs(),
 
256
            # for building pyrex extensions
 
257
            'cmdclass': {'build_ext': build_ext_if_possible},
 
258
           }
 
259
 
 
260
    ARGS.update(META_INFO)
 
261
    ARGS.update(BZRLIB)
 
262
    ARGS.update(PKG_DATA)
 
263
    
 
264
    setup(**ARGS)
 
265
 
 
266
elif 'py2exe' in sys.argv:
 
267
    # py2exe setup
 
268
    import py2exe
 
269
 
 
270
    # pick real bzr version
 
271
    import bzrlib
 
272
 
 
273
    version_number = []
 
274
    for i in bzrlib.version_info[:4]:
 
275
        try:
 
276
            i = int(i)
 
277
        except ValueError:
 
278
            i = 0
 
279
        version_number.append(str(i))
 
280
    version_str = '.'.join(version_number)
 
281
 
 
282
    target = py2exe.build_exe.Target(script = "bzr",
 
283
                                     dest_base = "bzr",
 
284
                                     icon_resources = [(0,'bzr.ico')],
 
285
                                     name = META_INFO['name'],
 
286
                                     version = version_str,
 
287
                                     description = META_INFO['description'],
 
288
                                     author = META_INFO['author'],
 
289
                                     copyright = "(c) Canonical Ltd, 2005-2007",
 
290
                                     company_name = "Canonical Ltd.",
 
291
                                     comments = META_INFO['description'],
 
292
                                    )
 
293
 
 
294
    additional_packages =  []
 
295
    if sys.version.startswith('2.4'):
 
296
        # adding elementtree package
 
297
        additional_packages.append('elementtree')
 
298
    elif sys.version.startswith('2.5'):
 
299
        additional_packages.append('xml.etree')
 
300
    else:
 
301
        import warnings
 
302
        warnings.warn('Unknown Python version.\n'
 
303
                      'Please check setup.py script for compatibility.')
 
304
    # email package from std python library use lazy import,
 
305
    # so we need to explicitly add all package
 
306
    additional_packages.append('email')
 
307
 
 
308
    # text files for help topis
 
309
    import glob
 
310
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
311
 
 
312
    options_list = {"py2exe": {"packages": BZRLIB['packages'] +
 
313
                                           additional_packages,
 
314
                               "excludes": ["Tkinter", "medusa", "tools"],
 
315
                               "dist_dir": "win32_bzr.exe",
 
316
                              },
 
317
                   }
 
318
    setup(options=options_list,
 
319
          console=[target,
 
320
                   'tools/win32/bzr_postinstall.py',
 
321
                  ],
 
322
          zipfile='lib/library.zip',
 
323
          data_files=[('lib/help_topics/en', text_topics)],
 
324
          )
 
325
 
 
326
else:
 
327
    # ad-hoc for easy_install
 
328
    DATA_FILES = []
 
329
    if not 'bdist_egg' in sys.argv:
 
330
        # generate and install bzr.1 only with plain install, not easy_install one
 
331
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
332
 
 
333
    # std setup
 
334
    ARGS = {'scripts': ['bzr'],
 
335
            'data_files': DATA_FILES,
 
336
            'cmdclass': command_classes,
 
337
            'ext_modules': ext_modules,
 
338
           }
 
339
 
 
340
    ARGS.update(META_INFO)
 
341
    ARGS.update(BZRLIB)
 
342
    ARGS.update(PKG_DATA)
 
343
 
 
344
    setup(**ARGS)