diff --git a/scripts/cmake/bare-metal-sources.cmake b/scripts/cmake/bare-metal-sources.cmake
index 8b348e3..2bfe616 100644
--- a/scripts/cmake/bare-metal-sources.cmake
+++ b/scripts/cmake/bare-metal-sources.cmake
@@ -28,13 +28,15 @@
 if (NOT DEFINED MEM_PROFILES_SRC_DIR)
     set(MEM_PROFILES_SRC_DIR    ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/subsystem-profiles)
 endif()
+
 set(MEM_PROFILE_TEMPLATE    ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/peripheral_memmap.h.template)
 set(IRQ_PROFILE_TEMPLATE    ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/peripheral_irqs.h.template)
 set(MEM_REGIONS_TEMPLATE    ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/mem_regions.h.template)
 set(TA_SETTINGS_TEMPLATE    ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/templates/timing_adapter_settings.template)
+set(LINKER_SCRIPT_DIR       "${PLAT_HAL}/bsp/mem_layout")
 set(TENSORFLOW_LITE_MICRO_PLATFORM_LIB_NAME  "libtensorflow-microlite.a")
 set(TENSORFLOW_LITE_MICRO_FLAG               "-DTF_LITE_STATIC_MEMORY")
-set(ETHOS_U55_FLAG          "-DARM_NPU=1")
+set(ETHOS_U55_FLAG                           "-DARM_NPU=1")
 
 if (ETHOS_U55_ENABLED)
     set(OPTIONAL_FLAGS      "${OPTIONAL_FLAGS} ${ETHOS_U55_FLAG}")
@@ -54,23 +56,33 @@
     if (TARGET_SUBSYSTEM STREQUAL sse-300)
         message(STATUS          "target subsystem is ${TARGET_SUBSYSTEM}")
         set(BSP_PACKAGE_DIR     "${PLAT_HAL}/bsp/bsp-packs/mps3")
-        set(SCAT_FILE           "${PLAT_HAL}/bsp/mem_layout/mps3-${TARGET_SUBSYSTEM}.sct")
+        set(LINKER_SCRIPT_NAME  "${TARGET_PLATFORM}-${TARGET_SUBSYSTEM}")
 
         # Include the mem profile definitions specific to our target subsystem
         include(${MEM_PROFILES_SRC_DIR}/corstone-${TARGET_SUBSYSTEM}.cmake)
         set(OPTIONAL_FLAGS      "${OPTIONAL_FLAGS} ${MPS3_PLATFORM_FLAG}")
+
+        # For deployment on the MPS3 FPGA platform, we need to produce
+        # two bin files - one that is loaded into the ITCM, and another
+        # that is loaded into the DDR region.
+        set(MPS3_SECTION_PATTERNS   "*.at_itcm" "*.at_ddr")
+        set(MPS3_OUTPUT_BIN_NAMES   "itcm.bin"  "ddr.bin")
+        set(MPS3_FPGA_CONFIG        "${CMAKE_CURRENT_SOURCE_DIR}/scripts/${TARGET_PLATFORM}/${TARGET_SUBSYSTEM}/images.txt")
     else ()
         message(FATAL_ERROR "Non compatible target subsystem: ${TARGET_SUBSYSTEM}")
     endif ()
 elseif (TARGET_PLATFORM STREQUAL simple_platform)
     set(BSP_PACKAGE_DIR     "${PLAT_HAL}/bsp/bsp-packs/${TARGET_PLATFORM}")
-    set(SCAT_FILE           "${PLAT_HAL}/bsp/mem_layout/${TARGET_PLATFORM}.sct")
+    set(LINKER_SCRIPT_NAME  "${TARGET_PLATFORM}")
     include(${MEM_PROFILES_SRC_DIR}/${TARGET_PLATFORM}.cmake)
     set(OPTIONAL_FLAGS      "${OPTIONAL_FLAGS}")
 else ()
     message(FATAL_ERROR "Non compatible target platform ${TARGET_PLATFORM}")
 endif ()
 
