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