~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: Ian Clatworthy
  • Date: 2007-11-27 21:17:06 UTC
  • mto: (3054.1.1 ianc-integration)
  • mto: This revision was merged to the branch mainline in revision 3055.
  • Revision ID: ian.clatworthy@internode.on.net-20071127211706-871zcqst0yi5tcvl
make fixes suggested by proof-readers

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
META_INFO = {'name':         'bzr',
18
18
             'version':      bzrlib.__version__,
19
19
             'author':       'Canonical Ltd',
20
 
             'author_email': 'bazaar-ng@lists.ubuntu.com',
 
20
             'author_email': 'bazaar@lists.canonical.com',
21
21
             'url':          'http://www.bazaar-vcs.org/',
22
22
             'description':  'Friendly distributed version control system',
23
23
             'license':      'GNU GPL v2',
55
55
                os.execvp(python, [python] + sys.argv)
56
56
            except OSError:
57
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
 
58
    sys.stderr.write("bzr: error: cannot find a suitable python interpreter\n")
 
59
    sys.stderr.write("  (need %d.%d or later)" % NEED_VERS)
 
60
    sys.stderr.write('\n')
60
61
    sys.exit(1)
61
62
if getattr(os, "unsetenv", None) is not None:
62
63
    os.unsetenv(REINVOKE)
99
100
    Create bzr.bat for win32.
100
101
    """
101
102
    def run(self):
102
 
        import os
103
 
        import sys
104
 
 
105
103
        install_scripts.run(self)   # standard action
106
104
 
107
105
        if sys.platform == "win32":
108
106
            try:
109
 
                scripts_dir = self.install_dir
 
107
                scripts_dir = os.path.join(sys.prefix, 'Scripts')
110
108
                script_path = self._quoted_path(os.path.join(scripts_dir,
111
109
                                                             "bzr"))
112
110
                python_exe = self._quoted_path(sys.executable)
113
111
                args = self._win_batch_args()
114
112
                batch_str = "@%s %s %s" % (python_exe, script_path, args)
115
 
                batch_path = script_path + ".bat"
 
113
                batch_path = os.path.join(self.install_dir, "bzr.bat")
116
114
                f = file(batch_path, "w")
117
115
                f.write(batch_str)
118
116
                f.close()
127
125
            return path
128
126
 
129
127
    def _win_batch_args(self):
130
 
        if os.name == 'nt':
 
128
        from bzrlib.win32utils import winver
 
129
        if winver == 'Windows NT':
131
130
            return '%*'
132
131
        else:
133
132
            return '%1 %2 %3 %4 %5 %6 %7 %8 %9'
149
148
## Setup
150
149
########################
151
150
 
 
151
command_classes = {'install_scripts': my_install_scripts,
 
152
                   'build': bzr_build}
 
153
from distutils import log
 
154
from distutils.errors import CCompilerError, DistutilsPlatformError
 
155
from distutils.extension import Extension
 
156
ext_modules = []
 
157
try:
 
158
    from Pyrex.Distutils import build_ext
 
159
except ImportError:
 
160
    have_pyrex = False
 
161
    # try to build the extension from the prior generated source.
 
162
    print
 
163
    print ("The python package 'Pyrex' is not available."
 
164
           " If the .c files are available,")
 
165
    print ("they will be built,"
 
166
           " but modifying the .pyx files will not rebuild them.")
 
167
    print
 
168
    from distutils.command.build_ext import build_ext
 
169
else:
 
170
    have_pyrex = True
 
171
 
 
172
 
 
173
class build_ext_if_possible(build_ext):
 
174
 
 
175
    def run(self):
 
176
        try:
 
177
            build_ext.run(self)
 
178
        except DistutilsPlatformError, e:
 
179
            log.warn(str(e))
 
180
            log.warn('Extensions cannot be built, '
 
181
                     'will use the Python versions instead')
 
182
 
 
183
    def build_extension(self, ext):
 
184
        try:
 
185
            build_ext.build_extension(self, ext)
 
186
        except CCompilerError:
 
187
            log.warn('Building of "%s" extension failed, '
 
188
                     'will use the Python version instead' % (ext.name,))
 
189
 
 
190
 
 
191
# Override the build_ext if we have Pyrex available
 
192
command_classes['build_ext'] = build_ext_if_possible
 
193
unavailable_files = []
 
194
 
 
195
 
 
196
def add_pyrex_extension(module_name, **kwargs):
 
197
    """Add a pyrex module to build.
 
198
 
 
199
    This will use Pyrex to auto-generate the .c file if it is available.
 
200
    Otherwise it will fall back on the .c file. If the .c file is not
 
201
    available, it will warn, and not add anything.
 
202
 
 
203
    You can pass any extra options to Extension through kwargs. One example is
 
204
    'libraries = []'.
 
205
 
 
206
    :param module_name: The python path to the module. This will be used to
 
207
        determine the .pyx and .c files to use.
 
208
    """
 
209
    path = module_name.replace('.', '/')
 
210
    pyrex_name = path + '.pyx'
 
211
    c_name = path + '.c'
 
212
    if have_pyrex:
 
213
        ext_modules.append(Extension(module_name, [pyrex_name]))
 
214
    else:
 
215
        if not os.path.isfile(c_name):
 
216
            unavailable_files.append(c_name)
 
217
        else:
 
218
            ext_modules.append(Extension(module_name, [c_name]))
 
219
 
 
220
 
 
221
add_pyrex_extension('bzrlib._dirstate_helpers_c')
 
222
add_pyrex_extension('bzrlib._knit_load_data_c')
 
223
ext_modules.append(Extension('bzrlib._patiencediff_c', ['bzrlib/_patiencediff_c.c']))
 
224
 
 
225
 
 
226
if unavailable_files:
 
227
    print 'C extension(s) not found:'
 
228
    print '   %s' % ('\n  '.join(unavailable_files),)
 
229
    print 'The python versions will be used instead.'
 
230
    print
 
231
 
 
232
 
152
233
if 'bdist_wininst' in sys.argv:
153
 
    import glob
154
 
    # doc files
155
 
    docs = glob.glob('doc/*.htm') + ['doc/default.css']
 
234
    def find_docs():
 
235
        docs = []
 
236
        for root, dirs, files in os.walk('doc'):
 
237
            r = []
 
238
            for f in files:
 
239
                if os.path.splitext(f)[1] in ('.html', '.css'):
 
240
                    r.append(os.path.join(root, f))
 
241
            if r:
 
242
                relative = root[4:]
 
243
                if relative:
 
244
                    target = os.path.join('Doc\\Bazaar', relative)
 
245
                else:
 
246
                    target = 'Doc\\Bazaar'
 
247
                docs.append((target, r))
 
248
        return docs
 
249
 
156
250
    # python's distutils-based win32 installer
157
251
    ARGS = {'scripts': ['bzr', 'tools/win32/bzr-win32-bdist-postinstall.py'],
 
252
            'ext_modules': ext_modules,
158
253
            # help pages
159
 
            'data_files': [('Doc/Bazaar', docs)],
 
254
            'data_files': find_docs(),
 
255
            # for building pyrex extensions
 
256
            'cmdclass': {'build_ext': build_ext_if_possible},
160
257
           }
161
258
 
162
259
    ARGS.update(META_INFO)
188
285
                                     version = version_str,
189
286
                                     description = META_INFO['description'],
190
287
                                     author = META_INFO['author'],
191
 
                                     copyright = "(c) Canonical Ltd, 2005-2006",
 
288
                                     copyright = "(c) Canonical Ltd, 2005-2007",
192
289
                                     company_name = "Canonical Ltd.",
193
290
                                     comments = META_INFO['description'],
194
291
                                    )
 
292
 
 
293
    additional_packages =  []
 
294
    if sys.version.startswith('2.4'):
 
295
        # adding elementtree package
 
296
        additional_packages.append('elementtree')
 
297
    elif sys.version.startswith('2.5'):
 
298
        additional_packages.append('xml.etree')
 
299
    else:
 
300
        import warnings
 
301
        warnings.warn('Unknown Python version.\n'
 
302
                      'Please check setup.py script for compatibility.')
 
303
    # email package from std python library use lazy import,
 
304
    # so we need to explicitly add all package
 
305
    additional_packages.append('email')
 
306
 
195
307
    options_list = {"py2exe": {"packages": BZRLIB['packages'] +
196
 
                                           ['elementtree'],
197
 
                               "excludes": ["Tkinter", "medusa"],
 
308
                                           additional_packages,
 
309
                               "excludes": ["Tkinter", "medusa", "tools"],
198
310
                               "dist_dir": "win32_bzr.exe",
199
311
                              },
200
312
                   }
205
317
          zipfile='lib/library.zip')
206
318
 
207
319
else:
 
320
    # ad-hoc for easy_install
 
321
    DATA_FILES = []
 
322
    if not 'bdist_egg' in sys.argv:
 
323
        # generate and install bzr.1 only with plain install, not easy_install one
 
324
        DATA_FILES = [('man/man1', ['bzr.1'])]
 
325
 
208
326
    # std setup
209
327
    ARGS = {'scripts': ['bzr'],
210
 
            'data_files': [('man/man1', ['bzr.1'])],
211
 
            'cmdclass': {'build': bzr_build,
212
 
                         'install_scripts': my_install_scripts,
213
 
                        },
 
328
            'data_files': DATA_FILES,
 
329
            'cmdclass': command_classes,
 
330
            'ext_modules': ext_modules,
214
331
           }
215
 
    
 
332
 
216
333
    ARGS.update(META_INFO)
217
334
    ARGS.update(BZRLIB)
218
335
    ARGS.update(PKG_DATA)