+# Add link options for the linker script to be used:
+add_linker_script(${LINKER_SCRIPT_DIR} ${LINKER_SCRIPT_NAME})
+
 if (ETHOS_U55_ENABLED)
     USER_OPTION(TA_CONFIG_FILE "Path to the timing adapter configuration file"
             "${CMAKE_SCRIPTS_DIR}/ta_config.cmake"
@@ -91,7 +103,6 @@
 configure_file("${MEM_REGIONS_TEMPLATE}" "${SOURCE_GEN_DIR}/mem_regions.h")
 configure_file("${TA_SETTINGS_TEMPLATE}" "${SOURCE_GEN_DIR}/timing_adapter_settings.h")
 
-message(STATUS "Scatter file: ${SCAT_FILE}")
 message(STATUS "Using BSP package from: ${BSP_PACKAGE_DIR}")
 
 if (DEFINED VERIFY_TEST_OUTPUT)
@@ -114,27 +125,14 @@
     set(OPTIONAL_FLAGS "${OPTIONAL_FLAGS} -gdwarf-${ARMCLANG_DEBUG_DWARF_LEVEL}")
 endif()
 
-set(COMPILER_FLAGS              "${ALL_COMMON_FLAGS} ${TENSORFLOW_LITE_MICRO_FLAG} ${PROFILING_OPT} ${OPTIONAL_FLAGS}")
+set(COMPILER_FLAGS              "${TENSORFLOW_LITE_MICRO_FLAG} ${PROFILING_OPT} ${OPTIONAL_FLAGS}")
 # For some reason, cmake doesn't pass the c++ standard flag, adding it manually
 set(CMAKE_CXX_FLAGS             "${COMPILER_FLAGS} -std=c++11" CACHE INTERNAL "")
 set(CMAKE_C_FLAGS               "${COMPILER_FLAGS}" CACHE INTERNAL "")
-set(CMAKE_ASM_FLAGS             "${CPU_LD}")
 set(CMAKE_ASM_COMPILE_OBJECT    ${CMAKE_CXX_FLAGS})
 
-add_link_options(--strict --callgraph --load_addr_map_info --map)
-add_link_options(--symbols --xref --scatter=${SCAT_FILE})
-
-# Warnings to be ignored:
-# L6314W = No section matches pattern
-# L6439W = Multiply defined Global Symbol
-add_link_options(--diag_suppress=L6439W,L6314W)
-add_link_options(--info sizes,totals,unused,veneers --entry Reset_Handler)
-
-if (CMAKE_BUILD_TYPE STREQUAL Release)
-    add_link_options(--no_debug)
-endif ()
-
-set(CMAKE_EXE_LINKER_FLAGS "${CPU_LD}")
+# Tell linker that reset interrupt handler is our entry point
+add_link_options(--entry Reset_Handler)
 
 set(PLAT_BSP_INCLUDES
     ${PLAT_HAL}/bsp/cmsis-device/include
@@ -168,3 +166,7 @@
     "${PLAT_HAL}/bsp/bsp-core/*.c"
     "${BSP_PACKAGE_DIR}/*.c"
     )
+
+# Special retarget source to direct stdin, stdout and stderr streams to the
+# UART block.
+set(PLAT_RETARGET_SOURCE "${PLAT_HAL}/bsp/bsp-core/retarget.c")
diff --git a/scripts/cmake/bare-metal-toolchain.cmake b/scripts/cmake/bare-metal-toolchain.cmake
deleted file mode 100644
index 5d91b98..0000000
--- a/scripts/cmake/bare-metal-toolchain.cmake
+++ /dev/null
@@ -1,65 +0,0 @@
-#----------------------------------------------------------------------------
-#  Copyright (c) 2021 Arm Limited. All rights reserved.
-#  SPDX-License-Identifier: Apache-2.0
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-#----------------------------------------------------------------------------
-# specify the cross compiler
-set(CMAKE_C_COMPILER                armclang)
-set(CMAKE_CXX_COMPILER              armclang)
-set(CMAKE_C_LINKER_PREFERENCE       armlink)
-set(CMAKE_ASM_LINKER_PREFERENCE     armlink)
-set(CMAKE_ASM_COMPILER              armasm)
-set(CMAKE_ASM_COMPILER_AR           armar)
-
-set(CMAKE_CROSSCOMPILING            true)
-set(CMAKE_SYSTEM_NAME               Generic)
-
-set(MIN_ARM_CLANG_VERSION           6.14)
-
-if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
-    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55)
-endif()
-
-# Skip compiler test execution
-set(CMAKE_C_COMPILER_WORKS          1)
-set(CMAKE_CXX_COMPILER_WORKS        1)
-
-set(PLATFORM_HAL                    1)
-
-set(WARNING_OPTS                    "-Wall -Wextra -Wvla")
-set(SPECIAL_OPTS                    "-fno-rtti -funsigned-char -fno-function-sections -fno-exceptions")
-set(PLATFORM_FLAGS                  "-mthumb --target=arm-arm-non-eabi -mlittle-endian -DPLATFORM_HAL=${PLATFORM_HAL}")
-
-set(CMAKE_C_FLAGS_DEBUG             "-DDEBUG -O0")
-set(CMAKE_C_FLAGS_RELEASE           "-DNDEBUG -O3")
-
-set(CMAKE_CXX_FLAGS_DEBUG           "-DDEBUG -O0")
-set(CMAKE_CXX_FLAGS_RELEASE         "-DNDEBUG -O3")
-
-if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55)
-    # Flags for cortex-m55
-    set(CPU_CORTEX_M55              1)
-    set(CPU_CC                      "-mcpu=cortex-m55 -mfloat-abi=hard -MD -DCPU_CORTEX_M55=1 -DARM_MATH_DSP -DARM_MATH_LOOPUNROLL -D__FPU_USED=1")
-    set(CPU_LD                      "--cpu=8.1-M.Main.dsp")
-elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33)
-    # Flags for cortex-m33 to go here
-endif()
-
-set(ALL_COMMON_FLAGS                "${CPU_CC} ${WARNING_OPTS} ${SPECIAL_OPTS} ${PLATFORM_FLAGS}")
-
-function(enforce_compiler_version)
-    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_ARM_CLANG_VERSION})
-        message( FATAL_ERROR "Arm compiler version must be ${MIN_ARM_CLANG_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." )
-    endif()
-endfunction()
diff --git a/scripts/cmake/cmsis-dsp.cmake b/scripts/cmake/cmsis-dsp.cmake
index cb0243b..bb26b69 100644
--- a/scripts/cmake/cmsis-dsp.cmake
+++ b/scripts/cmake/cmsis-dsp.cmake
@@ -37,7 +37,16 @@
 
 file(GLOB_RECURSE
     CMSIS_DSP_SRC
-    "${CMSIS_DSP_SRC_DIR}/arm_*.c")
+
+    "${CMSIS_DSP_SRC_DIR}/BasicMathFunctions/arm_*.c"
+    "${CMSIS_DSP_SRC_DIR}/FastMathFunctions/arm_*.c"
+    "${CMSIS_DSP_SRC_DIR}/CommonTables/arm_*.c"
+    "${CMSIS_DSP_SRC_DIR}/TransformFunctions/arm_*.c"
+    "${CMSIS_DSP_SRC_DIR}/StatisticsFunctions/arm_*.c"
+
+    # Issue with q15 and q31 functions with Arm GNU toolchain, we only
+    # need f32 functions.
+    "${CMSIS_DSP_SRC_DIR}/ComplexMathFunctions/arm_*f32.c")
 
 # 4. Create static library
 set(CMSIS_DSP_TARGET        cmsis-dsp)
