4aed74aff204efb96e43550d0c71fccaa3d60054
[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 py2exe_keywords = {}
42 if os.name == 'nt':
43     import py2exe
44     has_py2exe = True
45     py2exe_keywords['console'] = [
46         { "script": join("bin", "openerp-server.py"),
47           "icon_resources": [(1, join("pixmaps","openerp-icon.ico"))]
48         }]
49
50 sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin"))
51
52 execfile(join('bin', 'release.py'))
53
54 if 'bdist_rpm' in sys.argv:
55     version = version.split('-')[0]
56
57 # get python short version
58 py_short_version = '%s.%s' % sys.version_info[:2]
59
60 # backports os.walk with followlinks from python 2.6
61 def walk_followlinks(top, topdown=True, onerror=None, followlinks=False):
62     from os.path import join, isdir, islink
63     from os import listdir, error
64
65     try:
66         names = listdir(top)
67     except error, err:
68         if onerror is not None:
69             onerror(err)
70         return
71
72     dirs, nondirs = [], []
73     for name in names:
74         if isdir(join(top, name)):
75             dirs.append(name)
76         else:
77             nondirs.append(name)
78
79     if topdown:
80         yield top, dirs, nondirs
81     for name in dirs:
82         path = join(top, name)
83         if followlinks or not islink(path):
84             for x in walk_followlinks(path, topdown, onerror, followlinks):
85                 yield x
86     if not topdown:
87         yield top, dirs, nondirs
88
89 if sys.version_info < (2, 6):
90     os.walk = walk_followlinks
91
92 def find_addons():
93     for root, _, names in os.walk(join('bin', 'addons'), followlinks=True):
94         if '__openerp__.py' in names or '__terp__.py' in names:
95             yield basename(root), root
96     #look for extra modules
97     try:
98         empath = os.getenv('EXTRA_MODULES_PATH', '../addons/')
99         for mname in open(join(empath, 'server_modules.list')):
100             mname = mname.strip()
101             if not mname:
102                 continue
103
104             terp = join(empath, mname, '__openerp__.py')
105             if not os.path.exists(terp):
106                 terp = join(empath, mname, '__terp__.py')
107
108             if os.path.exists(terp):
109                 yield mname, join(empath, mname)
110             else:
111                 print "Module %s specified, but no valid path." % mname
112     except Exception:
113         pass
114
115 def data_files():
116     '''Build list of data files to be installed'''
117     files = []
118     if os.name == 'nt':
119         os.chdir('bin')
120         for (dp, dn, names) in os.walk('addons'):
121             files.append((dp, map(lambda x: join('bin', dp, x), names)))
122         os.chdir('..')
123         #for root, _, names in os.walk(join('bin','addons')):
124         #    files.append((root, [join(root, name) for name in names]))
125         for root, _, names in os.walk('doc'):
126             files.append((root, [join(root, name) for name in names]))
127         #for root, _, names in os.walk('pixmaps'):
128         #    files.append((root, [join(root, name) for name in names]))
129         files.append(('.', [join('bin', 'import_xml.rng'),]))
130     else:
131         man_directory = join('share', 'man')
132         files.append((join(man_directory, 'man1'), ['man/openerp-server.1']))
133         files.append((join(man_directory, 'man5'), ['man/openerp_serverrc.5']))
134
135         doc_directory = join('share', 'doc', 'openerp-server-%s' % version)
136         files.append((doc_directory, filter(isfile, glob.glob('doc/*'))))
137         files.append((join(doc_directory, 'migrate', '3.3.0-3.4.0'),
138                       filter(isfile, glob.glob('doc/migrate/3.3.0-3.4.0/*'))))
139         files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'),
140                       filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*'))))
141
142         openerp_site_packages = join(get_python_lib(prefix=''), 'openerp-server')
143
144         files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),]))
145
146         if sys.version_info[0:2] == (2,5):
147             files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'),
148                                                    join('python25-compat','SimpleXMLRPCServer.py'),
149                                                    join('python25-compat','SocketServer.py')]))
150
151         for addonname, add_path in find_addons():
152             addon_path = join(get_python_lib(prefix=''), 'openerp-server','addons', addonname)
153             for root, dirs, innerfiles in os.walk(add_path):
154                 innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles)
155                 if innerfiles:
156                     res = os.path.normpath(join(addon_path, root.replace(join(add_path), '.')))
157                     files.extend(((res, map(lambda fil: join(root, fil),
158                                             innerfiles)),))
159
160     return files
161
162 f = file('openerp-server','w')
163 f.write("""#!/bin/sh
164 echo "Error: the content of this file should have been replaced during "
165 echo "installation\n"
166 exit 1
167 """)
168 f.close()
169
170 def find_package_dirs():
171     package_dirs = {'openerp-server': 'bin'}
172     for mod, path in find_addons():
173         package_dirs['openerp-server.addons.' + mod] = path
174     return package_dirs
175
176 class openerp_server_install(install):
177     def run(self):
178         # create startup script
179         start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\
180             % (join(self.install_libbase, "openerp-server"), sys.executable)
181         # write script
182         f = open('openerp-server', 'w')
183         f.write(start_script)
184         f.close()
185         install.run(self)
186
187
188
189 options = {
190     "py2exe": {
191         "compressed": 1,
192         "optimize": 2,
193         "dist_dir": 'dist',
194         "packages": [
195             "lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
196             "lxml.objectify", "decimal", "xml", "xml", "xml.dom", "xml.xpath",
197             "encodings", "dateutil", "wizard", "pychart", "PIL", "pyparsing",
198             "pydot", "asyncore","asynchat", "reportlab", "vobject",
199             "HTMLParser", "select", "mako", "poplib",
200             "imaplib", "smtplib", "email", "yaml", "DAV",
201             "uuid", "commands",
202         ],
203         "excludes" : ["Tkconstants","Tkinter","tcl"],
204     }
205 }
206
207 setup(name             = name,
208       version          = version,
209       description      = description,
210       long_description = long_desc,
211       url              = url,
212       author           = author,
213       author_email     = author_email,
214       classifiers      = filter(None, classifiers.split("\n")),
215       license          = license,
216       data_files       = data_files(),
217       cmdclass         = {
218           'install' : openerp_server_install,
219       },
220       scripts          = ['openerp-server'],
221       packages = [
222           '.'.join(['openerp-server'] + package.split('.')[1:])
223           for package in find_packages()
224       ],
225       include_package_data = True,
226       package_data = {
227           '': ['*.yml', '*.xml', '*.po', '*.pot', '*.csv'],
228       },
229       package_dir      = find_package_dirs(),
230       options = options,
231       install_requires = [
232           'lxml',
233           'mako',
234           'python-dateutil',
235           'psycopg2',
236           'pychart',
237           'pydot',
238           'pytz',
239           'reportlab',
240           'caldav',
241           'pyyaml',
242           'pywebdav',
243           'feedparser',
244       ],
245       extras_require={
246           'SSL' : ['pyopenssl'],
247       },
248       **py2exe_keywords
249 )
250