pyeclib/setup.py
Tushar Gohad 786520d13c Refactor pyeclib python src tree for nosetests
pyeclib needs to be installed in order to run unit tests
which shouldn't be the case.  We should rely on in-source
modules.

This addresses issue#56.

Signed-off-by: Tushar Gohad <tushar.gohad@intel.com>
2014-12-10 10:25:01 -07:00

208 lines
8.7 KiB
Python

#!/usr/bin/env python
# Copyright (c) 2013, Kevin Greenan (kmgreen2@gmail.com)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# Redistributions of source code must retain the above copyright notice, this
# list of conditions and the following disclaimer.
#
# Redistributions in binary form must reproduce the above copyright notice,
# this list of conditions and the following disclaimer in the documentation
# and/or other materials provided with the distribution. THIS SOFTWARE IS
# PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
# NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import os
import platform
import sys
from distutils.command.build import build as _build
from distutils.command.clean import clean as _clean
from distutils.sysconfig import EXEC_PREFIX as _exec_prefix
from distutils.sysconfig import get_python_lib
from distutils.sysconfig import get_python_inc
try:
from setuptools import setup
except ImportError:
from distribute_setup import use_setuptools
use_setuptools()
from setuptools import setup
from setuptools import Extension
from setuptools.command.install import install as _install
platform_str = platform.platform()
default_python_incdir = get_python_inc()
default_python_libdir = get_python_lib()
default_library_paths = [default_python_libdir,
('%s/usr/local/lib' % _exec_prefix),
'/lib', '/usr/lib', '/usr/local/lib']
# utility routine
def _read_file_as_str(name):
with open(name, "rt") as f:
s = f.readline().strip()
return s
class build(_build):
def check_liberasure(self):
missing = True
library_suffix = ".so"
if platform_str.find("Darwin") > -1:
library_suffix = ".dylib"
liberasure_file = "liberasurecode" + library_suffix
for dir in (default_library_paths):
liberasure_file_path = dir + os.sep + liberasure_file
if (os.path.isfile(liberasure_file_path)):
missing = False
break
if missing:
print("***************************************************")
print("** ")
print("** Can not locate the liberasurecode library: ")
print("** %s" % (liberasure_file))
print("** ")
print("** PyECLib requires that the liberasurecode ")
print("** library be installed. The liberasurecode ")
print("** library can be obtained from: ")
print("** git@bitbucket.org:tsg-/liberasurecode.git")
print("** ")
print("** Please install liberasurecode and try again.")
print("***************************************************")
sys.exit(1)
def run(self):
self.check_liberasure()
_build.run(self)
class clean(_clean):
def run(self):
_clean.run(self)
class install(_install):
def run(self):
install_cmd = self.distribution.get_command_obj('install')
install_lib = self.distribution.get_command_obj('install_lib')
for cmd in (install_lib, install_cmd):
cmd.ensure_finalized()
# ensure that the paths are absolute so we don't get lost
opts = {'exec_prefix': install_cmd.exec_prefix,
'root': install_cmd.root}
for optname, value in list(opts.items()):
if value is not None:
opts[optname] = os.path.abspath(value)
prefix = opts['exec_prefix']
root = opts['root']
# prefer root for installdir
if root is not None:
installroot = root
elif prefix is not None:
installroot = prefix
else:
installroot = "/"
# exception is "/usr"
if installroot.startswith("/usr"):
installroot = "/"
default_library_paths.insert(0, "%s/usr/local/lib" % installroot)
_install.run(self)
#
# Another Mac-ism... If the libraries are installed
# in a strange place, DYLD_LIRBARY_PATH needs to be
# updated.
#
if platform_str.find("Darwin") > -1:
print("***************************************************")
print("** ")
print("** You are running on a Mac! This means that ")
print("** ")
print("** Any user using this library must update: ")
print("** DYLD_LIBRARY_PATH ")
print("** ")
print("** The best way to do this is to put this line:")
print("** export DYLD_LIBRARY_PATH=%s" % ("%s/usr/local/lib"
% installroot))
print("** ")
print("** into .bashrc, .profile, or the appropriate")
print("** shell start-up script!")
print("***************************************************")
else:
print("***************************************************")
print("** ")
print("** PyECLib libraries have been installed to: ")
print("** %susr/local/lib" % installroot)
print("** ")
print("** Any user using this library must update: ")
print("** LD_LIBRARY_PATH ")
print("** ")
print("** The best way to do this is to put this line:")
print("** export LD_LIBRARY_PATH=%s" % ("%susr/local/lib"
% installroot))
print("** ")
print("** into .bashrc, .profile, or the appropriate shell")
print("** start-up script! Also look at ldconfig(8) man")
print("** page for a more static LD configuration")
print("***************************************************")
module = Extension('pyeclib_c',
define_macros=[('MAJOR VERSION', '0'),
('MINOR VERSION', '9')],
include_dirs=[default_python_incdir,
'/usr/local/include',
'/usr/local/include/jerasure',
'/usr/include',
'src/c/pyeclib_c',
'/usr/local/include'],
library_dirs=default_library_paths,
runtime_library_dirs=default_library_paths,
libraries=['Jerasure', 'erasurecode'],
# The extra arguments are for debugging
# extra_compile_args=['-g', '-O0'],
extra_link_args=['-Wl,-rpath,%s' %
l for l in default_library_paths],
sources=['src/c/pyeclib_c/pyeclib_c.c'])
setup(name='PyECLib',
version='0.9.10',
author='Kevin Greenan',
author_email='kmgreen2@gmail.com',
maintainer='Kevin Greenan and Tushar Gohad',
maintainer_email='kmgreen2@gmail.com, tusharsg@gmail.com',
url='https://bitbucket.org/kmgreen2/pyeclib',
description='This library provides a simple Python interface for \
implementing erasure codes. To obtain the best possible \
performance, the underlying erasure code algorithms are \
written in C.',
platforms='Linux',
license='BSD',
ext_modules=[module],
packages=['pyeclib'],
package_dir={'pyeclib': 'pyeclib'},
cmdclass={'build': build, 'install': install, 'clean': clean},
py_modules=['pyeclib.ec_iface', 'pyeclib.core'],
test_suite='test')