source: pyromaths/trunk/fuentes/setup.py @ 423

Last change on this file since 423 was 423, checked in by mabarracus, 4 years ago

add sources from pyromaths 15.10

  • Property svn:executable set to *
File size: 9.3 KB
Line 
1#!/usr/bin/python
2# -*- coding: utf8 -*-
3"""
4Build script for pyromaths.
5
6This script is internally based on setuptools, with platform-specific extensions
7for special tasks (py2app, py2exe, innosetup).
8It builds different types of packages (source, binary, self-contained) on
9several platforms. Packages should be functional, although further optimization
10may be operated by other scripts (see: pkg/README).
11
12Python source and bynary eggs (all platforms):
13    $ python setup.py [sdist|bdist|bdist_egg] [options...]
14
15RPM package (UNIX/Linux):
16    $ ./setup.py bdist_rpm [options...]
17
18Self-contained application (Mac OS X):
19    $ python setup.py py2app [options...]
20
21Self-contained application (Windows):
22    $ python setup.py py2exe [options...]
23    $ python setup.py innosetup [options...]
24
25Help and options:
26    $ python setup.py --help
27    $ python setup.py --help-commands
28
29Created on 13 avr. 2013
30@author: Olivier Cornu <o.cornu@gmail.com>
31
32"""
33import os
34import sys
35import codecs
36from glob import glob, has_magic
37from os.path import dirname, normpath, join, abspath, realpath
38
39from setuptools import setup, find_packages
40
41import gettext
42locale_dir = join(dirname(__file__), 'locale/')
43locale_dir = realpath(locale_dir)
44
45gettext.install('pyromaths', localedir=locale_dir, unicode=1)
46
47py2exe, innosetup = None, None
48try:
49    import py2exe
50    import innosetup
51except ImportError:
52    pass
53
54# Import pyromaths VERSION from source
55_path = normpath(join(abspath(dirname(__file__)), "./src"))
56sys.path[0] = realpath(_path)
57#sys.path.append('src')
58from pyromaths.Values import VERSION
59print "Version ", VERSION
60
61def _unix_opt():
62    '''UNIX/Linux: generate Python eggs and RPM packages.'''
63    return dict(
64            platforms  = ['unix'],
65            scripts    = ['pyromaths'],
66            data_files = [
67            ('share/applications',     ['data/linux/pyromaths.desktop']),
68            ('share/man/man1',         ['data/linux/pyromaths.1']),
69            ('share/pixmaps/',         ['data/images/pyromaths.png']),
70            ('share/pyromaths/images', ['data/images/pyromaths-banniere.png',
71                                        'data/images/whatsthis.png']),
72            ('share/pyromaths/templates', glob('data/templates/*.tex')),
73            # ('share/pyromaths/packages',  glob('data/packages/*'))
74            ] + \
75            find_data_files('data/ex','share/pyromaths/ex/',['*/img/*.png']),
76            install_requires = ["lxml>=2.2.2"],
77    )
78
79def _mac_opt():
80    '''MacOS: py2app helps generate a self-contained app.'''
81    plist = dict(CFBundleIdentifier  = "org.pyromaths.pyromaths",
82                 CFBundleName        = "Pyromaths",
83                 CFBundleDisplayName = "Pyromaths",
84                 CFBundleVersion     = VERSION,
85                 CFBundleShortVersionString = VERSION,
86                 NSHumanReadableCopyright = u"© Jérôme Ortais",
87                 CFBundleDevelopmentRegion = "French",
88                 CFBundleIconFile    = "pyromaths",
89                 CFBundleExecutable  = "pyromaths",
90                 CFBundlePackageType = "APPL",
91                 CFBundleSignature   = "PYTS",
92                 )
93    # Unused Qt libraries/frameworks
94    qt_unused = ['QtDBus', 'QtDeclarative', 'QtDesigner', 'QtHelp',
95                 'QtMultimedia', 'QtNetwork', 'QtOpenGL', 'QtScript',
96                 'QtScriptTools', 'QtSql', 'QtSvg', 'QtTest', 'QtWebKit',
97                 'QtXml', 'QtXmlPatterns', 'phonon']
98    lib_dynload_unused = ['_AE', '_codecs_cn', '_codecs_hk', '_codecs_2022',
99                          '_codecs_iso2022', '_codecs_jp', '_codecs_kr',
100                          '_codecs_tw', '_Evt', '_File', '_hashlib', '_heapq',
101                          '_locale', '_multibytecodec', '_Res','_ssl', 'array',
102                          'bz2', 'cPickle', 'datetime', 'gestalt', 'MacOS',
103                          'pyexpat', 'rurce', 'strop', 'unicodedata']
104    site_packages_unused = ['_osx_support', '_builtinSuites', 'Carbon',
105                            'distutils', 'Finder', 'StdSuites','xml',
106                            'getopt', 'repr', '_strptime','gettext', 'sets',
107                            '_threading_local','base64', 'locale',
108                            'sre', 'bdb', 'optparse.', 'ssl', 'calendar', 'pdb',
109                            'stringprep', 'cmd', 'pkg_resources', 'copy',
110                            'platform', 'threading', 'dummy_thread', 'plistlib',
111                            'quopri', 'doctest', 'ntpath', 'OpenSSL',
112                            'os2emxpath', 'PyQt4.uic']
113    excludes = lib_dynload_unused + site_packages_unused + ['PyQt4.%s' % f for f in qt_unused]
114    # py2app
115    py2app = dict(plist    = plist,
116                  iconfile = 'data/images/pyromaths.icns',
117                  includes = ['gzip'],
118                  packages = ['pyromaths.ex'],
119                  excludes = excludes,
120                  argv_emulation = True,
121                  )
122    return dict(
123        app        = ['src/pyromaths.py'],
124        data_files = [
125            ( 'data', ['data/qtmac_fr.qm']),
126            ( 'data/images', ['data/images/pyromaths.png',
127                     'data/images/whatsthis.png']),
128            ('data/templates',        glob('data/templates/*.tex')),
129            # ('data/packages',         glob('data/packages/*')),
130        ] + find_data_files('data/ex','data/ex/',['*/img/*.png']),
131        setup_requires = ['py2app>=0.7.3', 'lxml>=2.2.2'],
132        options    = {'py2app': py2app},
133    )
134
135def _win_opt():
136    '''M$ Win: py2exe helps generate a self-contained app.'''
137#   import py2exe, innosetup
138    inno_script = '''
139[Setup]
140Compression = lzma/max
141OutputBaseFilename = pyromaths-%s-win32
142[Languages]
143Name: "french"; MessagesFile: "compiler:Languages\French.isl"
144[Tasks]
145Name: "desktopicon"; Description:  "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
146[Icons]
147Name: "{commondesktop}\Pyromaths"; Filename: "{app}\pyromaths.exe"
148''' % VERSION
149    return dict(
150        platforms  = ['windows'],
151        data_files=[
152          ('data/images', ['data/images/pyromaths.ico',
153            'data/images/pyromaths.png', 'data/images/pyromaths-banniere.png',
154            'data/images/whatsthis.png']
155           ),
156          (r'data/templates', glob(r'data/templates/*.tex')),
157          # (r'data/packages', glob(r'data/packages/*')),
158        ] + find_data_files('data/ex','data/ex/',['*/img/*.png']),
159        zipfile = None,
160        windows = [dict(script="pyromaths",
161                        icon_resources=[(1, 'data/images/pyromaths.ico')],
162                        )
163                   ],
164        setup_requires = ['py2exe'],
165        options = dict(py2exe=dict(compressed   = True,
166                                   optimize     = 2,
167                                   bundle_files = 3,
168                                   packages = ['pyromaths.ex', ],
169                                   includes     = ['sip', 'gzip', ],
170                                   dll_excludes = ['msvcr90.dll', 'msvcp90.dll'],
171                                   ),
172                       innosetup=dict(inno_script=inno_script,
173                                      bundle_vcr = False,
174                                      )
175                       )
176    )
177
178def find_data_files(source,target,patterns):
179  if has_magic(source) or has_magic(target):
180    raise ValueError("Magic not allowed in src, target")
181  ret = {}
182  for pattern in patterns:
183    pattern = os.path.join(source,pattern)
184    for filename in glob(pattern):
185      if os.path.isfile(filename):
186        targetpath = os.path.join(target, os.path.relpath(filename, source))
187        path = os.path.dirname(targetpath)
188        ret.setdefault(path,[]).append(filename)
189  return sorted(ret.items())
190
191# Set platform-specific options
192if "py2app" in sys.argv:
193    options = _mac_opt()
194elif sys.platform == 'win32':
195    options = _win_opt()
196else:
197    options = _unix_opt()
198
199# Long description is copied from README file
200if innosetup:
201    # innosetup fails with generated multiline long description
202    README = "Create maths exercises in LaTeX and PDF format"
203else:
204    with codecs.open('README', encoding='utf-8', mode='r') as file:
205        README = file.read()
206
207setup(
208    # project metadata
209    name        = "pyromaths",
210    version     = VERSION,
211    description = "Create maths exercises in LaTeX and PDF format",
212    long_description = README,
213    license     = "GPL",
214    url         = "http://www.pyromaths.org",
215    download_url = "http://www.pyromaths.org/telecharger/",
216    author      = u"Jérôme Ortais",
217    author_email = "jerome.ortais@pyromaths.org",
218    # python packages
219    packages    = find_packages('src'),
220    package_dir = {'': 'src'},
221    # dependencies
222    provides    = ["pyromaths"],
223    # platform-specific options
224    **options
225)
226
227# Post-processing
228if "py2app" in sys.argv:
229    # py2app/setenv hack: replace executable with one appending several LaTeX
230    # distributions locations to the path.
231    mactex   = "/Library/TeX/texbin:/usr/texbin:/usr/local/bin"
232    macports = "/opt/local/bin:/opt/local/sbin"
233    fink     = "/sw/bin"
234    path     = "%s:%s:%s" % (mactex, macports, fink)
235    f = open('dist/Pyromaths.app/Contents/MacOS/setenv.sh', 'w')
236    f.write('''#!/bin/sh
237PWD=$(dirname "$0"); /usr/bin/env PATH="$PATH:%s" $PWD/pyromaths''' % path)
238    os.system("chmod +x dist/Pyromaths.app/Contents/MacOS/setenv.sh")
239    os.system("sed -i '' '23s/pyromaths/setenv.sh/' dist/Pyromaths.app/Contents/Info.plist")
Note: See TracBrowser for help on using the repository browser.