xref: /aosp_15_r20/external/armnn/python/pyarmnn/setup.py (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1*89c4ff92SAndroid Build Coastguard Worker#!/usr/bin/env python3
2*89c4ff92SAndroid Build Coastguard Worker# Copyright © 2020 Arm Ltd. All rights reserved.
3*89c4ff92SAndroid Build Coastguard Worker# Copyright © 2020 NXP and Contributors. All rights reserved.
4*89c4ff92SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
5*89c4ff92SAndroid Build Coastguard Worker"""Python bindings for Arm NN
6*89c4ff92SAndroid Build Coastguard Worker
7*89c4ff92SAndroid Build Coastguard WorkerPyArmNN is a python extension for Arm NN SDK providing an interface similar to Arm NN C++ API.
8*89c4ff92SAndroid Build Coastguard Worker"""
9*89c4ff92SAndroid Build Coastguard Worker__version__ = None
10*89c4ff92SAndroid Build Coastguard Worker__arm_ml_version__ = None
11*89c4ff92SAndroid Build Coastguard Worker
12*89c4ff92SAndroid Build Coastguard Workerimport logging
13*89c4ff92SAndroid Build Coastguard Workerimport os
14*89c4ff92SAndroid Build Coastguard Workerimport sys
15*89c4ff92SAndroid Build Coastguard Workerimport subprocess
16*89c4ff92SAndroid Build Coastguard Workerfrom functools import lru_cache
17*89c4ff92SAndroid Build Coastguard Workerfrom pathlib import Path
18*89c4ff92SAndroid Build Coastguard Workerfrom itertools import chain
19*89c4ff92SAndroid Build Coastguard Worker
20*89c4ff92SAndroid Build Coastguard Workerfrom setuptools import setup
21*89c4ff92SAndroid Build Coastguard Workerfrom distutils.core import Extension
22*89c4ff92SAndroid Build Coastguard Workerfrom setuptools.command.build_py import build_py
23*89c4ff92SAndroid Build Coastguard Workerfrom setuptools.command.build_ext import build_ext
24*89c4ff92SAndroid Build Coastguard Worker
25*89c4ff92SAndroid Build Coastguard Workerlogger = logging.Logger(__name__)
26*89c4ff92SAndroid Build Coastguard Worker
27*89c4ff92SAndroid Build Coastguard WorkerDOCLINES = __doc__.split("\n")
28*89c4ff92SAndroid Build Coastguard WorkerLIB_ENV_NAME = "ARMNN_LIB"
29*89c4ff92SAndroid Build Coastguard WorkerINCLUDE_ENV_NAME = "ARMNN_INCLUDE"
30*89c4ff92SAndroid Build Coastguard Worker
31*89c4ff92SAndroid Build Coastguard Worker
32*89c4ff92SAndroid Build Coastguard Workerdef check_armnn_version(*args):
33*89c4ff92SAndroid Build Coastguard Worker    pass
34*89c4ff92SAndroid Build Coastguard Worker
35*89c4ff92SAndroid Build Coastguard Worker__current_dir = os.path.dirname(os.path.realpath(__file__))
36*89c4ff92SAndroid Build Coastguard Worker
37*89c4ff92SAndroid Build Coastguard Workerexec(open(os.path.join(__current_dir, 'src', 'pyarmnn', '_version.py'), encoding="utf-8").read())
38*89c4ff92SAndroid Build Coastguard Worker
39*89c4ff92SAndroid Build Coastguard Worker
40*89c4ff92SAndroid Build Coastguard Workerclass ExtensionPriorityBuilder(build_py):
41*89c4ff92SAndroid Build Coastguard Worker    """Runs extension builder before other stages. Otherwise generated files are not included to the distribution.
42*89c4ff92SAndroid Build Coastguard Worker    """
43*89c4ff92SAndroid Build Coastguard Worker
44*89c4ff92SAndroid Build Coastguard Worker    def run(self):
45*89c4ff92SAndroid Build Coastguard Worker        self.run_command('build_ext')
46*89c4ff92SAndroid Build Coastguard Worker        return super().run()
47*89c4ff92SAndroid Build Coastguard Worker
48*89c4ff92SAndroid Build Coastguard Worker
49*89c4ff92SAndroid Build Coastguard Workerclass ArmnnVersionCheckerExtBuilder(build_ext):
50*89c4ff92SAndroid Build Coastguard Worker    """Builds an extension (i.e. wrapper). Additionally checks for version.
51*89c4ff92SAndroid Build Coastguard Worker    """
52*89c4ff92SAndroid Build Coastguard Worker
53*89c4ff92SAndroid Build Coastguard Worker    def __init__(self, dist):
54*89c4ff92SAndroid Build Coastguard Worker        super().__init__(dist)
55*89c4ff92SAndroid Build Coastguard Worker        self.failed_ext = []
56*89c4ff92SAndroid Build Coastguard Worker
57*89c4ff92SAndroid Build Coastguard Worker    def build_extension(self, ext):
58*89c4ff92SAndroid Build Coastguard Worker        if ext.optional:
59*89c4ff92SAndroid Build Coastguard Worker            try:
60*89c4ff92SAndroid Build Coastguard Worker                super().build_extension(ext)
61*89c4ff92SAndroid Build Coastguard Worker            except Exception as err:
62*89c4ff92SAndroid Build Coastguard Worker                self.failed_ext.append(ext)
63*89c4ff92SAndroid Build Coastguard Worker                logger.warning('Failed to build extension %s. \n %s', ext.name, str(err))
64*89c4ff92SAndroid Build Coastguard Worker        else:
65*89c4ff92SAndroid Build Coastguard Worker            super().build_extension(ext)
66*89c4ff92SAndroid Build Coastguard Worker            if ext.name == 'pyarmnn._generated._pyarmnn_version':
67*89c4ff92SAndroid Build Coastguard Worker                sys.path.append(os.path.abspath(os.path.join(self.build_lib, str(Path(ext._file_name).parent))))
68*89c4ff92SAndroid Build Coastguard Worker                from _pyarmnn_version import GetVersion
69*89c4ff92SAndroid Build Coastguard Worker                check_armnn_version(GetVersion(), __arm_ml_version__)
70*89c4ff92SAndroid Build Coastguard Worker
71*89c4ff92SAndroid Build Coastguard Worker    def copy_extensions_to_source(self):
72*89c4ff92SAndroid Build Coastguard Worker
73*89c4ff92SAndroid Build Coastguard Worker        for ext in self.failed_ext:
74*89c4ff92SAndroid Build Coastguard Worker            self.extensions.remove(ext)
75*89c4ff92SAndroid Build Coastguard Worker        super().copy_extensions_to_source()
76*89c4ff92SAndroid Build Coastguard Worker
77*89c4ff92SAndroid Build Coastguard Worker
78*89c4ff92SAndroid Build Coastguard Workerdef linux_gcc_name():
79*89c4ff92SAndroid Build Coastguard Worker    """Returns the name of the `gcc` compiler. Might happen that we are cross-compiling and the
80*89c4ff92SAndroid Build Coastguard Worker    compiler has a longer name.
81*89c4ff92SAndroid Build Coastguard Worker
82*89c4ff92SAndroid Build Coastguard Worker    Args:
83*89c4ff92SAndroid Build Coastguard Worker        None
84*89c4ff92SAndroid Build Coastguard Worker
85*89c4ff92SAndroid Build Coastguard Worker    Returns:
86*89c4ff92SAndroid Build Coastguard Worker        str: Name of the `gcc` compiler or None
87*89c4ff92SAndroid Build Coastguard Worker    """
88*89c4ff92SAndroid Build Coastguard Worker    cc_env = os.getenv('CC')
89*89c4ff92SAndroid Build Coastguard Worker    if cc_env is not None:
90*89c4ff92SAndroid Build Coastguard Worker        if subprocess.Popen([cc_env, "--version"], stdout=subprocess.DEVNULL):
91*89c4ff92SAndroid Build Coastguard Worker            return cc_env
92*89c4ff92SAndroid Build Coastguard Worker    return "gcc" if subprocess.Popen(["gcc", "--version"], stdout=subprocess.DEVNULL) else None
93*89c4ff92SAndroid Build Coastguard Worker
94*89c4ff92SAndroid Build Coastguard Worker
95*89c4ff92SAndroid Build Coastguard Workerdef linux_gcc_lib_search(gcc_compiler_name: str = linux_gcc_name()):
96*89c4ff92SAndroid Build Coastguard Worker    """Calls the `gcc` to get linker default system paths.
97*89c4ff92SAndroid Build Coastguard Worker
98*89c4ff92SAndroid Build Coastguard Worker    Args:
99*89c4ff92SAndroid Build Coastguard Worker        gcc_compiler_name(str): Name of the GCC compiler
100*89c4ff92SAndroid Build Coastguard Worker
101*89c4ff92SAndroid Build Coastguard Worker    Returns:
102*89c4ff92SAndroid Build Coastguard Worker        list: A list of paths.
103*89c4ff92SAndroid Build Coastguard Worker
104*89c4ff92SAndroid Build Coastguard Worker    Raises:
105*89c4ff92SAndroid Build Coastguard Worker        RuntimeError: If unable to find GCC.
106*89c4ff92SAndroid Build Coastguard Worker    """
107*89c4ff92SAndroid Build Coastguard Worker    if gcc_compiler_name is None:
108*89c4ff92SAndroid Build Coastguard Worker        raise RuntimeError("Unable to find gcc compiler")
109*89c4ff92SAndroid Build Coastguard Worker    cmd1 = subprocess.Popen([gcc_compiler_name, "--print-search-dirs"], stdout=subprocess.PIPE)
110*89c4ff92SAndroid Build Coastguard Worker    cmd2 = subprocess.Popen(["grep", "libraries"], stdin=cmd1.stdout,
111*89c4ff92SAndroid Build Coastguard Worker                         stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
112*89c4ff92SAndroid Build Coastguard Worker    cmd1.stdout.close()
113*89c4ff92SAndroid Build Coastguard Worker    out, _ = cmd2.communicate()
114*89c4ff92SAndroid Build Coastguard Worker    out = out.decode("utf-8").split('=')
115*89c4ff92SAndroid Build Coastguard Worker    return tuple(out[1].split(':')) if len(out) > 0 else None
116*89c4ff92SAndroid Build Coastguard Worker
117*89c4ff92SAndroid Build Coastguard Worker
118*89c4ff92SAndroid Build Coastguard Workerdef find_includes(armnn_include_env: str = INCLUDE_ENV_NAME):
119*89c4ff92SAndroid Build Coastguard Worker    """Searches for ArmNN includes.
120*89c4ff92SAndroid Build Coastguard Worker
121*89c4ff92SAndroid Build Coastguard Worker    Args:
122*89c4ff92SAndroid Build Coastguard Worker        armnn_include_env(str): Environmental variable to use as path.
123*89c4ff92SAndroid Build Coastguard Worker
124*89c4ff92SAndroid Build Coastguard Worker    Returns:
125*89c4ff92SAndroid Build Coastguard Worker        list: A list of paths to include.
126*89c4ff92SAndroid Build Coastguard Worker    """
127*89c4ff92SAndroid Build Coastguard Worker
128*89c4ff92SAndroid Build Coastguard Worker    # split multiple paths
129*89c4ff92SAndroid Build Coastguard Worker    global armnn_include_path
130*89c4ff92SAndroid Build Coastguard Worker    armnn_include_path_raw = os.getenv(armnn_include_env)
131*89c4ff92SAndroid Build Coastguard Worker    if not armnn_include_path_raw == None:
132*89c4ff92SAndroid Build Coastguard Worker        armnn_include_path = armnn_include_path_raw.split(":")
133*89c4ff92SAndroid Build Coastguard Worker
134*89c4ff92SAndroid Build Coastguard Worker    # validate input paths
135*89c4ff92SAndroid Build Coastguard Worker    armnn_include_path_result = []
136*89c4ff92SAndroid Build Coastguard Worker    for path in armnn_include_path:
137*89c4ff92SAndroid Build Coastguard Worker        if path is not None and os.path.exists(path):
138*89c4ff92SAndroid Build Coastguard Worker            armnn_include_path_result = armnn_include_path_result + [path]
139*89c4ff92SAndroid Build Coastguard Worker
140*89c4ff92SAndroid Build Coastguard Worker
141*89c4ff92SAndroid Build Coastguard Worker    # if none exist revert to default
142*89c4ff92SAndroid Build Coastguard Worker    if len(armnn_include_path_result) == 0:
143*89c4ff92SAndroid Build Coastguard Worker        armnn_include_path_result = ['/usr/local/include', '/usr/include']
144*89c4ff92SAndroid Build Coastguard Worker    return armnn_include_path_result
145*89c4ff92SAndroid Build Coastguard Worker
146*89c4ff92SAndroid Build Coastguard Worker
147*89c4ff92SAndroid Build Coastguard Worker
148*89c4ff92SAndroid Build Coastguard Worker@lru_cache(maxsize=1)
149*89c4ff92SAndroid Build Coastguard Workerdef find_armnn(lib_name: str,
150*89c4ff92SAndroid Build Coastguard Worker               optional: bool = False,
151*89c4ff92SAndroid Build Coastguard Worker               armnn_libs_env: str = LIB_ENV_NAME,
152*89c4ff92SAndroid Build Coastguard Worker               default_lib_search: tuple = linux_gcc_lib_search()):
153*89c4ff92SAndroid Build Coastguard Worker    """Searches for ArmNN installation on the local machine.
154*89c4ff92SAndroid Build Coastguard Worker
155*89c4ff92SAndroid Build Coastguard Worker    Args:
156*89c4ff92SAndroid Build Coastguard Worker        lib_name(str): Lib name to find.
157*89c4ff92SAndroid Build Coastguard Worker        optional(bool): Do not fail if optional. Default is False - fail if library was not found.
158*89c4ff92SAndroid Build Coastguard Worker        armnn_libs_env(str): Custom environment variable pointing to ArmNN libraries location, default is 'ARMNN_LIBS'
159*89c4ff92SAndroid Build Coastguard Worker        default_lib_search(tuple): list of paths to search for ArmNN if not found within path provided by 'ARMNN_LIBS'
160*89c4ff92SAndroid Build Coastguard Worker                            env variable
161*89c4ff92SAndroid Build Coastguard Worker    Returns:
162*89c4ff92SAndroid Build Coastguard Worker        tuple: Contains name of the armnn libs, paths to the libs.
163*89c4ff92SAndroid Build Coastguard Worker
164*89c4ff92SAndroid Build Coastguard Worker    Raises:
165*89c4ff92SAndroid Build Coastguard Worker        RuntimeError: If armnn libs are not found.
166*89c4ff92SAndroid Build Coastguard Worker    """
167*89c4ff92SAndroid Build Coastguard Worker    armnn_lib_path = os.getenv(armnn_libs_env)
168*89c4ff92SAndroid Build Coastguard Worker    lib_search = [armnn_lib_path] if armnn_lib_path is not None else default_lib_search
169*89c4ff92SAndroid Build Coastguard Worker    armnn_libs = dict(map(lambda path: (':{}'.format(path.name), path),
170*89c4ff92SAndroid Build Coastguard Worker                          chain.from_iterable(map(lambda lib_path: Path(lib_path).glob(lib_name),
171*89c4ff92SAndroid Build Coastguard Worker                                                  lib_search))))
172*89c4ff92SAndroid Build Coastguard Worker    if not optional and len(armnn_libs) == 0:
173*89c4ff92SAndroid Build Coastguard Worker        raise RuntimeError("""ArmNN library {} was not found in {}. Please install ArmNN to one of the standard
174*89c4ff92SAndroid Build Coastguard Worker                           locations or set correct ARMNN_INCLUDE and ARMNN_LIB env variables.""".format(lib_name,
175*89c4ff92SAndroid Build Coastguard Worker                                                                                                         lib_search))
176*89c4ff92SAndroid Build Coastguard Worker    if optional and len(armnn_libs) == 0:
177*89c4ff92SAndroid Build Coastguard Worker        logger.warning("""Optional parser library %s was not found in %s and will not be installed.""", lib_name,
178*89c4ff92SAndroid Build Coastguard Worker                                                                                                        lib_search)
179*89c4ff92SAndroid Build Coastguard Worker
180*89c4ff92SAndroid Build Coastguard Worker    # gives back tuple of names of the libs, set of unique libs locations and includes.
181*89c4ff92SAndroid Build Coastguard Worker    return list(armnn_libs.keys()), list(set(
182*89c4ff92SAndroid Build Coastguard Worker        map(lambda path: str(path.absolute().parent), armnn_libs.values())))
183*89c4ff92SAndroid Build Coastguard Worker
184*89c4ff92SAndroid Build Coastguard Worker
185*89c4ff92SAndroid Build Coastguard Workerclass LazyArmnnFinderExtension(Extension):
186*89c4ff92SAndroid Build Coastguard Worker    """Derived from `Extension` this class adds ArmNN libraries search on the user's machine.
187*89c4ff92SAndroid Build Coastguard Worker    SWIG options and compilation flags are updated with relevant ArmNN libraries files locations (-L) and headers (-I).
188*89c4ff92SAndroid Build Coastguard Worker
189*89c4ff92SAndroid Build Coastguard Worker    Search for ArmNN is executed only when attributes include_dirs, library_dirs, runtime_library_dirs, libraries or
190*89c4ff92SAndroid Build Coastguard Worker    swig_opts are queried.
191*89c4ff92SAndroid Build Coastguard Worker
192*89c4ff92SAndroid Build Coastguard Worker    """
193*89c4ff92SAndroid Build Coastguard Worker
194*89c4ff92SAndroid Build Coastguard Worker    def __init__(self, name, sources, armnn_libs, include_dirs=None, define_macros=None, undef_macros=None,
195*89c4ff92SAndroid Build Coastguard Worker                 library_dirs=None,
196*89c4ff92SAndroid Build Coastguard Worker                 libraries=None, runtime_library_dirs=None, extra_objects=None, extra_compile_args=None,
197*89c4ff92SAndroid Build Coastguard Worker                 extra_link_args=None, export_symbols=None, language=None, optional=None, **kw):
198*89c4ff92SAndroid Build Coastguard Worker        self._include_dirs = None
199*89c4ff92SAndroid Build Coastguard Worker        self._library_dirs = None
200*89c4ff92SAndroid Build Coastguard Worker        self._runtime_library_dirs = None
201*89c4ff92SAndroid Build Coastguard Worker        self._armnn_libs = armnn_libs
202*89c4ff92SAndroid Build Coastguard Worker        self._optional = False if optional is None else optional
203*89c4ff92SAndroid Build Coastguard Worker
204*89c4ff92SAndroid Build Coastguard Worker        super().__init__(name=name, sources=sources, include_dirs=include_dirs, define_macros=define_macros,
205*89c4ff92SAndroid Build Coastguard Worker                         undef_macros=undef_macros, library_dirs=library_dirs, libraries=libraries,
206*89c4ff92SAndroid Build Coastguard Worker                         runtime_library_dirs=runtime_library_dirs, extra_objects=extra_objects,
207*89c4ff92SAndroid Build Coastguard Worker                         extra_compile_args=extra_compile_args, extra_link_args=extra_link_args,
208*89c4ff92SAndroid Build Coastguard Worker                         export_symbols=export_symbols, language=language, optional=optional, **kw)
209*89c4ff92SAndroid Build Coastguard Worker
210*89c4ff92SAndroid Build Coastguard Worker    @property
211*89c4ff92SAndroid Build Coastguard Worker    def include_dirs(self):
212*89c4ff92SAndroid Build Coastguard Worker        return self._include_dirs + find_includes()
213*89c4ff92SAndroid Build Coastguard Worker
214*89c4ff92SAndroid Build Coastguard Worker    @include_dirs.setter
215*89c4ff92SAndroid Build Coastguard Worker    def include_dirs(self, include_dirs):
216*89c4ff92SAndroid Build Coastguard Worker        self._include_dirs = include_dirs
217*89c4ff92SAndroid Build Coastguard Worker
218*89c4ff92SAndroid Build Coastguard Worker    @property
219*89c4ff92SAndroid Build Coastguard Worker    def library_dirs(self):
220*89c4ff92SAndroid Build Coastguard Worker        library_dirs = self._library_dirs
221*89c4ff92SAndroid Build Coastguard Worker        for lib in self._armnn_libs:
222*89c4ff92SAndroid Build Coastguard Worker            _, lib_path = find_armnn(lib, self._optional)
223*89c4ff92SAndroid Build Coastguard Worker            library_dirs = library_dirs + lib_path
224*89c4ff92SAndroid Build Coastguard Worker
225*89c4ff92SAndroid Build Coastguard Worker        return library_dirs
226*89c4ff92SAndroid Build Coastguard Worker
227*89c4ff92SAndroid Build Coastguard Worker    @library_dirs.setter
228*89c4ff92SAndroid Build Coastguard Worker    def library_dirs(self, library_dirs):
229*89c4ff92SAndroid Build Coastguard Worker        self._library_dirs = library_dirs
230*89c4ff92SAndroid Build Coastguard Worker
231*89c4ff92SAndroid Build Coastguard Worker    @property
232*89c4ff92SAndroid Build Coastguard Worker    def runtime_library_dirs(self):
233*89c4ff92SAndroid Build Coastguard Worker        library_dirs = self._runtime_library_dirs
234*89c4ff92SAndroid Build Coastguard Worker        for lib in self._armnn_libs:
235*89c4ff92SAndroid Build Coastguard Worker            _, lib_path = find_armnn(lib, self._optional)
236*89c4ff92SAndroid Build Coastguard Worker            library_dirs = library_dirs + lib_path
237*89c4ff92SAndroid Build Coastguard Worker
238*89c4ff92SAndroid Build Coastguard Worker        return library_dirs
239*89c4ff92SAndroid Build Coastguard Worker
240*89c4ff92SAndroid Build Coastguard Worker    @runtime_library_dirs.setter
241*89c4ff92SAndroid Build Coastguard Worker    def runtime_library_dirs(self, runtime_library_dirs):
242*89c4ff92SAndroid Build Coastguard Worker        self._runtime_library_dirs = runtime_library_dirs
243*89c4ff92SAndroid Build Coastguard Worker
244*89c4ff92SAndroid Build Coastguard Worker    @property
245*89c4ff92SAndroid Build Coastguard Worker    def libraries(self):
246*89c4ff92SAndroid Build Coastguard Worker        libraries = self._libraries
247*89c4ff92SAndroid Build Coastguard Worker        for lib in self._armnn_libs:
248*89c4ff92SAndroid Build Coastguard Worker            lib_names, _ = find_armnn(lib, self._optional)
249*89c4ff92SAndroid Build Coastguard Worker            libraries = libraries + lib_names
250*89c4ff92SAndroid Build Coastguard Worker
251*89c4ff92SAndroid Build Coastguard Worker        return libraries
252*89c4ff92SAndroid Build Coastguard Worker
253*89c4ff92SAndroid Build Coastguard Worker    @libraries.setter
254*89c4ff92SAndroid Build Coastguard Worker    def libraries(self, libraries):
255*89c4ff92SAndroid Build Coastguard Worker        self._libraries = libraries
256*89c4ff92SAndroid Build Coastguard Worker
257*89c4ff92SAndroid Build Coastguard Worker    def __eq__(self, other):
258*89c4ff92SAndroid Build Coastguard Worker        return self.__class__ == other.__class__ and self.name == other.name
259*89c4ff92SAndroid Build Coastguard Worker
260*89c4ff92SAndroid Build Coastguard Worker    def __ne__(self, other):
261*89c4ff92SAndroid Build Coastguard Worker        return not self.__eq__(other)
262*89c4ff92SAndroid Build Coastguard Worker
263*89c4ff92SAndroid Build Coastguard Worker    def __hash__(self):
264*89c4ff92SAndroid Build Coastguard Worker        return self.name.__hash__()
265*89c4ff92SAndroid Build Coastguard Worker
266*89c4ff92SAndroid Build Coastguard Worker
267*89c4ff92SAndroid Build Coastguard Workerif __name__ == '__main__':
268*89c4ff92SAndroid Build Coastguard Worker    # mandatory extensions
269*89c4ff92SAndroid Build Coastguard Worker    pyarmnn_module = LazyArmnnFinderExtension('pyarmnn._generated._pyarmnn',
270*89c4ff92SAndroid Build Coastguard Worker                                              sources=['src/pyarmnn/_generated/armnn_wrap.cpp'],
271*89c4ff92SAndroid Build Coastguard Worker                                              extra_compile_args=['-std=c++14'],
272*89c4ff92SAndroid Build Coastguard Worker                                              language='c++',
273*89c4ff92SAndroid Build Coastguard Worker                                              armnn_libs=['libarmnn.so'],
274*89c4ff92SAndroid Build Coastguard Worker                                              optional=False
275*89c4ff92SAndroid Build Coastguard Worker                                              )
276*89c4ff92SAndroid Build Coastguard Worker    pyarmnn_v_module = LazyArmnnFinderExtension('pyarmnn._generated._pyarmnn_version',
277*89c4ff92SAndroid Build Coastguard Worker                                                sources=['src/pyarmnn/_generated/armnn_version_wrap.cpp'],
278*89c4ff92SAndroid Build Coastguard Worker                                                extra_compile_args=['-std=c++14'],
279*89c4ff92SAndroid Build Coastguard Worker                                                language='c++',
280*89c4ff92SAndroid Build Coastguard Worker                                                armnn_libs=['libarmnn.so'],
281*89c4ff92SAndroid Build Coastguard Worker                                                optional=False
282*89c4ff92SAndroid Build Coastguard Worker                                                )
283*89c4ff92SAndroid Build Coastguard Worker    extensions_to_build = [pyarmnn_v_module, pyarmnn_module]
284*89c4ff92SAndroid Build Coastguard Worker
285*89c4ff92SAndroid Build Coastguard Worker
286*89c4ff92SAndroid Build Coastguard Worker    # optional extensions
287*89c4ff92SAndroid Build Coastguard Worker    def add_parsers_ext(name: str, ext_list: list):
288*89c4ff92SAndroid Build Coastguard Worker        pyarmnn_optional_module = LazyArmnnFinderExtension('pyarmnn._generated._pyarmnn_{}'.format(name.lower()),
289*89c4ff92SAndroid Build Coastguard Worker                                                           sources=['src/pyarmnn/_generated/armnn_{}_wrap.cpp'.format(
290*89c4ff92SAndroid Build Coastguard Worker                                                               name.lower())],
291*89c4ff92SAndroid Build Coastguard Worker                                                           extra_compile_args=['-std=c++14'],
292*89c4ff92SAndroid Build Coastguard Worker                                                           language='c++',
293*89c4ff92SAndroid Build Coastguard Worker                                                           armnn_libs=['libarmnn.so', 'libarmnn{}.so'.format(name)],
294*89c4ff92SAndroid Build Coastguard Worker                                                           optional=True
295*89c4ff92SAndroid Build Coastguard Worker                                                           )
296*89c4ff92SAndroid Build Coastguard Worker        ext_list.append(pyarmnn_optional_module)
297*89c4ff92SAndroid Build Coastguard Worker
298*89c4ff92SAndroid Build Coastguard Worker
299*89c4ff92SAndroid Build Coastguard Worker    add_parsers_ext('OnnxParser', extensions_to_build)
300*89c4ff92SAndroid Build Coastguard Worker    add_parsers_ext('TfLiteParser', extensions_to_build)
301*89c4ff92SAndroid Build Coastguard Worker    add_parsers_ext('Deserializer', extensions_to_build)
302*89c4ff92SAndroid Build Coastguard Worker
303*89c4ff92SAndroid Build Coastguard Worker    setup(
304*89c4ff92SAndroid Build Coastguard Worker        name='pyarmnn',
305*89c4ff92SAndroid Build Coastguard Worker        version=__version__,
306*89c4ff92SAndroid Build Coastguard Worker        author='Arm Ltd, NXP Semiconductors',
307*89c4ff92SAndroid Build Coastguard Worker        author_email='[email protected]',
308*89c4ff92SAndroid Build Coastguard Worker        description=DOCLINES[0],
309*89c4ff92SAndroid Build Coastguard Worker        long_description="\n".join(DOCLINES[2:]),
310*89c4ff92SAndroid Build Coastguard Worker        url='https://mlplatform.org/',
311*89c4ff92SAndroid Build Coastguard Worker        license='MIT',
312*89c4ff92SAndroid Build Coastguard Worker        keywords='armnn neural network machine learning',
313*89c4ff92SAndroid Build Coastguard Worker        classifiers=[
314*89c4ff92SAndroid Build Coastguard Worker            'Development Status :: 3 - Alpha',
315*89c4ff92SAndroid Build Coastguard Worker            'Intended Audience :: Developers',
316*89c4ff92SAndroid Build Coastguard Worker            'Intended Audience :: Education',
317*89c4ff92SAndroid Build Coastguard Worker            'Intended Audience :: Science/Research',
318*89c4ff92SAndroid Build Coastguard Worker            'License :: OSI Approved :: MIT License',
319*89c4ff92SAndroid Build Coastguard Worker            'Programming Language :: Python :: 3',
320*89c4ff92SAndroid Build Coastguard Worker            'Programming Language :: Python :: 3 :: Only',
321*89c4ff92SAndroid Build Coastguard Worker            'Programming Language :: Python :: 3.6',
322*89c4ff92SAndroid Build Coastguard Worker            'Programming Language :: Python :: 3.7',
323*89c4ff92SAndroid Build Coastguard Worker            'Programming Language :: Python :: 3.8',
324*89c4ff92SAndroid Build Coastguard Worker            'Topic :: Scientific/Engineering',
325*89c4ff92SAndroid Build Coastguard Worker            'Topic :: Scientific/Engineering :: Artificial Intelligence',
326*89c4ff92SAndroid Build Coastguard Worker            'Topic :: Software Development',
327*89c4ff92SAndroid Build Coastguard Worker            'Topic :: Software Development :: Libraries',
328*89c4ff92SAndroid Build Coastguard Worker            'Topic :: Software Development :: Libraries :: Python Modules',
329*89c4ff92SAndroid Build Coastguard Worker        ],
330*89c4ff92SAndroid Build Coastguard Worker        package_dir={'': 'src'},
331*89c4ff92SAndroid Build Coastguard Worker        packages=[
332*89c4ff92SAndroid Build Coastguard Worker            'pyarmnn',
333*89c4ff92SAndroid Build Coastguard Worker            'pyarmnn._generated',
334*89c4ff92SAndroid Build Coastguard Worker            'pyarmnn._quantization',
335*89c4ff92SAndroid Build Coastguard Worker            'pyarmnn._tensor',
336*89c4ff92SAndroid Build Coastguard Worker            'pyarmnn._utilities'
337*89c4ff92SAndroid Build Coastguard Worker        ],
338*89c4ff92SAndroid Build Coastguard Worker        data_files=[('', ['LICENSE'])],
339*89c4ff92SAndroid Build Coastguard Worker        python_requires='>=3.5',
340*89c4ff92SAndroid Build Coastguard Worker        install_requires=['numpy'],
341*89c4ff92SAndroid Build Coastguard Worker        cmdclass={
342*89c4ff92SAndroid Build Coastguard Worker            'build_py': ExtensionPriorityBuilder,
343*89c4ff92SAndroid Build Coastguard Worker            'build_ext': ArmnnVersionCheckerExtBuilder
344*89c4ff92SAndroid Build Coastguard Worker        },
345*89c4ff92SAndroid Build Coastguard Worker        ext_modules=extensions_to_build
346*89c4ff92SAndroid Build Coastguard Worker    )
347