#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 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

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
)

# If flatbuffers is built externally just link it
if (TARGET flatbuffers)
  target_link_libraries(tosa_serialization_lib PRIVATE flatbuffers)
else()
  # 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()
endif()

set(public_headers)
list(APPEND public_headers
     include/attribute.h
     include/attribute.def
     include/float_utils.h
     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}
)
