#
# Copyright © 2022-2023 Arm Ltd and Contributors. All rights reserved.
# SPDX-License-Identifier: MIT
#

cmake_minimum_required (VERSION 3.7.0)
project(armnnDelegate)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra -Werror -Wold-style-cast -Wno-missing-braces -Wconversion -Wsign-conversion -Wno-comment")

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${PROJECT_SOURCE_DIR}/cmake/Modules/")

set(armnnDelegate_sources)
list(APPEND armnnDelegate_sources
        include/armnn_delegate.hpp
        include/DelegateOptions.hpp
        include/Version.hpp
        src/armnn_delegate.cpp
        src/armnn_external_delegate.cpp
        src/DelegateOptions.cpp
        src/Activation.hpp
        src/ArgMinMax.hpp
        src/BatchMatMul.hpp
        src/BatchSpace.hpp
        src/Comparison.hpp
        src/Convolution.hpp
        src/Control.hpp
        src/DelegateUtils.hpp
        src/ElementwiseBinary.hpp
        src/ElementwiseUnary.hpp
        src/Fill.hpp
        src/FullyConnected.hpp
        src/Gather.hpp
        src/GatherNd.hpp
        src/LogicalBinary.hpp
        src/Lstm.hpp
        src/MultiLayerFacade.hpp
        src/Normalization.hpp
        src/Pack.hpp
        src/Pad.hpp
        src/Pooling.hpp
        src/Prelu.hpp
        src/Quantization.hpp
        src/Redefine.hpp
        src/Reduce.hpp
        src/Resize.hpp
        src/Round.hpp
        src/Shape.hpp
        src/SharedFunctions.hpp
        src/SharedFunctions.cpp
        src/Slice.hpp
        src/Softmax.hpp
        src/SpaceDepth.hpp
        src/Split.hpp
        src/Unpack.hpp
        src/Transpose.hpp)

add_library(armnnDelegate ${armnnDelegate_sources})

target_include_directories(armnnDelegate
        PUBLIC
            $<INSTALL_INTERFACE:include>
            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/src)

include(GNUInstallDirs)

## Add Armnn as a Dependency
if(NOT ARMNN_SUB_PROJECT)
    find_package(Armnn REQUIRED CONFIG HINTS ${Armnn_DIR})
endif()
target_link_libraries(armnnDelegate PUBLIC Armnn::Armnn)

## Add TfLite dependency
find_package(TfLiteSrc REQUIRED MODULE)
find_package(TfLite REQUIRED MODULE)

target_link_libraries(armnnDelegate PUBLIC ${TfLite_LIB})

#  lpthread and ldl are not required for Android
if(NOT "${CMAKE_SYSTEM_NAME}" STREQUAL Android)
    target_link_libraries(armnnDelegate PUBLIC -lpthread)
    target_link_libraries(armnnDelegate PUBLIC -ldl)
endif()

# 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_headers INTERFACE)
target_include_directories(tflite_headers INTERFACE $<BUILD_INTERFACE:${TfLite_INCLUDE_DIR}>
                                                    $<INSTALL_INTERFACE:include/tflite_headers>)

target_compile_options(tflite_headers INTERFACE -Wno-conversion
                                                -Wno-sign-conversion
                                                -Wno-unused-parameter
                                                -Wno-unused-function)

target_link_libraries(armnnDelegate PUBLIC tflite_headers)

## Add Flatbuffers dependency
find_package(Flatbuffers REQUIRED MODULE)

target_link_libraries(armnnDelegate PRIVATE
        ${Flatbuffers_LIB})

# include/flatbuffers/flatbuffers.h is 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(flatbuffer_headers INTERFACE)
target_include_directories(flatbuffer_headers INTERFACE $<BUILD_INTERFACE:${Flatbuffers_INCLUDE_DIR}>
                                                 $<INSTALL_INTERFACE:include/flatbuffer_headers>)
target_compile_options(flatbuffer_headers INTERFACE -Wno-sign-conversion)

target_link_libraries(armnnDelegate PUBLIC flatbuffer_headers)

# Add libraries from armnn third-party libraries
# Third-party 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(thirdparty_headers INTERFACE)
target_include_directories(thirdparty_headers INTERFACE $<BUILD_INTERFACE:${ARMNN_SOURCE_DIR}/third-party>
                                                        $<INSTALL_INTERFACE:include/thirdparty_headers>)

