/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: Mark Hammond
  • Date: 2008-08-11 02:04:00 UTC
  • mto: This revision was merged to the branch mainline in revision 3620.
  • Revision ID: mhammond@skippinet.com.au-20080811020400-7mnjrjl02b5w9uzf
prefer getattr() over hasattr()

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
 
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 os.path
 
11
import sys
 
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...
 
20
import bzrlib
 
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
 
 
32
##
 
33
# META INFORMATION FOR SETUP
 
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
    }
 
59
 
 
60
# The list of packages is automatically generated later. Add other things
 
61
# that are part of BZRLIB here.
 
62
BZRLIB = {}
 
63
 
 
64
PKG_DATA = {# install files from selftest suite
 
65
            'package_data': {'bzrlib': ['doc/api/*.txt',
 
66
                                        'tests/test_patches_data/*',
 
67
                                        'help_topics/en/*.txt',
 
68
                                       ]},
 
69
           }
 
70
 
 
71
 
 
72
def get_bzrlib_packages():
 
73
    """Recurse through the bzrlib directory, and extract the package names"""
 
74
 
 
75
    packages = []
 
76
    base_path = os.path.dirname(os.path.abspath(bzrlib.__file__))
 
77
    for root, dirs, files in os.walk(base_path):
 
78
        if '__init__.py' in files:
 
79
            assert root.startswith(base_path)
 
80
            # Get just the path below bzrlib
 
81
            package_path = root[len(base_path):]
 
82
            # Remove leading and trailing slashes
 
83
            package_path = package_path.strip('\\/')
 
84
            if not package_path:
 
85
                package_name = 'bzrlib'
 
86
            else:
 
87
                package_name = ('bzrlib.' +
 
88
                            package_path.replace('/', '.').replace('\\', '.'))
 
89
            packages.append(package_name)
 
90
    return sorted(packages)
 
91
 
 
92
 
 
93
BZRLIB['packages'] = get_bzrlib_packages()
 
94
 
6
95
 
7
96
from distutils.core import setup
8
 
 
9
 
setup(name='bzr',
10
 
      version='0.0.0',
11
 
      author='Martin Pool',
12
 
      author_email='mbp@sourcefrog.net',
13
 
      url='http://www.bazaar-ng.org/',
14
 
      description='Friendly distributed version control system',
15
 
      license='GNU GPL v2',
16
 
      packages=['bzrlib'],
17
 
      scripts=['bzr'])
 
97
from distutils.command.install_scripts import install_scripts
 
98
from distutils.command.build import build
 
99
 
 
100
###############################
 
101
# Overridden distutils actions
 
102
###############################
 
103
 
 
104
class my_install_scripts(install_scripts):
 
105
    """ Customized install_scripts distutils action.
 
106
    Create bzr.bat for win32.
 
107
    """
 
108
    def run(self):
 
109
        install_scripts.run(self)   # standard action
 
110
 
 
111
        if sys.platform == "win32":
 
112
            try:
 
113
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
 
114
                script_path = self._quoted_path(os.path.join(scripts_dir,
 
115
                                                             "bzr"))
 
116
                python_exe = self._quoted_path(sys.executable)
 
117
                args = self._win_batch_args()
 
118
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
 
119
                batch_path = os.path.join(self.install_dir, "bzr.bat")
 
120
                f = file(batch_path, "w")
 
121
                f.write(batch_str)
 
122
                f.close()
 
123
                print "Created:", batch_path
 
124
            except Exception, e:
 
125
                print "ERROR: Unable to create %s: %s" % (batch_path, e)
 
126
 
 
127
    def _quoted_path(self, path):
 
128
        if ' ' in path:
 
129
            return '"' + path + '"'
 
130
        else:
 
131
            return path
 
132
 
 
133
    def _win_batch_args(self):
 
134
        from bzrlib.win32utils import winver
 
135
        if winver == 'Windows NT':
 
136
            return '%*'
 
137
        else:
 
138
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
 
139
#/class my_install_scripts
 
