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