/ setup.py
setup.py
  1  #!/usr/bin/env python2.7
  2  
  3  import os
  4  import platform
  5  import shutil
  6  import sys
  7  from importlib import import_module
  8  
  9  from setuptools import Extension, setup
 10  from setuptools.command.install import install
 11  
 12  from src.version import softwareVersion
 13  
 14  EXTRAS_REQUIRE = {
 15      'docs': ['sphinx'],
 16      'gir': ['pygobject'],
 17      'json': ['jsonrpclib'],
 18      'notify2': ['notify2'],
 19      'opencl': ['pyopencl', 'numpy'],
 20      'prctl': ['python_prctl'],  # Named threads
 21      'qrcode': ['qrcode'],
 22      'sound;platform_system=="Windows"': ['winsound'],
 23      'tor': ['stem'],
 24      'xdg': ['pyxdg'],
 25      'xml': ['defusedxml']
 26  }
 27  
 28  
 29  class InstallCmd(install):
 30      """Custom setuptools install command preparing icons"""
 31  
 32      def run(self):
 33          # prepare icons directories
 34          try:
 35              os.makedirs('desktop/icons/scalable')
 36          except os.error:
 37              pass
 38          shutil.copyfile(
 39              'desktop/can-icon.svg', 'desktop/icons/scalable/pybitmessage.svg')
 40          try:
 41              os.makedirs('desktop/icons/24x24')
 42          except os.error:
 43              pass
 44          shutil.copyfile(
 45              'desktop/icon24.png', 'desktop/icons/24x24/pybitmessage.png')
 46  
 47          return install.run(self)
 48  
 49  
 50  if __name__ == "__main__":
 51      here = os.path.abspath(os.path.dirname(__file__))
 52      with open(os.path.join(here, 'README.md')) as f:
 53          README = f.read()
 54  
 55      with open(os.path.join(here, 'requirements.txt'), 'r') as f:
 56          requirements = list(f.readlines())
 57  
 58      bitmsghash = Extension(
 59          'pybitmessage.bitmsghash.bitmsghash',
 60          sources=['src/bitmsghash/bitmsghash.cpp'],
 61          libraries=['pthread', 'crypto'],
 62      )
 63  
 64      installRequires = ['six']
 65      packages = [
 66          'pybitmessage',
 67          'pybitmessage.bitmessageqt',
 68          'pybitmessage.bitmessagecurses',
 69          'pybitmessage.fallback',
 70          'pybitmessage.messagetypes',
 71          'pybitmessage.network',
 72          'pybitmessage.plugins',
 73          'pybitmessage.pyelliptic',
 74          'pybitmessage.storage'
 75      ]
 76      package_data = {'': [
 77          'bitmessageqt/*.ui', 'bitmsghash/*.cl', 'sslkeys/*.pem',
 78          'translations/*.ts', 'translations/*.qm', 'default.ini',
 79          'sql/*.sql', 'images/*.png', 'images/*.ico', 'images/*.icns',
 80          'bitmessagekivy/main.kv', 'bitmessagekivy/screens_data.json',
 81          'bitmessagekivy/kv/*.kv', 'images/kivy/payment/*.png',
 82          'images/kivy/*.gif', 'images/kivy/text_images*.png'
 83      ]}
 84  
 85      if sys.version_info[0] == 3:
 86          packages.extend([
 87              'pybitmessage.bitmessagekivy',
 88              'pybitmessage.bitmessagekivy.baseclass'
 89          ])
 90  
 91      if os.environ.get('INSTALL_TESTS', False):
 92          packages.extend([
 93              'pybitmessage.mockbm', 'pybitmessage.backend',
 94              'pybitmessage.bitmessagekivy.tests'
 95          ])
 96          package_data[''].extend(['bitmessagekivy/tests/sampleData/*.dat'])
 97  
 98      # this will silently accept alternative providers of msgpack
 99      # if they are already installed
100  
101      try:
102          import msgpack
103          installRequires.append(
104              "msgpack-python" if msgpack.version[:2] < (0, 6) else "msgpack")
105      except ImportError:
106          try:
107              import_module('umsgpack')
108              installRequires.append("umsgpack")
109          except ImportError:
110              packages += ['pybitmessage.fallback.umsgpack']
111  
112      data_files = [
113          ('share/applications/',
114              ['desktop/pybitmessage.desktop']),
115          ('share/icons/hicolor/scalable/apps/',
116              ['desktop/icons/scalable/pybitmessage.svg']),
117          ('share/icons/hicolor/24x24/apps/',
118              ['desktop/icons/24x24/pybitmessage.png'])
119      ]
120  
121      try:
122          if platform.dist()[0] in ('Debian', 'Ubuntu'):
123              data_files += [
124                  ("etc/apparmor.d/",
125                      ['packages/apparmor/pybitmessage'])
126              ]
127      except AttributeError:
128          pass  # FIXME: use distro for more recent python
129  
130      dist = setup(
131          name='pybitmessage',
132          version=softwareVersion,
133          description="Reference client for Bitmessage: "
134          "a P2P communications protocol",
135          long_description=README,
136          license='MIT',
137          # TODO: add author info
138          url='https://bitmessage.org',
139          # TODO: add keywords
140          install_requires=installRequires,
141          tests_require=requirements,
142          test_suite='tests.unittest_discover',
143          extras_require=EXTRAS_REQUIRE,
144          classifiers=[
145              "License :: OSI Approved :: MIT License"
146              "Operating System :: OS Independent",
147              "Programming Language :: Python :: 2.7 :: Only",
148              "Topic :: Internet",
149              "Topic :: Security :: Cryptography",
150              "Topic :: Software Development :: Libraries :: Python Modules",
151          ],
152          package_dir={'pybitmessage': 'src'},
153          packages=packages,
154          package_data=package_data,
155          data_files=data_files,
156          ext_modules=[bitmsghash],
157          zip_safe=False,
158          entry_points={
159              'bitmessage.gui.menu': [
160                  'address.qrcode = pybitmessage.plugins.menu_qrcode [qrcode]'
161              ],
162              'bitmessage.notification.message': [
163                  'notify2 = pybitmessage.plugins.notification_notify2'
164                  '[gir, notify2]'
165              ],
166              'bitmessage.notification.sound': [
167                  'theme.canberra = pybitmessage.plugins.sound_canberra',
168                  'file.gstreamer = pybitmessage.plugins.sound_gstreamer'
169                  '[gir]',
170                  'file.fallback = pybitmessage.plugins.sound_playfile'
171                  '[sound]'
172              ],
173              'bitmessage.indicator': [
174                  'libmessaging ='
175                  'pybitmessage.plugins.indicator_libmessaging [gir]'
176              ],
177              'bitmessage.desktop': [
178                  'freedesktop = pybitmessage.plugins.desktop_xdg [xdg]'
179              ],
180              'bitmessage.proxyconfig': [
181                  'stem = pybitmessage.plugins.proxyconfig_stem [tor]'
182              ],
183              'console_scripts': [
184                  'pybitmessage = pybitmessage.bitmessagemain:main'
185              ] if sys.platform[:3] == 'win' else []
186          },
187          scripts=['src/pybitmessage'],
188          cmdclass={'install': InstallCmd},
189          command_options={
190              'build_sphinx': {
191                  'source_dir': ('setup.py', 'docs')}
192          }
193      )