140
 
 
141
 
 
142
class bzr_build(build):
 
143
    """Customized build distutils action.
 
144
    Generate bzr.1.
 
145
    """
 
146
    def run(self):
 
147
        build.run(self)
 
148
 
 
149
        import generate_docs
 
150
        generate_docs.main(argv=["bzr", "man"])
 
151
 
 
152
 
 
153
########################
 
154
## Setup
 
155
########################
 
156
 
 
157
command_classes = {'install_scripts': my_install_scripts,
 
158
                   'build': bzr_build}
 
159
from distutils import log
 
160
from distutils.errors import CCompilerError, DistutilsPlatformError
 
161
from distutils.extension import Extension
 
162
ext_modules = []
 
163
try:
 
164
    from Pyrex.Distutils import build_ext
 
165
except ImportError:
 
166
    have_pyrex = False
 
167
    # try to build the extension from the prior generated source.
 
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
 
174
    from distutils.command.build_ext import build_ext
 
175
else:
 
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], **kwargs))
 
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], **kwargs))
 
225
 
 
226
 
 
227
add_pyrex_extension('bzrlib._dirstate_helpers_c')
 
228
add_pyrex_extension('bzrlib._knit_load_data_c')
 
229
if sys.platform == 'win32':
 
230
    # pyrex uses the macro WIN32 to detect the platform, even though it should
 
231
    # be using something like _WIN32 or MS_WINDOWS, oh well, we can give it the
 
232
    # right value.
 
233
    add_pyrex_extension('bzrlib._walkdirs_win32',
 
234
                        define_macros=[('WIN32', None)])
 
235
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
 
236
 
 
237
 
 
238
if unavailable_files:
 
239
    print 'C extension(s) not found:'
 
240
    print '   %s' % ('\n  '.join(unavailable_files),)
 
241
    print 'The python versions will be used instead.'
 
242
    print
 
243
 
 
244
 
 
245
if 'bdist_wininst' in sys.argv:
 
246
    def find_docs():
 
247
        docs = []
 
248
        for root, dirs, files in os.walk('doc'):
 
249
            r = []
 
250
            for f in files:
 
251
                if (os.path.splitext(f)[1] in ('.html','.css','.png','.pdf')
 
252
                    or f == 'quick-start-summary.svg'):
 
253
                    r.append(os.path.join(root, f))
 
254
            if r:
 
255
                relative = root[4:]
 
256
                if relative:
 
257
                    target = os.path.join('Doc\\Bazaar', relative)
 
258
                else:
 
259
                    target = 'Doc\\Bazaar'
 
260
                docs.append((target, r))
 
261
        return docs
 
262
 
 
263
    # python's distutils-based win32 installer
 
264
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
265
            'ext_modules': ext_modules,
 
266
            # help pages
 
267
            'data_files': find_docs(),
 
268
            # for building pyrex extensions
 
269
            'cmdclass': {'build_ext': build_ext_if_possible},
 
270
           }
 
271
 
 
272
    ARGS.update(META_INFO)
 
273
    ARGS.update(BZRLIB)
 
274
    ARGS.update(PKG_DATA)
 
275
    
 
276
    setup(**ARGS)
 
277
 
 
278
elif 'py2exe' in sys.argv:
 
279
    import glob
 
280
    # py2exe setup
 
281
    import py2exe
 
282
 
 
283
    # pick real bzr version
 
284
    import bzrlib
 
285
 
 
286
    version_number = []
 
287
    for i in bzrlib.version_info[:4]:
 
288
        try:
 
289
            i = int(i)
 
290
        except ValueError:
 
291
            i = 0
 
292
        version_number.append(str(i))
 
293
    version_str = '.'.join(version_number)
 