@@ -50,6 +59,20 @@
 target_include_directories(${CMSIS_DSP_TARGET} PRIVATE
                            ${CMSIS_DSP_PRI_INC_DIR})
 
+if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+    target_compile_options(${CMSIS_DSP_TARGET} PUBLIC -flax-vector-conversions)
+
+    # There is a known issue with -O0 optimisation option that affects
+    # FFT functions from CMSIS-DSP when compiling with Arm GNU embedded
+    # toolchain version 10.2.1
+    if (CMAKE_BUILD_TYPE STREQUAL Debug)
+        message(WARNING "There are known issues with CMSIS-DSP builds using "
+                        "MVE extension without optimisation. Forcing -O3 "
+                        "optimisation level")
+        target_compile_options(${CMSIS_DSP_TARGET} PUBLIC -O3)
+    endif()
+endif ()
+
 # 5. Add any custom/conditional flags for compilation or linkage
 if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL cortex-m55)
     target_compile_definitions(${CMSIS_DSP_TARGET} PUBLIC
diff --git a/scripts/cmake/native-sources.cmake b/scripts/cmake/native-sources.cmake
index 743e075..1b1431a 100644
--- a/scripts/cmake/native-sources.cmake
+++ b/scripts/cmake/native-sources.cmake
@@ -34,13 +34,11 @@
 set(TENSORFLOW_LITE_MICRO_FLAGS "-DTF_LITE_STATIC_MEMORY -DACTIVATION_BUF_SRAM_SZ=0")
 
 set(CMAKE_C_FLAGS
-        "${WARNING_FLAGS} ${SPECIAL_OPTS} ${PLATFORM_FLAGS}\
-        ${PROFILING_OPT} ${TF_FLAG} ${LOG_FLAG} ${TENSORFLOW_LITE_MICRO_FLAGS}"
+        "${PROFILING_OPT} ${LOG_FLAG} ${TENSORFLOW_LITE_MICRO_FLAGS}"
         CACHE INTERNAL "")
+
 set(CMAKE_CXX_FLAGS
-        "${WARNING_FLAGS} ${SPECIAL_OPTS} ${SPECIAL_OPTS_CXX}\
-        ${PLATFORM_FLAGS} ${PROFILING_OPT} ${TF_FLAG} ${LOG_FLAG}\
-        ${TENSORFLOW_LITE_MICRO_FLAGS}"
+        "${PROFILING_OPT} ${LOG_FLAG} ${TENSORFLOW_LITE_MICRO_FLAGS}"
         CACHE INTERNAL "")
 
 # Include directories:
diff --git a/scripts/cmake/toolchains/bare-metal-armclang.cmake b/scripts/cmake/toolchains/bare-metal-armclang.cmake
new file mode 100644
index 0000000..0a86eb6
--- /dev/null
+++ b/scripts/cmake/toolchains/bare-metal-armclang.cmake
@@ -0,0 +1,134 @@
+#----------------------------------------------------------------------------
+#  Copyright (c) 2021 Arm Limited. All rights reserved.
+#  SPDX-License-Identifier: Apache-2.0
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#----------------------------------------------------------------------------
+# specify the cross compiler
+set(CMAKE_C_COMPILER                armclang)
+set(CMAKE_CXX_COMPILER              armclang)
+set(CMAKE_C_LINKER_PREFERENCE       armlink)
+set(CMAKE_ASM_LINKER_PREFERENCE     armlink)
+set(CMAKE_ASM_COMPILER              armasm)
+set(CMAKE_ASM_COMPILER_AR           armar)
+
+set(CMAKE_CROSSCOMPILING            true)
+set(CMAKE_SYSTEM_NAME               Generic)
+
+set(MIN_ARM_CLANG_VERSION           6.14)
+
+# Skip compiler test execution
+set(CMAKE_C_COMPILER_WORKS          1)
+set(CMAKE_CXX_COMPILER_WORKS        1)
+set(PLATFORM_HAL                    1)
+
+if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
+    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55)
+endif()
+
+if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55)
+    # Flags for cortex-m55
+    set(CPU_COMPILE_DEF             CPU_CORTEX_M55)
+    set(CPU_NAME                    ${CMAKE_SYSTEM_PROCESSOR})
+    set(FLOAT_ABI                   hard)
+    set(ARM_MATH_DSP                1)
+    set(ARM_MATH_LOOPUNROLL         1)
+    set(CPU_LINK_OPT                "--cpu=8.1-M.Main.dsp")
+elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33)
+    # Flags for cortex-m33 to go here
+endif()
+
+set(${CPU_COMPILE_DEF}              1)
+
+# Warning options
+add_compile_options(
+    -Wall
+    -Wextra
+    -Wvla)
+
+# General purpose compile options:
+add_compile_options(
+    -funsigned-char
+    -fno-function-sections
+    "$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables;-fno-rtti;-fno-exceptions>")
+
+# Arch compile options:
+add_compile_options(
+    -mthumb
+    -mcpu=${CPU_NAME}
+    -mfloat-abi=${FLOAT_ABI}
+    --target=arm-arm-non-eabi
+    -mlittle-endian
+    -MD)
+
+# Compile definitions:
+add_compile_definitions(
+    PLATFORM_HAL=${PLATFORM_HAL}
+    ${CPU_COMPILE_DEF}=1
+    $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP>
+    $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>)
+
+# Link options:
+add_link_options(${CPU_LINK_OPT})
+set(CMAKE_ASM_FLAGS "${CPU_LINK_OPT}")
+
+# Warnings to be ignored:
+# L6314W = No section matches pattern
+# L6439W = Multiply defined Global Symbol
+add_link_options(
+    --diag_suppress=L6439W,L6314W
+    --info sizes,totals,unused,veneers
+    --strict
+    --callgraph
+    --load_addr_map_info
+    --xref
+    "$<$<CONFIG:RELEASE>:--no_debug>")
+
+# Function to add a map file output for the linker to dump diagnostic information to.
+function(add_target_map_file TARGET_NAME MAP_FILE_PATH)
+    target_link_options(${TARGET_NAME} PUBLIC
+        --map --symbols --list=${MAP_FILE_PATH})
+endfunction()
+
+# Function to add linker option to use the chosen linker script (scatter file).
+function(add_linker_script SCRIPT_DIR SCRIPT_NAME)
+    set(LINKER_SCRIPT_PATH ${SCRIPT_DIR}/${SCRIPT_NAME}.sct
+        CACHE STRING "Linker script path")
+    if (NOT EXISTS ${LINKER_SCRIPT_PATH})
+        message(FATAL_ERROR "Scatter file not found: ${LINKER_SCRIPT_PATH}")
+    endif()
+    message(STATUS "Using linker script: ${LINKER_SCRIPT_PATH}")
+    add_link_options(--scatter=${LINKER_SCRIPT_PATH})
+endfunction()
+
+# Function to set the command to copy/extract contents from an elf
+# into a binary file.
+function(add_bin_generation_command)
+
+    set(multiValueArgs SECTION_PATTERNS OUTPUT_BIN_NAMES)
+    set(oneValueArgs TARGET_NAME OUTPUT_DIR AXF_PATH)
+    cmake_parse_arguments(PARSED "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    add_custom_command(TARGET ${PARSED_TARGET_NAME}
+        POST_BUILD
+        COMMAND fromelf --bin --output=${PARSED_OUTPUT_DIR}/
+        ${PARSED_AXF_PATH})
+
+endfunction()
+
+# Function to assert the compiler version
+function(enforce_compiler_version)
+    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_ARM_CLANG_VERSION})
+        message( FATAL_ERROR "Arm compiler version must be ${MIN_ARM_CLANG_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." )
+    endif()
+endfunction()
diff --git a/scripts/cmake/toolchains/bare-metal-gcc.cmake b/scripts/cmake/toolchains/bare-metal-gcc.cmake
new file mode 100644
index 0000000..2ffc1bb
--- /dev/null
+++ b/scripts/cmake/toolchains/bare-metal-gcc.cmake
@@ -0,0 +1,145 @@
+#----------------------------------------------------------------------------
+#  Copyright (c) 2021 Arm Limited. All rights reserved.
+#  SPDX-License-Identifier: Apache-2.0
+#
+#  Licensed under the Apache License, Version 2.0 (the "License");
+#  you may not use this file except in compliance with the License.
+#  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing, software
+#  distributed under the License is distributed on an "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#  See the License for the specific language governing permissions and
+#  limitations under the License.
+#----------------------------------------------------------------------------
+# specify the cross compiler
+set(TRIPLET                         arm-none-eabi)
+
+set(CMAKE_C_COMPILER                ${TRIPLET}-gcc)
+set(CMAKE_CXX_COMPILER              ${TRIPLET}-g++)
+
+set(CMAKE_CROSSCOMPILING            true)
+set(CMAKE_SYSTEM_NAME               Generic)
+
+set(MIN_GCC_VERSION                 10.2.1)
+
+# Skip compiler test execution
+set(CMAKE_C_COMPILER_WORKS          1)
+set(CMAKE_CXX_COMPILER_WORKS        1)
+set(PLATFORM_HAL                    1)
+
+if (NOT DEFINED CMAKE_SYSTEM_PROCESSOR)
+    set(CMAKE_SYSTEM_PROCESSOR      cortex-m55)
+endif()
+
+if (CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m55)
+    # Flags for cortex-m55
+    set(CPU_COMPILE_DEF             CPU_CORTEX_M55)
+    set(CPU_NAME                    ${CMAKE_SYSTEM_PROCESSOR})
+    set(FLOAT_ABI                   hard)
+    set(ARM_MATH_DSP                1)
+    set(ARM_MATH_LOOPUNROLL         1)
+elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL cortex-m33)
+    # Flags for cortex-m33 to go here
+endif()
+
+set(${CPU_COMPILE_DEF}              1)
+
+# Warning options
+add_compile_options(
+    -Wall
+    -Wextra
+    -Wvla
+    -Wno-psabi)
+
+# General purpose compile options:
+add_compile_options(
+    -funsigned-char
+    -fno-function-sections
+    "$<$<COMPILE_LANGUAGE:CXX>:-fno-unwind-tables;-fno-rtti;-fno-exceptions>")
+
+# Arch compile options:
+add_compile_options(
+    -mthumb
+    -mcpu=${CPU_NAME}
+    -mfloat-abi=${FLOAT_ABI}
+    -mlittle-endian
+    -MD)
+
+# Compile definitions:
+add_compile_definitions(
+    PLATFORM_HAL=${PLATFORM_HAL}
+    ${CPU_COMPILE_DEF}=1
+    $<$<BOOL:${ARM_MATH_DSP}>:ARM_MATH_DSP>
+    $<$<BOOL:${ARM_MATH_LOOPUNROLL}>:ARM_MATH_LOOPUNROLL>)
+
+# Link options:
+add_link_options(
+    -mthumb
+    -mcpu=${CPU_NAME}
+    -mfloat-abi=${FLOAT_ABI}
+    -mlittle-endian
+    --specs=nosys.specs
+    --stats
+    "$<$<CONFIG:RELEASE>:--no-debug>")
+
+# Function to add a map file output for the linker to dump diagnostic information to.
+function(add_target_map_file TARGET_NAME MAP_FILE_PATH)
+    target_link_options(${TARGET_NAME} PUBLIC
+        -Xlinker -Map=${MAP_FILE_PATH})
+endfunction()
+
+# Function to add linker option to use the chosen linker script.
+function(add_linker_script SCRIPT_DIR SCRIPT_NAME)
+    set(LINKER_SCRIPT_PATH ${SCRIPT_DIR}/${SCRIPT_NAME}.ld
+        CACHE STRING "Linker script path")
+    if (NOT EXISTS ${LINKER_SCRIPT_PATH})
+        message(FATAL_ERROR "Linker script not found: ${LINKER_SCRIPT_PATH}")
+    endif()
+    message(STATUS "Using linker script: ${LINKER_SCRIPT_PATH}")
+    add_link_options("SHELL:-T ${LINKER_SCRIPT_PATH}")
+endfunction()
+
+# Function to set the command to copy/extract contents from an elf
+# into a binary file.
+function(add_bin_generation_command)
+
+    set(multiValueArgs SECTION_PATTERNS OUTPUT_BIN_NAMES)
+    set(oneValueArgs TARGET_NAME OUTPUT_DIR AXF_PATH)
+    cmake_parse_arguments(PARSED "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
+
+    list(LENGTH PARSED_SECTION_PATTERNS N_SECTION_PATTERNS)
+    list(LENGTH PARSED_OUTPUT_BIN_NAMES N_OUTPUT_BIN_NAMES)
+
+    if (NOT ${N_SECTION_PATTERNS} STREQUAL ${N_OUTPUT_BIN_NAMES})
+        message(FATAL_ERROR "Section patterns and the output binary names "
+                "should be of the same length")
+    endif()
+
+    message(STATUS "${TRIPLET}-objcopy requested to generate "
+                   "${N_OUTPUT_BIN_NAMES} bin files.")
+
+    math(EXPR MAX_IDX "${N_SECTION_PATTERNS} - 1")
+
+    foreach(IDX RANGE ${MAX_IDX})
+
+        list(GET PARSED_OUTPUT_BIN_NAMES ${IDX} OUTPUT_BIN_NAME)
+        list(GET PARSED_SECTION_PATTERNS ${IDX} SECTION_PATTERN)
+
+        add_custom_command(TARGET ${PARSED_TARGET_NAME}
+            POST_BUILD
+            COMMAND ${TRIPLET}-objcopy -O binary
+            --only-section ${SECTION_PATTERN} ${PARSED_AXF_PATH}
+            ${PARSED_OUTPUT_DIR}/${OUTPUT_BIN_NAME})
+    endforeach()
+
+endfunction()
+
+# Function to assert the compiler version
+function(enforce_compiler_version)
+    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS ${MIN_GCC_VERSION})
+        message( FATAL_ERROR "arm-none-eabi-gcc version must be ${MIN_GCC_VERSION} or greater to support ${CMAKE_SYSTEM_PROCESSOR} architecture." )
+    endif()
+endfunction()
diff --git a/scripts/cmake/native-toolchain.cmake b/scripts/cmake/toolchains/native-gcc.cmake
similarity index 60%
rename from scripts/cmake/native-toolchain.cmake
rename to scripts/cmake/toolchains/native-gcc.cmake
index 2e28cd4..4b5a62b 100644
--- a/scripts/cmake/native-toolchain.cmake
+++ b/scripts/cmake/toolchains/native-gcc.cmake
@@ -19,22 +19,34 @@
 set(CMAKE_C_LINKER_PREFERENCE   gcc)
 set(CMAKE_CXX_LINKER_PREFERENCE gcc)
 
