diff mbox series

[meta-arago,scarthgap,v2,1/1] meta-arago-extras: Add recipe for TFLite Runtime

Message ID 20250221222446.4019819-2-c-shilwant@ti.com
State Accepted
Delegated to: Ryan Eatmon
Headers show
Series Add TFLite Runtime | expand

Commit Message

Chirag Shilwant Feb. 21, 2025, 10:24 p.m. UTC
- TensorFlow Lite is TensorFlow's lightweight solution for mobile
and embedded devices. It enables low-latency inference of on-device
machine learning models with a small binary size.

- The tensorflow-lite v2.18 recipe in meta-arago currently supports,

  * CPU delegate (with RUY enabled), XNNPACK delegate & ArmNN
    via external delegate for ARMv8 based Cortex-A platforms.

  * CPU delegate (with RUY enabled) & ArmNN via external delegate
    for ARMv7 based Cortex-A platforms.

Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
---
 ...eLists-for-building-_pywrap_tensorfl.patch |  37 +++
 ...eLists-for-building-shared-object-li.patch |  61 +++++
 ...uild-issues-observed-in-TFlite-v2.18.patch |  36 +++
 .../tensorflow-lite/tensorflow2-lite.pc.in    |   6 +
 .../tensorflow-lite/tensorflow-lite_2.18.0.bb | 232 ++++++++++++++++++
 5 files changed, 372 insertions(+)
 create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
 create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
 create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
 create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
 create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb

Comments

