8000 Specify .pyx in setup.files for cython generated extensions · scikit-learn/scikit-learn@69c5ae1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 69c5ae1

Browse files
committed
Specify .pyx in setup.files for cython generated extensions
More natural this way. Tweak the extensions to generate from .c and .cpp files for a release.
1 parent 7c731a6 commit 69c5ae1

File tree

17 files changed

+122
-233
lines changed

17 files changed

+122
-233
lines changed

sklearn/__check_build/setup.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,12 @@
33

44
import numpy
55

6-
from sklearn._build_utils import add_cython_extension
7-
86

97
def configuration(parent_package='', top_path=None):
108
from numpy.distutils.misc_util import Configuration
119
config = Configuration('__check_build', parent_package, top_path)
12-
add_cython_extension(top_path,
13-
config,
14-
'_check_build',
15-
sources=['_check_build.c'],
10+
config.add_extension('_check_build',
11+
sources=['_check_build.pyx'],
1612
include_dirs=[numpy.get_include()])
1713

1814
return config

sklearn/_build_utils/__init__.py

Lines changed: 26 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,36 @@ def atlas_not_found(blas_info_):
3737
return cblas_libs, blas_info
3838

3939

40-
def get_cython_source(filename):
41-
is_c_filename = filename.endswith('.c')
42-
is_cpp_filename = filename.endswith('.cpp')
43-
44-
# files in src are .c and .cpp files that are not cython-generated
45-
if ('src' + os.sep) in filename and (is_c_filename or is_cpp_filename):
46-
return filename
47-
elif is_c_filename:
48-
filename = filename[:-1]
49-
elif is_cpp_filename:
50-
filename = filename[:-3]
40+
def tweak_extensions_to_build_from_c_and_cpp_files(extensions):
41+
"""Modify the extensions to build from the .c and .cpp files.
42+
43+
This is useful for releases, this way cython is not required to
44+
run python setup.py install.
45+
"""
46+
for extension in extensions:
47+
sources = []
48+
for sfile in extension.sources:
49+
path, ext = os.path.splitext(sfile)
50+
if ext in ('.pyx', '.py'):
51+
if extension.language == 'c++':
52+
ext = '.cpp'
53+
else:
54+
ext = '.c'
55+
sfile = path + ext
56+
sources.append(sfile)
57+
extension.sources = sources
58+
59+
60+
def tweak_extensions(top_path, config):
61+
"""Tweaks between release and development mode."""
62+
is_release = os.path.exists(os.path.join(top_path, 'PKG-INFO'))
63+
64+
if is_release:
65+
tweak_extensions_to_build_from_c_and_cpp_files(config.ext_modules)
5166
else:
52-
raise ValueError('Only .c and .cpp files are supported. '
53-
'Got {0!r} instead'.format(filename))
54-
return filename + 'pyx'
55-
56-
57-
def add_cython_extension(top_path, config, name, sources, **kwargs):
58-
is_dev_version = not os.path.exists(os.path.join(top_path, 'PKG-INFO'))
59-
60-
if is_dev_version:
61-
sources = [get_cython_source(filename) for filename in sources]
62-
63-
config.add_extension(name, sources, **kwargs)
64-
65-
66-
def maybe_cythonize_extensions(top_path, config):
67-
is_dev_version = not os.path.exists(os.path.join(top_path, 'PKG-INFO'))
68-
69-
if is_dev_version:
7067
try:
7168
from Cython.Build import cythonize
7269
except ImportError:
7370
raise ValueError('Please install cython in order '
7471
'to build a scikit-learn development version')
75-
7672
config.ext_modules = cythonize(config.ext_modules)

sklearn/cluster/setup.py

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import numpy
77

88
from sklearn._build_utils import get_blas_info
9-
from sklearn._build_utils import add_cython_extension
109

1110

1211
def configuration(parent_package='', top_path=None):
@@ -20,39 +19,31 @@ def configuration(parent_package='', top_path=None):
2019
libraries.append('m')
2120

2221
config = Configuration('cluster', parent_package, top_path)
23-
add_cython_extension(top_path,
24-
config,
25-
'_dbscan_inner',
26-
sources=['_dbscan_inner.cpp'],
22+
config.add_extension('_dbscan_inner',
23+
sources=['_dbscan_inner.pyx'],
2724
include_dirs=[numpy.get_include()],
2825
language="c++")
2926

30-
add_cython_extension(top_path,
31-
config,
32-
'_hierarchical',
33-
sources=['_hierarchical.cpp'],
27+
config.add_extension('_hierarchical',
28+
sources=['_hierarchical.pyx'],
3429
language="c++",
3530
include_dirs=[numpy.get_include()],
3631
libraries=libraries)
37-
add_cython_extension(top_path,
38-
config,
39-
'_k_means_elkan',
40-
sources=['_k_means_elkan.c'],
32+
config.add_extension('_k_means_elkan',
33+
sources=['_k_means_elkan.pyx'],
4134
include_dirs=[numpy.get_include()],
4235
libraries=libraries)
4336

44-
add_cython_extension(
45-
top_path,
46-
config,
47-
'_k_means',
48-
libraries=cblas_libs,
49-
sources=['_k_means.c'],
50-
include_dirs=[join('..', 'src', 'cblas'),
51-
numpy.get_include(),
52-
blas_info.pop('include_dirs', [])],
53-
extra_compile_args=blas_info.pop('extra_compile_args', []),
54-
**blas_info
55-
)
37+
config.add_extension('_k_means',
38+
libraries=cblas_libs,
39+
sources=['_k_means.pyx'],
40+
include_dirs=[join('..', 'src', 'cblas'),
41+
numpy.get_include(),
42+
blas_info.pop('include_dirs', [])],
43+
extra_compile_args=blas_info.pop(
44+
'extra_compile_args', []),
45+
**blas_info
46+
)
5647

5748
config.add_subpackage('tests')
5849

sklearn/datasets/setup.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
import numpy
33
import os
44

5-
from sklearn._build_utils import add_cython_extension
6-
75

86
def configuration(parent_package='', top_path=None):
97
from numpy.distutils.misc_util import Configuration
@@ -12,10 +10,8 @@ def configuration(parent_package='', top_path=None):
1210
config.add_data_dir('descr')
1311
config.add_data_dir('images')
1412
config.add_data_dir(os.path.join('tests', 'data'))
15-
add_cython_extension(top_path,
16-
config,
17-
'_svmlight_format',
18-
sources=['_svmlight_format.c'],
13+
config.add_extension('_svmlight_format',
14+
sources=['_svmlight_format.pyx'],
1915
include_dirs=[numpy.get_include()])
2016
config.add_subpackage('tests')
2117
return config

sklearn/decomposition/setup.py

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
import numpy
33
from numpy.distutils.misc_util import Configuration
44

5-
from sklearn._build_utils import add_cython_extension
6-
75

86
def configuration(parent_package="", top_path=None):
97
config = Configuration("decomposition", parent_package, top_path)
@@ -12,17 +10,13 @@ def configuration(parent_package="", top_path=None):
1210
if os.name == 'posix':
1311
libraries.append('m')
1412

15-
add_cython_extension(top_path,
16-
config,
17-
"_online_lda",
18-
sources=["_online_lda.c"],
13+
config.add_extension("_online_lda",
14+
sources=["_online_lda.pyx"],
1915
include_dirs=[numpy.get_include()],
2016
libraries=libraries)
2117

22-
add_cython_extension(top_path,
23-
config,
24-
'cdnmf_fast',
25-
sources=['cdnmf_fast.c'],
18+
config.add_extension('cdnmf_fast',
19+
sources=['cdnmf_fast.pyx'],
2620
include_dirs=[numpy.get_include()],
2721
libraries=libraries)
2822

sklearn/ensemble/setup.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
import numpy
22
from numpy.distutils.misc_util import Configuration
33

4-
from sklearn._build_utils import add_cython_extension
5-
64

75
def configuration(parent_package="", top_path=None):
86
config = Configuration("ensemble", parent_package, top_path)
9-
add_cython_extension(top_path,
10-
config,
11-
"_gradient_boosting",
12-
sources=["_gradient_boosting.c"],
7+
config.add_extension("_gradient_boosting",
8+
sources=["_gradient_boosting.pyx"],
139
include_dirs=[numpy.get_include()])
1410

1511
config.add_subpackage("tests")

sklearn/feature_extraction/setup.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
import os
22

3-
from sklearn._build_utils import add_cython_extension
4-
53

64
def configuration(parent_package='', top_path=None):
75
import numpy
@@ -12,10 +10,8 @@ def configuration(parent_package='', top_path=None):
1210
if os.name == 'posix':
1311
libraries.append('m')
1412

15-
add_cython_extension(top_path,
16-
config,
17-
'_hashing',
18-
sources=['_hashing.c'],
13+
config.add_extension('_hashing',
14+
sources=['_hashing.pyx'],
1915
include_dirs=[numpy.get_include()],
2016
libraries=libraries)
2117
config.add_subpackage("tests")

sklearn/linear_model/setup.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import numpy
55

66
from sklearn._build_utils import get_blas_info
7-
from sklearn._build_utils import add_cython_extension
87

98

109
def configuration(parent_package='', top_path=None):
@@ -17,20 +16,16 @@ def configuration(parent_package='', top_path=None):
1716
if os.name == 'posix':
1817
cblas_libs.append('m')
1918

20-
add_cython_extension(top_path,
21-
config,
22-
'cd_fast', sources=['cd_fast.c'],
19+
config.add_extension('cd_fast', sources=['cd_fast.pyx'],
2320
libraries=cblas_libs,
2421
include_dirs=[join('..', 'src', 'cblas'),
2522
numpy.get_include(),
2623
blas_info.pop('include_dirs', [])],
2724
extra_compile_args=blas_info.pop('extra_compile_args',
2825
[]), **blas_info)
2926

30-
add_cython_extension(top_path,
31-
config,
32-
'sgd_fast',
33-
sources=['sgd_fast.c'],
27+
config.add_extension('sgd_fast',
28+
sources=['sgd_fast.pyx'],
3429
include_dirs=[join('..', 'src', 'cblas'),
3530
numpy.get_include(),
3631
blas_info.pop('include_dirs', [])],
@@ -39,10 +34,8 @@ def configuration(parent_package='', top_path=None):
3934
[]),
4035
**blas_info)
4136

42-
add_cython_extension(top_path,
43-
config,
44-
'sag_fast',
45-
sources=['sag_fast.c'],
37+
config.add_extension('sag_fast',
38+
sources=['sag_fast.pyx'],
4639
include_dirs=numpy.get_include())
4740

4841
# add other directories

sklearn/manifold/setup.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,24 @@
44
import numpy
55
from numpy.distutils.misc_util import Configuration
66
from sklearn._build_utils import get_blas_info
7-
from sklearn._build_utils import add_cython_extension
87

98

109
def configuration(parent_package="", top_path=None):
1110
config = Configuration("manifold", parent_package, top_path)
1211
libraries = []
1312
if os.name == 'posix':
1413
libraries.append('m')
15-
add_cython_extension(top_path,
16-
config,
17-
"_utils",
18-
sources=["_utils.c"],
14+
config.add_extension("_utils",
15+
sources=["_utils.pyx"],
1916
include_dirs=[numpy.get_include()],
2017
libraries=libraries,
2118
extra_compile_args=["-O3"])
2219
cblas_libs, blas_info = get_blas_info()
2320
eca = blas_info.pop('extra_compile_args', [])
2421
eca.append("-O4")
25-
add_cython_extension(top_path,
26-
config,
27-
"_barnes_hut_tsne",
22+
config.add_extension("_barnes_hut_tsne",
2823
libraries=cblas_libs,
29-
sources=["_barnes_hut_tsne.c"],
24+
sources=["_barnes_hut_tsne.pyx"],
3025
include_dirs=[join('..', 'src', 'cblas'),
3126
numpy.get_include(),
3227
blas_info.pop('include_dirs', [])],

sklearn/metrics/cluster/setup.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,14 @@
33
import numpy
44
from numpy.distutils.misc_util import Configuration
55

6-
from sklearn._build_utils import add_cython_extension
7-
86

97
def configuration(parent_package="", top_path=None):
108
config = Configuration("metrics/cluster", parent_package, top_path)
119
libraries = []
1210
if os.name == 'posix':
1311
libraries.append('m')
14-
add_cython_extension(top_path,
15-
config,
16-
"expected_mutual_info_fast",
17-
sources=["expected_mutual_info_fast.c"],
12+
config.add_extension("expected_mutual_info_fast",
13+
sources=["expected_mutual_info_fast.pyx"],
1814
include_dirs=[numpy.get_include()],
1915
libraries=libraries)
2016

sklearn/metrics/setup.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
from numpy.distutils.misc_util import Configuration
66

77
from sklearn._build_utils import get_blas_info
8-
from sklearn._build_utils import add_cython_extension
98

109

1110
def configuration(parent_package="", top_path=None):
@@ -15,10 +14,8 @@ def configuration(parent_package="", top_path=None):
1514
if os.name == 'posix':
1615
cblas_libs.append('m')
1716

18-
add_cython_extension(top_path,
19-
config,
20-
"pairwise_fast",
21-
sources=["pairwise_fast.c"],
17+
config.add_extension("pairwise_fast",
18+
sources=["pairwise_fast.pyx"],
2219
include_dirs=[os.path.join('..', 'src', 'cblas'),
2320
numpy.get_include(),
2421
blas_info.pop('include_dirs', [])],

0 commit comments

Comments
 (0)
0