-set(CMAKE_C_FLAGS_DEBUG         "-DDEBUG -O0 -g")
-set(CMAKE_C_FLAGS_RELEASE       "-DNDEBUG -O3")
-
-set(CMAKE_CXX_FLAGS_DEBUG       "-DDEBUG -O0 -g")
-set(CMAKE_CXX_FLAGS_RELEASE     "-DNDEBUG -O3")
-
 # Platform specific directory:
 set(PLATFORM_HAL                3)
-set(WARNING_FLAGS               "-Wsign-compare -Wshadow         \
-                                 -Wextra -Wall -Wunused-function \
-                                 -Wmissing-field-initializers    \
-                                 -Wswitch -Wvla -Wunused-parameter")
-set(SPECIAL_OPTS                "-fPIC -pthread")
-set(PLATFORM_FLAGS              "-DPLATFORM_HAL=${PLATFORM_HAL}")
-set(SPECIAL_OPTS_CXX            "-fno-threadsafe-statics")
-set(CMAKE_EXE_LINKER_FLAGS      "-lm -lc -lstdc++ --verbose")
+
+# Warning compiler definitions:
+add_compile_options(
+    -Wsign-compare
+    -Wshadow
+    -Wextra
+    -Wall
+    -Wunused-function
+    -Wmissing-field-initializers
+    -Wswitch
+    -Wvla
+    -Wunused-parameter)
+
+# General purpose compile definitions:
+add_compile_options(
+    -fPIC
+    -pthread
+    -DPLATFORM_HAL=${PLATFORM_HAL}
+    "$<$<COMPILE_LANGUAGE:CXX>:-fno-threadsafe-statics>")
+
+# Linker options
+add_link_options(
+    -lm
+    -lc
+    -lstdc++
+    --verbose)
 
 function(enforce_compiler_version)
 endfunction()
