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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
#! /usr/bin/env python
__revision__ = "$Id: setup.py,v 1.28 2004/08/13 23:44:47 akuchling Exp $"
from distutils import core
from distutils.core import Extension
from distutils.command.build_ext import build_ext
import os, sys
if sys.version[0:1] == '1':
raise RuntimeError, ("The Python Cryptography Toolkit requires "
"Python 2.x to build.")
if sys.platform == 'win32':
HTONS_LIBS = ['ws2_32']
plat_ext = [
Extension("Crypto.Util.winrandom",
libraries = HTONS_LIBS + ['advapi32'],
include_dirs=['src/'],
sources=["src/winrand.c"])
]
else:
HTONS_LIBS = []
plat_ext = []
# Functions for finding libraries and files, copied from Python's setup.py.
def find_file(filename, std_dirs, paths):
"""Searches for the directory where a given file is located,
and returns a possibly-empty list of additional directories, or None
if the file couldn't be found at all.
'filename' is the name of a file, such as readline.h or libcrypto.a.
'std_dirs' is the list of standard system directories; if the
file is found in one of them, no additional directives are needed.
'paths' is a list of additional locations to check; if the file is
found in one of them, the resulting list will contain the directory.
"""
# Check the standard locations
for dir in std_dirs:
f = os.path.join(dir, filename)
if os.path.exists(f): return []
# Check the additional directories
for dir in paths:
f = os.path.join(dir, filename)
if os.path.exists(f):
return [dir]
# Not found anywhere
return None
def find_library_file(compiler, libname, std_dirs, paths):
filename = compiler.library_filename(libname, lib_type='shared')
result = find_file(filename, std_dirs, paths)
if result is not None: return result
filename = compiler.library_filename(libname, lib_type='static')
result = find_file(filename, std_dirs, paths)
return result
class PCTBuildExt (build_ext):
def build_extensions(self):
self.extensions += [
# Hash functions
Extension("Crypto.Hash.MD4",
include_dirs=['src/'],
sources=["src/MD4.c"]),
Extension("Crypto.Hash.SHA256",
include_dirs=['src/'],
sources=["src/SHA256.c"]),
# Block encryption algorithms
Extension("Crypto.Cipher.AES",
include_dirs=['src/'],
sources=["src/AES.c"]),
Extension("Crypto.Cipher.ARC2",
include_dirs=['src/'],
sources=["src/ARC2.c"]),
Extension("Crypto.Cipher.Blowfish",
include_dirs=['src/'],
sources=["src/Blowfish.c"]),
Extension("Crypto.Cipher.CAST",
include_dirs=['src/'],
sources=["src/CAST.c"]),
Extension("Crypto.Cipher.DES",
include_dirs=['src/'],
sources=["src/DES.c"]),
Extension("Crypto.Cipher.DES3",
include_dirs=['src/'],
sources=["src/DES3.c"]),
# Stream ciphers
Extension("Crypto.Cipher.ARC4",
include_dirs=['src/'],
sources=["src/ARC4.c"]),
Extension("Crypto.Cipher.XOR",
include_dirs=['src/'],
sources=["src/XOR.c"]),
]
# Detect which modules should be compiled
self.detect_modules()
build_ext.build_extensions(self)
def detect_modules (self):
lib_dirs = self.compiler.library_dirs + ['/lib', '/usr/lib']
inc_dirs = self.compiler.include_dirs + ['/usr/include']
exts = []
if (self.compiler.find_library_file(lib_dirs, 'gmp')):
exts.append(Extension("Crypto.PublicKey._fastmath",
include_dirs=['src/'],
libraries=['gmp'],
sources=["src/_fastmath.c"]))
self.extensions += exts
kw = {'name':"pycrypto",
'version':"2.0",
'description':"Cryptographic modules for Python.",
'author':"A.M. Kuchling",
'author_email':"amk@amk.ca",
'url':"http://pycrypto.sourceforge.net",
'cmdclass' : {'build_ext':PCTBuildExt},
'packages' : ["Crypto", "Crypto.Hash", "Crypto.Cipher", "Crypto.Util",
"Crypto.Protocol", "Crypto.PublicKey"],
'package_dir' : { "Crypto":"." },
# One module is defined here, because build_ext won't be
# called unless there's at least one extension module defined.
'ext_modules':[Extension("Crypto.Hash.MD2",
include_dirs=['src/'],
sources=["src/MD2.c"])],
}
# If we're running Python 2.3, add extra information
if hasattr(core, 'setup_keywords'):
if 'classifiers' in core.setup_keywords:
kw['classifiers'] = [
'Development Status :: 4 - Beta',
'License :: Public Domain',
'Intended Audience :: Developers',
'Operating System :: Unix',
'Operating System :: Microsoft :: Windows',
'Operating System :: MacOS :: MacOS X',
'Topic :: Security :: Cryptography',
]
if 'download_url' in core.setup_keywords:
kw['download_url'] = ('http://www.amk.ca/files/python/crypto/'
'%s-%s.tar.gz' % (kw['name'], kw['version']) )
core.setup(**kw)
|