setup.py 6.94 KB
Newer Older
Christophe Benz's avatar
Christophe Benz committed
1
2
3
#! /usr/bin/env python
# -*- coding: utf-8 -*-

4
# Copyright(C) 2010-2014 Christophe Benz, Laurent Bachelier
5
#
Romain Bignon's avatar
Romain Bignon committed
6
# This file is part of weboob.
7
#
Romain Bignon's avatar
Romain Bignon committed
8
9
10
11
12
13
# weboob is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# weboob is distributed in the hope that it will be useful,
14
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Romain Bignon's avatar
Romain Bignon committed
15
16
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
17
#
Romain Bignon's avatar
Romain Bignon committed
18
19
# You should have received a copy of the GNU Affero General Public License
# along with weboob. If not, see <http://www.gnu.org/licenses/>.
20

21
from __future__ import print_function
Christophe Benz's avatar
Christophe Benz committed
22

23
import glob
Christophe Benz's avatar
Christophe Benz committed
24
import os
25
26
27
import subprocess
import sys

28
29
from setuptools import find_packages, setup

30

31
32
33
34
35
36
37
38
39
40
41
42
def find_executable(name, names):
    envname = '%s_EXECUTABLE' % name.upper()
    if os.getenv(envname):
        return os.getenv(envname)
    paths = os.getenv('PATH', os.defpath).split(os.pathsep)
    exts = os.getenv('PATHEXT', os.pathsep).split(os.pathsep)
    for name in names:
        for path in paths:
            for ext in exts:
                fpath = os.path.join(path, name) + ext
                if os.path.exists(fpath) and os.access(fpath, os.X_OK):
                    return fpath
Romain Bignon's avatar
Romain Bignon committed
43
    print('Could not find executable: %s' % name, file=sys.stderr)
44

45

46
def build_qt():
Romain Bignon's avatar
Romain Bignon committed
47
    print('Building Qt applications...', file=sys.stderr)
48
    make = find_executable('make', ('gmake', 'make'))
49
    pyuic5 = find_executable('pyuic5', ('python2-pyuic5', 'pyuic5-python2.7', 'pyuic5'))
50
    if not pyuic5 or not make:
Romain Bignon's avatar
Romain Bignon committed
51
        print('Install missing component(s) (see above) or disable Qt applications (with --no-qt).', file=sys.stderr)
52
        sys.exit(1)
53

54
55
56
57
58
    subprocess.check_call(
        [make,
         '-f', 'build.mk',
         '-s', '-j2',
         'all',
59
         'PYUIC=%s%s' % (pyuic5, ' WIN32=1' if sys.platform == 'win32' else '')])
60

61

62
63
def install_weboob():
    scripts = set(os.listdir('scripts'))
64
    packages = set(find_packages(exclude=['modules', 'modules.*']))
65
66

    hildon_scripts = set(('masstransit',))
67
68
    qt_scripts = set(('qboobmsg',
                      'qhavedate',
hydrargyrum's avatar
hydrargyrum committed
69
                      'qgalleroob',
70
71
72
73
74
75
                      'qvideoob',
                      'weboob-config-qt',
                      'qwebcontentedit',
                      'qflatboob',
                      'qcineoob',
                      'qcookboob',
76
                      'qbooblyrics',
77
                      'qhandjoob'))
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95

    if not options.hildon:
        scripts = scripts - hildon_scripts
    if options.qt:
        build_qt()
    else:
        scripts = scripts - qt_scripts

    hildon_packages = set((
        'weboob.applications.masstransit',
    ))
    qt_packages = set((
        'weboob.applications.qboobmsg',
        'weboob.applications.qboobmsg.ui',
        'weboob.applications.qcineoob',
        'weboob.applications.qcineoob.ui',
        'weboob.applications.qcookboob',
        'weboob.applications.qcookboob.ui',
96
97
        'weboob.applications.qbooblyrics',
        'weboob.applications.qbooblyrics.ui',
98
99
100
101
102
103
104
105
106
107
108
        'weboob.applications.qhandjoob',
        'weboob.applications.qhandjoob.ui',
        'weboob.applications.qhavedate',
        'weboob.applications.qhavedate.ui',
        'weboob.applications.qvideoob',
        'weboob.applications.qvideoob.ui',
        'weboob.applications.qweboobcfg',
        'weboob.applications.qweboobcfg.ui',
        'weboob.applications.qwebcontentedit',
        'weboob.applications.qwebcontentedit.ui'
        'weboob.applications.qflatboob',
hydrargyrum's avatar
hydrargyrum committed
109
110
111
        'weboob.applications.qflatboob.ui',
        'weboob.applications.qgalleroob',
        'weboob.applications.qgalleroob.ui',
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    ))

    if not options.hildon:
        packages = packages - hildon_packages
    if not options.qt:
        packages = packages - qt_packages

    data_files = [
        ('share/man/man1', glob.glob('man/*')),
    ]
    if options.xdg:
        data_files.extend([
            ('share/applications', glob.glob('desktop/*')),
            ('share/icons/hicolor/64x64/apps', glob.glob('icons/*')),
        ])

    # Do not put PyQt, it does not work properly.
    requirements = [
        'lxml',
131
        'cssselect',
132
        'requests>=2.0.0',
133
134
        'python-dateutil',
        'PyYAML',
135
        'html2text>=3.200',
136
        'six',
137
        'unidecode',
138
        'Pillow',
139
140
        'mechanize; python_version < "3.0"',
        'futures; python_version < "3.2"',
141
142
143
144
145
    ]

    if not options.deps:
        requirements = []