diff --git a/scripts/mps3/sse-300/images.txt b/scripts/mps3/sse-300/images.txt
new file mode 100644
index 0000000..b00c8b7
--- /dev/null
+++ b/scripts/mps3/sse-300/images.txt
@@ -0,0 +1,23 @@
+TITLE: Arm MPS3 FPGA prototyping board Images Configuration File
+
+; MCC mapping for Corstone-300 MPS3 bitfile package AN547
+; +-------------+---------------+-------------------------------+
+; | FPGA addr   | MCC addr      |  Region                       |
+; +-------------+---------------+-------------------------------+
+; | 0x00000000  | 0x00000000    | ITCM (NS)                     |
+; | 0x01000000  | 0x02000000    | BRAM or FPGA's data SRAM (NS) |
+; | 0x60000000  | 0x08000000    | DDR (NS)                      |
+; | 0x70000000  | 0x0c000000    | DDR (S)                       |
+; +-------------+---------------+-------------------------------+
+
+[IMAGES]
+
+TOTALIMAGES: 2 ;Number of Images (Max: 32)
+
+IMAGE0ADDRESS: 0x00000000 ; MCC@0x00000000 <=> FPGA@0x00000000
+IMAGE0UPDATE: AUTO
+IMAGE0FILE: \SOFTWARE\itcm.bin
+
+IMAGE1ADDRESS: 0x0c000000 ; MCC@0x0c000000 <=> FPGA@0x70000000
+IMAGE1UPDATE: AUTO
+IMAGE1FILE: \SOFTWARE\ddr.bin
diff --git a/scripts/py/gen_fpga_mem_map.py b/scripts/py/gen_fpga_mem_map.py
deleted file mode 100644
index 5703a8d..0000000
--- a/scripts/py/gen_fpga_mem_map.py
+++ /dev/null
@@ -1,178 +0,0 @@
-#  Copyright (c) 2021 Arm Limited. All rights reserved.
-#  SPDX-License-Identifier: Apache-2.0
-#
-#  Licensed under the Apache License, Version 2.0 (the "License");
-#  you may not use this file except in compliance with the License.
-#  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-import os
-from argparse import ArgumentParser
-
-"""
-This file is used as part of post build steps to generate 'images.txt' file
-which can be copied over onto the MPS3 board's SD card. The purpose is to
-limit having to manually edit the file based on different load regions that
-the build scatter file might dictate.
-"""
-
-def is_commented(line):
-    if (line.startswith(";")):
-        return True
-    else:
-        return False
-
-
-def is_load_rom(line):
-    load_region_specifiers = ['LOAD_ROM', 'LD_ROM', 'LOAD_REGION']
-
-    for load_specifier in load_region_specifiers:
-        if line.startswith(load_specifier):
-            return True
-
-    return False
-
-
-class TargetSubsystem:
-
-    def __init__(self, target_subsystem_name: str):
-        """
-        Constructor for target class.
-        Arguments:
-            target_subsystem_name: name of the target subsystem
-        """
-        # Dict with mem map and binary names we expect
-        self.subsystems = {
-            "sse-300": {
-                "mmap_mcc" : {
-                    # FPGA addr |  MCC addr  |
-                    "0x00000000": "0x00000000", # ITCM (NS)
-                    "0x01000000": "0x02000000", # BRAM or FPGA's data SRAM (NS)
-                    "0x60000000": "0x08000000", # DDR (NS)
-                    "0x70000000": "0x0c000000"  # DDR (S)
-                },
-                "bin_names": {
-                    0: "itcm.bin",
-                    1: "dram.bin"
-                }
-            }
-        }
-
-        self.name = target_subsystem_name
-
-
-    def is_supported(self, target_subsystem: str) -> bool:
-        """
-        Checks if the target subsystem exists within systems
-        supported by this script
-        """
-        if target_subsystem in self.subsystems.keys():
-            return True
-
-        print(f"Platforms supported: {self.subsystems.keys()}")
-        return False
-
-
-    def mps3_mappings(self) -> dict:
-        """
-        Returns the FPGA <--> MCC address translations
-        as a dict
-        """
-        if self.is_supported(self.name):
-            return self.subsystems[self.name]['mmap_mcc']
-        return {}
-
-
-    def mps3_bin_names(self) -> dict:
-        """
-        Returns expected binary names for the executable built
-        for Cortex-M55 or Cortex-M55+Ethos-U55 targets in the
-        form of a dict with index and name
-        """
-        if self.is_supported(self.name):
-            return self.subsystems[self.name]['bin_names']
-
-        return {}
-
-
-def main(args):
-    """
-    Generates the output txt file with MCC to FPGA address mapping used
-    that is used by the MCC on FPGA to load executable regions into
-    correct regions in memory.
-    """
-    # List out arguments used:
-    scatter_file_path = args.scatter_file_path
-    target_subsystem_name = args.target_subsystem
-    output_file_path = args.output_file_path
-
-    target = TargetSubsystem(target_subsystem_name=target_subsystem_name)
-
-    if target.is_supported(target_subsystem_name) != True:
-        print(f'Target {target_subsystem_name} not supported.')
-        return
-
-    with open(scatter_file_path,'r') as scatter_file:
-        lines_read = scatter_file.readlines()
-        str_list = []
-
-        bin_names = None
-        mem_map = None
-
-        mem_map = target.mps3_mappings()
-        bin_names = target.mps3_bin_names()
-
-        str_list.append("TITLE: Arm MPS3 FPGA prototyping board Images Configuration File\n")
-        str_list.append("[IMAGES]\n\n")
-
-        cnt = 0
-        for line in lines_read:
-            if is_commented(line) or is_load_rom(line) != True:
-                continue
-
-            addr = line.split()[1]
-
-            if mem_map.get(addr, None) == None:
-                raise RuntimeError(
-                    'Translation for this address unavailable')
-            if cnt > len(bin_names):
-                raise RuntimeError(
-                    f"bin names len exceeded: {cnt}")
-
-            str_list.append("IMAGE" + str(cnt) + "ADDRESS: " +
-                mem_map[addr] + " ; MCC@" + mem_map[addr] +
-                " <=> FPGA@"  + addr + "\n")
-            str_list.append("IMAGE" + str(cnt) + "UPDATE: AUTO\n")
-            str_list.append("IMAGE" + str(cnt) + "FILE: \SOFTWARE\\" +
-                bin_names[cnt] + "\n\n")
-            cnt += 1
-
-        if cnt > 0 and cnt < 33:
-            str_list.insert(2,
-                "TOTALIMAGES: {} ;Number of Images (Max: 32)\n\n".format(
-                    cnt))
-        else:
-            raise RuntimeError('Invalid image count')
-
-        if os.path.exists(output_file_path):
-            os.remove(output_file_path)
-        print(''.join(str_list), file=open(output_file_path, "a"))
-
-
-if __name__ == "__main__":
-    parser = ArgumentParser()
-    parser.add_argument("--scatter_file_path", type=str, required=True,
-                        help="Path to the scatter file")
-    parser.add_argument("--target_subsystem", type=str, required=True,
-                        help="Target subsystem in use")
-    parser.add_argument("--output_file_path", type=str, required=True,
-                        help="Output file path")
-    args = parser.parse_args()
-    main(args)
