# Copyright (c) 2023-2024 Arm Limited.
#
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.

cmake_minimum_required(VERSION 3.13 FATAL_ERROR)

# ---------------------------------------------------------------------
# Project ArmCompute

list(APPEND CMAKE_MESSAGE_CONTEXT ArmCompute)
project(
  ArmCompute
  VERSION 35.0.0
  DESCRIPTION
    "The Arm Compute Library is a collection of low-level machine learning functions optimized for Arm® Cortex®-A CPU and Arm® Mali™ GPU architectures"
  LANGUAGES C CXX ASM)

include(GNUInstallDirs)

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Options.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.cmake)

# Require at least gcc/g++ 11) CMAKE_CXX_COMPILER_VERSION OR
if(CMAKE_C_COMPILER_VERSION VERSION_LESS 10.2 OR CMAKE_CXX_COMPILER_VERSION
                                                 VERSION_LESS 10.2)
  message(
    FATAL_ERROR "gcc and g++ version => 10.2 is required for building project!")
endif()

# ---------------------------------------------------------------------
# Configuration

set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -gdwarf-2 -DARM_COMPUTE_ASSERTS_ENABLED")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
# Default to Release Build
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
  set(CMAKE_BUILD_TYPE
      "Release"
      CACHE
        STRING
        "Choose build type, available options are: Debug, Release, RelWithDebInfo"
        FORCE)
endif()

# ---------------------------------------------------------------------
# Information

message(STATUS "Arm Compute Library ${PROJECT_VERSION}")

message(VERBOSE "-----------------------------------------------------")
message(VERBOSE "Build information:")
list(APPEND CMAKE_MESSAGE_INDENT "  ")
message(VERBOSE "Host system: ${CMAKE_SYSTEM_NAME}")
message(VERBOSE "Host processor: ${CMAKE_SYSTEM_PROCESSOR}")
message(VERBOSE "Build path: ${CMAKE_CURRENT_BINARY_DIR}")
message(VERBOSE "Enable OpenCL acceleration: ${ENABLE_OPENCL}")
message(VERBOSE "Enable CPU acceleration: ${ENABLE_NEON}")
list(POP_BACK CMAKE_MESSAGE_INDENT)
message(VERBOSE "-----------------------------------------------------")

# ---------------------------------------------------------------------
# Compile options and features

set(COMMON_CXX_FLAGS
    -Wall
    -DARCH_ARM
    -Wextra
    -Wdisabled-optimization
    -Wformat=2
    -Winit-self
    -Wstrict-overflow=2
    -Wswitch-default
    -Woverloaded-virtual
    -Wformat-security
    -Wctor-dtor-privacy
    -Wsign-promo
    -Weffc++
    -Wno-overlength-strings
    -Wno-ignored-attributes
    -Wlogical-op
    -Wnoexcept
    -Wstrict-null-sentinel
    -Wno-misleading-indentation)

# Disable note popups on compiler ABI changes
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  add_compile_options("-Wno-psabi")
endif()

# Compile with -Werror if ARM_COMPUTE_WERROR set
if(ARM_COMPUTE_WERROR)
  add_compile_options("-Werror")
endif()

# Compile with -fno-exceptions flag and define ARM_COMPUTE_EXCEPTIONS_DISABLED
# if ARM_COMPUTE_EXCEPTIONS not set
if(NOT ARM_COMPUTE_EXCEPTIONS)
  add_compile_options("-fno-exceptions")
  add_definitions(-DARM_COMPUTE_EXCEPTIONS_DISABLED)
endif()

# Link OpenMP libraries if ARM_COMPUTE_OPENMP set
if(ARM_COMPUTE_OPENMP)
  find_package(OpenMP)
  if(OpenMP_CXX_FOUND)
    link_libraries(OpenMP::OpenMP_CXX)
    add_definitions(-DARM_COMPUTE_OPENMP_SCHEDULER)
  else()
    message(FATAL_ERROR "OPENMP was set but no OpenMP library was found!")
  endif()
