diff --git a/tflite_micro.cmake b/tflite_micro.cmake
new file mode 100644
index 0000000..2cdc4eb
--- /dev/null
+++ b/tflite_micro.cmake
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2021 Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+# Licensed under the Apache License, Version 2.0 (the License); you may
+# not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an AS IS BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+include(ProcessorCount)
+ProcessorCount(J)
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL "ARMClang")
+    set(TFLU_TOOLCHAIN "armclang")
+elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    set(TFLU_TOOLCHAIN "gcc")
+else ()
+    message(FATAL_ERROR "No compiler ID is set")
+endif()
+
+get_filename_component(TFLU_TARGET_TOOLCHAIN_ROOT ${CMAKE_C_COMPILER} DIRECTORY)
+
+set(TFLU_TARGET_TOOLCHAIN_ROOT "'${TFLU_TARGET_TOOLCHAIN_ROOT}'/")
+set(TFLU_PATH "${TENSORFLOW_PATH}/tensorflow/lite/micro")
+set(TFLU_GENDIR "${CMAKE_CURRENT_BINARY_DIR}/tflite_micro/")
+set(TFLU_TARGET "cortex_m_generic")
+set(TFLU_TARGET_ARCH ${CMAKE_SYSTEM_PROCESSOR}${CPU_FEATURES}
+    CACHE STRING "Tensorflow Lite for Microcontrollers target architecture")
+set(TFLU_BUILD_TYPE "release" CACHE STRING "Tensorflow Lite Mirco build type, can be release or debug")
+set(TFLU_OPTIMIZATION_LEVEL CACHE STRING "Tensorflow Lite Micro optimization level")
+
+
+if (TFLU_PREBUILT_LIBRARY_PATH)
+    set(TFLU_IMPORTED_LIB_PATH "${TFLU_PREBUILT_LIBRARY_PATH}")
+    message(STATUS "Using a prebuilt TensorFlow Lite for Microcontrollers library: ${TFLU_IMPORTED_LIB_PATH}")
+else()
+    if(CORE_SOFTWARE_ACCELERATOR STREQUAL NPU)
+        set(TFLU_ETHOSU_LIBS $<TARGET_FILE:ethosu_core_driver>)
+        # Set preference for ethos-u over cmsis-nn
+        set(TFLU_OPTIMIZED_KERNEL_DIR "cmsis_nn")
+        set(TFLU_CO_PROCESSOR "ethos_u")
+    elseif(CORE_SOFTWARE_ACCELERATOR STREQUAL CMSIS-NN)
+        set(TFLU_OPTIMIZED_KERNEL_DIR "cmsis_nn")
+    endif()
+
+    # Windows: change to relative paths.
+    if (CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
+        file(RELATIVE_PATH CMSIS_PATH ${TENSORFLOW_PATH} ${CMSIS_PATH})
+        file(RELATIVE_PATH CORE_DRIVER_PATH ${TENSORFLOW_PATH} ${CORE_DRIVER_PATH})
+    endif()
+
+    # Command and target
+    add_custom_target(tflu_gen ALL
+                  COMMAND make -j${J} -f ${TFLU_PATH}/tools/make/Makefile microlite
+                          TARGET_TOOLCHAIN_ROOT=${TFLU_TARGET_TOOLCHAIN_ROOT}
+                          TOOLCHAIN=${TFLU_TOOLCHAIN}
+                          GENDIR=${TFLU_GENDIR}
+                          TARGET=${TFLU_TARGET}
+                          TARGET_ARCH=${TFLU_TARGET_ARCH}
+                          OPTIMIZED_KERNEL_DIR="${TFLU_OPTIMIZED_KERNEL_DIR}"
+                          CO_PROCESSOR="${TFLU_CO_PROCESSOR}"
+                          $<$<BOOL:${FLOAT}>:FLOAT=${FLOAT}>
+                          BUILD_TYPE=${TFLU_BUILD_TYPE}
+                          $<$<BOOL:${TFLU_OPTIMIZATION_LEVEL}>:OPTIMIZATION_LEVEL=${TFLU_OPTIMIZATION_LEVEL}>
+                          CMSIS_PATH=${CMSIS_PATH}
+                          ETHOSU_DRIVER_PATH=${CORE_DRIVER_PATH}
+                          ETHOSU_DRIVER_LIBS=${TFLU_ETHOSU_LIBS}
+                  BYPRODUCTS ${CMAKE_CURRENT_SOURCE_DIR}/tensorflow/tensorflow/lite/micro/tools/make/downloads
+                  WORKING_DIRECTORY ${TENSORFLOW_PATH})
+
+    set(TFLU_IMPORTED_LIB_PATH "${TFLU_GENDIR}/lib/libtensorflow-microlite.a")
+endif()
+
+# Create library and link library to custom target
+add_library(tflu STATIC IMPORTED)
+set_property(TARGET tflu PROPERTY IMPORTED_LOCATION "${TFLU_IMPORTED_LIB_PATH}")
+add_dependencies(tflu tflu_gen)
+target_include_directories(tflu INTERFACE
+    ${TENSORFLOW_PATH})
+target_compile_options(tflu INTERFACE
+    -I${TENSORFLOW_PATH}/tensorflow/lite/micro/tools/make/downloads/flatbuffers/include)
+target_compile_definitions(tflu INTERFACE TF_LITE_MICRO TF_LITE_STATIC_MEMORY)
+
+if(${TFLU_BUILD_TYPE} STREQUAL "release")
+    target_compile_definitions(tflu INTERFACE TF_LITE_STRIP_ERROR_STRINGS)
+endif()
+
+if(CORE_SOFTWARE_ACCELERATOR STREQUAL NPU)
+    target_link_libraries(tflu INTERFACE ethosu_core_driver)
+endif()
+
+# Install libraries and header files
+get_target_property(TFLU_IMPORTED_LOCATION tflu IMPORTED_LOCATION)
+install(FILES ${TFLU_IMPORTED_LOCATION} DESTINATION "lib")
