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

#When included, this file will add a target to build the Mbed Crypto libraries
#with the same compilation setting as used by the file including this one.
cmake_minimum_required(VERSION 3.7)

#Define where mbed-crypto intermediate output files are stored.
set (MBEDCRYPTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/mbed-crypto")

#Check input variables
if(NOT DEFINED MBEDCRYPTO_DEBUG)
    message(FATAL_ERROR "Please set MBEDCRYPTO_DEBUG to 'OFF' or 'ON' before including this file.")
endif()

if(NOT DEFINED MBEDCRYPTO_SOURCE_DIR)
    message(FATAL_ERROR "Please set MBEDCRYPTO_SOURCE_DIR before including this file.")
endif()

if(NOT DEFINED MBEDCRYPTO_INSTALL_DIR)
    message(FATAL_ERROR "Please set MBEDCRYPTO_INSTALL_DIR before including this file.")
endif()

if(NOT DEFINED MBEDCRYPTO_C_FLAGS)
    message(FATAL_ERROR "Please set MBEDCRYPTO_C_FLAGS before including this file.")
endif()

if(NOT DEFINED MBEDCRYPTO_TARGET_NAME)
    message(FATAL_ERROR "Please set MBEDCRYPTO_TARGET_NAME before including this file.")
endif()

if(MBEDCRYPTO_DEBUG)
    set(MBEDCRYPTO_BUILD_TYPE "Debug")
else()
    set(MBEDCRYPTO_BUILD_TYPE "MinSizeRel")
endif()

#Based on preinclude input variables, decide if preinclude flags need to be appended
if((NOT DEFINED MBEDCRYPTO_PREINCLUDE_PREFIX) OR (NOT DEFINED MBEDCRYPTO_PREINCLUDE_HEADER))
    message(STATUS "Building mbed-crypto(mbedtls) without pre-included headers and global symbols prefixing.")
else()
    compiler_get_preinclude_option_string(${MBEDCRYPTO_PREINCLUDE_HEADER} _PRE_INC_STRING)
    set(MBEDCRYPTO_PREINCLUDE_C_FLAGS " -DLIB_PREFIX_NAME=${MBEDCRYPTO_PREINCLUDE_PREFIX} ${_PRE_INC_STRING}")
    string(APPEND MBEDCRYPTO_C_FLAGS ${MBEDCRYPTO_PREINCLUDE_C_FLAGS})
endif()

function(get_mbedcrypto_mbedtls_version)
    file(READ "${MBEDCRYPTO_SOURCE_DIR}/include/mbedtls/version.h" MBEDCRYPTO_MBEDTLS_VER_FILE)
    string(REGEX REPLACE ".*#define[ ]+MBEDTLS_VERSION_STRING[^\"]+\"+([0-9.]+)\".*" "\\1"
        _MBEDCRYPTO_MBEDTLS_VER ${MBEDCRYPTO_MBEDTLS_VER_FILE})
    set(MBEDCRYPTO_MBEDTLS_VERSION ${_MBEDCRYPTO_MBEDTLS_VER} PARENT_SCOPE)
endfunction()

get_mbedcrypto_mbedtls_version()

string(APPEND MBEDCRYPTO_C_FLAGS ${CMAKE_C_FLAGS})

# Workaround Mbed TLS issue https://github.com/ARMmbed/mbedtls/issues/1077
if ((${ARM_CPU_ARCHITECTURE} STREQUAL "ARMv8-M.BASE") OR
    (${ARM_CPU_ARCHITECTURE} STREQUAL "ARMv6-M") OR
    (${ARM_CPU_ARCHITECTURE} STREQUAL "ARMv6S-M"))
   string(APPEND MBEDCRYPTO_C_FLAGS " -DMULADDC_CANNOT_USE_R7")
endif()

if (TARGET ${MBEDCRYPTO_TARGET_NAME})
   message(FATAL_ERROR "A target with name ${MBEDCRYPTO_TARGET_NAME} is already\
defined. Please set MBEDCRYPTO_TARGET_NAME to a unique value.")
endif()

#Build mbed-crypto as external project.
#This ensures mbed-crypto is built with exactly defined settings.
#mbed-crypto will be used from its install location
include(ExternalProject)
# Add Mbed Crypto files to the build.
set(_static_lib_command ${CMAKE_C_CREATE_STATIC_LIBRARY})
externalproject_add(${MBEDCRYPTO_TARGET_NAME}
    SOURCE_DIR ${MBEDCRYPTO_SOURCE_DIR}
    #Set Mbed Crypto features
    CMAKE_ARGS -DENABLE_TESTING=OFF -DENABLE_PROGRAMS=OFF
    CMAKE_ARGS -DMBEDTLS_FATAL_WARNINGS=OFF
    #Enforce our build system's settings.
    CMAKE_ARGS -DCMAKE_MODULE_PATH=${CMAKE_MODULE_PATH} -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME}
    #Inherit the build setting of this project
    CMAKE_ARGS -DCMAKE_BUILD_TYPE=${MBEDCRYPTO_BUILD_TYPE}
    #C compiler settings
    CMAKE_CACHE_ARGS -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
    CMAKE_CACHE_ARGS -DCMAKE_C_COMPILER_ID:STRING=${CMAKE_C_COMPILER_ID}
    CMAKE_CACHE_ARGS -DCMAKE_C_FLAGS:STRING=${MBEDCRYPTO_C_FLAGS}
    CMAKE_CACHE_ARGS -DCMAKE_C_FLAGS_DEBUG:STRING=${CMAKE_C_FLAGS_DEBUG}
    CMAKE_CACHE_ARGS -DCMAKE_C_FLAGS_MINSIZEREL:STRING=${CMAKE_C_FLAGS_MINSIZEREL}
    CMAKE_CACHE_ARGS -DCMAKE_C_FLAGS_RELEASE:STRING=${CMAKE_C_FLAGS_RELEASE}
    CMAKE_CACHE_ARGS -DCMAKE_C_OUTPUT_EXTENSION:STRING=.o
    CMAKE_CACHE_ARGS -DCMAKE_C_COMPILER_WORKS:STRING=true
    #Archiver settings
    CMAKE_CACHE_ARGS -DCMAKE_AR:STRING=${CMAKE_AR}
    CMAKE_CACHE_ARGS -DCMAKE_C_CREATE_STATIC_LIBRARY:STRING=${_static_lib_command}
    CMAKE_CACHE_ARGS -DCMAKE_C_LINK_EXECUTABLE:STRING=${CMAKE_C_LINK_EXECUTABLE}
    CMAKE_CACHE_ARGS -DCMAKE_STATIC_LIBRARY_PREFIX_C:STRING=${CMAKE_STATIC_LIBRARY_PREFIX_C}
    CMAKE_CACHE_ARGS -DCMAKE_STATIC_LIBRARY_PREFIX_CXX:STRING=${CMAKE_STATIC_LIBRARY_PREFIX_CXX}
    #Install location
    CMAKE_CACHE_ARGS -DCMAKE_INSTALL_PREFIX:STRING=${MBEDCRYPTO_INSTALL_DIR}
    #Place for intermediate build files
    BINARY_DIR ${MBEDCRYPTO_BINARY_DIR})