endif()

# ---------------------------------------------------------------------
# SVE Library

add_library(arm_compute_sve "")
target_compile_options(arm_compute_sve
                       PRIVATE "-march=armv8.2-a+sve+fp16+dotprod")
target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_BF16)
target_compile_definitions(arm_compute_sve PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_SVE)
target_include_directories(
  arm_compute_sve
  PUBLIC $<INSTALL_INTERFACE:include>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
         ${CMAKE_CURRENT_SOURCE_DIR}
  PUBLIC src
         src/core/NEON/kernels/arm_conv
         src/core/NEON/kernels/arm_gemm
         src/core/NEON/kernels/assembly
         src/core/cpu/kernels/assembly
         src/cpu/kernels/assembly
         src/core/NEON/kernels/arm_gemm/merges)

# ---------------------------------------------------------------------
# SVE2 Library

add_library(arm_compute_sve2 "")
target_compile_options(arm_compute_sve2
                       PRIVATE "-march=armv8.6-a+sve2+fp16+dotprod")
target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE2)
target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_BF16)
target_compile_definitions(arm_compute_sve2 PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE)
target_include_directories(
  arm_compute_sve2
  PUBLIC $<INSTALL_INTERFACE:include>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
         ${CMAKE_CURRENT_SOURCE_DIR}
  PUBLIC src
         src/core/NEON/kernels/arm_conv
         src/core/NEON/kernels/arm_gemm
         src/core/NEON/kernels/assembly
         src/core/cpu/kernels/assembly
         src/cpu/kernels/assembly
         src/core/NEON/kernels/arm_gemm/merges)

# ---------------------------------------------------------------------
# Core Library

add_library(arm_compute "")
target_compile_options(arm_compute PRIVATE "-march=${ARM_COMPUTE_ARCH}")
target_compile_definitions(arm_compute PRIVATE ARM_COMPUTE_ENABLE_BF16)
target_compile_definitions(arm_compute PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute PRIVATE ARM_COMPUTE_ENABLE_SVE)
target_include_directories(
  arm_compute
  PUBLIC $<INSTALL_INTERFACE:include>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
         ${CMAKE_CURRENT_SOURCE_DIR}
  PRIVATE src
          src/cpu/kernels/assembly
          src/core/NEON/kernels/arm_gemm
          src/core/NEON/kernels/assembly
          src/core/NEON/kernels/convolution/common
          src/core/NEON/kernels/arm_conv/depthwise
          src/core/NEON/kernels/convolution/winograd)
target_compile_options(arm_compute PUBLIC ${COMMON_CXX_FLAGS})

add_library(ArmCompute::Core ALIAS arm_compute)
target_link_libraries(
  arm_compute PUBLIC arm_compute_sve arm_compute_sve2)

# ---------------------------------------------------------------------
# Graph Library

add_library(arm_compute_graph "")
target_compile_options(arm_compute_graph PRIVATE "-march=${ARM_COMPUTE_ARCH}")
target_compile_definitions(arm_compute_graph PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_graph PRIVATE ARM_COMPUTE_ENABLE_SVE)
# add_subdirectory(src/graph)

target_include_directories(
  arm_compute_graph
  PUBLIC $<INSTALL_INTERFACE:include>
         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
         ${CMAKE_CURRENT_SOURCE_DIR}
  PRIVATE src
          src/cpu/kernels/assembly
          src/core/NEON/kernels/arm_gemm
          src/core/NEON/kernels/assembly
          src/core/NEON/kernels/convolution/common
          src/core/NEON/kernels/arm_conv/depthwise
          src/core/NEON/kernels/convolution/winograd)
target_compile_options(arm_compute_graph PUBLIC ${COMMON_CXX_FLAGS})

add_library(ArmCompute::Graph ALIAS arm_compute_graph)

