cmake_minimum_required (VERSION 3.4)

# 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.

project(tosa_reference_model LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
  set(CMAKE_CXX_FLAGS "-Wall -Wno-ignored-attributes -Wno-format-truncation")
else()
  set(CMAKE_CXX_FLAGS "-Wall -Wno-ignored-attributes")
endif()

# If Serialization Library path is specified, look for library so it doesn't have to be built again.
# Otherwise, set the Serialization Library related paths to thirdparty directory.
if(SERIALIZATION_DIR)
  find_library(SERIALIZATION_LIB
               NAMES libtosa_serialization_lib.a tosa_serialization_lib
               NO_DEFAULT_PATH
               HINTS ${SERIALIZATION_DIR}
               PATH_SUFFIXES lib)

  if(NOT SERIALIZATION_LIB)
    message(FATAL_ERROR "TOSA Serialization Library location was specified but not found at: ${SERIALIZATION_LIB_DIR}")
  endif()
else()
  # Build from third party directory if not found.
  set(SERIALIZATION_LIB tosa_serialization_lib)
  set(SERIALIZATION_DIR "../thirdparty/serialization_lib/")
endif()

# If Flatbuffers, Eigen, Half path isn't specified, set to thirdparty directory.
if(NOT FLATBUFFERS_DIR)
  set(FLATBUFFERS_DIR "../thirdparty/serialization_lib/third_party/flatbuffers/")
endif()

if(NOT EIGEN_DIR)
  set(EIGEN_DIR "../thirdparty/eigen/")
endif()

if(NOT HALF_DIR)
  set(HALF_DIR "../thirdparty/serialization_lib/third_party/half")
endif()

include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)

# Common sources required for TOSA Reference Model library, executable and unit tests
set(CXX_SOURCE
    src/model_runner.cc
    src/model_runner_impl.cc
    src/tensor.cc
    src/graph_node.cc
    src/subgraph_traverser.cc
    src/func_debug.cc
    src/operators.cc
    src/ops/op_factory.cc
    src/ops/tensor_ops.cc
    src/ops/activation_funcs.cc
    src/ops/ewise_binary.cc
    src/ops/ewise_unary.cc
    src/ops/ewise_ternary.cc
    src/ops/comparison.cc
    src/ops/reduction.cc
    src/ops/data_layout.cc
    src/ops/scatter_gather.cc
    src/ops/image.cc
    src/ops/type_conversion.cc
    src/ops/data_nodes.cc
    src/ops/custom.cc
    src/ops/control_flow.cc
)

# Build TOSA Reference Model library
add_library(tosa_reference_model_lib ${CXX_SOURCE})

target_include_directories(tosa_reference_model_lib
  PUBLIC
    $<INSTALL_INTERFACE:include>
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SRC_DIR}/include>
  PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/src
    ${FLATBUFFERS_DIR}/include
    ${EIGEN_DIR}
    ${EIGEN_DIR}/unsupported/
    ${SERIALIZATION_DIR}/include
    ${HALF_DIR}/include
)

target_link_libraries(tosa_reference_model_lib
  PRIVATE
    ${SERIALIZATION_LIB}
)

set(PUBLIC_HEADERS)
list(APPEND PUBLIC_HEADERS
    include/debug_modes.def
    include/debug_types.h
    include/dtype.h
    include/func_config.h
    include/func_debug.h
    include/graph_status.h
    include/model_common.h
    include/model_runner.h
    include/version.h
)

set_target_properties(tosa_reference_model_lib PROPERTIES PUBLIC_HEADER "${PUBLIC_HEADERS}")

# Build TOSA Refererence Model executable
if(BUILD_TOSA_REFERENCE_MODEL_EXECUTABLE)
  set(CXX_SOURCE_EX src/main.cpp)
  list(APPEND CXX_SOURCE_EX ${CXX_SOURCE})

  add_executable(tosa_reference_model ${CXX_SOURCE_EX})

  target_include_directories(tosa_reference_model
    PUBLIC
      $<INSTALL_INTERFACE:include>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SRC_DIR}/include>
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/src
      ${FLATBUFFERS_DIR}/include
      ${EIGEN_DIR}
      ${EIGEN_DIR}/unsupported/
      ${SERIALIZATION_DIR}/include
      ${HALF_DIR}/include
  )

  target_link_libraries(tosa_reference_model
    PRIVATE
      ${SERIALIZATION_LIB}
      nlohmann_json::nlohmann_json
      cxxopts
  )

  install(TARGETS tosa_reference_model DESTINATION bin)
endif()

if(BUILD_TOSA_REFERENCE_MODEL_TESTS)
  # Set definition so unit tests can find examples directory.
  add_definitions(-DPROJECT_ROOT=\"${CMAKE_CURRENT_SOURCE_DIR}/\")

  # Set doctest location if not specified.
  if(NOT DOCTEST_DIR)
    set(DOCTEST_DIR "../thirdparty/doctest/doctest")
  endif()

  # Sources only required for unit tests.
  set(CXX_SOURCE_TESTS
      test/model_runner_tests.cpp
      ${DOCTEST_DIR}/doctest.h
  )

  list(APPEND CXX_SOURCE_TESTS ${CXX_SOURCE})

  add_executable(unit_tests ${CXX_SOURCE_TESTS})

  target_include_directories(unit_tests
    PUBLIC
      $<INSTALL_INTERFACE:include>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SRC_DIR}/include>
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/src
      ${FLATBUFFERS_DIR}/include
      ${EIGEN_DIR}
      ${EIGEN_DIR}/unsupported/
      ${SERIALIZATION_DIR}/include
      ${HALF_DIR}/include
      ${DOCTEST_DIR}
    )

  target_link_libraries(unit_tests
    PRIVATE
      ${SERIALIZATION_LIB}
  )
endif()

if(BUILD_MODEL_RUNNER_SAMPLE)
  # Set definition so sample executable can find examples directory.
  add_definitions(-DPROJECT_ROOT=\"${CMAKE_CURRENT_SOURCE_DIR}/\")

  # Sources only required for example executable.
  set(CXX_SOURCE_SAMPLE
      samples/model_runner_simple_sample.cpp
  )

  list(APPEND CXX_SOURCE_SAMPLE ${CXX_SOURCE})

  add_executable(model_runner_sample ${CXX_SOURCE_SAMPLE})

  target_include_directories(model_runner_sample
    PUBLIC
      $<INSTALL_INTERFACE:include>
      $<BUILD_INTERFACE:${CMAKE_CURRENT_SRC_DIR}/include>
    PRIVATE
      ${CMAKE_CURRENT_SOURCE_DIR}/src
      ${FLATBUFFERS_DIR}/include
      ${EIGEN_DIR}
      ${EIGEN_DIR}/unsupported/
      ${SERIALIZATION_DIR}/include
      ${HALF_DIR}/include
  )

  target_link_libraries(model_runner_sample
    PRIVATE
      ${SERIALIZATION_LIB}
  )
endif()

# Follow GNU packaging norms for installation directory structure.
include(GNUInstallDirs)
install(
  TARGETS tosa_reference_model_lib EXPORT TosaReferenceModelLibTargets
  PUBLIC_HEADER
  ARCHIVE
)

install(EXPORT TosaReferenceModelLibTargets
  FILE TosaReferenceModelLibTargets.cmake
  NAMESPACE TosaReference::
  DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/tosa_reference_model_lib"
)