1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
#!/usr/bin/env python
import os
import subprocess
import sys
from distutils.core import Command
from glob import glob
try:
from setuptools import setup, Extension
except ImportError:
from distutils.core import setup
from distutils.extension import Extension
class TestCommand(Command):
"""Hack for setup.py with implicit build_ext -i
"""
user_options = []
def initialize_options(self):
self.rootdir = os.getcwd()
def finalize_options(self):
pass
def remove_ext(self):
"""Remove extensions
All Python 2.x versions share the same library name. Remove the
file to fix version mismatch errors.
"""
for fname in os.listdir(self.rootdir):
if fname.endswith(("so", "dylib", "pyd", "sl")):
os.unlink(os.path.join(self.rootdir, fname))
def get_lib_dirs(self):
"""Get version, platform and configuration dependend lib dirs
Distutils caches the build command object on the distribution object.
We can retrieve the object to retrieve the paths to the directories
inside the build directory.
"""
build = self.distribution.command_obj["build"]
builddirs = set()
for attrname in 'build_platlib', 'build_lib', 'build_purelib':
builddir = getattr(build, attrname, None)
if not builddir:
continue
builddir = os.path.abspath(os.path.join(self.rootdir, builddir))
if not os.path.isdir(builddir):
continue
builddirs.add(builddir)
return builddirs
def run(self):
self.remove_ext()
# force a build with build_ext
self.run_command("build")
# get lib dirs from build object
libdirs = self.get_lib_dirs()
# add lib dirs to Python's search path
env = os.environ.copy()
env["PYTHONPATH"] = os.pathsep.join(libdirs)
# and finally run the test command
errno = subprocess.check_call([sys.executable, "tests.py"], env=env)
raise SystemExit(errno)
exts = []
sha3_depends = ["setup.py", "Modules/hashlib.h", "Modules/pymemsets.h"]
sha3_depends.extend(glob("Modules/_sha3/kcp/*"))
exts.append(
Extension(
"_pysha3",
["Modules/_sha3/sha3module.c", "Modules/pymemsets.c"],
depends=sha3_depends,
define_macros=[("PY_WITH_KECCAK", "1")]
)
)
long_description = []
with open("README.txt") as f:
long_description.append(f.read())
with open("CHANGES.txt") as f:
long_description.append(f.read())
setup(
name="pysha3",
version="1.0.2",
ext_modules=exts,
py_modules=["sha3"],
cmdclass={"test": TestCommand},
author="Christian Heimes",
author_email="christian@python.org",
maintainer="Christian Heimes",
maintainer_email="christian@python.org",
url="https://github.com/tiran/pysha3",
keywords="sha3 sha-3 keccak hash",
platforms="POSIX, Windows",
license="PSFL (Keccak: CC0 1.0 Universal)",
description="SHA-3 (Keccak) for Python 2.7 - 3.5",
long_description="\n".join(long_description),
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: Python Software Foundation License",
"License :: CC0 1.0 Universal (CC0 1.0) Public Domain Dedication",
"Natural Language :: English",
"Operating System :: MacOS :: MacOS X",
"Operating System :: POSIX",
"Operating System :: POSIX :: BSD",
"Operating System :: POSIX :: Linux",
"Operating System :: Microsoft :: Windows",
"Programming Language :: C",
"Programming Language :: Python",
"Programming Language :: Python :: 2",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Topic :: Security :: Cryptography",
],
)
|