66from Cython .Distutils .build_ext import new_build_ext as build_ext
77from setuptools import Extension , setup
88from setuptools .errors import CCompilerError , ExecError , PlatformError
9+ from distutils import ccompiler
10+ from distutils .command .clean import clean
911
1012# determine CPU support for SSE2 and AVX2
1113cpu_info = cpuinfo .get_cpu_info ()
@@ -71,6 +73,8 @@ def blosc_extension():
7173 if os .path .isdir (d )]
7274 include_dirs += [d for d in glob ('c-blosc/internal-complibs/*/*/*' )
7375 if os .path .isdir (d )]
76+ # remove minizip because Python.h 3.8 tries to include crypt.h
77+ include_dirs = [d for d in include_dirs if 'minizip' not in d ]
7478 define_macros += [('HAVE_LZ4' , 1 ),
7579 # ('HAVE_SNAPPY', 1),
7680 ('HAVE_ZLIB' , 1 ),
@@ -97,6 +101,15 @@ def blosc_extension():
97101 else :
98102 info ('compiling Blosc extension without AVX2 support' )
99103
104+ # include assembly files
105+ if cpuinfo .platform .machine () == 'x86_64' :
106+ extra_objects = [
107+ S [:- 1 ] + 'o'
108+ for S in glob ("c-blosc/internal-complibs/zstd*/decompress/*amd64.S" )
109+ ]
110+ else :
111+ extra_objects = []
112+
100113 sources = ['numcodecs/blosc.pyx' ]
101114
102115 # define extension module
@@ -106,6 +119,7 @@ def blosc_extension():
106119 include_dirs = include_dirs ,
107120 define_macros = define_macros ,
108121 extra_compile_args = extra_compile_args ,
122+ extra_objects = extra_objects ,
109123 ),
110124 ]
111125
@@ -133,13 +147,23 @@ def zstd_extension():
133147
134148 sources = ['numcodecs/zstd.pyx' ]
135149
150+ # include assembly files
151+ if cpuinfo .platform .machine () == 'x86_64' :
152+ extra_objects = [
153+ S [:- 1 ] + 'o'
154+ for S in glob ("c-blosc/internal-complibs/zstd*/decompress/*amd64.S" )
155+ ]
156+ else :
157+ extra_objects = []
158+
136159 # define extension module
137160 extensions = [
138161 Extension ('numcodecs.zstd' ,
139162 sources = sources + zstd_sources ,
140163 include_dirs = include_dirs ,
141164 define_macros = define_macros ,
142165 extra_compile_args = extra_compile_args ,
166+ extra_objects = extra_objects ,
143167 ),
144168 ]
145169
@@ -298,6 +322,12 @@ class ve_build_ext(build_ext):
298322
299323 def run (self ):
300324 try :
325+ if cpuinfo .platform .machine () == 'x86_64' :
326+ S_files = glob ('c-blosc/internal-complibs/zstd*/decompress/*amd64.S' )
327+ compiler = ccompiler .new_compiler ()
328+ compiler .src_extensions .append ('.S' )
329+ compiler .compile (S_files )
330+
301331 build_ext .run (self )
302332 except PlatformError as e :
303333 error (e )
@@ -311,14 +341,26 @@ def build_extension(self, ext):
311341 raise BuildFailed ()
312342
313343
344+ class Sclean (clean ):
345+ # Clean up .o files created by .S files
346+
347+ def run (self ):
348+ if cpuinfo .platform .machine () == 'x86_64' :
349+ o_files = glob ('c-blosc/internal-complibs/zstd*/decompress/*amd64.o' )
350+ for f in o_files :
351+ os .remove (f )
352+
353+ clean .run (self )
354+
355+
314356def run_setup (with_extensions ):
315357
316358 if with_extensions :
317359 ext_modules = (blosc_extension () + zstd_extension () + lz4_extension () +
318360 compat_extension () + shuffle_extension () + vlen_extension () +
319361 fletcher_extension () + jenkins_extension ())
320362
321- cmdclass = dict (build_ext = ve_build_ext )
363+ cmdclass = dict (build_ext = ve_build_ext , clean = Sclean )
322364 else :
323365 ext_modules = []
324366 cmdclass = {}
0 commit comments