~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to setup.py

  • Committer: Martin Pool
  • Date: 2007-08-31 05:32:00 UTC
  • mfrom: (2598.6.32 bzr-ci-verbose2)
  • mto: This revision was merged to the branch mainline in revision 2773.
  • Revision ID: mbp@sourcefrog.net-20070831053200-px49z9ajuv15dxpi
Merge commit --show-diff feature from Goffredo

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