Move to pyproject.toml
Tested to work with at least pip and build as frontends: pip wheel . python -m build . If liberasurecode is installed to a non-standard location, you may need additional arguments like <build command> --config-setting="--global-option=build_ext" \ --config-setting="--global-option=-I${HOME}/.local/include" \ --config-setting="--global-option=-L${HOME}/.local/lib" Or, export appropriate CFLAGS/LDFLAGS values. Signed-off-by: Tim Burke <tim.burke@gmail.com> Change-Id: I3c1d88fd3225f27bde4b08b1b848bd66e6d597ae
This commit is contained in:
@@ -30,6 +30,8 @@ RUN if [ -e /etc/yum.repos.d ]; then \
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
RUN if [ -n "$(type -p yum)" ]; then yum install -y zlib-devel ; fi
|
RUN if [ -n "$(type -p yum)" ]; then yum install -y zlib-devel ; fi
|
||||||
|
# Update setuptools for pyproject.toml support
|
||||||
|
RUN "/opt/python/${PYTHON_VERSION}/bin/python3" -m pip install -U setuptools packaging
|
||||||
|
|
||||||
ADD https://github.com/netwide-assembler/nasm/archive/refs/tags/nasm-2.15.05.tar.gz /opt/src/nasm.tar.gz
|
ADD https://github.com/netwide-assembler/nasm/archive/refs/tags/nasm-2.15.05.tar.gz /opt/src/nasm.tar.gz
|
||||||
RUN tar -C /opt/src -xz -f /opt/src/nasm.tar.gz
|
RUN tar -C /opt/src -xz -f /opt/src/nasm.tar.gz
|
||||||
|
45
pyproject.toml
Normal file
45
pyproject.toml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
[build-system]
|
||||||
|
requires = ["setuptools>=74.1"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[project]
|
||||||
|
name = "pyeclib"
|
||||||
|
version = "1.6.4"
|
||||||
|
authors = [
|
||||||
|
{name = "Kevin Greenan", email = "kmgreen2@gmail.com"},
|
||||||
|
]
|
||||||
|
maintainers = [
|
||||||
|
{name = "Tim Burke", email = "tim.burke@gmail.com"},
|
||||||
|
{name = "Kevin Greenan", email = "kmgreen2@gmail.com"},
|
||||||
|
{name = "Tushar Gohad", email = "tusharsg@gmail.com"},
|
||||||
|
]
|
||||||
|
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."
|
||||||
|
readme = "README.rst"
|
||||||
|
requires-python = ">=3.10"
|
||||||
|
license = {text = "BSD-2-Clause"}
|
||||||
|
classifiers = [
|
||||||
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
"Programming Language :: Python :: 3 :: Only",
|
||||||
|
"Programming Language :: Python :: 3.10",
|
||||||
|
"Programming Language :: Python :: 3.11",
|
||||||
|
"Programming Language :: Python :: 3.12",
|
||||||
|
"Programming Language :: Python :: 3.13",
|
||||||
|
"Intended Audience :: Developers",
|
||||||
|
"License :: OSI Approved :: BSD License",
|
||||||
|
]
|
||||||
|
|
||||||
|
[project.urls]
|
||||||
|
Homepage = "https://opendev.org/openstack/pyeclib"
|
||||||
|
"Bug Tracker" = "https://bugs.launchpad.net/pyeclib"
|
||||||
|
"Release Notes" = "https://opendev.org/openstack/pyeclib/src/branch/master/ChangeLog"
|
||||||
|
|
||||||
|
[tool.setuptools]
|
||||||
|
packages = ["pyeclib"]
|
||||||
|
platforms = ["Linux"]
|
||||||
|
|
||||||
|
[[tool.setuptools.ext-modules]]
|
||||||
|
name = "pyeclib_c"
|
||||||
|
sources = ["src/c/pyeclib_c/pyeclib_c.c"]
|
||||||
|
include-dirs = ["src/c/pyeclib_c"]
|
||||||
|
libraries = ["erasurecode"]
|
||||||
|
py-limited-api = true
|
267
setup.py
267
setup.py
@@ -1,267 +1,4 @@
|
|||||||
#!/usr/bin/env python
|
import setuptools
|
||||||
|
|
||||||
# Copyright (c) 2013-2015, Kevin Greenan (kmgreen2@gmail.com)
|
|
||||||
# Copyright (c) 2013-2015, Tushar Gohad (tusharsg@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 re
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
import ctypes
|
|
||||||
from ctypes.util import find_library
|
|
||||||
from distutils.command.build import build as _build
|
|
||||||
from distutils.command.clean import clean as _clean
|
|
||||||
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.command.install import install as _install
|
|
||||||
from setuptools import Extension
|
|
||||||
|
|
||||||
platform_str = platform.platform()
|
|
||||||
default_python_incdir = get_python_inc()
|
|
||||||
|
|
||||||
|
|
||||||
# this is to be used only for library existence/version checks,
|
setuptools.setup()
|
||||||
# not for rpath handling
|
|
||||||
def _find_library(name):
|
|
||||||
target_lib = find_library(name)
|
|
||||||
if platform_str.find("Darwin") > -1:
|
|
||||||
# If we didn't find it, try extending our search a bit
|
|
||||||
if not target_lib:
|
|
||||||
if 'DYLD_LIBRARY_PATH' in os.environ:
|
|
||||||
os.environ['DYLD_LIBRARY_PATH'] += ':%s/lib' % sys.prefix
|
|
||||||
else:
|
|
||||||
os.environ['DYLD_LIBRARY_PATH'] = '%s/lib' % sys.prefix
|
|
||||||
target_lib = find_library(name)
|
|
||||||
|
|
||||||
# If we *still* don't find it, bail
|
|
||||||
if not target_lib:
|
|
||||||
return target_lib
|
|
||||||
|
|
||||||
target_lib = os.path.abspath(target_lib)
|
|
||||||
if os.path.islink(target_lib):
|
|
||||||
p = os.readlink(target_lib)
|
|
||||||
if os.path.isabs(p):
|
|
||||||
target_lib = p
|
|
||||||
else:
|
|
||||||
target_lib = os.path.join(os.path.dirname(target_lib), p)
|
|
||||||
elif not target_lib:
|
|
||||||
# See https://bugs.python.org/issue9998
|
|
||||||
expr = r'[^\(\)\s]*lib%s\.[^\(\)\s]*' % re.escape(name)
|
|
||||||
cmd = ['ld', '-t']
|
|
||||||
libpath = os.environ.get('LD_LIBRARY_PATH')
|
|
||||||
if libpath:
|
|
||||||
for d in libpath.split(':'):
|
|
||||||
cmd.extend(['-L', d])
|
|
||||||
cmd.extend(['-o', os.devnull, '-l%s' % name])
|
|
||||||
try:
|
|
||||||
p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
|
|
||||||
stderr=subprocess.PIPE,
|
|
||||||
universal_newlines=True)
|
|
||||||
out, _ = p.communicate()
|
|
||||||
if hasattr(os, 'fsdecode'):
|
|
||||||
out = os.fsdecode(out)
|
|
||||||
res = re.search(expr, out)
|
|
||||||
if res:
|
|
||||||
target_lib = res.group(0)
|
|
||||||
except Exception:
|
|
||||||
pass # result will be None
|
|
||||||
# return absolute path to the library if found
|
|
||||||
return target_lib
|
|
||||||
|
|
||||||
|
|
||||||
class build(_build):
|
|
||||||
|
|
||||||
def check_liberasure(self):
|
|
||||||
library_basename = "liberasurecode"
|
|
||||||
library_version = "1"
|
|
||||||
library_url = "https://opendev.org/openstack/liberasurecode"
|
|
||||||
|
|
||||||
found_path = _find_library("erasurecode")
|
|
||||||
if found_path:
|
|
||||||
libec = ctypes.CDLL(found_path)
|
|
||||||
try:
|
|
||||||
packed_version = libec.liberasurecode_get_version()
|
|
||||||
except AttributeError:
|
|
||||||
# If we don't have the version getter, we're probably
|
|
||||||
# pre-1.4.0; fall back to some heuristics based on name
|
|
||||||
version_parts = [x for x in found_path.split('.')
|
|
||||||
if x.isdigit()]
|
|
||||||
if not version_parts:
|
|
||||||
# A bare .so? Well, we haven't released a 2.x yet... but
|
|
||||||
# if we ever do, hopefully it'd still provide a
|
|
||||||
# liberasurecode_get_version()
|
|
||||||
return
|
|
||||||
if version_parts[0] == library_version:
|
|
||||||
return
|
|
||||||
# else, seems to be an unknown version -- assume it won't work
|
|
||||||
else:
|
|
||||||
version = (
|
|
||||||
packed_version >> 16,
|
|
||||||
(packed_version >> 8) & 0xff,
|
|
||||||
packed_version & 0xff)
|
|
||||||
if (1, 0, 0) <= version < (2, 0, 0):
|
|
||||||
return
|
|
||||||
|
|
||||||
if platform_str.find("Darwin") > -1:
|
|
||||||
liberasure_file = \
|
|
||||||
library_basename + "." + library_version + ".dylib"
|
|
||||||
else:
|
|
||||||
liberasure_file = \
|
|
||||||
library_basename + ".so." + library_version
|
|
||||||
|
|
||||||
print("**************************************************************")
|
|
||||||
print("*** ")
|
|
||||||
print("*** Can not locate %s" % (liberasure_file))
|
|
||||||
print("*** ")
|
|
||||||
print("*** Install - ")
|
|
||||||
print("*** Manual: %s" % library_url)
|
|
||||||
print("*** Fedora/Red Hat variants: liberasurecode-devel")
|
|
||||||
print("*** Debian/Ubuntu variants: liberasurecode-dev")
|
|
||||||
print("*** ")
|
|
||||||
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)
|
|
||||||
|
|
||||||
installroot = install_lib.install_dir
|
|
||||||
_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:
|
|
||||||
ldpath_str = "DYLD_LIBRARY_PATH"
|
|
||||||
else:
|
|
||||||
ldpath_str = "LD_LIBRARY_PATH"
|
|
||||||
print("***************************************************")
|
|
||||||
print("** ")
|
|
||||||
print("** PyECLib libraries have been installed to: ")
|
|
||||||
print("** %s" % installroot)
|
|
||||||
print("** ")
|
|
||||||
print("** Any user using this library must update: ")
|
|
||||||
print("** %s" % ldpath_str)
|
|
||||||
print("** ")
|
|
||||||
print("** Run 'ldconfig' or place this line: ")
|
|
||||||
print("** export %s=%s" % (ldpath_str, "%s"
|
|
||||||
% 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("** ")
|
|
||||||
print("***************************************************")
|
|
||||||
|
|
||||||
|
|
||||||
module = Extension('pyeclib_c',
|
|
||||||
py_limited_api=True,
|
|
||||||
define_macros=[('MAJOR VERSION', '1'),
|
|
||||||
('MINOR VERSION', '6')],
|
|
||||||
include_dirs=[default_python_incdir,
|
|
||||||
'src/c/pyeclib_c',
|
|
||||||
'/usr/include',
|
|
||||||
'/usr/include/liberasurecode',
|
|
||||||
'%s/include/liberasurecode' % sys.prefix,
|
|
||||||
'%s/include' % sys.prefix],
|
|
||||||
libraries=['erasurecode'],
|
|
||||||
library_dirs=['%s/lib' % sys.prefix],
|
|
||||||
runtime_library_dirs=['%s/lib' % sys.prefix],
|
|
||||||
# The extra arguments are for debugging
|
|
||||||
# extra_compile_args=['-g', '-O0'],
|
|
||||||
sources=['src/c/pyeclib_c/pyeclib_c.c'])
|
|
||||||
|
|
||||||
setup(name='pyeclib',
|
|
||||||
version='1.6.4',
|
|
||||||
author='Kevin Greenan',
|
|
||||||
author_email='kmgreen2@gmail.com',
|
|
||||||
maintainer='Kevin Greenan and Tushar Gohad',
|
|
||||||
maintainer_email='kmgreen2@gmail.com, tusharsg@gmail.com',
|
|
||||||
url='https://opendev.org/openstack/pyeclib',
|
|
||||||
project_urls={
|
|
||||||
'Bug Tracker': 'https://bugs.launchpad.net/pyeclib',
|
|
||||||
'Release Notes': ('https://opendev.org/openstack/pyeclib/'
|
|
||||||
'src/branch/master/ChangeLog'),
|
|
||||||
},
|
|
||||||
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.'),
|
|
||||||
classifiers=[
|
|
||||||
"Development Status :: 5 - Production/Stable",
|
|
||||||
"Programming Language :: Python :: 3 :: Only",
|
|
||||||
"Programming Language :: Python :: 3.10",
|
|
||||||
"Programming Language :: Python :: 3.11",
|
|
||||||
"Programming Language :: Python :: 3.12",
|
|
||||||
"Programming Language :: Python :: 3.13",
|
|
||||||
"Intended Audience :: Developers",
|
|
||||||
"License :: OSI Approved :: BSD License",
|
|
||||||
],
|
|
||||||
long_description=open('README.rst', 'r').read(),
|
|
||||||
long_description_content_type='text/x-rst',
|
|
||||||
platforms='Linux',
|
|
||||||
license='BSD',
|
|
||||||
ext_modules=[module],
|
|
||||||
packages=['pyeclib'],
|
|
||||||
python_requires='>=3.10',
|
|
||||||
package_dir={'pyeclib': 'pyeclib'},
|
|
||||||
cmdclass={'build': build, 'install': install, 'clean': clean},
|
|
||||||
py_modules=['pyeclib.ec_iface', 'pyeclib.core'],
|
|
||||||
command_options={
|
|
||||||
'build_sphinx': {
|
|
||||||
'build_dir': ('setup.py', 'doc/build')}},
|
|
||||||
test_suite='test')
|
|
||||||
|
Reference in New Issue
Block a user