~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: John Arbash Meinel
  • Date: 2006-10-11 00:23:23 UTC
  • mfrom: (2070 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2071.
  • Revision ID: john@arbash-meinel.com-20061011002323-82ba88c293d7caff
[merge] bzr.dev 2070

Show diffs side-by-side

added added

removed removed

Lines of Context:
7
7
"""
8
8
 
9
9
import os
10
 
import os.path
11
10
import sys
12
11
 
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
12
import bzrlib
21
13
 
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
14
##
33
15
# 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
 
    }
 
16
 
 
17
META_INFO = {'name':         'bzr',
 
18
             'version':      bzrlib.__version__,
 
19
             'author':       'Canonical Ltd',
 
20
             'author_email': 'bazaar-ng@lists.ubuntu.com',
 
21
             'url':          'http://www.bazaar-vcs.org/',
 
22
             'description':  'Friendly distributed version control system',
 
23
             'license':      'GNU GPL v2',
 
24
            }
59
25
 
60
26
# The list of packages is automatically generated later. Add other things
61
27
# that are part of BZRLIB here.
64
30
PKG_DATA = {# install files from selftest suite
65
31
            'package_data': {'bzrlib': ['doc/api/*.txt',
66
32
                                        'tests/test_patches_data/*',
67
 
                                        'help_topics/en/*.txt',
68
33
                                       ]},
69
34
           }
70
35
 
 
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
 
71
64
 
72
65
def get_bzrlib_packages():
73
66
    """Recurse through the bzrlib directory, and extract the package names"""
106
99
    Create bzr.bat for win32.
107
100
    """
108
101
    def run(self):
 
102
        import os
 
103
        import sys
 
104
 
109
105
        install_scripts.run(self)   # standard action
110
106
 
111
107
        if sys.platform == "win32":
112
108
            try:
113
 
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
 
109
                scripts_dir = self.install_dir
114
110
                script_path = self._quoted_path(os.path.join(scripts_dir,
115
111
                                                             "bzr"))
116
112
                python_exe = self._quoted_path(sys.executable)
117
113
                args = self._win_batch_args()
118
114
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
119
 
                batch_path = os.path.join(self.install_dir, "bzr.bat")
 
115
                batch_path = script_path + ".bat"
120
116
                f = file(batch_path, "w")
121
117
                f.write(batch_str)
122
118
                f.close()
131
127
            return path
132
128
 
133
129
    def _win_batch_args(self):
134
 
        from bzrlib.win32utils import winver
135
 
        if winver == 'Windows NT':
 
130
        if os.name == 'nt':
136
131
            return '%*'
137
132
        else:
138
133
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
154
149
## Setup
155
150
########################
156
151
 
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]))
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
 
 
238
 
 
239
152
if 'bdist_wininst' in sys.argv:
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
 
 
 
153
    import glob
 
154
    # doc files
 
155
    docs = glob.glob('doc/*.htm') + ['doc/default.css']
257
156
    # python's distutils-based win32 installer
258
157
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
259
 
            'ext_modules': ext_modules,
260
158
            # help pages
261
 
            'data_files': find_docs(),
262
 
            # for building pyrex extensions
263
 
            'cmdclass': {'build_ext': build_ext_if_possible},
 
159
            'data_files': [('Doc/Bazaar', docs)],
264
160
           }
265
161
 
266
162
    ARGS.update(META_INFO)
270
166
    setup(**ARGS)
271
167
 
272
168
elif 'py2exe' in sys.argv:
273
 
    import glob
274
169
    # py2exe setup
275
170
    import py2exe
276
171
 
293
188
                                     version = version_str,
294
189
                                     description = META_INFO['description'],
295
190
                                     author = META_INFO['author'],
296
 
                                     copyright = "(c) Canonical Ltd, 2005-2007",
 
191
                                     copyright = "(c) Canonical Ltd, 2005-2006",
297
192
                                     company_name = "Canonical Ltd.",
298
193
                                     comments = META_INFO['description'],
299
194
                                    )
300
 
 
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()
312
 
    if sys.version.startswith('2.4'):
313
 
        # adding elementtree package
314
 
        additional_packages.add('elementtree')
315
 
    elif sys.version.startswith('2.5'):
316
 
        additional_packages.add('xml.etree')
317
 
    else:
318
 
        import warnings
319
 
        warnings.warn('Unknown Python version.\n'
320
 
                      'Please check setup.py script for compatibility.')
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"],
 
195
    options_list = {"py2exe": {"packages": BZRLIB['packages'] +
 
196
                                           ['elementtree'],
 
197
                               "excludes": ["Tkinter", "medusa"],
352
198
                               "dist_dir": "win32_bzr.exe",
353
199
                              },
354
200
                   }
356
202
          console=[target,
357
203
                   'tools/win32/bzr_postinstall.py',
358
204
                  ],
359
 
          zipfile='lib/library.zip',
360
 
          data_files=topics_files + plugins_files,
361
 
          )
 
205
          zipfile='lib/library.zip')
362
206
 
363
207
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
 
 
370
208
    # std setup
371
209
    ARGS = {'scripts': ['bzr'],
372
 
            'data_files': DATA_FILES,
373
 
            'cmdclass': command_classes,
374
 
            'ext_modules': ext_modules,
 
210
            'data_files': [('man/man1', ['bzr.1'])],
 
211
            'cmdclass': {'build': bzr_build,
 
212
                         'install_scripts': my_install_scripts,
 
213
                        },
375
214
           }
376
 
 
 
215
    
377
216
    ARGS.update(META_INFO)
378
217
    ARGS.update(BZRLIB)
379
218
    ARGS.update(PKG_DATA)