294
 
 
295
    target = py2exe.build_exe.Target(script = "bzr",
 
296
                                     dest_base = "bzr",
 
297
                                     icon_resources = [(0,'bzr.ico')],
 
298
                                     name = META_INFO['name'],
 
299
                                     version = version_str,
 
300
                                     description = META_INFO['description'],
 
301
                                     author = META_INFO['author'],
 
302
                                     copyright = "(c) Canonical Ltd, 2005-2007",
 
303
                                     company_name = "Canonical Ltd.",
 
304
                                     comments = META_INFO['description'],
 
305
                                    )
 
306
 
 
307
    packages = BZRLIB['packages']
 
308
    packages.remove('bzrlib')
 
309
    packages = [i for i in packages if not i.startswith('bzrlib.plugins')]
 
310
    includes = []
 
311
    for i in glob.glob('bzrlib\\*.py'):
 
312
        module = i[:-3].replace('\\', '.')
 
313
        if module.endswith('__init__'):
 
314
            module = module[:-len('__init__')]
 
315
        includes.append(module)
 
316
 
 
317
    additional_packages = set()
 
318
    if sys.version.startswith('2.4'):
 
319
        # adding elementtree package
 
320
        additional_packages.add('elementtree')
 
321
    elif sys.version.startswith('2.5'):
 
322
        additional_packages.add('xml.etree')
 
323
    else:
 
324
        import warnings
 
325
        warnings.warn('Unknown Python version.\n'
 
326
                      'Please check setup.py script for compatibility.')
 
327
    # email package from std python library use lazy import,
 
328
    # so we need to explicitly add all package
 
329
    additional_packages.add('email')
 
330
 
 
331
    # text files for help topis
 
332
    text_topics = glob.glob('bzrlib/help_topics/en/*.txt')
 
333
    topics_files = [('lib/help_topics/en', text_topics)]
 
334
 
 
335
    # built-in plugins
 
336
    plugins_files = []
 
337
    for root, dirs, files in os.walk('bzrlib/plugins'):
 
338
        x = []
 
339
        for i in files:
 
340
            if not i.endswith('.py'):
 
341
                continue
 
342
            if i == '__init__.py' and root == 'bzrlib/plugins':
 
343
                continue
 
344
            x.append(os.path.join(root, i))
 
345
        if x:
 
346
            target_dir = root[len('bzrlib/'):]  # install to 'plugins/...'
 
347
            plugins_files.append((target_dir, x))
 
348
    # find modules for built-in plugins
 
349
    import tools.package_mf
 
350
    mf = tools.package_mf.CustomModuleFinder()
 
351
    mf.run_package('bzrlib/plugins')
 
352
    packs, mods = mf.get_result()
 
353
    additional_packages.update(packs)
 
354
 
 
355
    # MSWSOCK.dll is a system-specific library, which py2exe accidentally pulls
 
356
    # in on Vista.
 
357
    options_list = {"py2exe": {"packages": packages + list(additional_packages),
 
358
                               "includes": includes + mods,
 
359
                               "excludes": ["Tkinter", "medusa", "tools"],
 
360
                               "dll_excludes": ["MSWSOCK.dll"],
 
361
                               "dist_dir": "win32_bzr.exe",
 
362
                              },
 
363
                   }
 
364
    setup(options=options_list,
 
365
          console=[target,
 
366
                   'tools/win32/bzr_postinstall.py',
 
367
                  ],
 
368
          zipfile='lib/library.zip',
 
369
          data_files=topics_files + plugins_files,
 
370
          )
 
371
 
 
372
else:
 
373
    # ad-hoc for easy_install
 
374
    DATA_FILES = []
 
375
    if not 'bdist_egg' in sys.argv:
 
376
        # generate and install bzr.1 only with plain install, not easy_install one
 
377
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
378
 
 
379
    # std setup
 
380
    ARGS = {'scripts': ['bzr'],
 
381
            'data_files': DATA_FILES,
 
382
            'cmdclass': command_classes,
 
383
            'ext_modules': ext_modules,
 
384
           }
 
385
 
 
386
    ARGS.update(META_INFO)
 
387
    ARGS.update(BZRLIB)
 
388
    ARGS.update(PKG_DATA)
 
389
 
 
390
    setup(**ARGS)