modifs
[odoo/odoo.git] / setup.py
1 #!/usr/bin/env python
2 # -*- encoding: utf-8 -*-
3 ##############################################################################
4 #
5 #    OpenERP, Open Source Management Solution   
6 #    Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
7 #    $Id$
8 #
9 #    This program is free software: you can redistribute it and/or modify
10 #    it under the terms of the GNU General Public License as published by
11 #    the Free Software Foundation, either version 3 of the License, or
12 #    (at your option) any later version.
13 #
14 #    This program is distributed in the hope that it will be useful,
15 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
16 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 #    GNU General Public License for more details.
18 #
19 #    You should have received a copy of the GNU General Public License
20 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 #
22 ##############################################################################
23
24 # setup from TinERP
25 #   taken from straw http://www.nongnu.org/straw/index.html
26 #   taken from gnomolicious http://www.nongnu.org/gnomolicious/
27 #   adapted by Nicolas Évrard <nicoe@altern.org>
28 #
29
30 import imp
31 import sys
32 import os
33 import glob
34
35 from stat import ST_MODE
36
37 from distutils.core import setup, Command
38 from distutils.command.install import install
39 #from distutils.command.install_scripts import install_scripts
40 from distutils.file_util import copy_file
41
42 if os.name == 'nt':
43     import py2exe
44
45 sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), "bin"))
46
47 opj = os.path.join
48
49 execfile(opj('bin', 'release.py'))
50
51 # get python short version
52 py_short_version = '%s.%s' % sys.version_info[:2]
53
54 required_modules = [
55     ('psycopg', 'PostgreSQL module'),
56     ('xml', 'XML Tools for python'),
57     ('libxml2', 'libxml2 python bindings'),
58     ('libxslt', 'libxslt python bindings'),
59     ('reportlab', 'reportlab module'),
60     ('pychart', 'pychart module'),
61     ('pydot', 'pydot module'),
62 ]
63
64 def check_modules():
65     ok = True
66     for modname, desc in required_modules:
67         try:
68             exec('import %s' % modname)
69         except ImportError:
70             ok = False
71             print 'Error: python module %s (%s) is required' % (modname, desc)
72
73     if not ok:
74         sys.exit(1)
75
76 def find_addons():
77     for (dp, dn, names) in os.walk(opj('bin', 'addons')):
78         for dirpath, dirnames, filenames in os.walk(dp):
79             if '__init__.py' in filenames:
80                 modname = dirpath.replace(os.path.sep, '.')
81                 yield modname.replace('bin', 'openerp-server', 1)
82
83 def data_files():
84     '''Build list of data files to be installed'''
85     files = []
86     if os.name == 'nt':
87         os.chdir('bin')
88         for (dp,dn,names) in os.walk('addons'):
89             files.append((dp, map(lambda x: opj('bin', dp, x), names)))
90         for (dp,dn,names) in os.walk('i18n'):
91             files.append((dp, map(lambda x: opj('bin', dp, x), names)))
92         os.chdir('..')
93         for (dp,dn,names) in os.walk('doc'):
94             files.append((dp, map(lambda x: opj(dp, x), names)))
95         files.append(('.', [('bin/import_xml.rng')]))
96     else:
97         man_directory = opj('share', 'man')
98         files.append((opj(man_directory, 'man1'), ['man/openerp-server.1']))
99         files.append((opj(man_directory, 'man5'), ['man/openerp_serverrc.5']))
100
101         doc_directory = opj('share', 'doc', 'openerp-server-%s' % version)
102         files.append((doc_directory, [f for f in glob.glob('doc/*') if os.path.isfile(f)]))
103         files.append((opj(doc_directory, 'migrate', '3.3.0-3.4.0'), [f for f in glob.glob('doc/migrate/3.3.0-3.4.0/*') if os.path.isfile(f)]))
104         files.append((opj(doc_directory, 'migrate', '3.4.0-4.0.0'), [f for f in glob.glob('doc/migrate/3.4.0-4.0.0/*') if os.path.isfile(f)]))
105
106         openerp_site_packages = opj('lib', 'python%s' % py_short_version, 'site-packages', 'openerp-server')
107
108         files.append((opj(openerp_site_packages, 'i18n'), glob.glob('bin/i18n/*')))
109         files.append((opj(openerp_site_packages, 'addons', 'custom'),
110             glob.glob('bin/addons/custom/*xml') + glob.glob('bin/addons/custom/*rml') + glob.glob('bin/addons/custom/*xsl')))
111
112         files.append((openerp_site_packages, [('bin/import_xml.rng')]))
113
114         for addon in find_addons():
115             add_path = addon.replace('.', os.path.sep).replace('openerp-server', 'bin', 1)
116             addon_path = opj('lib', 'python%s' % py_short_version, 'site-packages', add_path.replace('bin', 'openerp-server', 1))
117
118             pathfiles = [
119                 (
120                     addon_path, 
121                     glob.glob(opj(add_path, '*xml')) + 
122                     glob.glob(opj(add_path, '*csv')) + 
123                     glob.glob(opj(add_path, '*sql'))
124                 ),
125                 (
126                     opj(addon_path, 'data'), 
127                     glob.glob(opj(add_path, 'data', '*xml'))
128                 ), 
129                 (
130                     opj(addon_path, 'report'),
131                     glob.glob(opj(add_path, 'report', '*xml')) +
132                     glob.glob(opj(add_path, 'report', '*rml')) +
133                     glob.glob(opj(add_path, 'report', '*sxw')) +
134                     glob.glob(opj(add_path, 'report', '*xsl'))
135                 ),
136                 (   
137                     opj(addon_path, 'security'),
138                     glob.glob(opj(add_path, 'security', '*csv')) +
139                     glob.glob(opj(add_path, 'security', '*xml'))
140                 ),
141                 (   
142                     opj(addon_path, 'rng'), 
143                     glob.glob(opj(add_path, 'rng', '*rng'))
144                 )
145             ]
146             files.extend(pathfiles)
147     return files
148
149 check_modules()
150
151
152 class openerp_server_install(install):
153     def run(self):
154         # create startup script
155         start_script = "#!/bin/sh\ncd %s\nexec %s ./openerp-server.py $@\n" % (opj(self.install_libbase, "openerp-server"), sys.executable)
156         # write script
157         f = open('openerp-server', 'w')
158         f.write(start_script)
159         f.close()
160
161         install.run(self)
162
163 options = {
164     "py2exe": {
165         "compressed": 1,
166         "optimize": 2, 
167         "packages": ["lxml", "lxml.builder", "lxml._elementpath", "lxml.etree", 
168                      "lxml.objectify", "decimal", "xml", "xml.dom", "xml.xpath", 
169                      "encodings","mx.DateTime","wizard","pychart","PIL", "pyparsing", 
170                      "pydot","asyncore","asynchat", "reportlab", "vobject", "HTMLParser"],
171         "excludes" : ["Tkconstants","Tkinter","tcl"],
172     }
173 }
174
175 setup(name             = name,
176       version          = version,
177       description      = description,
178       long_description = long_desc,
179       url              = url,
180       author           = author,
181       author_email     = author_email,
182       classifiers      = filter(None, classifiers.split("\n")),
183       license          = license,
184       data_files       = data_files(),
185       cmdclass         = { 'install' : openerp_server_install },
186       scripts          = ['openerp-server'],
187       packages         = ['openerp-server', 
188                           'openerp-server.addons',
189                           'openerp-server.ir',
190                           'openerp-server.osv',
191                           'openerp-server.ssl',
192                           'openerp-server.service', 
193                           'openerp-server.tools',
194                           'openerp-server.report',
195                           'openerp-server.report.printscreen',
196                           'openerp-server.report.render',
197                           'openerp-server.report.render.rml2pdf',
198                           'openerp-server.report.render.rml2html',
199                           'openerp-server.wizard', 
200                           'openerp-server.workflow'] + \
201                          list(find_addons()),
202       package_dir      = {'openerp-server': 'bin'},
203       console = [ 
204           { "script" : "bin\\openerp-server.py", 
205             "icon_resources" : [
206                 (1,"pixmaps\\openerp-icon.ico")
207             ]
208           }
209       ],
210       options = options,
211       )
212
213
214 # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
215