CMake: link TF-M for both memory partition

This patch introduces the MCUBOOT_NO_SWAP compiler switch:
  - Default value is False to preserve swapping functionality to be
    default
  - When disabling it then TF-M is built in one instance:
    - tfm_sign.bin:   linked to run in XIP mode from slot 0 memory
      partition
  - When enabling it then TF-M is built in two instances:
    - tfm_sign_0.bin: linked to run in XIP mode from slot 0 memory
      partition
    - tfm_sign_1.bin: linked to run in XIP mode from slot 1 memory
      partition

Change-Id: I2757601295c80a42aba351a6d89c17f78dad3a0f
Signed-off-by: Tamas Ban <tamas.ban@arm.com>
Co-Authored-By: Mate Toth-Pal <mate.toth-pal@arm.com>
Co-Authored-By: Gyorgy Szing <Gyorgy.Szing@arm.com>
diff --git a/bl2/ext/mcuboot/CMakeLists.txt b/bl2/ext/mcuboot/CMakeLists.txt
index fb0d4ca..0ab7dcd 100644
--- a/bl2/ext/mcuboot/CMakeLists.txt
+++ b/bl2/ext/mcuboot/CMakeLists.txt
@@ -90,10 +90,10 @@
 include(${TFM_ROOT_DIR}/BuildMbedtls.cmake)
 
 #Setting include directories
-embedded_include_directories(PATH ${TFM_ROOT_DIR} ABSOLUTE APPEND)
-embedded_include_directories(PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/include ABSOLUTE APPEND)
-embedded_include_directories(PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/bootutil/include/ ABSOLUTE APPEND)
-embedded_include_directories(PATH ${MBEDTLS_INSTALL_DIR}/include ABSOLUTE APPEND)
+embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR} ABSOLUTE APPEND)
+embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/include ABSOLUTE APPEND)
+embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${TFM_ROOT_DIR}/bl2/ext/mcuboot/bootutil/include/ ABSOLUTE APPEND)
+embedded_target_include_directories(TARGET ${PROJECT_NAME} PATH ${MBEDTLS_INSTALL_DIR}/include ABSOLUTE APPEND)
 
 #Define linker file
 if(NOT DEFINED BL2_LINKER_CONFIG)
@@ -108,6 +108,10 @@
 
 add_executable(${PROJECT_NAME} ${ALL_SRC_ASM_BL2} ${ALL_SRC_C} ${ALL_SRC_CXX})
 
+#Set common compiler and linker flags
+config_setting_shared_compiler_flags(${PROJECT_NAME})
+config_setting_shared_linker_flags(${PROJECT_NAME})
+
 #Add BL2 define to linker to resolve symbols in region_defs.h
 embedded_set_target_link_defines(TARGET ${PROJECT_NAME} DEFINES "BL2")
 
@@ -125,7 +129,25 @@
 							MCUBOOT_VALIDATE_SLOT0
 							MCUBOOT_USE_FLASH_AREA_GET_SECTORS
 							MBEDTLS_CONFIG_FILE="config-boot.h"
-						)
+							MCUBOOT_TARGET_CONFIG="flash_layout.h")
+
+if (MCUBOOT_NO_SWAP)
+	target_compile_definitions(${PROJECT_NAME} PRIVATE MCUBOOT_NO_SWAP)
+endif()
+
+#Set install location. Keep original value to avoid overriding command line settings.
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+	set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/install" CACHE PATH "Default install location for MCUBoot." FORCE)
+endif()
+
+#Collect executables to common location: build/install/outputs/
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.axf
+			  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin
+		DESTINATION outputs/${TARGET_PLATFORM}/)
+
+install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.axf
+			  ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.bin
+		DESTINATION outputs/fvp/)
 
 #Finally let cmake system apply changes after the whole project is defined.
 embedded_project_end(${PROJECT_NAME})
