]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - src/allmydata/_auto_deps.py
fd13bab710ea06d9627fe1e26e1bda24851c71df
[tahoe-lafs/tahoe-lafs.git] / src / allmydata / _auto_deps.py
1 # Note: do not import any module from Tahoe-LAFS itself in this
2 # file. Also please avoid importing modules from other packages than
3 # the Python Standard Library if at all possible (exception: we rely
4 # on importing pkg_resources, which is provided by setuptools,
5 # zetuptoolz, distribute, and perhaps in the future distutils2, for
6 # the require_auto_deps() function.)
7
8 install_requires=[
9                   # we require newer versions of setuptools (actually
10                   # zetuptoolz) to build, but can handle older versions to run
11                   "setuptools >= 0.6c6",
12
13                   "zfec >= 1.1.0",
14
15                   # Feisty has simplejson 1.4
16                   "simplejson >= 1.4",
17
18                   "zope.interface",
19                   "Twisted >= 2.4.0",
20
21                   # foolscap < 0.5.1 had a performance bug which spent
22                   # O(N**2) CPU for transferring large mutable files
23                   # of size N.
24                   # foolscap < 0.6 is incompatible with Twisted 10.2.0.
25                   "foolscap[secure_connections] >= 0.6.0",
26                   "Nevow >= 0.6.0",
27
28                   # Needed for SFTP. pyasn1 is needed by twisted.conch in Twisted >= 9.0.
29                   # pycrypto 2.2 doesn't work due to https://bugs.launchpad.net/pycrypto/+bug/620253
30                   "pycrypto == 2.0.1, == 2.1, >= 2.3",
31                   "pyasn1 >= 0.0.8a",
32
33                   # Will be needed to test web apps, but not yet. See #1001.
34                   #"windmill >= 1.3",
35                   ]
36
37 import platform
38 if platform.machine().lower() in ['i386', 'x86_64', 'amd64', 'x86', '']:
39     # pycryptopp v0.5.20 fixes bugs in SHA-256 and AES on x86 or amd64
40     # (from Crypto++ revisions 470, 471, 480, 492).  The '' is there
41     # in case platform.machine is broken and this is actually an x86
42     # or amd64 machine.
43     install_requires.append("pycryptopp >= 0.5.20")
44 else:
45     # pycryptopp v0.5.13 had a new bundled version of Crypto++
46     # (v5.6.0) and a new bundled version of setuptools (although that
47     # shouldn't make any different to users of pycryptopp).
48     install_requires.append("pycryptopp >= 0.5.14")
49
50
51 # Sqlite comes built into Python >= 2.5, and is provided by the "pysqlite"
52 # distribution for Python 2.4.
53 import sys
54 if sys.version_info < (2, 5):
55     # pysqlite v2.0.5 was shipped in Ubuntu 6.06 LTS "dapper" and Nexenta NCP 1.
56     install_requires.append("pysqlite >= 2.0.5")
57
58 ## The following block is commented-out because there is not currently a pywin32 package which
59 ## can be easy_install'ed and also which actually makes "import win32api" succeed.
60 ## See http://sourceforge.net/tracker/index.php?func=detail&aid=1799934&group_id=78018&atid=551954
61 ## Users have to manually install pywin32 on Windows before installing Tahoe.
62 ##import platform
63 ##if platform.system() == "Windows":
64 ##    # Twisted requires pywin32 if it is going to offer process management functionality, or if
65 ##    # it is going to offer iocp reactor.  We currently require process management.  It would be
66 ##    # better if Twisted would declare that it requires pywin32 if it is going to offer process
67 ##    # management.  That is twisted ticket #3238 -- http://twistedmatrix.com/trac/ticket/3238 .
68 ##    # On the other hand, Tahoe also depends on pywin32 for getting free disk space statistics
69 ##    # (although that is not a hard requirement: if win32api can't be imported then we don't
70 ##    # rely on having the disk stats).
71 ##    install_requires.append('pywin32')
72
73 if hasattr(sys, 'frozen'): # for py2exe
74     install_requires=[]
75 del sys # clean up namespace
76
77 def require_python_version():
78     import sys, platform
79
80     # we require 2.4.4 on non-UCS-2, non-Redhat builds to avoid <http://www.python.org/news/security/PSF-2006-001/>
81     # we require 2.4.3 on non-UCS-2 Redhat, because 2.4.3 is common on Redhat-based distros and will have patched the above bug
82     # we require at least 2.4.2 in any case to avoid a bug in the base64 module: <http://bugs.python.org/issue1171487>
83     if sys.maxunicode == 65535:
84         if sys.version_info < (2, 4, 2) or sys.version_info[0] > 2:
85             raise NotImplementedError("Tahoe-LAFS current requires Python v2.4.2 or greater "
86                                       "for a UCS-2 build (but less than v3), not %r" %
87                                       (sys.version_info,))
88     elif platform.platform().lower().find('redhat') >= 0:
89         if sys.version_info < (2, 4, 3) or sys.version_info[0] > 2:
90             raise NotImplementedError("Tahoe-LAFS current requires Python v2.4.3 or greater "
91                                       "on Redhat-based distributions (but less than v3), not %r" %
92                                       (sys.version_info,))
93     else:
94         if sys.version_info < (2, 4, 4) or sys.version_info[0] > 2:
95             raise NotImplementedError("Tahoe-LAFS current requires Python v2.4.4 or greater "
96                                       "for a non-UCS-2 build (but less than v3), not %r" %
97                                       (sys.version_info,))
98
99 def require_auto_deps():
100     """
101     The purpose of this function is to raise a pkg_resources exception if any of the
102     requirements can't be imported.  This is just to give earlier and more explicit error
103     messages, as opposed to waiting until the source code tries to import some module from one
104     of these packages and gets an ImportError.  This function gets called from
105     src/allmydata/__init__.py .
106     """
107     require_python_version()
108
109     import pkg_resources
110     import foolscap.api
111     if foolscap.api.__version__ != '0.6.0':
112         import os, sys
113         raise AssertionError("wrong foolscap!\nfoolscap.api.__version__=%r\nPYTHONPATH=%r\nsys.path=%r" %
114                              (foolscap.api.__version__, os.environ.get('PYTHONPATH'), sys.path))
115
116     for requirement in install_requires:
117         try:
118             pkg_resources.require(requirement)
119         except pkg_resources.DistributionNotFound:
120             # there is no .egg-info present for this requirement, which
121             # either means that it isn't installed, or it is installed in a
122             # way that pkg_resources can't find it (but regular python
123             # might).  There are several older Linux distributions which
124             # provide our dependencies just fine, but they don't ship
125             # .egg-info files. Note that if there *is* an .egg-info file,
126             # but it shows a too-old version, then we'll get a
127             # VersionConflict error instead of DistributionNotFound.
128             pass