setup.py
133 lines
| 4.4 KiB
| text/x-python
|
PythonLexer
|
r0 | #!/usr/bin/env python | ||
|
r575 | # | ||
# This is the mercurial setup script. | ||||
|
r0 | # | ||
|
r4816 | # 'python setup.py install', or | ||
# 'python setup.py --help' for more options | ||||
|
r0 | |||
|
r1873 | import sys | ||
|
r3590 | if not hasattr(sys, 'version_info') or sys.version_info < (2, 3, 0, 'final'): | ||
|
r1873 | raise SystemExit, "Mercurial requires python 2.3 or later." | ||
|
r3239 | import os | ||
|
r6251 | import shutil | ||
import tempfile | ||||
|
r72 | from distutils.core import setup, Extension | ||
|
r157 | from distutils.command.install_data import install_data | ||
|
r6245 | from distutils.ccompiler import new_compiler | ||
|
r157 | |||
|
r423 | import mercurial.version | ||
|
r3893 | extra = {} | ||
|
r6251 | # 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-') | ||||
|
r6373 | devnull = oldstderr = None | ||
|
r6251 | try: | ||
try: | ||||
|
r6373 | 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() | ||||
# Redirect stderr to /dev/null to hide any error messages | ||||
# from the compiler. | ||||
# This will have to be changed if we ever have to check | ||||
# for a function on Windows. | ||||
devnull = open('/dev/null', 'w') | ||||
oldstderr = os.dup(sys.stderr.fileno()) | ||||
os.dup2(devnull.fileno(), sys.stderr.fileno()) | ||||
|
r6251 | objects = cc.compile([fname]) | ||
cc.link_executable(objects, os.path.join(tmpdir, "a.out")) | ||||
except: | ||||
return False | ||||
return True | ||||
finally: | ||||
|
r6373 | if oldstderr is not None: | ||
os.dup2(oldstderr, sys.stderr.fileno()) | ||||
if devnull is not None: | ||||
devnull.close() | ||||
|
r6251 | shutil.rmtree(tmpdir) | ||
|
r1283 | # py2exe needs to be installed to work | ||
try: | ||||
|
r1294 | import py2exe | ||
|
r1283 | |||
|
r1422 | # 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 | ||||
|
r3893 | extra['console'] = ['hg'] | ||
|
r1284 | except ImportError: | ||
|
r3890 | pass | ||
|
r1283 | |||
|
r427 | # specify version string, otherwise 'hg identify' will be used: | ||
version = '' | ||||
|
r157 | class install_package_data(install_data): | ||
def finalize_options(self): | ||||
self.set_undefined_options('install', | ||||
('install_lib', 'install_dir')) | ||||
install_data.finalize_options(self) | ||||
|
r0 | |||
|
r1977 | mercurial.version.remember_version(version) | ||
cmdclass = {'install_data': install_package_data} | ||||
|
r3238 | |||
|
r5396 | 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']) | ||||
] | ||||
|
r6239 | packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert'] | ||
|
r5396 | try: | ||
import posix | ||||
ext_modules.append(Extension('mercurial.osutil', ['mercurial/osutil.c'])) | ||||
|
r6241 | |||
if sys.platform == 'linux2' and os.uname()[2] > '2.6': | ||||
|
r6245 | # The inotify extension is only usable with Linux 2.6 kernels. | ||
# You also need a reasonably recent C library. | ||||
cc = new_compiler() | ||||
|
r6251 | if has_function(cc, 'inotify_add_watch'): | ||
|
r6245 | ext_modules.append(Extension('hgext.inotify.linux._inotify', | ||
['hgext/inotify/linux/_inotify.c'])) | ||||
packages.extend(['hgext.inotify', 'hgext.inotify.linux']) | ||||
|
r5396 | except ImportError: | ||
pass | ||||
|
r1977 | setup(name='mercurial', | ||
|
r3238 | 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', | ||||
|
r6009 | scripts=['hg'], | ||
|
r6239 | packages=packages, | ||
|
r5396 | ext_modules=ext_modules, | ||
|
r3239 | data_files=[(os.path.join('mercurial', root), | ||
[os.path.join(root, file_) for file_ in files]) | ||||
for root, dirs, files in os.walk('templates')], | ||||
|
r3238 | cmdclass=cmdclass, | ||
|
r4628 | options=dict(py2exe=dict(packages=['hgext']), | ||
bdist_mpkg=dict(zipdist=True, | ||||
|
r3238 | license='COPYING', | ||
readme='contrib/macosx/Readme.html', | ||||
welcome='contrib/macosx/Welcome.html')), | ||||
|
r3893 | **extra) | ||