pydtls/setup.py
Ray Brown 62f30a1888 Distribution and installation
The new module setup.py handles creation of package distributions in
compressed formats, and performs installation of said distributions
after decompression. Distribution strategy for PyDTLS is in the form
of source distributions only.

Building the OpenSSL library on Windows is non-trivial. Requirements
include linking against the same version of the C runtime that is used
by the Python interpreter, or else Microsoft redistributable
installation may also need to be performed. For the convenience of
Windows users, the distribution procedure includes creation of
prebuilt versions of the OpenSSL library for both 32- and 64-bit
versions of Windows. Despite containing binaries, these are still
source distributions that are installed with "python setup.py
install."

A version of OpenSSL compiled with the MinGW toolchain is included.
cygcrypto-1.0.0.dll and cygssl-1.0.0.dll contain symbols and can be
debugged with gdb. All MinGW OpenSSL dll's link with msvcr90.dll.

In order to avoid making installation a requirement after cloning, the
package initializer looks for prebuilts of the currently executing
platform and copies them into the dtls package directory before
continuing module initialization.

A distribution containing prebuilts for all platforms as well as those
containing no prebuilts (appropriate for Linux) can be generated by
issuing "python setup.py sdist --prebuilts."
2012-12-16 20:22:49 -08:00

97 lines
3.3 KiB
Python

#!/usr/bin/env python
# PyDTLS setup script. Written by Ray Brown.
"""PyDTLS setup script
Install or create a distribution of the PyDTLS package.
"""
from os import listdir, path, remove, rename
from sys import argv
from pickle import dump, load
from distutils.core import setup
from distutils.command.install import INSTALL_SCHEMES
# Make the root for data file installations the same as Python code
for scheme in INSTALL_SCHEMES.values():
scheme['data'] = scheme['purelib']
NAME = "Dtls"
VERSION = "0.1"
DIST_DIR = "dist"
FORMAT_TO_SUFFIX = { "zip": ".zip",
"gztar": ".tar.gz",
"bztar": ".tar.bz2",
"ztar": ".tar.Z",
"tar": ".tar" }
def invoke_setup(data_files=None):
data_files_file = "data_files"
data_files_file_created = False
try:
if data_files:
# Save the value of data_files with the distribution archive
data_files_file_created = True
with open(data_files_file, "wb") as fl:
dump(data_files, fl)
data_files.append(('', [data_files_file]),)
else:
# Load data_files from the distribution archive, if present
try:
with open(data_files_file, "rb") as fl:
data_files = load(fl)
except IOError:
pass
setup(name=NAME,
version=VERSION,
description="Python Datagram Transport Layer Security",
author="Ray Brown",
author_email="code@liquibits.com",
url="http://www.github.com/pydtls",
packages=["dtls", "dtls.demux", "dtls.test"],
package_data={"dtls.test": ["certs/*.pem"]},
data_files=data_files,
)
finally:
if data_files_file_created:
try:
remove(data_files_file)
except OSError:
pass
def make_dists():
prebuilt_platform_root = path.join("dtls", "prebuilt")
for platform in listdir(prebuilt_platform_root):
config = {"MANIFEST_DIR": path.join(prebuilt_platform_root, platform)}
execfile(path.join(prebuilt_platform_root, platform, "manifest.pycfg"),
config)
files = map(lambda x: "dtls/prebuilt/" + platform + "/" + x,
config["FILES"])
argv.append("--formats=" + config["FORMATS"])
invoke_setup([('dtls', files)])
del argv[-1]
for dist_format in config["FORMATS"].split(','):
source_name = path.join(DIST_DIR,
NAME + "-" + VERSION +
FORMAT_TO_SUFFIX[dist_format])
target_name = path.join(DIST_DIR,
NAME + "-" + VERSION +
".sdist_with_openssl." +
config["ARCHITECTURE"] +
FORMAT_TO_SUFFIX[dist_format])
try:
remove(target_name)
except OSError:
pass
rename(source_name, target_name)
# Finally the distribution without prebuilts
argv.append("--formats=zip,gztar")
invoke_setup()
if __name__ == "__main__":
if argv[-1] == "--prebuilts":
del argv[-1]
make_dists()
else:
invoke_setup()