##// END OF EJS Templates
setup: renamed l, e vars to out, err
Martin Geisler -
r8627:4c5b46f7 default
parent child Browse files
Show More
@@ -1,259 +1,259
1 1 #!/usr/bin/env python
2 2 #
3 3 # This is the mercurial setup script.
4 4 #
5 5 # 'python setup.py install', or
6 6 # 'python setup.py --help' for more options
7 7
8 8 import sys
9 9 if not hasattr(sys, 'version_info') or sys.version_info < (2, 4, 0, 'final'):
10 10 raise SystemExit("Mercurial requires Python 2.4 or later.")
11 11
12 12 # Solaris Python packaging brain damage
13 13 try:
14 14 import hashlib
15 15 sha = hashlib.sha1()
16 16 except:
17 17 try:
18 18 import sha
19 19 except:
20 20 raise SystemExit(
21 21 "Couldn't import standard hashlib (incomplete Python install).")
22 22
23 23 try:
24 24 import zlib
25 25 except:
26 26 raise SystemExit(
27 27 "Couldn't import standard zlib (incomplete Python install).")
28 28
29 29 import os, subprocess, time
30 30 import shutil
31 31 import tempfile
32 32 from distutils.core import setup, Extension
33 33 from distutils.dist import Distribution
34 34 from distutils.command.install_data import install_data
35 35 from distutils.command.build import build
36 36 from distutils.command.build_py import build_py
37 37 from distutils.spawn import spawn, find_executable
38 38 from distutils.ccompiler import new_compiler
39 39
40 40 extra = {}
41 41 scripts = ['hg']
42 42 if os.name == 'nt':
43 43 scripts.append('contrib/win32/hg.bat')
44 44
45 45 # simplified version of distutils.ccompiler.CCompiler.has_function
46 46 # that actually removes its temporary files.
47 47 def has_function(cc, funcname):
48 48 tmpdir = tempfile.mkdtemp(prefix='hg-install-')
49 49 devnull = oldstderr = None
50 50 try:
51 51 try:
52 52 fname = os.path.join(tmpdir, 'funcname.c')
53 53 f = open(fname, 'w')
54 54 f.write('int main(void) {\n')
55 55 f.write(' %s();\n' % funcname)
56 56 f.write('}\n')
57 57 f.close()
58 58 # Redirect stderr to /dev/null to hide any error messages
59 59 # from the compiler.
60 60 # This will have to be changed if we ever have to check
61 61 # for a function on Windows.
62 62 devnull = open('/dev/null', 'w')
63 63 oldstderr = os.dup(sys.stderr.fileno())
64 64 os.dup2(devnull.fileno(), sys.stderr.fileno())
65 65 objects = cc.compile([fname])
66 66 cc.link_executable(objects, os.path.join(tmpdir, "a.out"))
67 67 except:
68 68 return False
69 69 return True
70 70 finally:
71 71 if oldstderr is not None:
72 72 os.dup2(oldstderr, sys.stderr.fileno())
73 73 if devnull is not None:
74 74 devnull.close()
75 75 shutil.rmtree(tmpdir)
76 76
77 77 # py2exe needs to be installed to work
78 78 try:
79 79 import py2exe
80 80
81 81 # Help py2exe to find win32com.shell
82 82 try:
83 83 import modulefinder
84 84 import win32com
85 85 for p in win32com.__path__[1:]: # Take the path to win32comext
86 86 modulefinder.AddPackagePath("win32com", p)
87 87 pn = "win32com.shell"
88 88 __import__(pn)
89 89 m = sys.modules[pn]
90 90 for p in m.__path__[1:]:
91 91 modulefinder.AddPackagePath(pn, p)
92 92 except ImportError:
93 93 pass
94 94
95 95 extra['console'] = ['hg']
96 96
97 97 except ImportError:
98 98 pass
99 99
100 100 version = None
101 101
102 102 if os.path.isdir('.hg'):
103 103 # execute hg out of this directory with a custom environment which
104 104 # includes the pure Python modules in mercurial/pure
105 105 pypath = os.environ.get('PYTHONPATH', '')
106 106 purepath = os.path.join('mercurial', 'pure')
107 107 os.environ['PYTHONPATH'] = os.pathsep.join(['mercurial', purepath, pypath])
108 108 os.environ['HGRCPATH'] = '' # do not read any config file
109 109 cmd = [sys.executable, 'hg', 'id', '-i', '-t']
110 110
111 l, e = subprocess.Popen(cmd, stdout=subprocess.PIPE,
112 stderr=subprocess.PIPE).communicate()
111 out, err = subprocess.Popen(cmd, stdout=subprocess.PIPE,
112 stderr=subprocess.PIPE).communicate()
113 113 os.environ['PYTHONPATH'] = pypath
114 114
115 if e:
115 if err:
116 116 sys.stderr.write('warning: could not establish Mercurial '
117 'version:\n%s\n' % e)
117 'version:\n%s\n' % err)
118 118 else:
119 l = l.split()
119 l = out.split()
120 120 while len(l) > 1 and l[-1][0].isalpha(): # remove non-numbered tags
121 121 l.pop()
122 122 if l:
123 123 version = l[-1] # latest tag or revision number
124 124 if version.endswith('+'):
125 125 version += time.strftime('%Y%m%d')
126 126 elif os.path.exists('.hg_archival.txt'):
127 127 hgarchival = open('.hg_archival.txt')
128 128 for line in hgarchival:
129 129 if line.startswith('node:'):
130 130 version = line.split(':')[1].strip()[:12]
131 131 break
132 132
133 133 if version:
134 134 f = file("mercurial/__version__.py", "w")
135 135 f.write('# this file is autogenerated by setup.py\n')
136 136 f.write('version = "%s"\n' % version)
137 137 f.close()
138 138
139 139
140 140 try:
141 141 from mercurial import __version__
142 142 version = __version__.version
143 143 except ImportError:
144 144 version = 'unknown'
145 145
146 146 class install_package_data(install_data):
147 147 def finalize_options(self):
148 148 self.set_undefined_options('install',
149 149 ('install_lib', 'install_dir'))
150 150 install_data.finalize_options(self)
151 151
152 152 class build_mo(build):
153 153
154 154 description = "build translations (.mo files)"
155 155
156 156 def run(self):
157 157 if not find_executable('msgfmt'):
158 158 self.warn("could not find msgfmt executable, no translations "
159 159 "will be built")
160 160 return
161 161
162 162 podir = 'i18n'
163 163 if not os.path.isdir(podir):
164 164 self.warn("could not find %s/ directory" % podir)
165 165 return
166 166
167 167 join = os.path.join
168 168 for po in os.listdir(podir):
169 169 if not po.endswith('.po'):
170 170 continue
171 171 pofile = join(podir, po)
172 172 modir = join('locale', po[:-3], 'LC_MESSAGES')
173 173 mofile = join(modir, 'hg.mo')
174 174 cmd = ['msgfmt', '-v', '-o', mofile, pofile]
175 175 if sys.platform != 'sunos5':
176 176 # msgfmt on Solaris does not know about -c
177 177 cmd.append('-c')
178 178 self.mkpath(modir)
179 179 self.make_file([pofile], mofile, spawn, (cmd,))
180 180 self.distribution.data_files.append((join('mercurial', modir),
181 181 [mofile]))
182 182
183 183 build.sub_commands.append(('build_mo', None))
184 184
185 185 Distribution.pure = 0
186 186 Distribution.global_options.append(('pure', None, "use pure (slow) Python "
187 187 "code instead of C extensions"))
188 188
189 189 class hg_build_py(build_py):
190 190
191 191 def finalize_options(self):
192 192 build_py.finalize_options(self)
193 193
194 194 if self.distribution.pure:
195 195 if self.py_modules is None:
196 196 self.py_modules = []
197 197 for ext in self.distribution.ext_modules:
198 198 if ext.name.startswith("mercurial."):
199 199 self.py_modules.append("mercurial.pure.%s" % ext.name[10:])
200 200 self.distribution.ext_modules = []
201 201
202 202 def find_modules(self):
203 203 modules = build_py.find_modules(self)
204 204 for module in modules:
205 205 if module[0] == "mercurial.pure":
206 206 if module[1] != "__init__":
207 207 yield ("mercurial", module[1], module[2])
208 208 else:
209 209 yield module
210 210
211 211 cmdclass = {'install_data': install_package_data,
212 212 'build_mo': build_mo,
213 213 'build_py': hg_build_py}
214 214
215 215 ext_modules=[
216 216 Extension('mercurial.base85', ['mercurial/base85.c']),
217 217 Extension('mercurial.bdiff', ['mercurial/bdiff.c']),
218 218 Extension('mercurial.diffhelpers', ['mercurial/diffhelpers.c']),
219 219 Extension('mercurial.mpatch', ['mercurial/mpatch.c']),
220 220 Extension('mercurial.parsers', ['mercurial/parsers.c']),
221 221 Extension('mercurial.osutil', ['mercurial/osutil.c']),
222 222 ]
223 223
224 224 packages = ['mercurial', 'mercurial.hgweb', 'hgext', 'hgext.convert',
225 225 'hgext.highlight', 'hgext.zeroconf', ]
226 226
227 227 if sys.platform == 'linux2' and os.uname()[2] > '2.6':
228 228 # The inotify extension is only usable with Linux 2.6 kernels.
229 229 # You also need a reasonably recent C library.
230 230 cc = new_compiler()
231 231 if has_function(cc, 'inotify_add_watch'):
232 232 ext_modules.append(Extension('hgext.inotify.linux._inotify',
233 233 ['hgext/inotify/linux/_inotify.c']))
234 234 packages.extend(['hgext.inotify', 'hgext.inotify.linux'])
235 235
236 236 datafiles = []
237 237 for root in ('templates', 'i18n'):
238 238 for dir, dirs, files in os.walk(root):
239 239 datafiles.append((os.path.join('mercurial', dir),
240 240 [os.path.join(dir, file_) for file_ in files]))
241 241
242 242 setup(name='mercurial',
243 243 version=version,
244 244 author='Matt Mackall',
245 245 author_email='mpm@selenic.com',
246 246 url='http://selenic.com/mercurial',
247 247 description='Scalable distributed SCM',
248 248 license='GNU GPL',
249 249 scripts=scripts,
250 250 packages=packages,
251 251 ext_modules=ext_modules,
252 252 data_files=datafiles,
253 253 cmdclass=cmdclass,
254 254 options=dict(py2exe=dict(packages=['hgext', 'email']),
255 255 bdist_mpkg=dict(zipdist=True,
256 256 license='COPYING',
257 257 readme='contrib/macosx/Readme.html',
258 258 welcome='contrib/macosx/Welcome.html')),
259 259 **extra)
General Comments 0
You need to be logged in to leave comments. Login now