[MRG] from trunk
[odoo/odoo.git] / setup.py
1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*-
3 ##############################################################################
4 #
5 #    OpenERP, Open Source Management Solution
6 #    Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
7 #
8 #    This program is free software: you can redistribute it and/or modify
9 #    it under the terms of the GNU Affero General Public License as
10 #    published by the Free Software Foundation, either version 3 of the
11 #    License, or (at your option) any later version.
12 #
13 #    This program is distributed in the hope that it will be useful,
14 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
15 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 #    GNU Affero General Public License for more details.
17 #
18 #    You should have received a copy of the GNU Affero General Public License
19 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##############################################################################
22
23 # setup from TinERP
24 #   taken from straw http://www.nongnu.org/straw/index.html
25 #   taken from gnomolicious http://www.nongnu.org/gnomolicious/
26 #   adapted by Nicolas Évrard <nicoe@altern.org>
27 #
28
29 import sys
30 import os
31 from os.path import join, isfile, basename
32 import glob
33
34 from pprint import pprint as pp
35
36 from setuptools import setup, find_packages
37 from setuptools.command.install import install
38 from distutils.sysconfig import get_python_lib
39
40 has_py2exe = False
41 if os.name == 'nt':
42     import py2exe
43     has_py2exe = True
44
45 sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin"))
46
47 execfile(join('bin', 'release.py'))
48
49 if 'bdist_rpm' in sys.argv:
50     version = version.split('-')[0]
51
52 # get python short version
53 py_short_version = '%s.%s' % sys.version_info[:2]
54
55 # backports os.walk with followlinks from python 2.6
56 def walk_followlinks(top, topdown=True, onerror=None, followlinks=False):
57     from os.path import join, isdir, islink
58     from os import listdir, error
59
60     try:
61         names = listdir(top)
62     except error, err:
63         if onerror is not None:
64             onerror(err)
65         return
66
67     dirs, nondirs = [], []
68     for name in names:
69         if isdir(join(top, name)):
70             dirs.append(name)
71         else:
72             nondirs.append(name)
73
74     if topdown:
75         yield top, dirs, nondirs
76     for name in dirs:
77         path = join(top, name)
78         if followlinks or not islink(path):
79             for x in walk_followlinks(path, topdown, onerror, followlinks):
80                 yield x
81     if not topdown:
82         yield top, dirs, nondirs
83
84 if sys.version_info < (2, 6):
85     os.walk = walk_followlinks
86
87 def find_addons():
88     for root, _, names in os.walk(join('bin', 'addons'), followlinks=True):
89         if '__openerp__.py' in names or '__terp__.py' in names:
90             yield basename(root), root
91     #look for extra modules
92     try:
93         empath = os.getenv('EXTRA_MODULES_PATH', '../addons/')
94         for mname in open(join(empath, 'server_modules.list')):
95             mname = mname.strip()
96             if not mname:
97                 continue
98
99             terp = join(empath, mname, '__openerp__.py')
100             if not os.path.exists(terp):
101                 terp = join(empath, mname, '__terp__.py')
102
103             if os.path.exists(terp):
104                 yield mname, join(empath, mname)
105             else:
106                 print "Module %s specified, but no valid path." % mname
107     except Exception:
108         pass
109
110 def data_files():
111     '''Build list of data files to be installed'''
112     files = []
113     if os.name == 'nt':
114         os.chdir('bin')
115         for (dp, dn, names) in os.walk('addons'):
116             files.append((dp, map(lambda x: join('bin', dp, x), names)))
117         os.chdir('..')
118         #for root, _, names in os.walk(join('bin','addons')):
119         #    files.append((root, [join(root, name) for name in names]))
120         for root, _, names in os.walk('doc'):
121             files.append((root, [join(root, name) for name in names]))
122         #for root, _, names in os.walk('pixmaps'):
123         #    files.append((root, [join(root, name) for name in names]))
124         files.append(('.', [join('bin', 'import_xml.rng'),]))
125     else:
126         man_directory = join('share', 'man')
127         files.append((join(man_directory, 'man1'), ['man/openerp-server.1']))
128         files.append((join(man_directory, 'man5'), ['man/openerp_serverrc.5']))
129
130         doc_directory = join('share', 'doc', 'openerp-server-%s' % version)
131         files.append((doc_directory, filter(isfile, glob.glob('doc/*'))))
132         files.append((join(doc_directory, 'migrate', '3.3.0-3.4.0'),
133                       filter(isfile, glob.glob('doc/migrate/3.3.0-3.4.0/*'))))
134         files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'),
135                       filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*'))))
136
137         openerp_site_packages = join(get_python_lib(prefix=''), 'openerp-server')
138
139         files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),]))
140
141         if sys.version_info[0:2] == (2,5):
142             files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'),
143                                                    join('python25-compat','SimpleXMLRPCServer.py'),
144                                                    join('python25-compat','SocketServer.py')]))
145
146         for addonname, add_path in find_addons():
147             addon_path = join(get_python_lib(prefix=''), 'openerp-server','addons', addonname)
148             for root, dirs, innerfiles in os.walk(add_path):
149                 innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles)
150                 if innerfiles:
151                     res = os.path.normpath(join(addon_path, root.replace(join(add_path), '.')))
152                     files.extend(((res, map(lambda fil: join(root, fil),
153                                             innerfiles)),))
154
155     return files
156
157 f = file('openerp-server','w')
158 f.write("""#!/bin/sh
159 echo "Error: the content of this file should have been replaced during "
160 echo "installation\n"
161 exit 1
162 """)
163 f.close()
164
165 def find_package_dirs():
166     package_dirs = {'openerp-server': 'bin'}
167     for mod, path in find_addons():
168         package_dirs['openerp-server.addons.' + mod] = path
169     return package_dirs
170
171 class openerp_server_install(install):
172     def run(self):
173         # create startup script
174         start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\
175             % (join(self.install_libbase, "openerp-server"), sys.executable)
176         # write script
177         f = open('openerp-server', 'w')
178         f.write(start_script)
179         f.close()
180         install.run(self)
181
182
183
184 options = {
185     "py2exe": {
186         "compressed": 1,
187         "optimize": 2,
188         "dist_dir": 'dist',
189         "packages": [
190             "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
191             "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath",
192             "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing",
193             "pydot", "asyncore","asynchat", "reportlab", "vobject",
194             "HTMLParser", "select", "mako", "poplib",
195             "imaplib", "smtplib", "email", "yaml", "DAV",
196             "uuid",
197         ],
198         "excludes" : ["Tkconstants","Tkinter","tcl"],
199     }
200 }
201
202 setup(name             = name,
203       version          = version,
204       description      = description,
205       long_description = long_desc,
206       url              = url,
207       author           = author,
208       author_email     = author_email,
209       classifiers      = filter(None, classifiers.split("\n")),
210       license          = license,
211       data_files       = data_files(),
212       cmdclass         = {
213           'install' : openerp_server_install,
214       },
215       scripts          = ['openerp-server'],
216       packages = [
217           '.'.join(['openerp-server'] + package.split('.')[1:])
218           for package in find_packages()
219       ],
220       include_package_data = True,
221       package_data = {
222           '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'],
223       },
224       package_dir      = find_package_dirs(),
225       console = [
226           {
227               "script": join("bin", "openerp-server.py"),
228               "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))]
229           }
230       ],
231       options = options,
232       install_requires = [
233           'lxml',
234           'mako',
235           'python-dateutil',
236           'psycopg2',
237           'pychart',
238           'pydot',
239           'pytz',
240           'reportlab',
241           'caldav',
242           'pyyaml',
243           'pywebdav'
244           'feedparser',
245       ],
246       extras_require={
247           'SSL' : ['pyopenssl'],
248       }
249 )
250