2 # -*- coding: utf-8 -*-
3 ##############################################################################
5 # OpenERP, Open Source Management Solution
6 # Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
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.
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.
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/>.
21 ##############################################################################
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>
32 from os.path import join, isfile, basename
35 from distutils.core import setup, Command
36 from distutils.command.install import install
43 sys.path.append(join(os.path.abspath(os.path.dirname(__file__)), "bin"))
45 execfile(join('bin', 'release.py'))
47 if sys.argv[1] == 'bdist_rpm':
48 version = version.split('-')[0]
50 # get python short version
51 py_short_version = '%s.%s' % sys.version_info[:2]
54 ('lxml', 'lxml module: pythonic libxml2 and libxslt bindings'),
55 ('mako', 'Mako template engine'),
56 ('mx', "egenix's mx library for its extended DateTime module"),
57 ('psycopg2', 'PostgreSQL module'),
58 ('pychart', 'pychart module'),
59 ('pydot', 'pydot module'),
60 ('pytz', 'Timezone handling library for Python'),
61 ('reportlab', 'reportlab module'),
66 for modname, desc in required_modules:
68 imp.find_module(modname)
71 'Error: python module %s (%s) is required' % (modname, desc))
74 print '\n'.join(errors)
78 for root, _, names in os.walk(join('bin', 'addons')):
79 if '__terp__.py' in names:
80 yield basename(root), root
81 #look for extra modules
83 empath = os.getenv('EXTRA_MODULES_PATH', '../addons/')
84 for mname in open(join(empath, 'server_modules.list')):
88 if os.path.exists(join(empath, mname, '__terp__.py')):
89 yield mname, join(empath, mname)
91 print "Module %s specified, but no valid path." % mname
96 '''Build list of data files to be installed'''
99 for root, _, names in os.walk(join('bin','addons')):
100 files.append((root, [join(root, name) for name in names]))
101 for root, _, names in os.walk('doc'):
102 files.append((root, [join(root, name) for name in names]))
103 files.append(('.', [join('bin', 'import_xml.rng'),
104 join('bin', 'server.pkey'),
105 join('bin', 'server.cert')]))
107 man_directory = join('share', 'man')
108 files.append((join(man_directory, 'man1'), ['man/openerp-server.1']))
109 files.append((join(man_directory, 'man5'), ['man/openerp_serverrc.5']))
111 doc_directory = join('share', 'doc', 'openerp-server-%s' % version)
112 files.append((doc_directory, filter(isfile, glob.glob('doc/*'))))
113 files.append((join(doc_directory, 'migrate', '3.3.0-3.4.0'),
114 filter(isfile, glob.glob('doc/migrate/3.3.0-3.4.0/*'))))
115 files.append((join(doc_directory, 'migrate', '3.4.0-4.0.0'),
116 filter(isfile, glob.glob('doc/migrate/3.4.0-4.0.0/*'))))
118 openerp_site_packages = join('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server')
120 files.append((openerp_site_packages, [join('bin', 'import_xml.rng'),
121 join('bin', 'server.pkey'),
122 join('bin', 'server.cert')]))
124 if sys.version_info[0:2] == (2,5):
125 files.append((openerp_site_packages, [ join('python25-compat','BaseHTTPServer.py'),
126 join('python25-compat','SimpleXMLRPCServer.py'),
127 join('python25-compat','SocketServer.py')]))
129 for addonname, add_path in find_addons():
130 addon_path = join('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server','addons', addonname)
131 for root, dirs, innerfiles in os.walk(add_path):
132 innerfiles = filter(lambda fil: os.path.splitext(fil)[1] not in ('.pyc', '.pyd', '.pyo'), innerfiles)
134 res = os.path.normpath(join(addon_path, root.replace(join(add_path), '.')))
135 files.extend(((res, map(lambda fil: join(root, fil),
140 if not os.getenv('NO_CHECK_MODULES') :
143 f = file('openerp-server','w')
145 echo "Error: the content of this file should have been replaced during "
146 echo "installation\n"
151 def find_package_dirs():
152 package_dirs = {'openerp-server': 'bin'}
153 for mod, path in find_addons():
154 package_dirs['openerp-server.addons.' + mod] = path
157 class openerp_server_install(install):
159 # create startup script
160 start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n"\
161 % (join(self.install_libbase, "openerp-server"), sys.executable)
163 f = open('openerp-server', 'w')
164 f.write(start_script)
173 "packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree",
174 "lxml.objectify", "decimal", "xml", "xml.dom", "xml.xpath",
175 "encodings","mx.DateTime","wizard","pychart","PIL",
176 "pyparsing", "pydot","asyncore","asynchat", "reportlab",
177 "vobject", "HTMLParser", "select"],
178 "excludes" : ["Tkconstants","Tkinter","tcl"],
184 description = description,
185 long_description = long_desc,
188 author_email = author_email,
189 classifiers = filter(None, classifiers.split("\n")),
191 data_files = data_files(),
193 'install' : openerp_server_install,
195 scripts = ['openerp-server'],
196 packages = ['openerp-server',
197 'openerp-server.addons',
199 'openerp-server.osv',
200 'openerp-server.pychart',
201 'openerp-server.pychart.afm',
202 'openerp-server.report',
203 'openerp-server.report.printscreen',
204 'openerp-server.report.pyPdf',
205 'openerp-server.report.render',
206 'openerp-server.report.render.html2html',
207 'openerp-server.report.render.makohtml2html',
208 'openerp-server.report.render.odt2odt',
209 'openerp-server.report.render.rml2html',
210 'openerp-server.report.render.rml2pdf',
211 'openerp-server.report.render.rml2txt',
212 'openerp-server.service',
213 'openerp-server.tools',
214 'openerp-server.wizard',
215 'openerp-server.workflow'] + \
216 [('openerp-server.addons.' + name)
217 for name, _ in find_addons()],
218 package_dir = find_package_dirs(),
219 console = [{"script": join("bin", "openerp-server.py"),
220 "icon_resources": [(1,join("pixmaps","openerp-icon.ico"))]
226 # Sometime between pytz-2008a and pytz-2008i common_timezones started to
227 # include only names of zones with a corresponding data file in zoneinfo.
228 # pytz installs the zoneinfo directory tree in the same directory
229 # as the pytz/__init__.py file. These data files are loaded using
230 # pkg_resources.resource_stream. py2exe does not copy this to library.zip so
231 # resource_stream can't find the files and common_timezones is empty when
232 # read in the py2exe executable.
233 # This manually copies zoneinfo into the zip. See also
234 # http://code.google.com/p/googletransitdatafeed/issues/detail?id=121
237 # Make sure the layout of pytz hasn't changed
238 assert (pytz.__file__.endswith('__init__.pyc') or
239 pytz.__file__.endswith('__init__.py')), pytz.__file__
240 zoneinfo_dir = join(os.path.dirname(pytz.__file__), 'zoneinfo')
241 # '..\\Lib\\pytz\\__init__.py' -> '..\\Lib'
242 disk_basedir = os.path.dirname(os.path.dirname(pytz.__file__))
243 zipfile_path = join(options['py2exe']['dist_dir'], 'library.zip')
244 z = zipfile.ZipFile(zipfile_path, 'a')
245 for absdir, directories, filenames in os.walk(zoneinfo_dir):
246 assert absdir.startswith(disk_basedir), (absdir, disk_basedir)
247 zip_dir = absdir[len(disk_basedir):]
249 z.write(join(absdir, f), join(zip_dir, f))