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