def configuration(parent_package='', top_path=None):
config = Configuration('smaxflow', parent_package, top_path,
cmdclass={'build_ext': build_ext})
numpy_dirs = get_numpy_include_dirs()
get_maxflow_source()
files = ["graph.cpp", "maxflow.cpp"]
files = [os.path.join(source_path, f) for f in files]
files = ['_maxflow.pyx', 'smurfs_mf.cpp'] + files
config.add_extension('_maxflow', sources=files, language='c++',
include_dirs=[source_path,
get_numpy_include_dirs()],
library_dirs=[source_path],
extra_compile_args=["-fpermissive"],
extra_link_args=["-fpermissive"])
return config
python类build_ext()的实例源码
def configuration(parent_package='', top_path=None):
config = Configuration('pysmurfs', parent_package, top_path,
cmdclass={'build_ext': build_ext})
numpy_dirs = get_numpy_include_dirs()
# Compile `_features.pyx`
config.add_extension('_features', sources=['_features.pyx'],
include_dirs=numpy_dirs)
# Compile `_split.pyx`
config.add_extension('_split', sources=['_split.pyx'],
language='c++', include_dirs=numpy_dirs)
# Compile `_relabel.pyx`
config.add_extension('_merge', sources=['_merge.pyx'],
language='c++', include_dirs=numpy_dirs)
return config
def setup_package():
metadata = dict(name=spfeas_name,
maintainer=maintainer,
maintainer_email=maintainer_email,
description=description,
license=license_file,
version=__version__,
long_description=long_description,
author=author_file,
packages=get_packages(),
package_data=get_package_data(),
ext_modules=cythonize(get_pyx_list()),
include_dirs=[np.get_include()],
cmdclass=dict(build_ext=build_ext),
zip_safe=False,
download_url=git_url,
install_requires=required_packages,
entry_points=get_console_dict())
setup(**metadata)
def __getitem__(self, key):
if key != 'build_ext':
return super(LazyBuildExtCommandClass, self).__getitem__(key)
from Cython.Distutils import build_ext as cython_build_ext
import numpy
# Cython_build_ext isn't a new-style class in Py2.
class build_ext(cython_build_ext, object):
"""
Custom build_ext command that lazily adds numpy's include_dir to
extensions.
"""
def build_extensions(self):
"""
Lazily append numpy's include directory to Extension includes.
This is done here rather than at module scope because setup.py
may be run before numpy has been installed, in which case
importing numpy and calling `numpy.get_include()` will fail.
"""
numpy_incl = numpy.get_include()
for ext in self.extensions:
ext.include_dirs.append(numpy_incl)
super(build_ext, self).build_extensions()
return build_ext
def __getitem__(self, key):
if key != 'build_ext':
return super(LazyBuildExtCommandClass, self).__getitem__(key)
from Cython.Distutils import build_ext as cython_build_ext
import numpy
# Cython_build_ext isn't a new-style class in Py2.
class build_ext(cython_build_ext, object):
"""
Custom build_ext command that lazily adds numpy's include_dir to
extensions.
"""
def build_extensions(self):
"""
Lazily append numpy's include directory to Extension includes.
This is done here rather than at module scope because setup.py
may be run before numpy has been installed, in which case
importing numpy and calling `numpy.get_include()` will fail.
"""
numpy_incl = numpy.get_include()
for ext in self.extensions:
ext.include_dirs.append(numpy_incl)
super(build_ext, self).build_extensions()
return build_ext
def command(self):
command = [sys.executable, "setup.py", "build_ext", "--inplace"]
return command
def compile_c_single_file(filename, vectorize=True):
"""
Compile C source (excluding .c extension) in place to module.
"""
c_filename = filename + '.c'
# this is a temporary hack to force the use of GCC instead of clang
if os.path.isfile("/usr/local/bin/gcc-5"):
print("using gcc-5 compiler from homebrew...")
os.environ["CC"] = os.environ["CXX"] = "gcc-5"
else:
os.environ["CC"] = os.environ["CXX"] = "gcc"
if os.name == 'nt':
extension = [
Extension(
filename,
sources = [c_filename],
include_dirs = [numpy.get_include()],
extra_compile_args = '-openmp'.split(),
extra_link_args = '-openmp'.split()
)
]
else:
extension = [
Extension(
filename,
sources = [c_filename],
include_dirs = [numpy.get_include()],
extra_compile_args = '-w -fopenmp'.split() + (['-fno-tree-vectorize'] if not vectorize else []),
extra_link_args = '-fopenmp'.split()
)
]
setup(
name = filename,
cmdclass = {'build_ext' : build_ext},
include_dirs = [numpy.get_include()],
ext_modules = extension,
script_args='build_ext --inplace'.split()
)