target_compile_options(thirdparty_headers INTERFACE -Wno-old-style-cast)
target_link_libraries(armnnDelegate PUBLIC thirdparty_headers)

add_library(profiling_library_headers INTERFACE)
target_include_directories(profiling_library_headers INTERFACE $<BUILD_INTERFACE:${ARMNN_SOURCE_DIR}/profiling>
                                                              $<INSTALL_INTERFACE:include/profiling_library_headers>)
target_link_libraries(armnnDelegate PUBLIC profiling_library_headers)
target_link_libraries(armnnDelegate PUBLIC Armnn::armnnUtils)

set_target_properties(armnnDelegate PROPERTIES VERSION ${DELEGATE_LIB_VERSION} SOVERSION ${DELEGATE_LIB_SOVERSION})

option(BUILD_UNIT_TESTS "Build unit tests" ON)
if(BUILD_UNIT_TESTS)
    set(armnnDelegate_unittest_sources)
    list(APPEND armnnDelegate_unittest_sources
        src/test/ActivationTest.cpp
        src/test/ActivationTestHelper.hpp
        src/test/ArgMinMaxTest.cpp
        src/test/ArgMinMaxTestHelper.hpp
        src/test/ArmnnDelegateTest.cpp
        src/test/BatchMatMulTest.cpp
        src/test/BatchMatMulTestHelper.hpp
        src/test/BatchSpaceTest.cpp
        src/test/BatchSpaceTestHelper.hpp
        src/test/CastTest.cpp
        src/test/CastTestHelper.hpp
        src/test/ComparisonTest.cpp
        src/test/ComparisonTestHelper.hpp
        src/test/ControlTest.cpp
        src/test/ControlTestHelper.hpp
        src/test/Convolution2dTest.cpp
        src/test/Convolution3dTest.cpp
        src/test/ConvolutionTestHelper.hpp
        src/test/DelegateOptionsTest.cpp
        src/test/DelegateOptionsTestHelper.hpp
        src/test/DepthwiseConvolution2dTest.cpp
        src/test/ElementwiseBinaryTest.cpp
        src/test/ElementwiseBinaryTestHelper.hpp
        src/test/ElementwiseUnaryTest.cpp
        src/test/ElementwiseUnaryTestHelper.hpp
        src/test/FillTest.cpp
        src/test/FillTestHelper.hpp
        src/test/FullyConnectedTest.cpp
        src/test/FullyConnectedTestHelper.hpp
        src/test/GatherTest.cpp
        src/test/GatherTestHelper.hpp
        src/test/GatherNdTest.cpp
        src/test/GatherNdTestHelper.hpp
        src/test/LogicalTest.cpp
        src/test/LogicalTestHelper.hpp
        src/test/LstmTest.cpp
        src/test/LstmTestHelper.hpp
        src/test/MirrorPadTest.cpp
        src/test/NormalizationTest.cpp
        src/test/NormalizationTestHelper.hpp
        src/test/PackTest.cpp
        src/test/PackTestHelper.hpp
        src/test/PadTest.cpp
        src/test/PadTestHelper.hpp
        src/test/Pooling2dTest.cpp
        src/test/Pooling2dTestHelper.hpp
        src/test/Pooling3dTest.cpp
        src/test/Pooling3dTestHelper.hpp
        src/test/PreluTest.cpp
        src/test/PreluTestHelper.hpp
        src/test/QuantizationTest.cpp
        src/test/QuantizationTestHelper.hpp
        src/test/RedefineTestHelper.hpp
        src/test/ReduceTest.cpp
        src/test/ReduceTestHelper.hpp
        src/test/ReshapeTest.cpp
        src/test/ResizeTest.cpp
        src/test/ResizeTestHelper.hpp
        src/test/RoundTest.cpp
        src/test/RoundTestHelper.hpp
        src/test/SoftmaxTest.cpp
        src/test/SoftmaxTestHelper.hpp
        src/test/SpaceDepthTest.cpp
        src/test/SpaceDepthTestHelper.hpp
        src/test/ShapeTest.cpp
        src/test/ShapeTestHelper.hpp
        src/test/SliceTest.cpp
        src/test/SliceTestHelper.hpp
        src/test/StridedSliceTest.cpp
        src/test/StridedSliceTestHelper.hpp
        src/test/SplitTest.cpp
        src/test/SplitTestHelper.hpp
        src/test/TestUtils.hpp
        src/test/TestUtils.cpp
        src/test/TransposeTest.cpp
        src/test/TransposeTestHelper.hpp
        src/test/UnidirectionalSequenceLstmTest.cpp
        src/test/UnidirectionalSequenceLstmTestHelper.hpp
        src/test/UnpackTest.cpp
        src/test/UnpackTestHelper.hpp)

        # There's a known Android NDK bug which causes a subset of NeonLayerTests to
        # fail. We'll exclude these tests in NeonLayerTests_NDK_Bug.cpp if we're doing
        # a debug build and NDK is less than r21.
        # https://github.com/android/ndk/issues/1135

        # Default to always including these tests.
        set(INCLUDE_NDK_BUG_TESTS "ON")
        # Reconsider if we in a debug build.
        string( TOLOWER ${CMAKE_BUILD_TYPE} BUILD_TYPE_LOWERCASE )
        if ( NOT BUILD_TYPE_LOWERCASE STREQUAL "release" )
            message("CMAKE:: BUILD TYPE IS ${CMAKE_BUILD_TYPE}")
            # And NDK_VERSION has been set.
            if ( DEFINED NDK_VERSION )
                message("CMAKE:: NDK DEFINED")
                # And the version is less than r21.
                if ( ${NDK_VERSION} STRLESS "r21" )
                    message("CMAKE:: BUG TESTS OFF")
                    set(INCLUDE_NDK_BUG_TESTS "OFF")
                endif()
            endif()
        endif()

        if ( INCLUDE_NDK_BUG_TESTS STREQUAL "ON" )
           list(APPEND armnnDelegate_unittest_sources
                src/test/NeonDelegateTests_NDK_Issue.cpp
                )
        else()

        endif()

    add_executable(DelegateUnitTests ${armnnDelegate_unittest_sources})

    # Add half library from armnn third-party libraries
    target_link_libraries(DelegateUnitTests PRIVATE thirdparty_headers)

    target_link_libraries(DelegateUnitTests PRIVATE armnnDelegate)
    target_link_libraries(DelegateUnitTests PRIVATE Armnn::armnnUtils)

    target_link_libraries(DelegateUnitTests PRIVATE tflite_headers)
    target_link_libraries(DelegateUnitTests PRIVATE flatbuffer_headers)
    target_link_libraries(DelegateUnitTests PRIVATE profiling_library_headers)

