MLECO-1860: Support for Arm GNU Embedded Toolchain

This patch enables compilation of ML use cases bare-metal applications
using Arm GNU Embedded Toolchain. The GNU toolchain can be used instead
of the Arm Compiler that was already supported.

The GNU toolchain is also set as the default toolchain when building
applications for the MPS3 target.

Note: The version of GNU toolchain must be 10.2.1 or higher.

Change-Id: I5fff242f0f52d2db6c75d292f9fa990df1aec978
Signed-off-by: Kshitij Sisodia <kshitij.sisodia@arm.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 0581a2c..411b4f2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,15 +39,9 @@
 set(CMAKE_C_EXTENSIONS OFF)
 set(CMAKE_CXX_EXTENSIONS OFF)
 
-project(arm_ethos_u55_eval
-        VERSION     21.03
-        DESCRIPTION "ARM Ethos-U55 Evaluation application for MPS3 FPGA Prototyping Board and FastModel")
-
-add_compile_definitions(PRJ_VER_STR="${PROJECT_VERSION}")
-add_compile_definitions(PRJ_DES_STR="${PROJECT_DESCRIPTION}")
-
-set(CMAKE_SCRIPTS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/)
-set(DOWNLOAD_DEP_DIR  ${CMAKE_BINARY_DIR}/dependencies)
+set(CMAKE_SCRIPTS_DIR   ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake)
+set(DOWNLOAD_DEP_DIR    ${CMAKE_BINARY_DIR}/dependencies)
+set(CMAKE_TOOLCHAIN_DIR ${CMAKE_SCRIPTS_DIR}/toolchains)
 
 include(${CMAKE_SCRIPTS_DIR}/source_gen_utils.cmake)
 include(${CMAKE_SCRIPTS_DIR}/util_functions.cmake)
@@ -88,15 +82,28 @@
     BOOL)
 
 if (TARGET_PLATFORM STREQUAL mps3)
-    message(STATUS "Platform: MPS3 FPGA Prototyping Board or SSE-XXX FVP")
+    message(STATUS "Platform: MPS3 FPGA Prototyping Board or FVP")
+    set(DEFAULT_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_DIR}/bare-metal-gcc.cmake)
 elseif (TARGET_PLATFORM STREQUAL simple_platform)
-    message(STATUS "Platform: Simple platform within minimal peripherals")
+    message(STATUS "Platform: Simple platform with minimal peripherals")
+    set(DEFAULT_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_DIR}/bare-metal-gcc.cmake)
 elseif (TARGET_PLATFORM STREQUAL native)
     message(STATUS "Platform: Native (Linux based x86_64/aarch64 system)")
+    set(DEFAULT_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_DIR}/native-gcc.cmake)
 else ()
     message(FATAL_ERROR "Invalid platform specified: ${TARGET_PLATFORM}")
 endif ()
 
+if (NOT DEFINED CMAKE_TOOLCHAIN_FILE)
+    set(CMAKE_TOOLCHAIN_FILE ${DEFAULT_TOOLCHAIN_FILE}
+        CACHE FILEPATH "Toolchain file")
+endif()
+message(STATUS "Using CMAKE_TOOLCHAIN_FILE: ${CMAKE_TOOLCHAIN_FILE}")
+
+project(arm_ml_embedded_evaluation_kit
+        VERSION     21.05
+        DESCRIPTION "ARM ML Embedded Evaluation Kit for MPS3 FPGA and FastModel")
+
 enforce_compiler_version()
 setup_source_generator()
 
@@ -318,9 +325,11 @@
         "${SRC_GEN_DIR}/*.c"
         )
 
-    set(SRC_MAIN
-        "${SRC_PATH}/application/main/Main.cc"
-        )
+    set(SRC_MAIN "${SRC_PATH}/application/main/Main.cc")
+
+    set_source_files_properties(${SRC_MAIN}
+        PROPERTIES COMPILE_DEFINITIONS
+        "PRJ_VER_STR=\"${PROJECT_VERSION}\";PRJ_DES_STR=\"${PROJECT_DESCRIPTION}\"")
 
     set(UC_LIB_NAME lib${TARGET_NAME})
 
@@ -364,32 +373,30 @@
         $<$<BOOL:${ETHOS_U55_ENABLED}>:${ETHOS_U55_LIBS}>
         $<$<BOOL:${CMSIS_DSP_LIB}>:${CMSIS_DSP_LIB}>)
 
-    add_executable(${TARGET_NAME} ${SRC_MAIN})
+    add_executable(${TARGET_NAME} ${SRC_MAIN} ${PLAT_RETARGET_SOURCE})
 
     target_link_libraries(${TARGET_NAME} ${UC_LIB_NAME})
 
     if (${CMAKE_CROSSCOMPILING})
         set_target_properties(${TARGET_NAME} PROPERTIES SUFFIX ".axf")
+        add_target_map_file(${TARGET_NAME} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.map)
     endif()
 
     if (${TARGET_PLATFORM} STREQUAL mps3)
 
-        SET(SECTORS_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sectors/${use_case})
-        file(REMOVE_RECURSE ${SECTORS_DIR})
-        file(MAKE_DIRECTORY ${SECTORS_DIR})
+        set(SECTORS_DIR ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/sectors)
+        set(SECTORS_BIN_DIR ${SECTORS_DIR}/${use_case})
 
-        add_custom_command(TARGET ${TARGET_NAME}
-            POST_BUILD
-            COMMAND fromelf --bin --output=${SECTORS_DIR}/
-            ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.axf)
+        file(REMOVE_RECURSE ${SECTORS_BIN_DIR})
+        file(MAKE_DIRECTORY ${SECTORS_BIN_DIR})
+        file(COPY ${MPS3_FPGA_CONFIG} DESTINATION ${SECTORS_DIR})
 
-        add_custom_target(
-            run-${use_case} ALL
-            COMMAND ${PYTHON} ${CMAKE_CURRENT_SOURCE_DIR}/scripts/py/gen_fpga_mem_map.py
-            --scatter_file_path ${SCAT_FILE}
-            --target_subsystem  ${TARGET_SUBSYSTEM}
-            --output_file_path  ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/images-${use_case}.txt
-            COMMENT "Generating FPGA mappings file")
+        add_bin_generation_command(
+            TARGET_NAME ${TARGET_NAME}
+            OUTPUT_DIR  ${SECTORS_BIN_DIR}
+            AXF_PATH    ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TARGET_NAME}.axf
+            SECTION_PATTERNS    "${MPS3_SECTION_PATTERNS}"
+            OUTPUT_BIN_NAMES    "${MPS3_OUTPUT_BIN_NAMES}")
     elseif (${TARGET_PLATFORM} STREQUAL native)
 
         # If native build tests