view setup.py @ 6369:53912d30ac40

Avoid calling heads() twice on every hg commit. In an extreme case (merging two revisions with very low revision numbers) this could be slower than the previous code, but it should be much faster in the usual cases (parents are near the tip). It also avoids some races in some uninteresting cases (e.g. two concurrent hg commits).
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Sun, 23 Mar 2008 21:03:24 -0300
parents 87053f0b0fad
children 7010e4557963
line wrap: on
line source

#!/usr/bin/env python
#
# This is the mercurial setup script.
#
# 'python setup.py install', or
# 'python setup.py --help' for more options

import sys
if not hasattr(sys, 'version_info') or sys.version_info < (2, 3, 0, 'final'):
    raise SystemExit, "Mercurial requires python 2.3 or later."

import os
import shutil
import tempfile
from distutils.core import setup, Extension
from distutils.command.install_data import install_data
from distutils.ccompiler import new_compiler

import mercurial.version

extra = {}

# simplified version of distutils.ccompiler.CCompiler.has_function
# that actually removes its temporary files.
def has_function(cc, funcname):
    tmpdir = tempfile.mkdtemp(prefix='hg-install-')
    try:
        fname = os.path.join(tmpdir, 'funcname.c')
        f = open(fname, 'w')
        f.write('int main(void) {\n')
        f.write('    %s();\n' % funcname)
        f.write('}\n')
        f.close()
        try:
            objects = cc.compile([fname])
            cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
        except:
            return False
        return True
    finally:
        shutil.rmtree(tmpdir)

# py2exe needs to be installed to work
try:
    import py2exe

    # Help py2exe to find win32com.shell
    try:
        import modulefinder
        import win32com
        for p in win32com.__path__[1:]: # Take the path to win32comext
            modulefinder.AddPackagePath("win32com", p)
        pn = "win32com.shell"
        __import__(pn)
        m = sys.modules[pn]
        for p in m.__path__[1:]:
            modulefinder.AddPackagePath(pn, p)
    except ImportError:
        pass

    extra['console'] = ['hg']

except ImportError:
    pass

# specify version string, otherwise 'hg identify' will be used:
version = ''

class install_package_data(install_data):
    def finalize_options(self):
        self.set_undefined_options('install',
                                   ('install_lib', 'install_dir'))
        install_data.finalize_options(self)

mercurial.version.remember_version(version)
cmdclass = {'install_data': install_package_data}

ext_modules=[
    Extension('mercurial.mpatch', ['mercurial/mpatch.c']),
    Extension('mercurial.bdiff', ['mercurial/bdiff.c']),
    Extension('mercurial.base85', ['mercurial/base85.c']),
    Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c'])
    ]

packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert']

try:
    import posix
    ext_modules.append(Extension('mercurial.osutil', ['mercurial/osutil.c']))

    if sys.platform == 'linux2' and os.uname()[2] > '2.6':
        # The inotify extension is only usable with Linux 2.6 kernels.
        # You also need a reasonably recent C library.
        cc = new_compiler()
        if has_function(cc, 'inotify_add_watch'):
            ext_modules.append(Extension('hgext.inotify.linux._inotify',
                                         ['hgext/inotify/linux/_inotify.c']))
            packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
except ImportError:
    pass

setup(name='mercurial',
      version=mercurial.version.get_version(),
      author='Matt Mackall',
      author_email='mpm@selenic.com',
      url='http://selenic.com/mercurial',
      description='Scalable distributed SCM',
      license='GNU GPL',
      scripts=['hg'],
      packages=packages,
      ext_modules=ext_modules,
      data_files=[(os.path.join('mercurial', root),
                   [os.path.join(root, file_) for file_ in files])
                  for root, dirs, files in os.walk('templates')],
      cmdclass=cmdclass,
      options=dict(py2exe=dict(packages=['hgext']),
                   bdist_mpkg=dict(zipdist=True,
                                   license='COPYING',
                                   readme='contrib/macosx/Readme.html',
                                   welcome='contrib/macosx/Welcome.html')),
      **extra)