##// END OF EJS Templates
setup.py: fixing version info for Windows hg.exe (py2exe)...
setup.py: fixing version info for Windows hg.exe (py2exe) Fixes warning: py2exe: Version Info will not be included: could not parse version number ... which was seen when doing nightly builds. hg.exe files of nightly builds did not have any version info resoure, which may cause problems with installers. Also setting a copyright string for the version resource (was missing).

File last commit:

r10400:fb203201 default
r10400:fb203201 default
Show More
setup.py
300 lines | 10.2 KiB | text/x-python | PythonLexer
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 #!/usr/bin/env python
mpm@selenic.com
More whitespace cleanups...
r575 #
# This is the mercurial setup script.
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0 #
Christian Ebert
setup.py not executable: change instructions at beginning of file
r4816 # 'python setup.py install', or
# 'python setup.py --help' for more options
mpm@selenic.com
Add back links from file revisions to changeset revisions...
r0
Thomas Arendsen Hein
Added check for minimal python version to setup.py
r1873 import sys
Martin Geisler
setup: require Python 2.4
r8286 if not hasattr(sys, 'version_info') or sys.version_info < (2, 4, 0, 'final'):
raise SystemExit("Mercurial requires Python 2.4 or later.")
Thomas Arendsen Hein
Added check for minimal python version to setup.py
r1873
Matt Mackall
setup: warn about missing standard Python components
r7558 # Solaris Python packaging brain damage
try:
import hashlib
sha = hashlib.sha1()
except:
try:
import sha
except:
raise SystemExit(
"Couldn't import standard hashlib (incomplete Python install).")
try:
import zlib
except:
raise SystemExit(
"Couldn't import standard zlib (incomplete Python install).")
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 import os, subprocess, time
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 import shutil
import tempfile
mpm@selenic.com
Add an O(m + nlog n) patching extension
r72 from distutils.core import setup, Extension
Martin Geisler
add --pure flag to setup.py...
r7722 from distutils.dist import Distribution
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157 from distutils.command.install_data import install_data
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 from distutils.command.build import build
Martin Geisler
add --pure flag to setup.py...
r7722 from distutils.command.build_py import build_py
Martin Geisler
i18n: new build_mo command for setup.py...
r7649 from distutils.spawn import spawn, find_executable
Alexis S. L. Carvalho
setup.py: skip inotify if there's no inotify_add_watch...
r6245 from distutils.ccompiler import new_compiler
mpm@selenic.com
Install the templates where they can be found by hgweb.py...
r157
Paul Moore
Add a batch file driver for Windows
r6513 scripts = ['hg']
if os.name == 'nt':
scripts.append('contrib/win32/hg.bat')
Matt Mackall
Fix setup.py warning
r3893
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 # simplified version of distutils.ccompiler.CCompiler.has_function
# that actually removes its temporary files.
Martin Geisler
setup: cleanup coding style
r10000 def hasfunction(cc, funcname):
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 tmpdir = tempfile.mkdtemp(prefix='hg-install-')
Alexis S. L. Carvalho
setup.py: hide compiler error messages while searching for inotify
r6373 devnull = oldstderr = None
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 try:
try:
Alexis S. L. Carvalho
setup.py: hide compiler error messages while searching for inotify
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())
Bryan O'Sullivan
setup.py: don't pollute the current directory with temporary files
r9124 objects = cc.compile([fname], output_dir=tmpdir)
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
except:
return False
return True
finally:
Alexis S. L. Carvalho
setup.py: hide compiler error messages while searching for inotify
r6373 if oldstderr is not None:
os.dup2(oldstderr, sys.stderr.fileno())
if devnull is not None:
devnull.close()
Alexis S. L. Carvalho
setup.py: use a simplified custom version of CCompiler.has_function...
r6251 shutil.rmtree(tmpdir)
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283 # py2exe needs to be installed to work
try:
Bryan O'Sullivan
Clean up whitespace damage.
r1294 import py2exe
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 py2exeloaded = True
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
Volker Kleinfeld
py2exe is not able to handle win32com.shell...
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
Bryan O'Sullivan
Fix Volker's modifications to setup.py for non-Windows systems.
r1284 except ImportError:
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 py2exeloaded = False
Matt Mackall
Fix demandload bits of setup.py py2exe support
r3890 pass
Volker.Kleinfeld@gmx.de
Support for the distutils extention 'py2exe' added....
r1283
Christian Boos
setup: fix f51d1822d6fd refactoring, propagate env to runcmd
r9807 def runcmd(cmd, env):
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, env=env)
out, err = p.communicate()
# If root is executing setup.py, but the repository is owned by
# another user (as in "sudo python setup.py install") we will get
# trust warnings since the .hg/hgrc file is untrusted. That is
Steve Borho
setup: ignore 'not importing' warnings during version detection...
r10120 # fine, we don't want to load it anyway. Python may warn about
# a missing __init__.py in mercurial/locale, we also ignore that.
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 err = [e for e in err.splitlines()
Steve Borho
setup: ignore 'not importing' warnings during version detection...
r10120 if not e.startswith('Not trusting file') \
and not e.startswith('warning: Not importing')]
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if err:
return ''
return out
version = ''
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 if os.path.isdir('.hg'):
Martin Geisler
setup: execute hg in C locale
r8629 # Execute hg out of this directory with a custom environment which
# includes the pure Python modules in mercurial/pure. We also take
# care to not use any hgrc files and do no localization.
pypath = ['mercurial', os.path.join('mercurial', 'pure')]
env = {'PYTHONPATH': os.pathsep.join(pypath),
'HGRCPATH': '',
'LANGUAGE': 'C'}
Christian Boos
setup: pass LD_LIBRARY_PATH to subprocess when determining version.
r9856 if 'LD_LIBRARY_PATH' in os.environ:
env['LD_LIBRARY_PATH'] = os.environ['LD_LIBRARY_PATH']
Garth Roxburgh-Kidd
fixed 0xc0150004 error building Mercurial under Python 2.6 for Windows
r8648 if 'SystemRoot' in os.environ:
# Copy SystemRoot into the custom environment for Python 2.6
# under Windows. Otherwise, the subprocess will fail with
# error 0xc0150004. See: http://bugs.python.org/issue3440
env['SystemRoot'] = os.environ['SystemRoot']
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 cmd = [sys.executable, 'hg', 'id', '-i', '-t']
Christian Boos
setup: fix f51d1822d6fd refactoring, propagate env to runcmd
r9807 l = runcmd(cmd, env).split()
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
l.pop()
if len(l) > 1: # tag found
version = l[-1]
if l[0].endswith('+'): # propagate the dirty status to the tag
version += '+'
elif len(l) == 1: # no tag found
cmd = [sys.executable, 'hg', 'parents', '--template',
'{latesttag}+{latesttagdistance}-']
Christian Boos
setup: fix f51d1822d6fd refactoring, propagate env to runcmd
r9807 version = runcmd(cmd, env) + l[0]
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if version.endswith('+'):
version += time.strftime('%Y%m%d')
elif os.path.exists('.hg_archival.txt'):
Martin Geisler
setup.py: keep Python 2.3 compatibility...
r10124 kw = dict([[t.strip() for t in l.split(':', 1)]
for l in open('.hg_archival.txt')])
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 if 'tag' in kw:
version = kw['tag']
elif 'latesttag' in kw:
version = '%(latesttag)s+%(latesttagdistance)s-%(node).12s' % kw
Christian Ebert
setup.py: subprocess instead of os.popen, sys.stderr.write instead of print...
r8547 else:
Gilles Moris
setup: refactor the version string to a subset of tag+tagdist-hash+date...
r9615 version = kw.get('node', '')[:12]
Matt Mackall
refactor version code...
r7632
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548 if version:
Alejandro Santos
compat: use open() instead of file() everywhere
r9031 f = open("mercurial/__version__.py", "w")
Jeremy Whitlock
setup: read .hg_archival.txt for version info (issue1670)...
r8548 f.write('# this file is autogenerated by setup.py\n')
f.write('version = "%s"\n' % version)
f.close()
Jeremy Whitlock
Fix how setup.py identifies the Mercurial version....
r8493
try:
from mercurial import __version__
version = __version__.version
except ImportError:
version = 'unknown'
Matt Mackall
refactor version code...
r7632
Martin Geisler
setup: cleanup coding style
r10000 class hgbuildmo(build):
Martin Geisler
i18n: new build_mo command for setup.py...
r7649
description = "build translations (.mo files)"
def run(self):
if not find_executable('msgfmt'):
self.warn("could not find msgfmt executable, no translations "
"will be built")
return
podir = 'i18n'
if not os.path.isdir(podir):
self.warn("could not find %s/ directory" % podir)
return
join = os.path.join
for po in os.listdir(podir):
if not po.endswith('.po'):
continue
pofile = join(podir, po)
modir = join('locale', po[:-3], 'LC_MESSAGES')
mofile = join(modir, 'hg.mo')
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 mobuildfile = join('mercurial', mofile)
cmd = ['msgfmt', '-v', '-o', mobuildfile, pofile]
Martin Geisler
setup: do not use -c with msgfmt on Solaris (issue1489)
r7720 if sys.platform != 'sunos5':
# msgfmt on Solaris does not know about -c
cmd.append('-c')
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 self.mkpath(join('mercurial', modir))
self.make_file([pofile], mobuildfile, spawn, (cmd,))
Martin Geisler
i18n: new build_mo command for setup.py...
r7649
Martin Geisler
setup: cleanup coding style
r10000 # Insert hgbuildmo first so that files in mercurial/locale/ are found
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 # when build_py is run next.
build.sub_commands.insert(0, ('build_mo', None))
Martin Geisler
i18n: new build_mo command for setup.py...
r7649
Martin Geisler
add --pure flag to setup.py...
r7722 Distribution.pure = 0
Distribution.global_options.append(('pure', None, "use pure (slow) Python "
"code instead of C extensions"))
Martin Geisler
setup: cleanup coding style
r10000 class hgbuildpy(build_py):
Martin Geisler
add --pure flag to setup.py...
r7722
def finalize_options(self):
build_py.finalize_options(self)
if self.distribution.pure:
if self.py_modules is None:
self.py_modules = []
for ext in self.distribution.ext_modules:
if ext.name.startswith("mercurial."):
self.py_modules.append("mercurial.pure.%s" % ext.name[10:])
self.distribution.ext_modules = []
def find_modules(self):
modules = build_py.find_modules(self)
for module in modules:
if module[0] == "mercurial.pure":
if module[1] != "__init__":
yield ("mercurial", module[1], module[2])
else:
yield module
Martin Geisler
setup: cleanup coding style
r10000 cmdclass = {'build_mo': hgbuildmo,
'build_py': hgbuildpy}
Thomas Arendsen Hein
Applied coding style to setup.py
r3238
Martin Geisler
setup: cleanup coding style
r10000 extmodules = [
Bryan O'Sullivan
manifest: improve parsing performance by 8x via a new C extension
r6389 Extension('mercurial.base85', ['mercurial/base85.c']),
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 Extension('mercurial.bdiff', ['mercurial/bdiff.c']),
Bryan O'Sullivan
manifest: improve parsing performance by 8x via a new C extension
r6389 Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c']),
Extension('mercurial.mpatch', ['mercurial/mpatch.c']),
Extension('mercurial.parsers', ['mercurial/parsers.c']),
Martin Geisler
setup: cleanup old left-over code
r8283 Extension('mercurial.osutil', ['mercurial/osutil.c']),
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396 ]
Dirkjan Ochtman
fix double indentation and trailing whitespace
r6948 packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert',
Matt Mackall
many, many trivial check-code fixups
r10282 'hgext.highlight', 'hgext.zeroconf']
Bryan O'Sullivan
Add inotify extension
r6239
Martin Geisler
setup: cleanup old left-over code
r8283 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()
Martin Geisler
setup: cleanup coding style
r10000 if hasfunction(cc, 'inotify_add_watch'):
extmodules.append(Extension('hgext.inotify.linux._inotify',
Martin Geisler
setup: cleanup old left-over code
r8283 ['hgext/inotify/linux/_inotify.c']))
packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
Bryan O'Sullivan
Add osutil module, containing a listdir function....
r5396
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 packagedata = {'mercurial': ['locale/*/LC_MESSAGES/hg.mo',
'help/*.txt']}
def ordinarypath(p):
return p and p[0] != '.' and p[-1] != '~'
Matt Mackall
many, many trivial check-code fixups
r10282 for root in ('templates',):
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 for curdir, dirs, files in os.walk(os.path.join('mercurial', root)):
curdir = curdir.split(os.sep, 1)[1]
dirs[:] = filter(ordinarypath, dirs)
for f in filter(ordinarypath, files):
f = os.path.join(curdir, f)
packagedata['mercurial'].append(f)
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 datafiles = []
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 setupversion = version
extra = {}
if py2exeloaded:
extra['console'] = [
{'script':'hg',
'copyright':'Copyright (C) 2005-2010 Matt Mackall and others',
'product_version':version}]
if os.name == 'nt':
# Windows binary file versions for exe/dll files must have the
# form W.X.Y.Z, where W,X,Y,Z are numbers in the range 0..65535
setupversion = version.split('+', 1)[0]
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648
Thomas Arendsen Hein
Don't forget version at the end of setup.py, write it only if changed....
r1977 setup(name='mercurial',
Adrian Buehlmann
setup.py: fixing version info for Windows hg.exe (py2exe)...
r10400 version=setupversion,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 author='Matt Mackall',
author_email='mpm@selenic.com',
Dirkjan Ochtman
change wiki/bts URLs to point to new hostname
r8936 url='http://mercurial.selenic.com/',
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 description='Scalable distributed SCM',
Matt Mackall
Update license to GPLv2+
r10263 license='GNU GPLv2+',
Paul Moore
Add a batch file driver for Windows
r6513 scripts=scripts,
Bryan O'Sullivan
Add inotify extension
r6239 packages=packages,
Martin Geisler
setup: cleanup coding style
r10000 ext_modules=extmodules,
Martin Geisler
i18n: let Makefile generate i18n/hg.pot...
r7648 data_files=datafiles,
Dan Villiom Podlaski Christiansen
setup: install translation files as package data...
r9999 package_data=packagedata,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 cmdclass=cmdclass,
Paul Moore
Force email package to be loaded in py2exe...
r6789 options=dict(py2exe=dict(packages=['hgext', 'email']),
Lee Cantey
Fix for including hgext in Windows compiled version....
r4628 bdist_mpkg=dict(zipdist=True,
Thomas Arendsen Hein
Applied coding style to setup.py
r3238 license='COPYING',
readme='contrib/macosx/Readme.html',
welcome='contrib/macosx/Welcome.html')),
Matt Mackall
Fix setup.py warning
r3893 **extra)