146
147
148
149
150
151
152
    try:
        if sys.argv[1] == 'requirements':
            print('\n'.join(requirements))
            sys.exit(0)
    except IndexError:
        pass

153
154
    setup(
        name='weboob',
Florent's avatar
Florent committed
155
        version='1.4',
156
        description='Weboob, Web Outside Of Browsers',
157
        long_description=open('README.md').read(),
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
        author='Romain Bignon',
        author_email='weboob@weboob.org',
        maintainer='Romain Bignon',
        maintainer_email='romain@weboob.org',
        url='http://weboob.org/',
        license='GNU AGPL 3',
        classifiers=[
            'Environment :: Console',
            'Environment :: X11 Applications :: Qt',
            'License :: OSI Approved :: GNU Affero General Public License v3',
            'Programming Language :: Python :: 2.7',
            'Programming Language :: Python',
            'Topic :: Communications :: Email',
            'Topic :: Internet :: WWW/HTTP',
        ],

        packages=packages,
        scripts=[os.path.join('scripts', script) for script in scripts],
        data_files=data_files,

        install_requires=requirements,
179
180
181
182
183
184
185
        python_requires='>=2.7',
        tests_require=[
            'flake8',
            'nose',
            'xunitparser',
            'coverage',
        ],
186
187
    )

188

189
class Options(object):
190
    hildon = False
Romain Bignon's avatar
Romain Bignon committed
191
    qt = False
192
    xdg = True
193
    deps = True
194

195
196
197
options = Options()

args = list(sys.argv)
198
if '--hildon' in args and '--no-hildon' in args:
Romain Bignon's avatar
Romain Bignon committed
199
    print('--hildon and --no-hildon options are incompatible', file=sys.stderr)
200
    sys.exit(1)
201
if '--qt' in args and '--no-qt' in args:
Romain Bignon's avatar
Romain Bignon committed
202
    print('--qt and --no-qt options are incompatible', file=sys.stderr)
203
    sys.exit(1)
204
if '--xdg' in args and '--no-xdg' in args:
Romain Bignon's avatar
Romain Bignon committed
205
    print('--xdg and --no-xdg options are incompatible', file=sys.stderr)
206
    sys.exit(1)
207

208
if '--hildon' in args or os.environ.get('HILDON') == 'true':
209
    options.hildon = True
210
211
    if '--hildon' in args:
        args.remove('--hildon')
212
213
214
215
elif '--no-hildon' in args:
    options.hildon = False
    args.remove('--no-hildon')

216
217
218
219
220
221
222
if '--qt' in args:
    options.qt = True
    args.remove('--qt')
elif '--no-qt' in args:
    options.qt = False
    args.remove('--no-qt')

223
224
225
226
227
228
229
if '--xdg' in args:
    options.xdg = True
    args.remove('--xdg')
elif '--no-xdg' in args:
    options.xdg = False
    args.remove('--no-xdg')

230
231
232
233
if '--nodeps' in args:
    options.deps = False
    args.remove('--nodeps')

234
sys.argv = args
Christophe Benz's avatar
Christophe Benz committed
235

Romain Bignon's avatar
Romain Bignon committed
236
install_weboob()