blob: 2c4d37179711a81b47597b50a12a6c7f5a4e4663 [file] [log] [blame]
Jean-Paul Calderonecf20dd62008-06-12 16:38:38 -04001#!/usr/bin/env python
Jean-Paul Calderone0db6cdb2008-04-11 11:52:15 -04002# -*- coding: utf-8 -*-
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05003#
4# Copyright (C) AB Strakt 2001, All rights reserved
Jean-Paul Calderonee53ccf72008-04-11 11:40:39 -04005# Copyright (C) Jean-Paul Calderone 2008, All rights reserved
Jean-Paul Calderone897bc252008-02-18 20:50:23 -05006#
7# @(#) $Id: setup.py,v 1.28 2004/08/10 10:59:01 martin Exp $
8#
Jean-Paul Calderonee53ccf72008-04-11 11:40:39 -04009
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050010"""
11Installation script for the OpenSSL module
12"""
13
Jean-Paul Calderoneddbc28f2008-12-31 16:33:17 -050014import sys, os
15
16if 'bdist_egg' in sys.argv:
17 # If we're probably trying to do something that only setuptools can do,
18 # then try to use setuptools.
19 from setuptools import Extension, setup
zookoa4be22a2008-12-01 09:22:02 -070020else:
Jean-Paul Calderoneddbc28f2008-12-31 16:33:17 -050021 # Otherwise, prefer distutils, it's better.
22 from distutils.core import Extension, setup
zookoa4be22a2008-12-01 09:22:02 -070023
U-YOUR-FA38FA253F\Zooko Brillnonywonxd78922f2008-11-10 06:19:16 -070024from glob import glob
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050025
26from version import __version__
27
28# A hack to determine if Extension objects support the depends keyword arg.
29try:
30 init_func = Extension.__init__.func_code
31 has_dep = 'depends' in init_func.co_varnames
32except:
33 has_dep = 0
34if not has_dep:
35 # If it doesn't, create a local replacement that removes depends
36 # from the kwargs before calling the regular constructor.
37 _Extension = Extension
38 class Extension(_Extension):
39 def __init__(self, name, sources, **kwargs):
Jean-Paul Calderonee79705c2008-03-04 22:20:06 -050040 kwargs.pop('depends', None)
Jean-Paul Calderonee9404372008-03-04 22:19:18 -050041 _Extension.__init__(self, name, sources, **kwargs)
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050042
43
44crypto_src = ['src/crypto/crypto.c', 'src/crypto/x509.c',
45 'src/crypto/x509name.c', 'src/crypto/pkey.c',
46 'src/crypto/x509store.c', 'src/crypto/x509req.c',
47 'src/crypto/x509ext.c', 'src/crypto/pkcs7.c',
48 'src/crypto/pkcs12.c', 'src/crypto/netscape_spki.c',
49 'src/util.c']
50crypto_dep = ['src/crypto/crypto.h', 'src/crypto/x509.h',
51 'src/crypto/x509name.h', 'src/crypto/pkey.h',
52 'src/crypto/x509store.h', 'src/crypto/x509req.h',
53 'src/crypto/x509ext.h', 'src/crypto/pkcs7.h',
54 'src/crypto/pkcs12.h', 'src/crypto/netscape_spki.h',
55 'src/util.h']
56rand_src = ['src/rand/rand.c', 'src/util.c']
57rand_dep = ['src/util.h']
58ssl_src = ['src/ssl/connection.c', 'src/ssl/context.c', 'src/ssl/ssl.c',
59 'src/util.c']
60ssl_dep = ['src/ssl/connection.h', 'src/ssl/context.h', 'src/ssl/ssl.h',
61 'src/util.h']
62
63IncludeDirs = None
64LibraryDirs = None
65
66# Add more platforms here when needed
67if os.name == 'nt' or sys.platform == 'win32':
Jean-Paul Calderonecc8a54a2008-03-08 20:13:01 -050068 Libraries = ['eay32', 'Ws2_32']
Jean-Paul Calderone3ea41b02008-12-31 15:15:29 -050069 # Try to find it...
70 for path in ["c:/Python25/libs/", "C:/Python26/libs/", "C:/OpenSSL/lib/MinGW/"]:
71 if os.path.exists(os.path.join(path, "ssleay32.a")):
72 ExtraObjects = [os.path.join(path, "ssleay32.a")]
73 break
74 else:
75 raise SystemExit("Cannot find ssleay32.a, aborting")
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050076else:
77 Libraries = ['ssl', 'crypto']
Jean-Paul Calderonecc8a54a2008-03-08 20:13:01 -050078 ExtraObjects = []
Jean-Paul Calderone897bc252008-02-18 20:50:23 -050079
80if sys.platform == 'darwin':
81 IncludeDirs = ['/sw/include']
82 LibraryDirs = ['/sw/lib']
83
U-YOUR-FA38FA253F\Zooko Brillnonywonxd78922f2008-11-10 06:19:16 -070084# Use the SSL_LIB and SSL_INC environment variables to extend
85# the library and header directories we pass to the extensions.
86ssl_lib = os.environ.get('SSL_LIB', [])
87if ssl_lib:
88 if LibraryDirs:
89 LibraryDirs += [ssl_lib]
90 else:
91 LibraryDirs = [ssl_lib]
92ssl_inc = os.environ.get('SSL_INC', [])
93if ssl_inc:
94 if IncludeDirs:
95 IncludeDirs += [ssl_inc]
96 else:
97 IncludeDirs = [ssl_inc]
98
99# On Windows, make sure the necessary .dll's get added to the egg.
100data_files = []
101if sys.platform == 'win32':
102 data_files = [("OpenSSL", glob(os.path.join(ssl_lib, '*.dll')))]
103
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500104def mkExtension(name):
Jean-Paul Calderonee9404372008-03-04 22:19:18 -0500105 modname = 'OpenSSL.' + name
106 src = globals()[name.lower() + '_src']
107 dep = globals()[name.lower() + '_dep']
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500108 return Extension(modname, src, libraries=Libraries, depends=dep,
Jean-Paul Calderonecc8a54a2008-03-08 20:13:01 -0500109 include_dirs=IncludeDirs, library_dirs=LibraryDirs,
110 extra_objects=ExtraObjects)
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500111
112setup(name='pyOpenSSL', version=__version__,
Jean-Paul Calderone525ef802008-03-09 20:39:42 -0400113 package_dir = {'OpenSSL': '.'},
114 ext_modules = [mkExtension('crypto'), mkExtension('rand'),
115 mkExtension('SSL')],
116 py_modules = ['OpenSSL.__init__', 'OpenSSL.tsafe',
117 'OpenSSL.version', 'OpenSSL.test.__init__',
Jean-Paul Calderone30c09ea2008-03-21 17:04:05 -0400118 'OpenSSL.test.test_crypto',
119 'OpenSSL.test.test_ssl'],
U-YOUR-FA38FA253F\Zooko Brillnonywonxd78922f2008-11-10 06:19:16 -0700120 data_files = data_files,
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500121 description = 'Python wrapper module around the OpenSSL library',
Jean-Paul Calderonee53ccf72008-04-11 11:40:39 -0400122 author = 'Martin Sjögren, AB Strakt',
123 author_email = 'msjogren@gmail.com',
124 maintainer = 'Jean-Paul Calderone',
125 maintainer_email = 'exarkun@twistedmatrix.com',
Jean-Paul Calderone897bc252008-02-18 20:50:23 -0500126 url = 'http://pyopenssl.sourceforge.net/',
127 license = 'LGPL',
128 long_description = """\
129High-level wrapper around a subset of the OpenSSL library, includes
130 * SSL.Connection objects, wrapping the methods of Python's portable
131 sockets
132 * Callbacks written in Python
133 * Extensive error-handling mechanism, mirroring OpenSSL's error codes
134... and much more ;)"""
135 )