# ---------------------------------------------------------------------
# Library Target Sources
add_subdirectory(src)

if(ARM_COMPUTE_BUILD_TESTING)
  # ---------------------------------------------------------------------
  # Validation Framework Library
  add_library(arm_compute_validation_framework "")
  # target_compile_options(arm_compute_validation_framework PRIVATE
  # "-march=armv8.2-a")
  target_compile_options(arm_compute_validation_framework
                        PRIVATE "-march=${ARM_COMPUTE_ARCH}")

  add_subdirectory(tests)
  target_include_directories(
    arm_compute_validation_framework
    PUBLIC $<INSTALL_INTERFACE:include>
          $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
          ${CMAKE_CURRENT_SOURCE_DIR})
  target_compile_options(arm_compute_validation_framework
                        PUBLIC ${COMMON_CXX_FLAGS})
                        target_link_libraries(
                          arm_compute_validation_framework
      PUBLIC arm_compute arm_compute_graph)

  # ---------------------------------------------------------------------
  # Validation Binary

  add_executable(arm_compute_validation "")
  target_compile_options(arm_compute_validation PRIVATE "-march=${ARM_COMPUTE_ARCH}")
  if(ARM_COMPUTE_ENABLE_BF16_VALIDATION)
    target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_BF16)
  endif()
  if(ARM_COMPUTE_ENABLE_SVE_VALIDATION)
    target_compile_definitions(arm_compute_validation PRIVATE ENABLE_SVE)
    target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_SVE)
  endif()
  add_subdirectory(tests/validation)
  target_compile_options(arm_compute_validation PUBLIC ${COMMON_CXX_FLAGS})
  set_target_properties(
    arm_compute_validation PROPERTIES RUNTIME_OUTPUT_DIRECTORY
                                      "${CMAKE_BINARY_DIR}/validation")
  target_link_libraries(
    arm_compute_validation
    PUBLIC arm_compute arm_compute_graph arm_compute_validation_framework
           arm_compute_sve)
  target_link_directories(arm_compute_validation PUBLIC tests)

  # ---------------------------------------------------------------------
  # Benchmark Binary

  add_executable(arm_compute_benchmark)
  target_compile_options(arm_compute_benchmark PRIVATE "-march=${ARM_COMPUTE_ARCH}")

  add_subdirectory(tests/benchmark)
  target_compile_options(arm_compute_benchmark PUBLIC ${COMMON_CXX_FLAGS})
  set_target_properties(
    arm_compute_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY
                                     "${CMAKE_BINARY_DIR}/validation")
  target_link_libraries(
    arm_compute_benchmark PUBLIC arm_compute arm_compute_graph
                                 arm_compute_validation_framework)

endif() # ARM_COMPUTE_BUILD_TESTING
# ---------------------------------------------------------------------
# Examples Binaries

if(ARM_COMPUTE_BUILD_EXAMPLES)

  add_subdirectory(examples)

  # Graph Examples
  foreach(test_name ${EXAMPLE_GRAPH_NAMES})
    add_executable(
      ${test_name} "examples/${test_name}.cpp" utils/Utils.cpp
                   utils/GraphUtils.cpp utils/CommonGraphOptions.cpp)
    target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
    set_target_properties(
      ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
                              "${CMAKE_BINARY_DIR}/examples")
    target_link_libraries(${test_name} PUBLIC arm_compute
                                              arm_compute_graph arm_compute_sve)
  endforeach()

  # NEON Examples
  foreach(test_name ${EXAMPLE_NEON_NAMES})
    add_executable(${test_name} "examples/${test_name}.cpp" utils/Utils.cpp)
    target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
    set_target_properties(
      ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
                              "${CMAKE_BINARY_DIR}/examples")
    target_link_libraries(${test_name} PUBLIC arm_compute)
  endforeach()

endif() # ARM_COMPUTE_BUILD_EXAMPLES
