#-------------------------------------------------------------------------------
# Copyright (c) 2020-2022, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------

#[===[.rst:
  The base deployment CMake file
  ------------------------------

  Contains common CMake definitions that are used by concrete deployments.
  This file should be included first by a concrete deployment's CMakeLists.txt.
#]===]

# Sets TS-ROOT which is used as the reference directory for everything contained within the project
get_filename_component(TS_ROOT "${CMAKE_CURRENT_LIST_DIR}/../" ABSOLUTE CACHE PATH "Trusted Services root directory.")

# Replicate TS_ROOT as environment variable to allow access from child CMake contexts
set(ENV{TS_ROOT} "${TS_ROOT}")

# Common utilities used by the build system
include(${TS_ROOT}/tools/cmake/common/Utils.cmake REQUIRED)
include(${TS_ROOT}/tools/cmake/common/AddComponents.cmake REQUIRED)
include(${TS_ROOT}/tools/cmake/common/AddPlatform.cmake REQUIRED)
include(${TS_ROOT}/tools/cmake/common/TsGetVersion.cmake REQUIRED)

# Check build environment requirements are met
ts_verify_build_env()

# Project wide include directories
set(TOP_LEVEL_INCLUDE_DIRS
  "${TS_ROOT}"
  "${TS_ROOT}/components"
  )

# Set platform provider root default to use if no commandline variable value has been specified.
# The root path may be specified to allow an external project to provide platform definitions.
if (DEFINED ENV{TS_PLATFORM_ROOT})
  set(_default_platform_root ENV{TS_PLATFORM_ROOT})
else()
  set(_default_platform_root "${TS_ROOT}/platform/providers")
endif()
set(TS_PLATFORM_ROOT ${_default_platform_root} CACHE STRING "Platform provider path")

# Set the default platform to use if no explict platform has been specified on the cmake commandline.
if (DEFINED ENV{TS_PLATFORM})
  set(_default_platform ENV{TS_PLATFORM})
else()
  set(_default_platform "ts/vanilla")
endif()
set(TS_PLATFORM ${_default_platform} CACHE STRING "Selected platform")

# Custom property for defining platform feature dependencies based on components used in a deployment
define_property(TARGET PROPERTY TS_PLATFORM_DRIVER_DEPENDENCIES
  BRIEF_DOCS "List of platform driver interfaces used for a deployment."
  FULL_DOCS "Used by the platform specific builder to specify a configuration for the built platform components."
  )

# Set default build type to Debug
if (NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Build type.")
endif()

# List of supported build types. Needs to be in alignment with the toolchain file
set(TS_SUPPORTED_BUILD_TYPES DEBUG "MINSIZEREL" "MINSIZWITHDEBINFO" "RELEASE" "RELWITHDEBINFO" CACHE
  STRING "List of supported build types.")

# Convert the build type string to upper case to help case insensitive comparison.
string(TOUPPER "${CMAKE_BUILD_TYPE}" UC_CMAKE_BUILD_TYPE CACHE STRING "Easy to compare build type.")
mark_as_advanced(UC_CMAKE_BUILD_TYPE)

# Validate build type
if (NOT "${UC_CMAKE_BUILD_TYPE}" IN_LIST TS_SUPPORTED_BUILD_TYPES)
	message(FATAL_ERROR "Unknown build type \"${CMAKE_BUILD_TYPE}\" specified in CMAKE_BUILD_TYPE.")
endif()

# Default protocol UUID used by TS SPs.
set(TS_RPC_UUID_CANON "bdcd76d7-825e-4751-963b-86d4f84943ac" CACHE STRING "Trusted Services PRC (protocol) UUID.")