endif()

option(BUILD_DELEGATE_JNI_INTERFACE "Builds a library to allow accessing the Arm NN delegate from Java code.
                                     This is an experimental feature." Off)
if(BUILD_DELEGATE_JNI_INTERFACE)
    add_subdirectory(armnnDelegateJNI)
endif()

####################################################
## Export targets
set(armnn_delegate_export_targets)
list(APPEND armnn_delegate_export_targets
            armnnDelegate
            tflite_headers
            flatbuffer_headers
            profiling_library_headers
            thirdparty_headers)

install(
        TARGETS ${armnn_delegate_export_targets}
        EXPORT  armnn-delegate-targets
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

## Set export alias
set_target_properties(armnnDelegate
        PROPERTIES
        EXPORT_NAME ArmnnDelegate)

## Export target scrips
install(
        EXPORT      armnn-delegate-targets
        FILE        ArmnnDelegateTargets.cmake
        NAMESPACE   ArmnnDelegate::
        DESTINATION ${CMAKE_INSTALL_LIBDIR})

## Create ArmnnDelegateConfig.cmake
include(CMakePackageConfigHelpers)
set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR})
message(STATUS "CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_DIR}" )
message(STATUS "CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}" )
SET(Armnn_DIR "${Armnn_DIR}")

configure_package_config_file(
        ${CMAKE_CURRENT_LIST_DIR}/cmake/Modules/ArmnnDelegateConfig.cmake.in
        ${CMAKE_CURRENT_BINARY_DIR}/ArmnnDelegateConfig.cmake
        INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
        PATH_VARS  Armnn_DIR)

## Install ArmNN Delegate config file
install(
        FILES
        ${CMAKE_CURRENT_BINARY_DIR}/ArmnnDelegateConfig.cmake
        DESTINATION ${INSTALL_CONFIGDIR})

## Export from build tree
export(
        EXPORT      armnn-delegate-targets
        FILE        ${CMAKE_CURRENT_BINARY_DIR}/ArmnnDelegateTargets.cmake
        NAMESPACE   ArmnnDelegate::)
add_library(ArmnnDelegate::ArmnnDelegate ALIAS armnnDelegate)


####################################################