Andrew Davis Feb. 22, 2025, 5:24 p.m. UTC | #1
On 2/21/25 4:24 PM, Chirag Shilwant wrote:
> - TensorFlow Lite is TensorFlow's lightweight solution for mobile
> and embedded devices. It enables low-latency inference of on-device
> machine learning models with a small binary size.
> 
> - The tensorflow-lite v2.18 recipe in meta-arago currently supports,
> 
>    * CPU delegate (with RUY enabled), XNNPACK delegate & ArmNN
>      via external delegate for ARMv8 based Cortex-A platforms.
> 
>    * CPU delegate (with RUY enabled) & ArmNN via external delegate
>      for ARMv7 based Cortex-A platforms.
> 
> Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
> ---
>   ...eLists-for-building-_pywrap_tensorfl.patch |  37 +++
>   ...eLists-for-building-shared-object-li.patch |  61 +++++
>   ...uild-issues-observed-in-TFlite-v2.18.patch |  36 +++
>   .../tensorflow-lite/tensorflow2-lite.pc.in    |   6 +
>   .../tensorflow-lite/tensorflow-lite_2.18.0.bb | 232 ++++++++++++++++++
>   5 files changed, 372 insertions(+)
>   create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
>   create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
>   create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
>   create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
>   create mode 100644 meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
> 
> diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
> new file mode 100644
> index 00000000..e277beb3
> --- /dev/null
> +++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
> @@ -0,0 +1,37 @@
> +From 050127548d7f28464cbe5dc9caa83c8023676d80 Mon Sep 17 00:00:00 2001
> +From: Chirag Shilwant <c-shilwant@ti.com>
> +Date: Thu, 13 Feb 2025 14:33:50 +0530
> +Subject: [PATCH 1/3] lite: Update CMakeLists for building
> + _pywrap_tensorflow_interpreter_wrapper
> +
> +- Update the CMakeLists.txt file for TensorFlow Lite to include the paths for
> +PYTHON, Numpy, and PYBIND11 headers.
> +
> +- This ensures that these headers are available during the build process,
> +which is necessary for building the _pywrap_tensorflow_interpreter_wrapper
> +target that relies on these dependencies.
> +
> +Upstream-Status: Inappropriate [configuration]
> +
> +Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
> +---
> + tensorflow/lite/CMakeLists.txt | 3 +++
> + 1 file changed, 3 insertions(+)
> +
> +diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
> +index bce9627fbd3..b7bb39869b5 100644
> +--- a/tensorflow/lite/CMakeLists.txt
> ++++ b/tensorflow/lite/CMakeLists.txt
> +@@ -810,6 +810,9 @@ set_target_properties(_pywrap_tensorflow_interpreter_wrapper PROPERTIES PREFIX "
> + target_include_directories(_pywrap_tensorflow_interpreter_wrapper
> +   PUBLIC
> +     ${TENSORFLOW_SOURCE_DIR}
> ++    ${PYTHON_TARGET_INCLUDE}
> ++    ${NUMPY_TARGET_INCLUDE}
> ++    ${PYBIND11_TARGET_INCLUDE}
> + )
> +
> + target_link_libraries(_pywrap_tensorflow_interpreter_wrapper
> +--
> +2.34.1
> +
> diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
> new file mode 100644
> index 00000000..dce229fd
> --- /dev/null
> +++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
> @@ -0,0 +1,61 @@
> +From 339b5a7e5f17a60df1e3d6d2ffe607786ce34978 Mon Sep 17 00:00:00 2001
> +From: Chirag Shilwant <c-shilwant@ti.com>
> +Date: Thu, 13 Feb 2025 14:38:01 +0530
> +Subject: [PATCH 2/3] lite: Update CMakeLists for building shared object
> + library
> +
> +- When building TFLite with CMake, it builds static library
> +(i.e. libtensorflow-lite.a) by default which isn't self-contained
> +since all the transitive dependencies are not included [1]
> +
> +- As documented in [1], there's an update needed in CMake build steps
> +inorder to generate a shared object library (i.e. libtensorflow-lite.so)
> +
> +- This patch adds schema_conversion_utils.cc to TFLite source files
> +& updates CMakeLists.txt to build TFLite as a shared library. Additionally,
> +it ensures that the properties are set correctly to manage the shared
> +object version.
> +
> +[1]: https://ai.google.dev/edge/litert/build/cmake#step_5_build_litert
> +
> +Upstream-Status: Inappropriate [enable feature]
> +
> +Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
> +---
> + tensorflow/lite/CMakeLists.txt | 6 +++++-
> + 1 file changed, 5 insertions(+), 1 deletion(-)
> +
> +diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
> +index b7bb39869b5..92b05e42446 100644
> +--- a/tensorflow/lite/CMakeLists.txt
> ++++ b/tensorflow/lite/CMakeLists.txt
> +@@ -671,6 +671,7 @@ set(_ALL_TFLITE_SRCS
> +   ${TFLITE_SOURCE_DIR}/kernels/internal/utils/sparsity_format_converter.cc
> +   ${TFLITE_SOURCE_DIR}/schema/conversion_metadata_generated.h
> +   ${TFLITE_SOURCE_DIR}/schema/schema_generated.h
> ++  ${TFLITE_SOURCE_DIR}/schema/schema_conversion_utils.h
> +   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/schema_utils.cc
> +   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/schema_generated.h
> +   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/conversion_metadata_generated.h
> +@@ -697,7 +698,7 @@ else()
> +   list(FILTER _ALL_TFLITE_SRCS EXCLUDE REGEX ".*mmap_allocation\\.cc$")
> + endif()
> +
> +-add_library(tensorflow-lite
> ++add_library(tensorflow-lite SHARED EXCLUDE_FROM_ALL
> +   ${_ALL_TFLITE_SRCS}
> + )
> + set(_ALL_TFLITE_HDRS ${_ALL_TFLITE_SRCS})
> +@@ -773,6 +774,9 @@ if(TFLITE_ENABLE_INSTALL)
> +   )
> + endif()
> +
> ++# Manage version for shared object (dynamic) library
> ++set_target_properties(tensorflow-lite PROPERTIES VERSION "${TFLITE_VERSION_MAJOR}")
> ++
> + # The kernel tests.
> + if(TFLITE_KERNEL_TEST)
> +   enable_testing()
> +--
> +2.34.1
> +
> diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
> new file mode 100644
> index 00000000..0e21b254
> --- /dev/null
> +++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
> @@ -0,0 +1,36 @@
> +From 577192caa67660f857f2869896d01db3611b4128 Mon Sep 17 00:00:00 2001
> +From: Chirag Shilwant <c-shilwant@ti.com>
> +Date: Thu, 13 Feb 2025 14:45:46 +0530
> +Subject: [PATCH 3/3] CMakeLists: Fix build issues observed in TFlite v2.18
> +
> +- Improve regular expression for filtering neon and sse
> +related sources. The improved expression avoids missing files
> +in case the absolute path contains the terms neon or sse.
> +
> +- Fixes [1]
> +
> +[1]: https://github.com/tensorflow/tensorflow/issues/70730
> +
> +Upstream-Status: Backport from master
> +
> +Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
> +---
> + tensorflow/lite/CMakeLists.txt | 2 +-
> + 1 file changed, 1 insertion(+), 1 deletion(-)
> +
> +diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
> +index 92b05e42446..737f754621f 100644
> +--- a/tensorflow/lite/CMakeLists.txt
> ++++ b/tensorflow/lite/CMakeLists.txt
> +@@ -605,7 +605,7 @@ populate_tflite_source_vars("kernels/internal/reference/sparse_ops"
> + )
> + populate_tflite_source_vars("kernels/internal/optimized/4bit"
> +   TFLITE_KERNEL_INTERNAL_OPT_4BIT_SRCS
> +-  FILTER "(.*neon.*|.*sse.*)\\.(cc|h)"
> ++  FILTER "(.*neon_.*|.*sse_.*)\\.(cc|h)"
> + )
> + set(TFLITE_PROFILER_SRCS
> +   ${TFLITE_SOURCE_DIR}/profiling/platform_profiler.cc
> +--
> +2.34.1
> +
> diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
> new file mode 100644
> index 00000000..8c5bf2e0
> --- /dev/null
> +++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
> @@ -0,0 +1,6 @@
> +Name: tensorflow lite c++ shared library
> +Description: tensorflow lite c++ shared library
> +Version: @version@
> +Requires:
> +Libs: -L@libdir@ -ltensorflowlite -lrt
> +Cflags: -I@includedir@
> diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
> new file mode 100644
> index 00000000..a20c090a
> --- /dev/null
> +++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
> @@ -0,0 +1,232 @@
> +DESCRIPTION = "TensorFlow Lite is an open source deep learning framework for \
> +on-device inference."
> +AUTHOR = "Google Inc. and Yuan Tang"
> +SUMMARY = "TensorFlow Lite C++ Library, Python interpreter & Benchmark Model"
> +HOMEPAGE = "https://www.tensorflow.org/lite"
> +
> +LICENSE = "Apache-2.0"
> +LIC_FILES_CHKSUM = "file://LICENSE;md5=4158a261ca7f2525513e31ba9c50ae98"
> +
> +# Get major of the PV variable
> +MAJOR = "${@d.getVar('PV').split('.')[0]}"
> +
> +SRC_URI = " \
> +    git://github.com/tensorflow/tensorflow.git;protocol=https;branch=r2.18 \
> +    file://0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch \
> +    file://0002-lite-Update-CMakeLists-for-building-shared-object-li.patch \
> +    file://0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch \
> +    file://tensorflow2-lite.pc.in \
> +"
> +
> +SRC_URI += " \
> +    git://github.com/abseil/abseil-cpp.git;protocol=https;branch=lts_2023_08_02;name=abseil-cpp;destsuffix=${S}/external/abseil-cpp \
> +    git://gitlab.com/libeigen/eigen.git;protocol=https;branch=master;name=eigen;destsuffix=${S}/external/eigen \
> +    git://github.com/google/farmhash.git;protocol=https;branch=master;name=farmhash;destsuffix=${S}/external/farmhash \
> +    git://github.com/petewarden/OouraFFT.git;protocol=https;branch=master;name=fft2d;destsuffix=${S}/external/fft2d \
> +    git://github.com/google/gemmlowp.git;branch=master;protocol=https;name=gemmlowp;destsuffix=${S}/external/gemmlowp \
> +    git://github.com/pytorch/cpuinfo.git;branch=main;protocol=https;name=cpuinfo;destsuffix=${S}/external/cpuinfo \
> +    git://github.com/jax-ml/ml_dtypes.git;branch=main;protocol=https;name=ml_dtypes;destsuffix=${S}/external/ml_dtypes \
> +    git://github.com/google/ruy.git;branch=master;protocol=https;name=ruy;destsuffix=${S}/external/ruy \
> +    git://github.com/google/flatbuffers;branch=master;protocol=https;name=flatbuffers;destsuffix=${S}/external/flatbuffers \
> +    git://github.com/Maratyszcza/pthreadpool.git;branch=master;protocol=https;name=pthreadpool-source;destsuffix=${S}/external/pthreadpool-source \
> +    git://github.com/google/XNNPACK.git;branch=master;protocol=https;name=xnnpack;destsuffix=${S}/external/xnnpack \
> +    git://github.com/Maratyszcza/FXdiv.git;branch=master;protocol=https;name=FXdiv-source;destsuffix=${S}/external/FXdiv-source \
> +    git://github.com/Maratyszcza/FP16.git;branch=master;protocol=https;name=FP16-source;destsuffix=${S}/external/FP16-source \
> +    git://git.gitlab.arm.com/kleidi/kleidiai.git;branch=main;protocol=https;name=kleidiai;destsuffix=${S}/external/kleidiai \
> +    git://github.com/Maratyszcza/psimd.git;branch=master;protocol=https;name=psimd;destsuffix=${S}/external/psimd \
> +    git://github.com/protocolbuffers/protobuf.git;branch=25.x;protocol=https;name=protobuf;destsuffix=${S}/external/protobuf \
> +"
> +
> +SRCREV_FORMAT = "default"
> +
> +# Matches v${PV} tag
> +SRCREV = "6550e4bd80223cdb8be6c3afd1f81e86a4d433c3"
> +SRCREV_abseil-cpp = "fb3621f4f897824c0dbe0615fa94543df6192f30"
> +SRCREV_eigen = "33d0937c6bdf5ec999939fb17f2a553183d14a74"
> +SRCREV_farmhash = "0d859a811870d10f53a594927d0d0b97573ad06d"
> +SRCREV_fft2d = "c6fd2dd6d21397baa6653139d31d84540d5449a2"
> +SRCREV_gemmlowp = "16e8662c34917be0065110bfcd9cc27d30f52fdf"
> +SRCREV_cpuinfo = "b73ae6ce38d5dd0b7fe46dbe0a4b5f4bab91c7ea"
> +SRCREV_ml_dtypes = "24084d9ed2c3d45bf83b7a9bff833aa185bf9172"
> +SRCREV_ruy = "3286a34cc8de6149ac6844107dfdffac91531e72"
> +SRCREV_flatbuffers = "e6463926479bd6b330cbcf673f7e917803fd5831"
> +SRCREV_pthreadpool-source = "4fe0e1e183925bf8cfa6aae24237e724a96479b8"
> +SRCREV_xnnpack = "6b83f69d4938da4dc9ad63c00bd13e9695659a51"
> +SRCREV_FXdiv-source = "63058eff77e11aa15bf531df5dd34395ec3017c8"
> +SRCREV_FP16-source = "0a92994d729ff76a58f692d3028ca1b64b145d91"
> +SRCREV_kleidiai = "cddf991af5de49fd34949fa39690e4e906e04074"
> +SRCREV_psimd = "072586a71b55b7f8c584153d223e95687148a900"
> +SRCREV_protobuf = "4a2aef570deb2bfb8927426558701e8bfc26f2a4"
> +
> +S = "${WORKDIR}/git"
> +
> +inherit setuptools3 cmake
> +
> +DEPENDS = " \
> +    flatbuffers-native \
> +    python3-numpy-native \
> +    python3-pybind11-native \
> +    python3-numpy \
> +    python3 \
> +    gzip-native \
> +    protobuf-native \
> +    python3-pybind11 \
> +"
> +
> +# Set building environment variables
> +TENSORFLOW_TARGET="linux"
> +TENSORFLOW_TARGET_ARCH:aarch64="aarch64"
> +TENSORFLOW_TARGET_ARCH:arm="armv7"
> +
> +PACKAGECONFIG ??= "xnnpack ruy"
> +PACKAGECONFIG[xnnpack] = "-DTFLITE_ENABLE_XNNPACK=ON, -DTFLITE_ENABLE_XNNPACK=OFF"
> +PACKAGECONFIG[ruy] = "-DTFLITE_ENABLE_RUY=ON, -DTFLITE_ENABLE_RUY=OFF"
> +
> +# XNNPACK is not supported in Linux armv7-a [https://github.com/tensorflow/tensorflow/issues/64358]
> +# Hence, turning it off
> +PACKAGECONFIG:remove:arm = "xnnpack"
> +
> +OECMAKE_SOURCEPATH = "${S}/tensorflow/lite"
> +
> +# The -O3 flag enables high-level optimizations for performance
> +# and the -DNDEBUG flag disables debugging code, such as assertions
> +# to further optimize the build for production use.
> +# Hence, activate -O3 optimization and disable debug symbols.
> +OECMAKE_C_FLAGS_RELEASE = "-O3 -DNDEBUG"
> +OECMAKE_CXX_FLAGS_RELEASE = "-O3 -DNDEBUG -flax-vector-conversions"
> +
> +OECMAKE_C_FLAGS_RELEASE:append:arm = " -march=armv7-a -mfpu=neon"
> +OECMAKE_CXX_FLAGS_RELEASE:append:arm = " -march=armv7-a -mfpu=neon"
> +
> +do_generate_toolchain_file:append:arm() {
> +    # Even if we set TENSORFLOW_TARGET_ARCH:arm as armv7, the TFLite CMake
> +    # build system still uses CMAKE_SYSTEM_PROCESSOR as arm in toolchain.cmake file
> +    # which leads to build failures. Hence, change it to armv7.
> +    sed -i 's:CMAKE_SYSTEM_PROCESSOR arm:CMAKE_SYSTEM_PROCESSOR armv7:g' ${WORKDIR}/toolchain.cmake
> +}
> +
> +# Build tensorflow-lite.so library, _pywrap_tensorflow_interpreter_wrapper.so library and the benchmark_model application
> +OECMAKE_TARGET_COMPILE =  "tensorflow-lite benchmark_model _pywrap_tensorflow_interpreter_wrapper"
> +
> +EXTRA_OECMAKE:append = " \
> +    -DFETCHCONTENT_FULLY_DISCONNECTED=ON \
> +    -DCMAKE_SYSTEM_NAME=${TENSORFLOW_TARGET} \
> +    -DCMAKE_SYSTEM_PROCESSOR=${TENSORFLOW_TARGET_ARCH} \
> +    -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
> +    -DPYTHON_TARGET_INCLUDE=${RECIPE_SYSROOT}${includedir}/${PYTHON_DIR} \
> +    -DNUMPY_TARGET_INCLUDE=${RECIPE_SYSROOT}${PYTHON_SITEPACKAGES_DIR}/numpy/core/include \
> +    -DPYBIND11_TARGET_INCLUDE=${RECIPE_SYSROOT}${PYTHON_SITEPACKAGES_DIR}/pybind11/include \
> +    -DTFLITE_VERSION_MAJOR=${MAJOR}  \
> +    -DTFLITE_HOST_TOOLS_DIR=${STAGING_BINDIR_NATIVE} \
> +    -DPTHREADPOOL_SOURCE_DIR=${S}/external/pthreadpool-source \
> +    -DFXDIV_SOURCE_DIR=${S}/external/FXdiv-source \
> +    -DFP16_SOURCE_DIR=${S}/external/FP16-source \
> +    -DCPUINFO_SOURCE_DIR=${S}/external/cpuinfo \
> +    -DKLEIDIAI_SOURCE_DIR=${S}/external/kleidiai \
> +    -DPSIMD_SOURCE_DIR=${S}/external/psimd \
> +    --compile-no-warning-as-error \
> +    --log-level=VERBOSE \
> +"
> +
> +do_configure:prepend() {
> +    for i in abseil-cpp cpuinfo eigen farmhash fft2d flatbuffers FP16-source FXdiv-source gemmlowp kleidiai ml_dtypes psimd protobuf pthreadpool-source ruy xnnpack; do
> +        cp -ra ${S}/external/$i ${B}/$i
> +    done
> +
> +    # There is no Fortran compiler in the toolchain, but bitbake sets this variable anyway with unavailable
> +    # binary & it leads to "CMake Error: Could not find compiler set in environment variable FC:"
> +    unset FC

Is this still needed?

> +}
> +
> +SETUPTOOLS_SETUP_PATH = "${B}"
> +
> +do_compile:append() {
> +    # Build the python wheel (procedure extract form the build_pip_package_with_cmake.sh)
> +    BUILD_DIR=${B}
> +    TENSORFLOW_DIR=${S}
> +    TENSORFLOW_LITE_DIR="${TENSORFLOW_DIR}/tensorflow/lite"
> +    TENSORFLOW_VERSION=$(grep "_VERSION = " "${TENSORFLOW_DIR}/tensorflow/tools/pip_package/setup.py" | cut -d= -f2 | sed "s/[ '-]//g")
> +    mkdir -p "${B}/tflite_runtime"
> +    cp -r "${TENSORFLOW_LITE_DIR}/tools/pip_package/debian" \
> +          "${TENSORFLOW_LITE_DIR}/tools/pip_package/MANIFEST.in" \
> +          "${B}"
> +    cp -r "${TENSORFLOW_LITE_DIR}/python/interpreter_wrapper" "${B}"
> +    cp "${TENSORFLOW_LITE_DIR}/tools/pip_package/setup_with_binary.py" "${B}/setup.py"
> +    cp "${TENSORFLOW_LITE_DIR}/python/interpreter.py" \
> +       "${TENSORFLOW_LITE_DIR}/python/metrics/metrics_interface.py" \
> +       "${TENSORFLOW_LITE_DIR}/python/metrics/metrics_portable.py" \
> +       "${B}/tflite_runtime"
> +    echo "__version__ = '${TENSORFLOW_VERSION}'" >> "${BUILD_DIR}/tflite_runtime/__init__.py"
> +    echo "__git_version__ = '$(git -C "${TENSORFLOW_DIR}" describe)'" >> "${BUILD_DIR}/tflite_runtime/__init__.py"
> +
> +    export PACKAGE_VERSION="${TENSORFLOW_VERSION}"
> +    export PROJECT_NAME="tflite_runtime"
> +    cp "${B}/_pywrap_tensorflow_interpreter_wrapper.so" "tflite_runtime"
> +
> +    setuptools3_do_compile
> +}
> +
> +do_install() {
> +    # Install tensorflow-lite dynamic library
> +    install -d ${D}${libdir}
> +    install -m 0644 ${B}/libtensorflow-lite.so.${MAJOR} ${D}${libdir}/libtensorflow-lite.so.${PV}
> +
> +    ln -sf libtensorflow-lite.so.${PV} ${D}${libdir}/libtensorflow-lite.so.${MAJOR}
> +    ln -sf libtensorflow-lite.so.${PV} ${D}${libdir}/libtensorflow-lite.so
> +
> +    # armnn expects the the dynamic library of tensorflow lite to be named as "libtensorflowlite.so"
> +    # Eg - https://github.com/ARM-software/armnn/blob/branches/armnn_24_11/delegate/cmake/Modules/FindTfLite.cmake#L19
> +    # Hence, create a symbolic link to handle the same

We should look into fixing this on the armnn side so we can drop this at some point.

> +    ln -snf libtensorflow-lite.so ${D}${libdir}/libtensorflowlite.so
> +
> +    # Install benchmark_model
> +    install -d ${D}/opt/${PN}/tools/
> +    install -m 0755 ${B}/tools/benchmark/benchmark_model ${D}/opt/${PN}/tools/
> +
> +    # Install header files
> +    install -d ${D}${includedir}/tensorflow/
> +    cd ${S}/tensorflow/
> +    cp --parents $(find ./lite -name "*.h*" -not -path "*cmake_build/*") ${D}${includedir}/tensorflow
> +    cp --parents $(find ./compiler/mlir/lite -name "*.h*" -not -path "*cmake_build/*") ${D}${includedir}/tensorflow
> +    cd ${B}
> +    cp --parents $(find . -name "*.h*") ${D}${includedir}/tensorflow/lite
> +
> +    # Install TFlite python3 interpreter
> +    install -d ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime
> +    install -d ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info
> +    install -m 0755  ${B}/tflite_runtime/* ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime
> +    install -m 0755  ${B}/tflite_runtime.egg-info/* ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info
> +
> +    # Install pkgconfig file required for NNstreamer build

It is not just NNstreamer, any project that wants to link with this
can make use of some form of .pc or .cmake file. We should see if
we can fix this upstream and have this project generate that during build.

> +    install -d ${D}${libdir}/pkgconfig
> +    install -m 0644 ${WORKDIR}/tensorflow2-lite.pc.in ${D}${libdir}/pkgconfig/tensorflow2-lite.pc
> +    sed -i 's:@version@:${PV}:g
> +            s:@libdir@:${libdir}:g
> +            s:@includedir@:${includedir}:g' \
> +            ${D}${libdir}/pkgconfig/tensorflow2-lite.pc
> +}
> +
> +PACKAGES += "${PN}-tools python3-${PN}"
> +
> +RDEPENDS:${PN} += " \
> +    ${PN}-tools \
> +    python3-${PN} \
> +"
> +
> +FILES:${PN} = " \
> +    ${libdir}/lib*.so* \
> +    ${libdir}/pkgconfig/* \
> +"
> +
> +FILES:${PN}-tools = " \
> +    /opt/* \

Why /opt/ ?

How about ${bindir}/${BPN}-tests?

Anyway, only minor comments here, and nothing we cant fix up over time.

Looks good to me,

Acked-by: Andrew Davis <afd@ti.com>

> +"
> +
> +FILES:python3-${PN} = " \
> +    ${PYTHON_SITEPACKAGES_DIR}/tflite_runtime \
> +    ${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info \
> +"
> +
> +RDEPENDS:python3-${PN} += " python3-ctypes python3-numpy "
> +
> +PROVIDES += "python3-${PN}"
Chirag Shilwant Feb. 27, 2025, 7:30 a.m. UTC | #2
Hi Andrew,

On 22/02/25 22:54, Andrew Davis wrote:
> On 2/21/25 4:24 PM, Chirag Shilwant wrote:
>> - TensorFlow Lite is TensorFlow's lightweight solution for mobile
>> and embedded devices. It enables low-latency inference of on-device
>> machine learning models with a small binary size.
>>
>> - The tensorflow-lite v2.18 recipe in meta-arago currently supports,
>>
>>    * CPU delegate (with RUY enabled), XNNPACK delegate & ArmNN
>>      via external delegate for ARMv8 based Cortex-A platforms.
>>
>>    * CPU delegate (with RUY enabled) & ArmNN via external delegate
>>      for ARMv7 based Cortex-A platforms.
>>
>> Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
>> ---
>>   ...eLists-for-building-_pywrap_tensorfl.patch |  37 +++
>>   ...eLists-for-building-shared-object-li.patch |  61 +++++
>>   ...uild-issues-observed-in-TFlite-v2.18.patch |  36 +++
>>   .../tensorflow-lite/tensorflow2-lite.pc.in    |   6 +
>>   .../tensorflow-lite/tensorflow-lite_2.18.0.bb | 232 ++++++++++++++++++
>>   5 files changed, 372 insertions(+)
>>   create mode 100644 
>> meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
>>   create mode 100644 
>> meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
>>   create mode 100644 
>> meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
>>   create mode 100644 
>> meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
>>   create mode 100644 
>> meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
>>
>> diff --git 
>> a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch 
>>
>> new file mode 100644
>> index 00000000..e277beb3
>> --- /dev/null
>> +++ 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
>> @@ -0,0 +1,37 @@
>> +From 050127548d7f28464cbe5dc9caa83c8023676d80 Mon Sep 17 00:00:00 2001
>> +From: Chirag Shilwant <c-shilwant@ti.com>
>> +Date: Thu, 13 Feb 2025 14:33:50 +0530
>> +Subject: [PATCH 1/3] lite: Update CMakeLists for building
>> + _pywrap_tensorflow_interpreter_wrapper
>> +
>> +- Update the CMakeLists.txt file for TensorFlow Lite to include the 
>> paths for
>> +PYTHON, Numpy, and PYBIND11 headers.
>> +
>> +- This ensures that these headers are available during the build 
>> process,
>> +which is necessary for building the 
>> _pywrap_tensorflow_interpreter_wrapper
>> +target that relies on these dependencies.
>> +
>> +Upstream-Status: Inappropriate [configuration]
>> +
>> +Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
>> +---
>> + tensorflow/lite/CMakeLists.txt | 3 +++
>> + 1 file changed, 3 insertions(+)
>> +
>> +diff --git a/tensorflow/lite/CMakeLists.txt 
>> b/tensorflow/lite/CMakeLists.txt
>> +index bce9627fbd3..b7bb39869b5 100644
>> +--- a/tensorflow/lite/CMakeLists.txt
>> ++++ b/tensorflow/lite/CMakeLists.txt
>> +@@ -810,6 +810,9 @@ 
>> set_target_properties(_pywrap_tensorflow_interpreter_wrapper 
>> PROPERTIES PREFIX "
>> + target_include_directories(_pywrap_tensorflow_interpreter_wrapper
>> +   PUBLIC
>> +     ${TENSORFLOW_SOURCE_DIR}
>> ++    ${PYTHON_TARGET_INCLUDE}
>> ++    ${NUMPY_TARGET_INCLUDE}
>> ++    ${PYBIND11_TARGET_INCLUDE}
>> + )
>> +
>> + target_link_libraries(_pywrap_tensorflow_interpreter_wrapper
>> +--
>> +2.34.1
>> +
>> diff --git 
>> a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch 
>>
>> new file mode 100644
>> index 00000000..dce229fd
>> --- /dev/null
>> +++ 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
>> @@ -0,0 +1,61 @@
>> +From 339b5a7e5f17a60df1e3d6d2ffe607786ce34978 Mon Sep 17 00:00:00 2001
>> +From: Chirag Shilwant <c-shilwant@ti.com>
>> +Date: Thu, 13 Feb 2025 14:38:01 +0530
>> +Subject: [PATCH 2/3] lite: Update CMakeLists for building shared object
>> + library
>> +
>> +- When building TFLite with CMake, it builds static library
>> +(i.e. libtensorflow-lite.a) by default which isn't self-contained
>> +since all the transitive dependencies are not included [1]
>> +
>> +- As documented in [1], there's an update needed in CMake build steps
>> +inorder to generate a shared object library (i.e. 
>> libtensorflow-lite.so)
>> +
>> +- This patch adds schema_conversion_utils.cc to TFLite source files
>> +& updates CMakeLists.txt to build TFLite as a shared library. 
>> Additionally,
>> +it ensures that the properties are set correctly to manage the shared
>> +object version.
>> +
>> +[1]: https://ai.google.dev/edge/litert/build/cmake#step_5_build_litert
>> +
>> +Upstream-Status: Inappropriate [enable feature]
>> +
>> +Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
>> +---
>> + tensorflow/lite/CMakeLists.txt | 6 +++++-
>> + 1 file changed, 5 insertions(+), 1 deletion(-)
>> +
>> +diff --git a/tensorflow/lite/CMakeLists.txt 
>> b/tensorflow/lite/CMakeLists.txt
>> +index b7bb39869b5..92b05e42446 100644
>> +--- a/tensorflow/lite/CMakeLists.txt
>> ++++ b/tensorflow/lite/CMakeLists.txt
>> +@@ -671,6 +671,7 @@ set(_ALL_TFLITE_SRCS
>> + 
>> ${TFLITE_SOURCE_DIR}/kernels/internal/utils/sparsity_format_converter.cc
>> +   ${TFLITE_SOURCE_DIR}/schema/conversion_metadata_generated.h
>> +   ${TFLITE_SOURCE_DIR}/schema/schema_generated.h
>> ++  ${TFLITE_SOURCE_DIR}/schema/schema_conversion_utils.h
>> +   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/schema_utils.cc
>> + ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/schema_generated.h
>> + 
>> ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/conversion_metadata_generated.h
>> +@@ -697,7 +698,7 @@ else()
>> +   list(FILTER _ALL_TFLITE_SRCS EXCLUDE REGEX 
>> ".*mmap_allocation\\.cc$")
>> + endif()
>> +
>> +-add_library(tensorflow-lite
>> ++add_library(tensorflow-lite SHARED EXCLUDE_FROM_ALL
>> +   ${_ALL_TFLITE_SRCS}
>> + )
>> + set(_ALL_TFLITE_HDRS ${_ALL_TFLITE_SRCS})
>> +@@ -773,6 +774,9 @@ if(TFLITE_ENABLE_INSTALL)
>> +   )
>> + endif()
>> +
>> ++# Manage version for shared object (dynamic) library
>> ++set_target_properties(tensorflow-lite PROPERTIES VERSION 
>> "${TFLITE_VERSION_MAJOR}")
>> ++
>> + # The kernel tests.
>> + if(TFLITE_KERNEL_TEST)
>> +   enable_testing()
>> +--
>> +2.34.1
>> +
>> diff --git 
>> a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch 
>>
>> new file mode 100644
>> index 00000000..0e21b254
>> --- /dev/null
>> +++ 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
>> @@ -0,0 +1,36 @@
>> +From 577192caa67660f857f2869896d01db3611b4128 Mon Sep 17 00:00:00 2001
>> +From: Chirag Shilwant <c-shilwant@ti.com>
>> +Date: Thu, 13 Feb 2025 14:45:46 +0530
>> +Subject: [PATCH 3/3] CMakeLists: Fix build issues observed in TFlite 
>> v2.18
>> +
>> +- Improve regular expression for filtering neon and sse
>> +related sources. The improved expression avoids missing files
>> +in case the absolute path contains the terms neon or sse.
>> +
>> +- Fixes [1]
>> +
>> +[1]: https://github.com/tensorflow/tensorflow/issues/70730
>> +
>> +Upstream-Status: Backport from master
>> +
>> +Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
>> +---
>> + tensorflow/lite/CMakeLists.txt | 2 +-
>> + 1 file changed, 1 insertion(+), 1 deletion(-)
>> +
>> +diff --git a/tensorflow/lite/CMakeLists.txt 
>> b/tensorflow/lite/CMakeLists.txt
>> +index 92b05e42446..737f754621f 100644
>> +--- a/tensorflow/lite/CMakeLists.txt
>> ++++ b/tensorflow/lite/CMakeLists.txt
>> +@@ -605,7 +605,7 @@ 
>> populate_tflite_source_vars("kernels/internal/reference/sparse_ops"
>> + )
>> + populate_tflite_source_vars("kernels/internal/optimized/4bit"
>> +   TFLITE_KERNEL_INTERNAL_OPT_4BIT_SRCS
>> +-  FILTER "(.*neon.*|.*sse.*)\\.(cc|h)"
>> ++  FILTER "(.*neon_.*|.*sse_.*)\\.(cc|h)"
>> + )
>> + set(TFLITE_PROFILER_SRCS
>> +   ${TFLITE_SOURCE_DIR}/profiling/platform_profiler.cc
>> +--
>> +2.34.1
>> +
>> diff --git 
>> a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in 
>>
>> new file mode 100644
>> index 00000000..8c5bf2e0
>> --- /dev/null
>> +++ 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
>> @@ -0,0 +1,6 @@
>> +Name: tensorflow lite c++ shared library
>> +Description: tensorflow lite c++ shared library
>> +Version: @version@
>> +Requires:
>> +Libs: -L@libdir@ -ltensorflowlite -lrt
>> +Cflags: -I@includedir@
>> diff --git 
>> a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb 
>>
>> new file mode 100644
>> index 00000000..a20c090a
>> --- /dev/null
>> +++ 
>> b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
>> @@ -0,0 +1,232 @@
>> +DESCRIPTION = "TensorFlow Lite is an open source deep learning 
>> framework for \
>> +on-device inference."
>> +AUTHOR = "Google Inc. and Yuan Tang"
>> +SUMMARY = "TensorFlow Lite C++ Library, Python interpreter & 
>> Benchmark Model"
>> +HOMEPAGE = "https://www.tensorflow.org/lite"
>> +
>> +LICENSE = "Apache-2.0"
>> +LIC_FILES_CHKSUM = 
>> "file://LICENSE;md5=4158a261ca7f2525513e31ba9c50ae98"
>> +
>> +# Get major of the PV variable
>> +MAJOR = "${@d.getVar('PV').split('.')[0]}"
>> +
>> +SRC_URI = " \
>> + 
>> git://github.com/tensorflow/tensorflow.git;protocol=https;branch=r2.18 \
>> + 
>> file://0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch \
>> + 
>> file://0002-lite-Update-CMakeLists-for-building-shared-object-li.patch \
>> + 
>> file://0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch \
>> +    file://tensorflow2-lite.pc.in \
>> +"
>> +
>> +SRC_URI += " \
>> + 
>> git://github.com/abseil/abseil-cpp.git;protocol=https;branch=lts_2023_08_02;name=abseil-cpp;destsuffix=${S}/external/abseil-cpp 
>> \
>> + 
>> git://gitlab.com/libeigen/eigen.git;protocol=https;branch=master;name=eigen;destsuffix=${S}/external/eigen 
>> \
>> + 
>> git://github.com/google/farmhash.git;protocol=https;branch=master;name=farmhash;destsuffix=${S}/external/farmhash 
>> \
>> + 
>> git://github.com/petewarden/OouraFFT.git;protocol=https;branch=master;name=fft2d;destsuffix=${S}/external/fft2d 
>> \
>> + 
>> git://github.com/google/gemmlowp.git;branch=master;protocol=https;name=gemmlowp;destsuffix=${S}/external/gemmlowp 
>> \
>> + 
>> git://github.com/pytorch/cpuinfo.git;branch=main;protocol=https;name=cpuinfo;destsuffix=${S}/external/cpuinfo 
>> \
>> + 
>> git://github.com/jax-ml/ml_dtypes.git;branch=main;protocol=https;name=ml_dtypes;destsuffix=${S}/external/ml_dtypes 
>> \
>> + 
>> git://github.com/google/ruy.git;branch=master;protocol=https;name=ruy;destsuffix=${S}/external/ruy 
>> \
>> + 
>> git://github.com/google/flatbuffers;branch=master;protocol=https;name=flatbuffers;destsuffix=${S}/external/flatbuffers 
>> \
>> + 
>> git://github.com/Maratyszcza/pthreadpool.git;branch=master;protocol=https;name=pthreadpool-source;destsuffix=${S}/external/pthreadpool-source 
>> \
>> + 
>> git://github.com/google/XNNPACK.git;branch=master;protocol=https;name=xnnpack;destsuffix=${S}/external/xnnpack 
>> \
>> + 
>> git://github.com/Maratyszcza/FXdiv.git;branch=master;protocol=https;name=FXdiv-source;destsuffix=${S}/external/FXdiv-source 
>> \
>> + 
>> git://github.com/Maratyszcza/FP16.git;branch=master;protocol=https;name=FP16-source;destsuffix=${S}/external/FP16-source 
>> \
>> + 
>> git://git.gitlab.arm.com/kleidi/kleidiai.git;branch=main;protocol=https;name=kleidiai;destsuffix=${S}/external/kleidiai 
>> \
>> + 
>> git://github.com/Maratyszcza/psimd.git;branch=master;protocol=https;name=psimd;destsuffix=${S}/external/psimd 
>> \
>> + 
>> git://github.com/protocolbuffers/protobuf.git;branch=25.x;protocol=https;name=protobuf;destsuffix=${S}/external/protobuf 
>> \
>> +"
>> +
>> +SRCREV_FORMAT = "default"
>> +
>> +# Matches v${PV} tag
>> +SRCREV = "6550e4bd80223cdb8be6c3afd1f81e86a4d433c3"
>> +SRCREV_abseil-cpp = "fb3621f4f897824c0dbe0615fa94543df6192f30"
>> +SRCREV_eigen = "33d0937c6bdf5ec999939fb17f2a553183d14a74"
>> +SRCREV_farmhash = "0d859a811870d10f53a594927d0d0b97573ad06d"
>> +SRCREV_fft2d = "c6fd2dd6d21397baa6653139d31d84540d5449a2"
>> +SRCREV_gemmlowp = "16e8662c34917be0065110bfcd9cc27d30f52fdf"
>> +SRCREV_cpuinfo = "b73ae6ce38d5dd0b7fe46dbe0a4b5f4bab91c7ea"
>> +SRCREV_ml_dtypes = "24084d9ed2c3d45bf83b7a9bff833aa185bf9172"
>> +SRCREV_ruy = "3286a34cc8de6149ac6844107dfdffac91531e72"
>> +SRCREV_flatbuffers = "e6463926479bd6b330cbcf673f7e917803fd5831"
>> +SRCREV_pthreadpool-source = "4fe0e1e183925bf8cfa6aae24237e724a96479b8"
>> +SRCREV_xnnpack = "6b83f69d4938da4dc9ad63c00bd13e9695659a51"
>> +SRCREV_FXdiv-source = "63058eff77e11aa15bf531df5dd34395ec3017c8"
>> +SRCREV_FP16-source = "0a92994d729ff76a58f692d3028ca1b64b145d91"
>> +SRCREV_kleidiai = "cddf991af5de49fd34949fa39690e4e906e04074"
>> +SRCREV_psimd = "072586a71b55b7f8c584153d223e95687148a900"
>> +SRCREV_protobuf = "4a2aef570deb2bfb8927426558701e8bfc26f2a4"
>> +
>> +S = "${WORKDIR}/git"
>> +
>> +inherit setuptools3 cmake
>> +
>> +DEPENDS = " \
>> +    flatbuffers-native \
>> +    python3-numpy-native \
>> +    python3-pybind11-native \
>> +    python3-numpy \
>> +    python3 \
>> +    gzip-native \
>> +    protobuf-native \
>> +    python3-pybind11 \
>> +"
>> +
>> +# Set building environment variables
>> +TENSORFLOW_TARGET="linux"
>> +TENSORFLOW_TARGET_ARCH:aarch64="aarch64"
>> +TENSORFLOW_TARGET_ARCH:arm="armv7"
>> +
>> +PACKAGECONFIG ??= "xnnpack ruy"
>> +PACKAGECONFIG[xnnpack] = "-DTFLITE_ENABLE_XNNPACK=ON, 
>> -DTFLITE_ENABLE_XNNPACK=OFF"
>> +PACKAGECONFIG[ruy] = "-DTFLITE_ENABLE_RUY=ON, -DTFLITE_ENABLE_RUY=OFF"
>> +
>> +# XNNPACK is not supported in Linux armv7-a 
>> [https://github.com/tensorflow/tensorflow/issues/64358]
>> +# Hence, turning it off
>> +PACKAGECONFIG:remove:arm = "xnnpack"
>> +
>> +OECMAKE_SOURCEPATH = "${S}/tensorflow/lite"
>> +
>> +# The -O3 flag enables high-level optimizations for performance
>> +# and the -DNDEBUG flag disables debugging code, such as assertions
>> +# to further optimize the build for production use.
>> +# Hence, activate -O3 optimization and disable debug symbols.
>> +OECMAKE_C_FLAGS_RELEASE = "-O3 -DNDEBUG"
>> +OECMAKE_CXX_FLAGS_RELEASE = "-O3 -DNDEBUG -flax-vector-conversions"
>> +
>> +OECMAKE_C_FLAGS_RELEASE:append:arm = " -march=armv7-a -mfpu=neon"
>> +OECMAKE_CXX_FLAGS_RELEASE:append:arm = " -march=armv7-a -mfpu=neon"
>> +
>> +do_generate_toolchain_file:append:arm() {
>> +    # Even if we set TENSORFLOW_TARGET_ARCH:arm as armv7, the TFLite 
>> CMake
>> +    # build system still uses CMAKE_SYSTEM_PROCESSOR as arm in 
>> toolchain.cmake file
>> +    # which leads to build failures. Hence, change it to armv7.
>> +    sed -i 's:CMAKE_SYSTEM_PROCESSOR arm:CMAKE_SYSTEM_PROCESSOR 
>> armv7:g' ${WORKDIR}/toolchain.cmake
>> +}
>> +
>> +# Build tensorflow-lite.so library, 
>> _pywrap_tensorflow_interpreter_wrapper.so library and the 
>> benchmark_model application
>> +OECMAKE_TARGET_COMPILE =  "tensorflow-lite benchmark_model 
>> _pywrap_tensorflow_interpreter_wrapper"
>> +
>> +EXTRA_OECMAKE:append = " \
>> +    -DFETCHCONTENT_FULLY_DISCONNECTED=ON \
>> +    -DCMAKE_SYSTEM_NAME=${TENSORFLOW_TARGET} \
>> +    -DCMAKE_SYSTEM_PROCESSOR=${TENSORFLOW_TARGET_ARCH} \
>> +    -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
>> + -DPYTHON_TARGET_INCLUDE=${RECIPE_SYSROOT}${includedir}/${PYTHON_DIR} \
>> + 
>> -DNUMPY_TARGET_INCLUDE=${RECIPE_SYSROOT}${PYTHON_SITEPACKAGES_DIR}/numpy/core/include 
>> \
>> + 
>> -DPYBIND11_TARGET_INCLUDE=${RECIPE_SYSROOT}${PYTHON_SITEPACKAGES_DIR}/pybind11/include 
>> \
>> +    -DTFLITE_VERSION_MAJOR=${MAJOR}  \
>> +    -DTFLITE_HOST_TOOLS_DIR=${STAGING_BINDIR_NATIVE} \
>> +    -DPTHREADPOOL_SOURCE_DIR=${S}/external/pthreadpool-source \
>> +    -DFXDIV_SOURCE_DIR=${S}/external/FXdiv-source \
>> +    -DFP16_SOURCE_DIR=${S}/external/FP16-source \
>> +    -DCPUINFO_SOURCE_DIR=${S}/external/cpuinfo \
>> +    -DKLEIDIAI_SOURCE_DIR=${S}/external/kleidiai \
>> +    -DPSIMD_SOURCE_DIR=${S}/external/psimd \
>> +    --compile-no-warning-as-error \
>> +    --log-level=VERBOSE \
>> +"
>> +
>> +do_configure:prepend() {
>> +    for i in abseil-cpp cpuinfo eigen farmhash fft2d flatbuffers 
>> FP16-source FXdiv-source gemmlowp kleidiai ml_dtypes psimd protobuf 
>> pthreadpool-source ruy xnnpack; do
>> +        cp -ra ${S}/external/$i ${B}/$i
>> +    done
>> +
>> +    # There is no Fortran compiler in the toolchain, but bitbake 
>> sets this variable anyway with unavailable
>> +    # binary & it leads to "CMake Error: Could not find compiler set 
>> in environment variable FC:"
>> +    unset FC
>
> Is this still needed?



Umm, good point. Most likely this can be dropped.
Will confirm & send a follow up patch if that's the case


>
>
>> +}
>> +
>> +SETUPTOOLS_SETUP_PATH = "${B}"
>> +
>> +do_compile:append() {
>> +    # Build the python wheel (procedure extract form the 
>> build_pip_package_with_cmake.sh)
>> +    BUILD_DIR=${B}
>> +    TENSORFLOW_DIR=${S}
>> +    TENSORFLOW_LITE_DIR="${TENSORFLOW_DIR}/tensorflow/lite"
>> +    TENSORFLOW_VERSION=$(grep "_VERSION = " 
>> "${TENSORFLOW_DIR}/tensorflow/tools/pip_package/setup.py" | cut -d= 
>> -f2 | sed "s/[ '-]//g")
>> +    mkdir -p "${B}/tflite_runtime"
>> +    cp -r "${TENSORFLOW_LITE_DIR}/tools/pip_package/debian" \
>> + "${TENSORFLOW_LITE_DIR}/tools/pip_package/MANIFEST.in" \
>> +          "${B}"
>> +    cp -r "${TENSORFLOW_LITE_DIR}/python/interpreter_wrapper" "${B}"
>> +    cp 
>> "${TENSORFLOW_LITE_DIR}/tools/pip_package/setup_with_binary.py" 
>> "${B}/setup.py"
>> +    cp "${TENSORFLOW_LITE_DIR}/python/interpreter.py" \
>> + "${TENSORFLOW_LITE_DIR}/python/metrics/metrics_interface.py" \
>> + "${TENSORFLOW_LITE_DIR}/python/metrics/metrics_portable.py" \
>> +       "${B}/tflite_runtime"
>> +    echo "__version__ = '${TENSORFLOW_VERSION}'" >> 
>> "${BUILD_DIR}/tflite_runtime/__init__.py"
>> +    echo "__git_version__ = '$(git -C "${TENSORFLOW_DIR}" 
>> describe)'" >> "${BUILD_DIR}/tflite_runtime/__init__.py"
>> +
>> +    export PACKAGE_VERSION="${TENSORFLOW_VERSION}"
>> +    export PROJECT_NAME="tflite_runtime"
>> +    cp "${B}/_pywrap_tensorflow_interpreter_wrapper.so" 
>> "tflite_runtime"
>> +
>> +    setuptools3_do_compile
>> +}
>> +
>> +do_install() {
>> +    # Install tensorflow-lite dynamic library
>> +    install -d ${D}${libdir}
>> +    install -m 0644 ${B}/libtensorflow-lite.so.${MAJOR} 
>> ${D}${libdir}/libtensorflow-lite.so.${PV}
>> +
>> +    ln -sf libtensorflow-lite.so.${PV} 
>> ${D}${libdir}/libtensorflow-lite.so.${MAJOR}
>> +    ln -sf libtensorflow-lite.so.${PV} 
>> ${D}${libdir}/libtensorflow-lite.so
>> +
>> +    # armnn expects the the dynamic library of tensorflow lite to be 
>> named as "libtensorflowlite.so"
>> +    # Eg - 
>> https://github.com/ARM-software/armnn/blob/branches/armnn_24_11/delegate/cmake/Modules/FindTfLite.cmake#L19
>> +    # Hence, create a symbolic link to handle the same
>
> We should look into fixing this on the armnn side so we can drop this 
> at some point.


Yup, sent a patch on armnn [1] & added you in CC if that helps


[1]: https://review.mlplatform.org/c/ml/armnn/+/13743


>
>
>> +    ln -snf libtensorflow-lite.so ${D}${libdir}/libtensorflowlite.so
>> +
>> +    # Install benchmark_model
>> +    install -d ${D}/opt/${PN}/tools/
>> +    install -m 0755 ${B}/tools/benchmark/benchmark_model 
>> ${D}/opt/${PN}/tools/
>> +
>> +    # Install header files
>> +    install -d ${D}${includedir}/tensorflow/
>> +    cd ${S}/tensorflow/
>> +    cp --parents $(find ./lite -name "*.h*" -not -path 
>> "*cmake_build/*") ${D}${includedir}/tensorflow
>> +    cp --parents $(find ./compiler/mlir/lite -name "*.h*" -not -path 
>> "*cmake_build/*") ${D}${includedir}/tensorflow
>> +    cd ${B}
>> +    cp --parents $(find . -name "*.h*") 
>> ${D}${includedir}/tensorflow/lite
>> +
>> +    # Install TFlite python3 interpreter
>> +    install -d ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime
>> +    install -d ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info
>> +    install -m 0755  ${B}/tflite_runtime/* 
>> ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime
>> +    install -m 0755  ${B}/tflite_runtime.egg-info/* 
>> ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info
>> +
>> +    # Install pkgconfig file required for NNstreamer build
>
> It is not just NNstreamer, any project that wants to link with this
> can make use of some form of .pc or .cmake file. We should see if
> we can fix this upstream and have this project generate that during build.


I see, let me see how we can fix it upstream


>
>
>> +    install -d ${D}${libdir}/pkgconfig
>> +    install -m 0644 ${WORKDIR}/tensorflow2-lite.pc.in 
>> ${D}${libdir}/pkgconfig/tensorflow2-lite.pc
>> +    sed -i 's:@version@:${PV}:g
>> +            s:@libdir@:${libdir}:g
>> +            s:@includedir@:${includedir}:g' \
>> +            ${D}${libdir}/pkgconfig/tensorflow2-lite.pc
>> +}
>> +
>> +PACKAGES += "${PN}-tools python3-${PN}"
>> +
>> +RDEPENDS:${PN} += " \
>> +    ${PN}-tools \
>> +    python3-${PN} \
>> +"
>> +
>> +FILES:${PN} = " \
>> +    ${libdir}/lib*.so* \
>> +    ${libdir}/pkgconfig/* \
>> +"
>> +
>> +FILES:${PN}-tools = " \
>> +    /opt/* \
>
> Why /opt/ ?



So, currently I'm deploying the C++ based benchmark_model tool
in /opt. This tool isn't mandatory for TFLite Runtime to function as
such & is an optional add-on package which users may / may not use.

As /opt is the directory intended for installation of optional or
add-on software packages [2], I felt went ahead to use it


[2]: https://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/opt.html


--
Chirag



>
>
> How about ${bindir}/${BPN}-tests?
>
> Anyway, only minor comments here, and nothing we cant fix up over time.
>
> Looks good to me,
>
> Acked-by: Andrew Davis <afd@ti.com>
>
>> +"
>> +
>> +FILES:python3-${PN} = " \
>> +    ${PYTHON_SITEPACKAGES_DIR}/tflite_runtime \
>> +    ${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info \
>> +"
>> +
>> +RDEPENDS:python3-${PN} += " python3-ctypes python3-numpy "
>> +
>> +PROVIDES += "python3-${PN}"
diff mbox series

Patch

diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
new file mode 100644
index 00000000..e277beb3
--- /dev/null
+++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch
@@ -0,0 +1,37 @@ 
+From 050127548d7f28464cbe5dc9caa83c8023676d80 Mon Sep 17 00:00:00 2001
+From: Chirag Shilwant <c-shilwant@ti.com>
+Date: Thu, 13 Feb 2025 14:33:50 +0530
+Subject: [PATCH 1/3] lite: Update CMakeLists for building
+ _pywrap_tensorflow_interpreter_wrapper
+
+- Update the CMakeLists.txt file for TensorFlow Lite to include the paths for
+PYTHON, Numpy, and PYBIND11 headers.
+
+- This ensures that these headers are available during the build process,
+which is necessary for building the _pywrap_tensorflow_interpreter_wrapper
+target that relies on these dependencies.
+
+Upstream-Status: Inappropriate [configuration]
+
+Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
+---
+ tensorflow/lite/CMakeLists.txt | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
+index bce9627fbd3..b7bb39869b5 100644
+--- a/tensorflow/lite/CMakeLists.txt
++++ b/tensorflow/lite/CMakeLists.txt
+@@ -810,6 +810,9 @@ set_target_properties(_pywrap_tensorflow_interpreter_wrapper PROPERTIES PREFIX "
+ target_include_directories(_pywrap_tensorflow_interpreter_wrapper
+   PUBLIC
+     ${TENSORFLOW_SOURCE_DIR}
++    ${PYTHON_TARGET_INCLUDE}
++    ${NUMPY_TARGET_INCLUDE}
++    ${PYBIND11_TARGET_INCLUDE}
+ )
+ 
+ target_link_libraries(_pywrap_tensorflow_interpreter_wrapper
+-- 
+2.34.1
+
diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
new file mode 100644
index 00000000..dce229fd
--- /dev/null
+++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0002-lite-Update-CMakeLists-for-building-shared-object-li.patch
@@ -0,0 +1,61 @@ 
+From 339b5a7e5f17a60df1e3d6d2ffe607786ce34978 Mon Sep 17 00:00:00 2001
+From: Chirag Shilwant <c-shilwant@ti.com>
+Date: Thu, 13 Feb 2025 14:38:01 +0530
+Subject: [PATCH 2/3] lite: Update CMakeLists for building shared object
+ library
+
+- When building TFLite with CMake, it builds static library
+(i.e. libtensorflow-lite.a) by default which isn't self-contained
+since all the transitive dependencies are not included [1]
+
+- As documented in [1], there's an update needed in CMake build steps
+inorder to generate a shared object library (i.e. libtensorflow-lite.so)
+
+- This patch adds schema_conversion_utils.cc to TFLite source files
+& updates CMakeLists.txt to build TFLite as a shared library. Additionally,
+it ensures that the properties are set correctly to manage the shared
+object version.
+
+[1]: https://ai.google.dev/edge/litert/build/cmake#step_5_build_litert
+
+Upstream-Status: Inappropriate [enable feature]
+
+Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
+---
+ tensorflow/lite/CMakeLists.txt | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
+index b7bb39869b5..92b05e42446 100644
+--- a/tensorflow/lite/CMakeLists.txt
++++ b/tensorflow/lite/CMakeLists.txt
+@@ -671,6 +671,7 @@ set(_ALL_TFLITE_SRCS
+   ${TFLITE_SOURCE_DIR}/kernels/internal/utils/sparsity_format_converter.cc
+   ${TFLITE_SOURCE_DIR}/schema/conversion_metadata_generated.h
+   ${TFLITE_SOURCE_DIR}/schema/schema_generated.h
++  ${TFLITE_SOURCE_DIR}/schema/schema_conversion_utils.h
+   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/schema_utils.cc
+   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/schema_generated.h
+   ${TF_SOURCE_DIR}/compiler/mlir/lite/schema/conversion_metadata_generated.h
+@@ -697,7 +698,7 @@ else()
+   list(FILTER _ALL_TFLITE_SRCS EXCLUDE REGEX ".*mmap_allocation\\.cc$")
+ endif()
+ 
+-add_library(tensorflow-lite
++add_library(tensorflow-lite SHARED EXCLUDE_FROM_ALL
+   ${_ALL_TFLITE_SRCS}
+ )
+ set(_ALL_TFLITE_HDRS ${_ALL_TFLITE_SRCS})
+@@ -773,6 +774,9 @@ if(TFLITE_ENABLE_INSTALL)
+   )
+ endif()
+ 
++# Manage version for shared object (dynamic) library
++set_target_properties(tensorflow-lite PROPERTIES VERSION "${TFLITE_VERSION_MAJOR}")
++
+ # The kernel tests.
+ if(TFLITE_KERNEL_TEST)
+   enable_testing()
+-- 
+2.34.1
+
diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
new file mode 100644
index 00000000..0e21b254
--- /dev/null
+++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch
@@ -0,0 +1,36 @@ 
+From 577192caa67660f857f2869896d01db3611b4128 Mon Sep 17 00:00:00 2001
+From: Chirag Shilwant <c-shilwant@ti.com>
+Date: Thu, 13 Feb 2025 14:45:46 +0530
+Subject: [PATCH 3/3] CMakeLists: Fix build issues observed in TFlite v2.18
+
+- Improve regular expression for filtering neon and sse
+related sources. The improved expression avoids missing files
+in case the absolute path contains the terms neon or sse.
+
+- Fixes [1]
+
+[1]: https://github.com/tensorflow/tensorflow/issues/70730
+
+Upstream-Status: Backport from master
+
+Signed-off-by: Chirag Shilwant <c-shilwant@ti.com>
+---
+ tensorflow/lite/CMakeLists.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tensorflow/lite/CMakeLists.txt b/tensorflow/lite/CMakeLists.txt
+index 92b05e42446..737f754621f 100644
+--- a/tensorflow/lite/CMakeLists.txt
++++ b/tensorflow/lite/CMakeLists.txt
+@@ -605,7 +605,7 @@ populate_tflite_source_vars("kernels/internal/reference/sparse_ops"
+ )
+ populate_tflite_source_vars("kernels/internal/optimized/4bit"
+   TFLITE_KERNEL_INTERNAL_OPT_4BIT_SRCS
+-  FILTER "(.*neon.*|.*sse.*)\\.(cc|h)"
++  FILTER "(.*neon_.*|.*sse_.*)\\.(cc|h)"
+ )
+ set(TFLITE_PROFILER_SRCS
+   ${TFLITE_SOURCE_DIR}/profiling/platform_profiler.cc
+-- 
+2.34.1
+
diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
new file mode 100644
index 00000000..8c5bf2e0
--- /dev/null
+++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite/tensorflow2-lite.pc.in
@@ -0,0 +1,6 @@ 
+Name: tensorflow lite c++ shared library
+Description: tensorflow lite c++ shared library
+Version: @version@
+Requires:
+Libs: -L@libdir@ -ltensorflowlite -lrt
+Cflags: -I@includedir@
diff --git a/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
new file mode 100644
index 00000000..a20c090a
--- /dev/null
+++ b/meta-arago-extras/recipes-framework/tensorflow-lite/tensorflow-lite_2.18.0.bb
@@ -0,0 +1,232 @@ 
+DESCRIPTION = "TensorFlow Lite is an open source deep learning framework for \
+on-device inference."
+AUTHOR = "Google Inc. and Yuan Tang"
+SUMMARY = "TensorFlow Lite C++ Library, Python interpreter & Benchmark Model"
+HOMEPAGE = "https://www.tensorflow.org/lite"
+
+LICENSE = "Apache-2.0"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=4158a261ca7f2525513e31ba9c50ae98"
+
+# Get major of the PV variable
+MAJOR = "${@d.getVar('PV').split('.')[0]}"
+
+SRC_URI = " \
+    git://github.com/tensorflow/tensorflow.git;protocol=https;branch=r2.18 \
+    file://0001-lite-Update-CMakeLists-for-building-_pywrap_tensorfl.patch \
+    file://0002-lite-Update-CMakeLists-for-building-shared-object-li.patch \
+    file://0003-CMakeLists-Fix-build-issues-observed-in-TFlite-v2.18.patch \
+    file://tensorflow2-lite.pc.in \
+"
+
+SRC_URI += " \
+    git://github.com/abseil/abseil-cpp.git;protocol=https;branch=lts_2023_08_02;name=abseil-cpp;destsuffix=${S}/external/abseil-cpp \
+    git://gitlab.com/libeigen/eigen.git;protocol=https;branch=master;name=eigen;destsuffix=${S}/external/eigen \
+    git://github.com/google/farmhash.git;protocol=https;branch=master;name=farmhash;destsuffix=${S}/external/farmhash \
+    git://github.com/petewarden/OouraFFT.git;protocol=https;branch=master;name=fft2d;destsuffix=${S}/external/fft2d \
+    git://github.com/google/gemmlowp.git;branch=master;protocol=https;name=gemmlowp;destsuffix=${S}/external/gemmlowp \
+    git://github.com/pytorch/cpuinfo.git;branch=main;protocol=https;name=cpuinfo;destsuffix=${S}/external/cpuinfo \
+    git://github.com/jax-ml/ml_dtypes.git;branch=main;protocol=https;name=ml_dtypes;destsuffix=${S}/external/ml_dtypes \
+    git://github.com/google/ruy.git;branch=master;protocol=https;name=ruy;destsuffix=${S}/external/ruy \
+    git://github.com/google/flatbuffers;branch=master;protocol=https;name=flatbuffers;destsuffix=${S}/external/flatbuffers \
+    git://github.com/Maratyszcza/pthreadpool.git;branch=master;protocol=https;name=pthreadpool-source;destsuffix=${S}/external/pthreadpool-source \
+    git://github.com/google/XNNPACK.git;branch=master;protocol=https;name=xnnpack;destsuffix=${S}/external/xnnpack \
+    git://github.com/Maratyszcza/FXdiv.git;branch=master;protocol=https;name=FXdiv-source;destsuffix=${S}/external/FXdiv-source \
+    git://github.com/Maratyszcza/FP16.git;branch=master;protocol=https;name=FP16-source;destsuffix=${S}/external/FP16-source \
+    git://git.gitlab.arm.com/kleidi/kleidiai.git;branch=main;protocol=https;name=kleidiai;destsuffix=${S}/external/kleidiai \
+    git://github.com/Maratyszcza/psimd.git;branch=master;protocol=https;name=psimd;destsuffix=${S}/external/psimd \
+    git://github.com/protocolbuffers/protobuf.git;branch=25.x;protocol=https;name=protobuf;destsuffix=${S}/external/protobuf \
+"
+
+SRCREV_FORMAT = "default"
+
+# Matches v${PV} tag
+SRCREV = "6550e4bd80223cdb8be6c3afd1f81e86a4d433c3"
+SRCREV_abseil-cpp = "fb3621f4f897824c0dbe0615fa94543df6192f30"
+SRCREV_eigen = "33d0937c6bdf5ec999939fb17f2a553183d14a74"
+SRCREV_farmhash = "0d859a811870d10f53a594927d0d0b97573ad06d"
+SRCREV_fft2d = "c6fd2dd6d21397baa6653139d31d84540d5449a2"
+SRCREV_gemmlowp = "16e8662c34917be0065110bfcd9cc27d30f52fdf"
+SRCREV_cpuinfo = "b73ae6ce38d5dd0b7fe46dbe0a4b5f4bab91c7ea"
+SRCREV_ml_dtypes = "24084d9ed2c3d45bf83b7a9bff833aa185bf9172"
+SRCREV_ruy = "3286a34cc8de6149ac6844107dfdffac91531e72"
+SRCREV_flatbuffers = "e6463926479bd6b330cbcf673f7e917803fd5831"
+SRCREV_pthreadpool-source = "4fe0e1e183925bf8cfa6aae24237e724a96479b8"
+SRCREV_xnnpack = "6b83f69d4938da4dc9ad63c00bd13e9695659a51"
+SRCREV_FXdiv-source = "63058eff77e11aa15bf531df5dd34395ec3017c8"
+SRCREV_FP16-source = "0a92994d729ff76a58f692d3028ca1b64b145d91"
+SRCREV_kleidiai = "cddf991af5de49fd34949fa39690e4e906e04074"
+SRCREV_psimd = "072586a71b55b7f8c584153d223e95687148a900"
+SRCREV_protobuf = "4a2aef570deb2bfb8927426558701e8bfc26f2a4"
+
+S = "${WORKDIR}/git"
+
+inherit setuptools3 cmake
+
+DEPENDS = " \
+    flatbuffers-native \
+    python3-numpy-native \
+    python3-pybind11-native \
+    python3-numpy \
+    python3 \
+    gzip-native \
+    protobuf-native \
+    python3-pybind11 \
+"
+
+# Set building environment variables
+TENSORFLOW_TARGET="linux"
+TENSORFLOW_TARGET_ARCH:aarch64="aarch64"
+TENSORFLOW_TARGET_ARCH:arm="armv7"
+
+PACKAGECONFIG ??= "xnnpack ruy"
+PACKAGECONFIG[xnnpack] = "-DTFLITE_ENABLE_XNNPACK=ON, -DTFLITE_ENABLE_XNNPACK=OFF"
+PACKAGECONFIG[ruy] = "-DTFLITE_ENABLE_RUY=ON, -DTFLITE_ENABLE_RUY=OFF"
+
+# XNNPACK is not supported in Linux armv7-a [https://github.com/tensorflow/tensorflow/issues/64358]
+# Hence, turning it off
+PACKAGECONFIG:remove:arm = "xnnpack"
+
+OECMAKE_SOURCEPATH = "${S}/tensorflow/lite"
+
+# The -O3 flag enables high-level optimizations for performance
+# and the -DNDEBUG flag disables debugging code, such as assertions
+# to further optimize the build for production use.
+# Hence, activate -O3 optimization and disable debug symbols.
+OECMAKE_C_FLAGS_RELEASE = "-O3 -DNDEBUG"
+OECMAKE_CXX_FLAGS_RELEASE = "-O3 -DNDEBUG -flax-vector-conversions"
+
+OECMAKE_C_FLAGS_RELEASE:append:arm = " -march=armv7-a -mfpu=neon"
+OECMAKE_CXX_FLAGS_RELEASE:append:arm = " -march=armv7-a -mfpu=neon"
+
+do_generate_toolchain_file:append:arm() {
+    # Even if we set TENSORFLOW_TARGET_ARCH:arm as armv7, the TFLite CMake
+    # build system still uses CMAKE_SYSTEM_PROCESSOR as arm in toolchain.cmake file
+    # which leads to build failures. Hence, change it to armv7.
+    sed -i 's:CMAKE_SYSTEM_PROCESSOR arm:CMAKE_SYSTEM_PROCESSOR armv7:g' ${WORKDIR}/toolchain.cmake
+}
+
+# Build tensorflow-lite.so library, _pywrap_tensorflow_interpreter_wrapper.so library and the benchmark_model application
+OECMAKE_TARGET_COMPILE =  "tensorflow-lite benchmark_model _pywrap_tensorflow_interpreter_wrapper"
+
+EXTRA_OECMAKE:append = " \
+    -DFETCHCONTENT_FULLY_DISCONNECTED=ON \
+    -DCMAKE_SYSTEM_NAME=${TENSORFLOW_TARGET} \
+    -DCMAKE_SYSTEM_PROCESSOR=${TENSORFLOW_TARGET_ARCH} \
+    -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
+    -DPYTHON_TARGET_INCLUDE=${RECIPE_SYSROOT}${includedir}/${PYTHON_DIR} \
+    -DNUMPY_TARGET_INCLUDE=${RECIPE_SYSROOT}${PYTHON_SITEPACKAGES_DIR}/numpy/core/include \
+    -DPYBIND11_TARGET_INCLUDE=${RECIPE_SYSROOT}${PYTHON_SITEPACKAGES_DIR}/pybind11/include \
+    -DTFLITE_VERSION_MAJOR=${MAJOR}  \
+    -DTFLITE_HOST_TOOLS_DIR=${STAGING_BINDIR_NATIVE} \
+    -DPTHREADPOOL_SOURCE_DIR=${S}/external/pthreadpool-source \
+    -DFXDIV_SOURCE_DIR=${S}/external/FXdiv-source \
+    -DFP16_SOURCE_DIR=${S}/external/FP16-source \
+    -DCPUINFO_SOURCE_DIR=${S}/external/cpuinfo \
+    -DKLEIDIAI_SOURCE_DIR=${S}/external/kleidiai \
+    -DPSIMD_SOURCE_DIR=${S}/external/psimd \
+    --compile-no-warning-as-error \
+    --log-level=VERBOSE \
+"
+
+do_configure:prepend() {
+    for i in abseil-cpp cpuinfo eigen farmhash fft2d flatbuffers FP16-source FXdiv-source gemmlowp kleidiai ml_dtypes psimd protobuf pthreadpool-source ruy xnnpack; do
+        cp -ra ${S}/external/$i ${B}/$i
+    done
+
+    # There is no Fortran compiler in the toolchain, but bitbake sets this variable anyway with unavailable
+    # binary & it leads to "CMake Error: Could not find compiler set in environment variable FC:"
+    unset FC
+}
+
+SETUPTOOLS_SETUP_PATH = "${B}"
+
+do_compile:append() {
+    # Build the python wheel (procedure extract form the build_pip_package_with_cmake.sh)
+    BUILD_DIR=${B}
+    TENSORFLOW_DIR=${S}
+    TENSORFLOW_LITE_DIR="${TENSORFLOW_DIR}/tensorflow/lite"
+    TENSORFLOW_VERSION=$(grep "_VERSION = " "${TENSORFLOW_DIR}/tensorflow/tools/pip_package/setup.py" | cut -d= -f2 | sed "s/[ '-]//g")
+    mkdir -p "${B}/tflite_runtime"
+    cp -r "${TENSORFLOW_LITE_DIR}/tools/pip_package/debian" \
+          "${TENSORFLOW_LITE_DIR}/tools/pip_package/MANIFEST.in" \
+          "${B}"
+    cp -r "${TENSORFLOW_LITE_DIR}/python/interpreter_wrapper" "${B}"
+    cp "${TENSORFLOW_LITE_DIR}/tools/pip_package/setup_with_binary.py" "${B}/setup.py"
+    cp "${TENSORFLOW_LITE_DIR}/python/interpreter.py" \
+       "${TENSORFLOW_LITE_DIR}/python/metrics/metrics_interface.py" \
+       "${TENSORFLOW_LITE_DIR}/python/metrics/metrics_portable.py" \
+       "${B}/tflite_runtime"
+    echo "__version__ = '${TENSORFLOW_VERSION}'" >> "${BUILD_DIR}/tflite_runtime/__init__.py"
+    echo "__git_version__ = '$(git -C "${TENSORFLOW_DIR}" describe)'" >> "${BUILD_DIR}/tflite_runtime/__init__.py"
+
+    export PACKAGE_VERSION="${TENSORFLOW_VERSION}"
+    export PROJECT_NAME="tflite_runtime"
+    cp "${B}/_pywrap_tensorflow_interpreter_wrapper.so" "tflite_runtime"
+
+    setuptools3_do_compile
+}
+
+do_install() {
+    # Install tensorflow-lite dynamic library
+    install -d ${D}${libdir}
+    install -m 0644 ${B}/libtensorflow-lite.so.${MAJOR} ${D}${libdir}/libtensorflow-lite.so.${PV}
+
+    ln -sf libtensorflow-lite.so.${PV} ${D}${libdir}/libtensorflow-lite.so.${MAJOR}
+    ln -sf libtensorflow-lite.so.${PV} ${D}${libdir}/libtensorflow-lite.so
+
+    # armnn expects the the dynamic library of tensorflow lite to be named as "libtensorflowlite.so"
+    # Eg - https://github.com/ARM-software/armnn/blob/branches/armnn_24_11/delegate/cmake/Modules/FindTfLite.cmake#L19
+    # Hence, create a symbolic link to handle the same
+    ln -snf libtensorflow-lite.so ${D}${libdir}/libtensorflowlite.so
+
+    # Install benchmark_model
+    install -d ${D}/opt/${PN}/tools/
+    install -m 0755 ${B}/tools/benchmark/benchmark_model ${D}/opt/${PN}/tools/
+
+    # Install header files
+    install -d ${D}${includedir}/tensorflow/
+    cd ${S}/tensorflow/
+    cp --parents $(find ./lite -name "*.h*" -not -path "*cmake_build/*") ${D}${includedir}/tensorflow
+    cp --parents $(find ./compiler/mlir/lite -name "*.h*" -not -path "*cmake_build/*") ${D}${includedir}/tensorflow
+    cd ${B}
+    cp --parents $(find . -name "*.h*") ${D}${includedir}/tensorflow/lite
+
+    # Install TFlite python3 interpreter
+    install -d ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime
+    install -d ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info
+    install -m 0755  ${B}/tflite_runtime/* ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime
+    install -m 0755  ${B}/tflite_runtime.egg-info/* ${D}${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info
+
+    # Install pkgconfig file required for NNstreamer build
+    install -d ${D}${libdir}/pkgconfig
+    install -m 0644 ${WORKDIR}/tensorflow2-lite.pc.in ${D}${libdir}/pkgconfig/tensorflow2-lite.pc
+    sed -i 's:@version@:${PV}:g
+            s:@libdir@:${libdir}:g
+            s:@includedir@:${includedir}:g' \
+            ${D}${libdir}/pkgconfig/tensorflow2-lite.pc
+}
+
+PACKAGES += "${PN}-tools python3-${PN}"
+
+RDEPENDS:${PN} += " \
+    ${PN}-tools \
+    python3-${PN} \
+"
+
+FILES:${PN} = " \
+    ${libdir}/lib*.so* \
+    ${libdir}/pkgconfig/* \
+"
+
+FILES:${PN}-tools = " \
+    /opt/* \
+"
+
+FILES:python3-${PN} = " \
+    ${PYTHON_SITEPACKAGES_DIR}/tflite_runtime \
+    ${PYTHON_SITEPACKAGES_DIR}/tflite_runtime.egg-info \
+"
+
+RDEPENDS:python3-${PN} += " python3-ctypes python3-numpy "
+
+PROVIDES += "python3-${PN}"