blob: 1103cd8e7d0f3cb0f9842a13787c69d0472ceb46 [file] [log] [blame]
Christophe Favergeonc8a9c182022-02-25 09:48:43 +01001#from distutils.core import setup, Extension
2from setuptools import setup, Extension,find_packages
3from distutils.util import convert_path
4import glob
5import numpy
6import sys
7import os
8import os.path
9import re
10import pathlib
11
12here = pathlib.Path(__file__).parent.resolve()
13ROOT = here
14ROOT=""
15
16includes = [os.path.join(ROOT,"Include"),os.path.join(ROOT,"PrivateInclude"),os.path.join("PythonWrapper","cmsisdsp_pkg","src")]
17
18if sys.platform == 'win32':
19 cflags = ["-DWIN","-DCMSISDSP","-DUNALIGNED_SUPPORT_DISABLE"]
20else:
21 cflags = ["-Wno-attributes","-Wno-unused-function","-Wno-unused-variable","-Wno-implicit-function-declaration","-DCMSISDSP","-D__GNUC_PYTHON__"]
22
23transform = glob.glob(os.path.join(ROOT,"Source","TransformFunctions","*.c"))
24
25# Files are present when creating the source distribution
26# but they are not copied to the source distribution
27# When doing pip install those files are not prevent
28# and it should not fail
29try:
30 transform.remove(os.path.join(ROOT,"Source","TransformFunctions","TransformFunctions.c"))
31 transform.remove(os.path.join(ROOT,"Source","TransformFunctions","TransformFunctionsF16.c"))
32except:
33 pass
34
35support = glob.glob(os.path.join(ROOT,"Source","SupportFunctions","*.c"))
36
37try:
38 support.remove(os.path.join(ROOT,"Source","SupportFunctions","SupportFunctions.c"))
39 support.remove(os.path.join(ROOT,"Source","SupportFunctions","SupportFunctionsF16.c"))
40except:
41 pass
42
43fastmath = glob.glob(os.path.join(ROOT,"Source","FastMathFunctions","*.c"))
44try:
45 fastmath.remove(os.path.join(ROOT,"Source","FastMathFunctions","FastMathFunctions.c"))
46except:
47 pass
48
49filtering = glob.glob(os.path.join(ROOT,"Source","FilteringFunctions","*.c"))
50try:
51 filtering.remove(os.path.join(ROOT,"Source","FilteringFunctions","FilteringFunctions.c"))
52 filtering.remove(os.path.join(ROOT,"Source","FilteringFunctions","FilteringFunctionsF16.c"))
53except:
54 pass
55
56matrix = glob.glob(os.path.join(ROOT,"Source","MatrixFunctions","*.c"))
57try:
58 matrix.remove(os.path.join(ROOT,"Source","MatrixFunctions","MatrixFunctions.c"))
59 matrix.remove(os.path.join(ROOT,"Source","MatrixFunctions","MatrixFunctionsF16.c"))
60except:
61 pass
62
63statistics = glob.glob(os.path.join(ROOT,"Source","StatisticsFunctions","*.c"))
64try:
65 statistics.remove(os.path.join(ROOT,"Source","StatisticsFunctions","StatisticsFunctions.c"))
66 statistics.remove(os.path.join(ROOT,"Source","StatisticsFunctions","StatisticsFunctionsF16.c"))
67except:
68 pass
69
70complexf = glob.glob(os.path.join(ROOT,"Source","ComplexMathFunctions","*.c"))
71try:
72 complexf.remove(os.path.join(ROOT,"Source","ComplexMathFunctions","ComplexMathFunctions.c"))
73 complexf.remove(os.path.join(ROOT,"Source","ComplexMathFunctions","ComplexMathFunctionsF16.c"))
74except:
75 pass
76
77basic = glob.glob(os.path.join(ROOT,"Source","BasicMathFunctions","*.c"))
78try:
79 basic.remove(os.path.join(ROOT,"Source","BasicMathFunctions","BasicMathFunctions.c"))
80 basic.remove(os.path.join(ROOT,"Source","BasicMathFunctions","BasicMathFunctionsF16.c"))
81except:
82 pass
83
84controller = glob.glob(os.path.join(ROOT,"Source","ControllerFunctions","*.c"))
85try:
86 controller.remove(os.path.join(ROOT,"Source","ControllerFunctions","ControllerFunctions.c"))
87except:
88 pass
89
90common = glob.glob(os.path.join(ROOT,"Source","CommonTables","*.c"))
91try:
92 common.remove(os.path.join(ROOT,"Source","CommonTables","CommonTables.c"))
93 common.remove(os.path.join(ROOT,"Source","CommonTables","CommonTablesF16.c"))
94except:
95 pass
96
97interpolation = glob.glob(os.path.join(ROOT,"Source","InterpolationFunctions","*.c"))
98try:
99 interpolation.remove(os.path.join(ROOT,"Source","InterpolationFunctions","InterpolationFunctions.c"))
100 interpolation.remove(os.path.join(ROOT,"Source","InterpolationFunctions","InterpolationFunctionsF16.c"))
101except:
102 pass
103
104quaternion = glob.glob(os.path.join(ROOT,"Source","QuaternionMathFunctions","*.c"))
105try:
106 quaternion.remove(os.path.join(ROOT,"Source","QuaternionMathFunctions","QuaternionMathFunctions.c"))
107except:
108 pass
109
110#distance = glob.glob(os.path.join(ROOT,"Source","DistanceFunctions","*.c"))
111#distance.remove(os.path.join(ROOT,"Source","DistanceFunctions","DistanceFunctions.c"))
112
113
114# Add dependencies
115transformMod = transform + common + basic + complexf + fastmath + matrix + statistics
116statisticsMod = statistics + common + fastmath
117interpolationMod = interpolation + common
118filteringMod = filtering + common + support + fastmath
119controllerMod = controller + common
120
121matrixMod = matrix
122supportMod = support
123complexfMod = complexf + fastmath + common
124basicMod = basic
125quaternionMod = quaternion
126fastmathMod = fastmath + common
127
128
129filteringMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_filtering.c"))
130matrixMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_matrix.c"))
131supportMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_support.c"))
132statisticsMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_statistics.c"))
133complexfMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_complexf.c"))
134basicMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_basic.c"))
135controllerMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_controller.c"))
136transformMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_transform.c"))
137interpolationMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_interpolation.c"))
138quaternionMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_quaternion.c"))
139fastmathMod.append(os.path.join("PythonWrapper","cmsisdsp_pkg","src","cmsisdsp_fastmath.c"))
140
141
142
143
144missing=set(["arm_abs_f64"
145,"arm_absmax_f64"
146,"arm_absmax_no_idx_f32"
147,"arm_absmax_no_idx_f64"
148,"arm_absmin_f64"
149,"arm_absmin_no_idx_f32"
150,"arm_absmin_no_idx_f64"
151,"arm_add_f64"
152,"arm_barycenter_f32"
153,"arm_braycurtis_distance_f32"
154,"arm_canberra_distance_f32"
155,"arm_chebyshev_distance_f32"
156,"arm_chebyshev_distance_f64"
157,"arm_circularRead_f32"
158,"arm_cityblock_distance_f32"
159,"arm_cityblock_distance_f64"
160,"arm_cmplx_mag_f64"
161,"arm_cmplx_mag_squared_f64"
162,"arm_cmplx_mult_cmplx_f64"
163,"arm_copy_f64"
164,"arm_correlate_f64"
165,"arm_correlation_distance_f32"
166,"arm_cosine_distance_f32"
167,"arm_cosine_distance_f64"
168,"arm_dot_prod_f64"
169,"arm_entropy_f32"
170,"arm_entropy_f64"
171,"arm_euclidean_distance_f32"
172,"arm_euclidean_distance_f64"
173,"arm_exponent_f32"
174,"arm_fill_f64"
175,"arm_fir_f64"
176,"arm_fir_init_f64"
177,"arm_gaussian_naive_bayes_predict_f32"
178,"arm_jensenshannon_distance_f32"
179,"arm_kullback_leibler_f32"
180,"arm_kullback_leibler_f64"
181,"arm_logsumexp_dot_prod_f32"
182,"arm_logsumexp_f32"
183,"arm_mat_cholesky_f32"
184,"arm_mat_cholesky_f64"
185,"arm_mat_init_f32"
186,"arm_mat_ldlt_f32"
187,"arm_mat_ldlt_f64"
188,"arm_mat_mult_f64"
189,"arm_mat_solve_lower_triangular_f32"
190,"arm_mat_solve_lower_triangular_f64"
191,"arm_mat_solve_upper_triangular_f32"
192,"arm_mat_solve_upper_triangular_f64"
193,"arm_mat_sub_f64"
194,"arm_mat_trans_f64"
195,"arm_max_f64"
196,"arm_max_no_idx_f32"
197,"arm_max_no_idx_f64"
198,"arm_mean_f64"
199,"arm_merge_sort_f32"
200,"arm_merge_sort_init_f32"
201,"arm_min_f64"
202,"arm_min_no_idx_f32"
203,"arm_min_no_idx_f64"
204,"arm_minkowski_distance_f32"
205,"arm_mult_f64"
206,"arm_negate_f64"
207,"arm_offset_f64"
208,"arm_power_f64"
209,"arm_scale_f64"
210,"arm_sort_f32"
211,"arm_sort_init_f32"
212,"arm_spline_f32"
213,"arm_spline_init_f32"
214,"arm_std_f64"
215,"arm_sub_f64"
216,"arm_svm_linear_init_f32"
217,"arm_svm_linear_predict_f32"
218,"arm_svm_polynomial_init_f32"
219,"arm_svm_polynomial_predict_f32"
220,"arm_svm_rbf_init_f32"
221,"arm_svm_rbf_predict_f32"
222,"arm_svm_sigmoid_init_f32"
223,"arm_svm_sigmoid_predict_f32"
224,"arm_var_f64"
225,"arm_vexp_f32"
226,"arm_vexp_f64"
227,"arm_vlog_f64"
228,"arm_vsqrt_f32"
229,"arm_weighted_sum_f32"
230,"arm_circularRead_q15"
231,"arm_circularRead_q7"
232,"arm_div_q63_to_q31"
233,"arm_fir_sparse_q15"
234,"arm_fir_sparse_q31"
235,"arm_fir_sparse_q7"
236,"arm_mat_init_q15"
237,"arm_mat_init_q31"
238 ])
239
240def notf16(number):
241 if re.search(r'f16',number):
242 return(False)
243 if re.search(r'F16',number):
244 return(False)
245 return(True)
246
247def isnotmissing(src):
248 name=os.path.splitext(os.path.basename(src))[0]
249 return(not (name in missing))
250
251# If there are too many files, the linker command is failing on Windows.
252# So f16 functions are removed since they are not currently available in the wrapper.
253# A next version will have to structure this wrapper more cleanly so that the
254# build can work even with more functions
255
256filtering = list(filter(isnotmissing,list(filter(notf16, filteringMod))))
257matrix = list(filter(isnotmissing,list(filter(notf16, matrixMod))))
258support = list(filter(isnotmissing,list(filter(notf16, supportMod))))
259statistics = list(filter(isnotmissing,list(filter(notf16, statisticsMod))))
260complexf = list(filter(isnotmissing,list(filter(notf16, complexfMod))))
261basic = list(filter(isnotmissing,list(filter(notf16, basicMod))))
262controller = list(filter(isnotmissing,list(filter(notf16, controllerMod))))
263transform = list(filter(isnotmissing,list(filter(notf16, transformMod))))
264interpolation = list(filter(isnotmissing,list(filter(notf16, interpolationMod))))
265quaternion = list(filter(isnotmissing,list(filter(notf16, quaternionMod))))
266fastmath = list(filter(isnotmissing,list(filter(notf16, fastmathMod))))
267
268#for l in filtering:
269# print(os.path.basename(l))
270#quit()
271
272def mkModule(name,srcs):
273 return(Extension(name,
274 sources = (srcs
275 )
276 ,
277 include_dirs = includes + [numpy.get_include()],
278 extra_compile_args = cflags
279 ))
280
281moduleFiltering = mkModule('cmsisdsp_filtering',filtering)
282moduleMatrix = mkModule('cmsisdsp_matrix',matrix)
283moduleSupport = mkModule('cmsisdsp_support',support)
284moduleStatistics = mkModule('cmsisdsp_statistics',statistics)
285moduleComplexf= mkModule('cmsisdsp_complexf',complexf)
286moduleBasic = mkModule('cmsisdsp_basic',basic)
287moduleController = mkModule('cmsisdsp_controller',controller)
288moduleTransform = mkModule('cmsisdsp_transform',transform)
289moduleInterpolation = mkModule('cmsisdsp_interpolation',interpolation)
290moduleQuaternion = mkModule('cmsisdsp_quaternion',quaternion)
291moduleFastmath = mkModule('cmsisdsp_fastmath',fastmath)
292
293
294
295
296def build():
297 if sys.version_info.major < 3:
298 print('setup.py: Error: This package only supports Python 3.', file=sys.stderr)
299 sys.exit(1)
300
301 main_ns = {}
302 ver_path = convert_path(os.path.join("cmsisdsp","version.py"))
303 with open(ver_path) as ver_file:
304 exec(ver_file.read(), main_ns)
305
306 setup (name = 'cmsisdsp',
307 version = main_ns['__version__'],
308 packages=["cmsisdsp","cmsisdsp.sdf","cmsisdsp.sdf.nodes","cmsisdsp.sdf.nodes.host","cmsisdsp.sdf.scheduler"],
309 description = 'CMSIS-DSP Python API',
310 long_description=open("PythonWrapper_README.md").read(),
311 long_description_content_type='text/markdown',
312 ext_modules = [moduleFiltering ,
313 moduleMatrix,
314 moduleSupport,
315 moduleStatistics,
316 moduleComplexf,
317 moduleBasic,
318 moduleController,
319 moduleTransform,
320 moduleInterpolation,
321 moduleQuaternion,
322 moduleFastmath
323 ],
324 include_package_data=True,
325 author = 'Copyright (C) 2010-2022 ARM Limited or its affiliates. All rights reserved.',
326 author_email = 'christophe.favergeon@arm.com',
327 url="https://arm-software.github.io/CMSIS_5/DSP/html/index.html",
328 python_requires='>=3.6',
329 license="License :: OSI Approved :: Apache Software License",
330 platforms=['any'],
331 classifiers=[
332 "Programming Language :: Python :: 3",
333 "Programming Language :: Python :: Implementation :: CPython",
334 "Programming Language :: C",
335 "License :: OSI Approved :: Apache Software License",
336 "Operating System :: OS Independent",
337 "Development Status :: 4 - Beta",
338 "Topic :: Software Development :: Embedded Systems",
339 "Topic :: Scientific/Engineering :: Mathematics",
340 "Environment :: Console",
341 "Intended Audience :: Developers",
342 ],
343 keywords=['development','dsp','cmsis','cmsis-dsp','Arm','signal processing','maths'],
344 install_requires=['numpy>=1.19',
345 'networkx>=2.5',
346 'jinja2>= 3.0',
347 'sympy>=1.6'],
348 project_urls={ # Optional
349 'Bug Reports': 'https://github.com/ARM-software/CMSIS_5/issues',
350 'Source': 'https://github.com/ARM-software/CMSIS_5/tree/develop/CMSIS/DSP',
351 }
352 )
353
354
355build()