#
# Copyright © 2017, 2023 Arm Ltd. All rights reserved.
# SPDX-License-Identifier: MIT
#
if(BUILD_TF_LITE_PARSER)
    set(armnn_tf_lite_parser_sources)
    list(APPEND armnn_tf_lite_parser_sources
        ../../include/armnnTfLiteParser/ITfLiteParser.hpp
        ../../include/armnnTfLiteParser/Version.hpp
        TfLiteParser.hpp
        TfLiteParser.cpp
        )

    if(EXECUTE_NETWORK_STATIC)
        add_library_ex(armnnTfLiteParser OBJECT ${armnn_tf_lite_parser_sources})
    else()
        add_library_ex(armnnTfLiteParser SHARED ${armnn_tf_lite_parser_sources})
    endif()

    include_directories(SYSTEM "${FLATBUFFERS_INCLUDE_PATH}")
    set_target_properties(armnnTfLiteParser PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
    target_include_directories(armnnTfLiteParser PRIVATE ../armnn)
    target_include_directories(armnnTfLiteParser PRIVATE ../armnnUtils)
    target_include_directories(armnnTfLiteParser SYSTEM PRIVATE "${TF_LITE_SCHEMA_INCLUDE_PATH}")


    # using the armnn/delegate/cmake/Modules/FindTfLiteSrc.cmake to find the TfLite sources
    # so that we can use the tensorflow/lite/version.h to determine which version of
    # tensorflow lite we are compiling against
    find_package(TfLiteSrc REQUIRED MODULE)

    # Various tflite header files are not warning clean
    # We can't change compilation flags on header files directly, so we need to add them to an interface library first
    add_library(tflite_version_headers INTERFACE)
    target_include_directories(tflite_version_headers INTERFACE $<BUILD_INTERFACE:${TfLite_INCLUDE_DIR}>
                                                                $<INSTALL_INTERFACE:include/tflite_version_headers>)

    if(COMPILER_IS_GNU_LIKE)
        target_compile_options(tflite_version_headers INTERFACE -Wno-conversion
                                                                -Wno-sign-conversion
                                                                -Wno-unused-parameter
                                                                -Wno-unused-function)
    endif()
                                                            

    # If user has explicitly specified flatbuffers lib then use that,
    # otherwise search for it based on FLATBUFFERS_BUILD_DIR
    if (FLATBUFFERS_LIBRARY)
        target_link_libraries(armnnTfLiteParser
                              armnn
                              tflite_version_headers
                              ${FLATBUFFERS_LIBRARY})
    else()
        # Use PATH_SUFFIXES to help find separate libs for debug/release on Windows builds
        find_library(FLATBUFFERS_LIBRARY_DEBUG NAMES flatbuffers
                     HINTS ${FLATBUFFERS_BUILD_DIR}
                     PATH_SUFFIXES "Debug")
        find_library(FLATBUFFERS_LIBRARY_RELEASE NAMES flatbuffers
                     HINTS ${FLATBUFFERS_BUILD_DIR}
                     PATH_SUFFIXES "Release")
            target_link_libraries(armnnTfLiteParser
                                  armnn
                                  tflite_version_headers
                                  debug ${FLATBUFFERS_LIBRARY_DEBUG}
                                  optimized ${FLATBUFFERS_LIBRARY_RELEASE})
    endif()

    set_target_properties(armnnTfLiteParser PROPERTIES VERSION ${TFLITE_PARSER_LIB_VERSION} SOVERSION ${TFLITE_PARSER_LIB_SOVERSION} )

    install(TARGETS armnnTfLiteParser
            LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
            RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
endif()
