pybind: Rework rados/setup.py for PyPI

Detects appropriate Python CFLAGS/LDFLAGS for Cythonizing

Signed-off-by: Anirudha Bose <ani07nov@gmail.com>
This commit is contained in:
Anirudha Bose 2016-05-26 01:25:57 +05:30
parent c1d0f5491d
commit 7b04e7ff1b

View File

@ -1,51 +1,111 @@
# Largely taken from
# https://blog.kevin-brown.com/programming/2014/09/24/combining-autotools-and-setuptools.html
import os, sys, os.path
from setuptools.command.egg_info import egg_info
import os
import subprocess
import sys
from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
def get_version():
# PEP 440 versioning of the Rados package on PyPI
# Bump this version, after every changeset
# NOTE: This version is not the same as get_ceph_version()
__version__ = '0.0.1'
def get_ceph_version():
try:
for line in open(os.path.join(os.path.dirname(__file__), "..", "ceph_ver.h")):
for line in open(os.path.join(os.path.dirname(__file__), "..", "..", "ceph_ver.h")):
if "CEPH_GIT_NICE_VER" in line:
return line.split()[2][1:-1]
return line.split()[2].strip('"')
else:
return "0"
except IOError:
return "0"
class EggInfoCommand(egg_info):
def finalize_options(self):
egg_info.finalize_options(self)
if "build" in self.distribution.command_obj:
build_command = self.distribution.command_obj["build"]
self.egg_base = build_command.build_base
self.egg_info = os.path.join(self.egg_base, os.path.basename(self.egg_info))
def get_python_flags():
cflags = {'I': [], 'extras': []}
ldflags = {'l': [], 'L': [], 'extras': []}
if os.environ.get('VIRTUAL_ENV', None):
python = "python"
else:
python = 'python' + str(sys.version_info.major) + '.' + str(sys.version_info.minor)
python_config = python + '-config'
for cflag in subprocess.check_output(
[python_config, "--cflags"]
).strip().decode('utf-8').split():
if cflag.startswith('-I'):
cflags['I'].append(cflag.replace('-I', ''))
else:
cflags['extras'].append(cflag)
for ldflag in subprocess.check_output(
[python_config, "--ldflags"]
).strip().decode('utf-8').split():
if ldflag.startswith('-l'):
ldflags['l'].append(ldflag.replace('-l', ''))
if ldflag.startswith('-L'):
ldflags['L'].append(ldflag.replace('-L', ''))
else:
ldflags['extras'].append(ldflag)
return {
'cflags': cflags,
'ldflags': ldflags
}
# Disable cythonification if we're not really building anything
if (len(sys.argv) >= 2 and
any(i in sys.argv[1:] for i in ('--help', 'clean', 'egg_info', '--version')
)):
any(i in sys.argv[1:] for i in ('--help', 'clean', 'egg_info', '--version')
)):
def cythonize(x, **kwargs):
return x
flags = get_python_flags()
setup(
name = 'rados',
version = get_version(),
description = "Python libraries for the Ceph librados library",
long_description = (
name='rados',
version=__version__,
description="Python libraries for the Ceph librados library",
long_description=(
"This package contains Python libraries for interacting with Ceph's "
"rados library."),
ext_modules = cythonize([
Extension("rados",
["rados.pyx"],
libraries=["rados"],
"RADOS library. RADOS is a reliable, autonomic distributed object "
"storage cluster developed as part of the Ceph distributed storage "
"system. This is a shared library allowing applications to access "
"the distributed object store using a simple file-like interface."
),
url='https://github.com/ceph/ceph/tree/master/src/pybind/rados',
license='LGPLv2+',
ext_modules=cythonize(
[
Extension(
"rados",
["rados.pyx"],
include_dirs=flags['cflags']['I'],
library_dirs=flags['ldflags']['L'],
libraries=["rados"] + flags['ldflags']['l'],
extra_compile_args=flags['cflags']['extras'] + flags['ldflags']['extras'],
)
], build_dir=os.environ.get("CYTHON_BUILD_DIR", None)),
cmdclass={
"egg_info": EggInfoCommand,
},
], build_dir=os.environ.get("CYTHON_BUILD_DIR", None)
),
classifiers=[
'Intended Audience :: Developers',
'Intended Audience :: System Administrators',
'License :: OSI Approved :: GNU Lesser General Public License v2 or later (LGPLv2+)',
'Operating System :: POSIX :: Linux',
'Programming Language :: Cython',
'Programming Language :: Python :: 2.6',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3.2',
'Programming Language :: Python :: 3.3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5'
],
)