#TOSA serialization library

# Copyright (c) 2020-2023, ARM Limited.
#
#    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
#
#         http://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.

# Contains TOSA flatbuffer serialization library content.

cmake_minimum_required(VERSION 3.13.4)
project(TosaSerialization)

set(CMAKE_CXX_STANDARD 14 CACHE STRING "C++ standard to conform to")
set(CMAKE_CXX_STANDARD_REQUIRED YES)

set(CMAKE_VERBOSE_MAKEFILE ON)

option(BUILD_TESTS "Build test applications" ON)
option(FLATBUFFERS_ROOT "Location where the flatbuffers 'include' and 'lib' folders to be found" Off)

include_directories(${PROJECT_SOURCE_DIR}/third_party/half/include)

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

add_library(tosa_serialization_lib
  src/tosa_serialization_handler.cpp
  src/numpy_utils.cpp
)

# Verify we have a valid flatbuffers include path.
# We will explicitly exclude the system include directories and only
# accept either a user supplied value or the local third_party/flatbuffers.
find_path(FLATBUFFERS_INCLUDE_PATH flatbuffers/flatbuffers.h
          NO_DEFAULT_PATH
          HINTS ${FLATBUFFERS_ROOT} ./third_party/flatbuffers
          PATH_SUFFIXES include)
message(STATUS "Flatbuffers include located at: ${FLATBUFFERS_INCLUDE_PATH}")
include_directories(${FLATBUFFERS_INCLUDE_PATH})

# Next is the library.
# We will explicitly exclude the system lib directories and only accept
# either a user supplied value or the local third_party/flatbuffers.
find_library(FLATBUFFERS_LIBRARY
             NAMES libflatbuffers.a flatbuffers
             NO_DEFAULT_PATH
             HINTS ${FLATBUFFERS_ROOT} ./third_party/flatbuffers
             PATH_SUFFIXES lib)

if(FLATBUFFERS_LIBRARY)
    message(STATUS "Flatbuffers library located at: ${FLATBUFFERS_LIBRARY}")
    target_link_libraries(tosa_serialization_lib PRIVATE ${FLATBUFFERS_LIBRARY})
else()
    # It's not there we treat third_party/flatbuffers as a sub project.
    # In this case we'll need to build the downloaded source.
    # Turn off unnecessary flatbuffers targets
    set(FLATBUFFERS_BUILD_TESTS OFF)
    add_subdirectory(third_party/flatbuffers)
    target_link_libraries(tosa_serialization_lib PRIVATE flatbuffers)
endif()

set(public_headers)
list(APPEND public_headers
     include/attribute.h
     include/attribute.def
     include/numpy_utils.h
     include/tosa_generated.h
     include/tosa_serialization_handler.h
)

set_target_properties(tosa_serialization_lib PROPERTIES PUBLIC_HEADER "${public_headers}")

# Optionally build test executables.
if (BUILD_TESTS)
    add_executable(serialization_npy_test
      test/src/serialization_npy_test.cpp
    )

    target_link_libraries(serialization_npy_test
      tosa_serialization_lib
    )
endif()

set(TOSA_SERIALIZATION_LIB_CMAKE_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/tosa_serialization_lib")
# Follow GNU packaging norms for installation directory structure.
include(GNUInstallDirs)
install(
  TARGETS tosa_serialization_lib EXPORT TosaSerializationLibTargets
  PUBLIC_HEADER
  ARCHIVE
)

install(EXPORT TosaSerializationLibTargets
  FILE TosaSerializationLibTargets.cmake
  NAMESPACE tosa::
  DESTINATION ${TOSA_SERIALIZATION_LIB_CMAKE_DIR}
)