diff --git a/bl2/ext/mcuboot/MCUBoot.cmake b/bl2/ext/mcuboot/MCUBoot.cmake
new file mode 100644
index 0000000..cdcfcbd
--- /dev/null
+++ b/bl2/ext/mcuboot/MCUBoot.cmake
@@ -0,0 +1,62 @@
+#-------------------------------------------------------------------------------
+# Copyright (c) 2018, Arm Limited. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+#-------------------------------------------------------------------------------
+
+cmake_minimum_required(VERSION 3.7)
+
+function(mcuboot_create_boot_payload)
+	set( _OPTIONS_ARGS)                                          #Option (on/off) arguments (e.g. IGNORE_CASE)
+	set( _ONE_VALUE_ARGS S_BIN NS_BIN FULL_BIN SIGN_BIN POSTFIX) #Single option arguments (e.g. PATH "./foo/bar")
+	set( _MULTI_VALUE_ARGS)                                      #List arguments (e.g. LANGUAGES C ASM CXX)
+	cmake_parse_arguments(_MY_PARAMS "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN})
+
+	if (NOT DEFINED _MY_PARAMS_S_BIN)
+		message(FATAL_ERROR "mcuboot_create_boot_payload(): mandatory parameter 'S_BIN' missing.")
+	endif()
+
+	if (NOT DEFINED _MY_PARAMS_NS_BIN)
+		message(FATAL_ERROR "mcuboot_create_boot_payload(): mandatory parameter 'NS_BIN' missing.")
+	endif()
+
+	if (NOT DEFINED _MY_PARAMS_FULL_BIN)
+		message(FATAL_ERROR "mcuboot_create_boot_payload(): mandatory parameter 'FULL_BIN' missing.")
+	endif()
+
+	if (NOT DEFINED _MY_PARAMS_SIGN_BIN)
+		message(FATAL_ERROR "mcuboot_create_boot_payload(): mandatory parameter 'SIGN_BIN' missing.")
+	endif()
+
+	#Find Python3.x interpreter
+	find_package(PythonInterp 3)
+	if (NOT PYTHONINTERP_FOUND)
+		message(FATAL_ERROR "Failed to find Python3.x interpreter. Pyhton3 must be installed and available on the PATH.")
+	endif()
+
+	if(NOT DEFINED FLASH_LAYOUT)
+		message(FATAL_ERROR "ERROR: Incomplete Configuration: FLASH_LAYOUT is not defined.")
+	endif()
+
+	add_custom_command(TARGET ${_MY_PARAMS_NS_BIN}
+						POST_BUILD
+
+						#Create concatenated binary image from the two binary file
+						COMMAND ${PYTHON_EXECUTABLE} ${MCUBOOT_DIR}/scripts/assemble.py
+						ARGS -l ${FLASH_LAYOUT}
+							 -s $<TARGET_FILE_DIR:${_MY_PARAMS_S_BIN}>/${_MY_PARAMS_S_BIN}.bin
+							 -n $<TARGET_FILE_DIR:${_MY_PARAMS_NS_BIN}>/${_MY_PARAMS_NS_BIN}.bin
+							 -o ${CMAKE_BINARY_DIR}/${_MY_PARAMS_FULL_BIN}.bin
+
+						#Sign concatenated binary image with default public key in mcuboot folder
+						COMMAND ${PYTHON_EXECUTABLE} ${MCUBOOT_DIR}/scripts/imgtool.py
+						ARGS sign
+							 -k ${MCUBOOT_DIR}/root-rsa-2048.pem
+							 --align 1
+							 -v 1.0
+							 -H 0x400
+							 --pad ${SIGN_BIN_SIZE}
+							 ${CMAKE_BINARY_DIR}/${_MY_PARAMS_FULL_BIN}.bin
+							 ${CMAKE_BINARY_DIR}/${_MY_PARAMS_SIGN_BIN}.bin)
+endfunction()
\ No newline at end of file