Browse Source

setuptools: migrate from setup.py to setup.cfg

The preferred way to install MMGen is now:

    # cd to repository root
    $ python3 -m build --no-isolation
    $ pip3 install --user dist/*.whl

A user install eliminates reliance on superuser privileges and prevents
conflicts with Python packages that may already be installed on the system.

Python dependencies are automatically installed by pip.
The MMGen Project 3 years ago
parent
commit
4a9571424e
8 changed files with 91 additions and 206 deletions
  1. 4 0
      eth-requirements.txt
  2. 1 0
      mmgen/data/keywords
  3. 1 0
      mmgen/data/release_date
  4. 1 0
      mmgen/data/version
  5. 9 3
      mmgen/globalvars.py
  6. 7 0
      pyproject.toml
  7. 65 0
      setup.cfg
  8. 3 203
      setup.py

+ 4 - 0
eth-requirements.txt

@@ -0,0 +1,4 @@
+semantic-version
+pysha3
+py_ecc==1.6.0
+mypy_extensions==0.4.1

+ 1 - 0
mmgen/data/keywords

@@ -0,0 +1 @@
+Bitcoin, BTC, Ethereum, ETH, Monero, XMR, ERC20, cryptocurrency, wallet, BIP32, cold storage, offline, online, spending, open-source, command-line, Python, Linux, Bitcoin Core, bitcoind, hd, deterministic, hierarchical, secure, anonymous, Electrum, seed, mnemonic, brainwallet, Scrypt, utility, script, scriptable, blockchain, raw, transaction, permissionless, console, terminal, curses, ansi, color, tmux, remote, client, daemon, RPC, json, entropy, xterm, rxvt, PowerShell, MSYS, MSYS2, MinGW, MinGW64, MSWin, Armbian, Raspbian, Raspberry Pi, Orange Pi, BCash, BCH, Litecoin, LTC, altcoin, ZEC, Zcash, DASH, Dashpay, SHA256Compress, monerod, EMC, Emercoin, token, deploy, contract, gas, fee, smart contract, solidity, Parity, OpenEthereum, testnet, devmode, Kovan

+ 1 - 0
mmgen/data/release_date

@@ -0,0 +1 @@
+February 2021

+ 1 - 0
mmgen/data/version

@@ -0,0 +1 @@
+0.12.199

+ 9 - 3
mmgen/globalvars.py

@@ -46,8 +46,6 @@ class GlobalContext(Lockable):
 	_use_class_attr = True
 
 	# Constants:
-	version      = '0.12.199'
-	release_date = 'February 2021'
 
 	proj_name = 'MMGen'
 	proj_url  = 'https://github.com/mmgen/mmgen'
@@ -55,7 +53,15 @@ class GlobalContext(Lockable):
 	author    = 'The MMGen Project'
 	email     = '<mmgen@tuta.io>'
 	Cdates    = '2013-2021'
-	keywords  = 'Bitcoin, BTC, Ethereum, ETH, Monero, XMR, ERC20, cryptocurrency, wallet, BIP32, cold storage, offline, online, spending, open-source, command-line, Python, Linux, Bitcoin Core, bitcoind, hd, deterministic, hierarchical, secure, anonymous, Electrum, seed, mnemonic, brainwallet, Scrypt, utility, script, scriptable, blockchain, raw, transaction, permissionless, console, terminal, curses, ansi, color, tmux, remote, client, daemon, RPC, json, entropy, xterm, rxvt, PowerShell, MSYS, MSYS2, MinGW, MinGW64, MSWin, Armbian, Raspbian, Raspberry Pi, Orange Pi, BCash, BCH, Litecoin, LTC, altcoin, ZEC, Zcash, DASH, Dashpay, SHA256Compress, monerod, EMC, Emercoin, token, deploy, contract, gas, fee, smart contract, solidity, Parity, OpenEthereum, testnet, devmode, Kovan'
+
+	try:
+		from importlib.resources import files # Python 3.9
+	except ImportError:
+		from importlib_resources import files
+
+	version      = files('mmgen').joinpath('data','version').read_text().strip()
+	release_date = files('mmgen').joinpath('data','release_date').read_text().strip()
+
 	max_int   = 0xffffffff
 
 	stdin_tty = sys.stdin.isatty()

+ 7 - 0
pyproject.toml

@@ -0,0 +1,7 @@
+[build-system]
+requires = [
+	"setuptools>=57",
+	"wheel>=0.37.0",
+	"build>=0.7.0",
+]
+build-backend = "setuptools.build_meta"

+ 65 - 0
setup.cfg

@@ -0,0 +1,65 @@
+[metadata]
+name         = MMGen
+version      = file: mmgen/data/version
+description  = MMGen cryptocurrency wallet suite
+long_description = file: README.md
+long_description_content_type = text/markdown
+author       = The MMGen Project
+author_email = mmgen@tuta.io
+url          = https://github.com/mmgen/mmgen
+license      = GNU GPL v3
+platforms    = Linux, Armbian, Raspbian, MS Windows
+keywords     = file: mmgen/data/keywords
+project_urls =
+	Bug Tracker = https://github.com/mmgen/mmgen/issues
+classifiers  =
+	Programming Language :: Python :: 3
+	License :: OSI Approved :: GNU General Public License v3 (GPLv3)
+	Operating System :: POSIX :: Linux
+	Operating System :: Microsoft :: Windows
+
+[options]
+python_requires = >=3.7
+include_package_data = True
+install_requires =
+	gmpy2
+	cryptography
+	pynacl
+	ecdsa
+	requests
+	aiohttp
+	pysocks
+	pexpect
+	importlib-resources; python_version < "3.9"
+	scrypt
+
+packages =
+	mmgen
+	mmgen.share
+	mmgen.altcoins
+	mmgen.altcoins.eth
+	mmgen.altcoins.eth.pyethereum
+	mmgen.altcoins.eth.rlp
+
+scripts =
+	cmds/mmgen-addrgen
+	cmds/mmgen-addrimport
+	cmds/mmgen-autosign
+	cmds/mmgen-keygen
+	cmds/mmgen-passchg
+	cmds/mmgen-passgen
+	cmds/mmgen-regtest
+	cmds/mmgen-seedjoin
+	cmds/mmgen-seedsplit
+	cmds/mmgen-split
+	cmds/mmgen-subwalletgen
+	cmds/mmgen-tool
+	cmds/mmgen-txbump
+	cmds/mmgen-txcreate
+	cmds/mmgen-txdo
+	cmds/mmgen-txsend
+	cmds/mmgen-txsign
+	cmds/mmgen-walletchk
+	cmds/mmgen-walletconv
+	cmds/mmgen-walletgen
+	cmds/mmgen-xmrwallet

+ 3 - 203
setup.py

@@ -1,216 +1,16 @@
 #!/usr/bin/env python3
-#
-# mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
-# Copyright (C)2013-2021 The MMGen Project <mmgen@tuta.io>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-import sys,os
+from setuptools import setup,Extension
 from subprocess import run,PIPE
-from shutil import copy2
-
-sys_ver = sys.version_info[:2]
-req_ver = (3,7)
-ver2f = lambda t: float('{}.{:03}'.format(*t))
-
-if ver2f(sys_ver) < ver2f(req_ver):
-	m = '{}.{}: unsupported Python version.  MMGen requires Python {}.{} or greater\n'
-	sys.stderr.write(m.format(*sys_ver,*req_ver))
-	sys.exit(1)
 
 have_msys2 = run(['uname','-s'],stdout=PIPE,check=True).stdout.startswith(b'MSYS_NT')
 if have_msys2:
 	print('MSYS2 system detected')
 
-from setuptools import setup,Extension
-from setuptools.command.install import install
-from setuptools.command.build_py import build_py
-from setuptools.command.build_ext import build_ext
-
-cwd = os.getcwd()
-
-def copy_owner(a,b):
-	st = os.stat(a)
-	try: os.chown(b,st.st_uid,st.st_gid,follow_symlinks=False)
-	except: pass
-
-# install extension module in repository after building
-class my_build_ext(build_ext):
-	def build_extension(self,ext):
-		build_ext.build_extension(self,ext)
-		ext_src = self.get_ext_fullpath(ext.name)
-		ext_dest = os.path.join('mmgen',os.path.basename(ext_src))
-		try: os.unlink(ext_dest)
-		except: pass
-		os.chmod(ext_src,0o755) # required if user has non-standard umask
-		print('copying {} to {}'.format(ext_src,ext_dest))
-		copy2(ext_src,ext_dest)
-		copy_owner(cwd,ext_dest)
-
-def link_or_copy(tdir,a,b):
-	os.chdir(tdir)
-	try: os.unlink(b)
-	except FileNotFoundError: pass
-	copy2(a,b) if have_msys2 else os.symlink(a,b)
-	copy_owner(a,b)
-	os.chdir(cwd)
-
-class my_build_py(build_py):
-	def run(self):
-		link_or_copy('test','start-coin-daemons.py','stop-coin-daemons.py')
-		build_py.run(self)
-
-module1 = Extension(
+setup(ext_modules=[Extension(
 	name         = 'mmgen.secp256k1',
 	sources      = ['extmod/secp256k1mod.c'],
 	libraries    = ['secp256k1'] + ([],['gmp'])[have_msys2],
 	library_dirs = ['/usr/local/lib',r'C:\msys64\mingw64\lib',r'C:\msys64\usr\lib'],
 	include_dirs = ['/usr/local/include',r'C:\msys64\mingw64\include',r'C:\msys64\usr\include'],
-	)
-
-os.umask(0o0022)
-
-from mmgen.globalvars import g
-setup(
-		name         = 'mmgen',
-		description  = 'A complete Bitcoin offline/online wallet solution for the command line',
-		version      = g.version,
-		author       = g.author,
-		author_email = g.email,
-		maintainer   = g.author,
-		url          = g.proj_url,
-		license      = 'GNU GPL v3',
-		platforms    = 'Linux, Debian, Ubuntu, Arch Linux, MS Windows, Raspberry Pi/Raspbian, Orange Pi/Armbian, Rock Pi/Armbian',
-		keywords     = g.keywords,
-		cmdclass     = {
-			'build_py': my_build_py,
-			'build_ext': my_build_ext,
-		},
-		ext_modules  = [module1],
-		packages = ['mmgen'],
-		include_package_data = True,
-		py_modules = [
-			'mmgen.__init__',
-			'mmgen.addr',
-			'mmgen.altcoin',
-			'mmgen.baseconv',
-			'mmgen.base_obj',
-			'mmgen.bech32',
-			'mmgen.bip39',
-			'mmgen.cfg',
-			'mmgen.color',
-			'mmgen.common',
-			'mmgen.crypto',
-			'mmgen.daemon',
-			'mmgen.devtools',
-			'mmgen.ed25519',
-			'mmgen.ed25519ll_djbec',
-			'mmgen.exception',
-			'mmgen.filename',
-			'mmgen.flags',
-			'mmgen.globalvars',
-			'mmgen.help',
-			'mmgen.keccak',
-			'mmgen.led',
-			'mmgen.license',
-			'mmgen.mn_electrum',
-			'mmgen.mn_entry',
-			'mmgen.mn_monero',
-			'mmgen.mn_tirosh',
-			'mmgen.obj',
-			'mmgen.opts',
-			'mmgen.protocol',
-			'mmgen.regtest',
-			'mmgen.rpc',
-			'mmgen.seed',
-			'mmgen.sha2',
-			'mmgen.term',
-			'mmgen.tool',
-			'mmgen.tw',
-			'mmgen.tx',
-			'mmgen.txfile',
-			'mmgen.txsign',
-			'mmgen.util',
-			'mmgen.wallet',
-			'mmgen.xmrwallet',
-
-			'mmgen.altcoins.__init__',
-
-			'mmgen.altcoins.eth.__init__',
-			'mmgen.altcoins.eth.contract',
-			'mmgen.altcoins.eth.obj',
-			'mmgen.altcoins.eth.tx',
-			'mmgen.altcoins.eth.tw',
-
-			'mmgen.altcoins.eth.pyethereum.__init__',
-			'mmgen.altcoins.eth.pyethereum.transactions',
-			'mmgen.altcoins.eth.pyethereum.utils',
-
-			'mmgen.altcoins.eth.rlp.__init__',
-			'mmgen.altcoins.eth.rlp.atomic',
-			'mmgen.altcoins.eth.rlp.codec',
-			'mmgen.altcoins.eth.rlp.exceptions',
-			'mmgen.altcoins.eth.rlp.sedes.__init__',
-			'mmgen.altcoins.eth.rlp.sedes.big_endian_int',
-			'mmgen.altcoins.eth.rlp.sedes.binary',
-			'mmgen.altcoins.eth.rlp.sedes.boolean',
-			'mmgen.altcoins.eth.rlp.sedes.lists',
-			'mmgen.altcoins.eth.rlp.sedes.raw',
-			'mmgen.altcoins.eth.rlp.sedes.serializable',
-			'mmgen.altcoins.eth.rlp.sedes.text',
-
-			'mmgen.main',
-			'mmgen.main_addrgen',
-			'mmgen.main_addrimport',
-			'mmgen.main_autosign',
-			'mmgen.main_passgen',
-			'mmgen.main_regtest',
-			'mmgen.main_seedjoin',
-			'mmgen.main_split',
-			'mmgen.main_tool',
-			'mmgen.main_txbump',
-			'mmgen.main_txcreate',
-			'mmgen.main_txdo',
-			'mmgen.main_txsend',
-			'mmgen.main_txsign',
-			'mmgen.main_wallet',
-			'mmgen.main_xmrwallet',
-
-			'mmgen.share.__init__',
-			'mmgen.share.Opts',
-		],
-		scripts = [
-			'cmds/mmgen-addrgen',
-			'cmds/mmgen-addrimport',
-			'cmds/mmgen-autosign',
-			'cmds/mmgen-keygen',
-			'cmds/mmgen-passchg',
-			'cmds/mmgen-passgen',
-			'cmds/mmgen-regtest',
-			'cmds/mmgen-seedjoin',
-			'cmds/mmgen-seedsplit',
-			'cmds/mmgen-split',
-			'cmds/mmgen-subwalletgen',
-			'cmds/mmgen-tool',
-			'cmds/mmgen-txbump',
-			'cmds/mmgen-txcreate',
-			'cmds/mmgen-txdo',
-			'cmds/mmgen-txsend',
-			'cmds/mmgen-txsign',
-			'cmds/mmgen-walletchk',
-			'cmds/mmgen-walletconv',
-			'cmds/mmgen-walletgen',
-			'cmds/mmgen-xmrwallet',
-		]
-	)
+	)])