#Add an install target to force installation after each mbed-crypto build. Without
#this target installation happens only when a clean mbed-crypto build is executed.
add_custom_target(${MBEDCRYPTO_TARGET_NAME}_install
    COMMAND ${CMAKE_COMMAND} --build ${MBEDCRYPTO_BINARY_DIR}  -- install
    BYPRODUCTS ${MBEDCRYPTO_INSTALL_DIR}/lib/${CMAKE_STATIC_LIBRARY_PREFIX_C}mbedcrypto${CMAKE_STATIC_LIBRARY_SUFFIX_C}
    WORKING_DIRECTORY ${MBEDCRYPTO_BINARY_DIR}
    COMMENT "Installing Mbed Crypto(MbedTLS) to ${MBEDCRYPTO_INSTALL_DIR}"
    VERBATIM)
#Make install rule depend on Mbed Crypto library build
add_dependencies(${MBEDCRYPTO_TARGET_NAME}_install ${MBEDCRYPTO_TARGET_NAME})

add_custom_command(TARGET ${MBEDCRYPTO_TARGET_NAME}_install
                   POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                           ${MBEDCRYPTO_INSTALL_DIR}/include/psa
                           ${MBEDCRYPTO_INSTALL_DIR}/include/mbedcrypto/psa
                   COMMAND ${CMAKE_COMMAND} -E remove_directory
                           ${MBEDCRYPTO_INSTALL_DIR}/include/psa)
