#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/cfloat.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}
)
