/ 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 )