COMPMID-2706: Add the ability to build bootcode for bare metal

Adds an option for providing a linker script and also adds the
bootcode folder, it it exists, in the build path and links it
with the executable binaries.

Change-Id: I4119b21bdf1b4dd7fe38c4ee66741460666f53a1
Signed-off-by: Michalis Spyrou <michalis.spyrou@arm.com>
Reviewed-on: https://review.mlplatform.org/c/2051
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
diff --git a/SConstruct b/SConstruct
index 216920f..139c0e5 100644
--- a/SConstruct
+++ b/SConstruct
@@ -59,6 +59,7 @@
     PathVariable("build_dir", "Specify sub-folder for the build", ".", PathVariable.PathAccept),
     PathVariable("install_dir", "Specify sub-folder for the install", "", PathVariable.PathAccept),
     BoolVariable("exceptions", "Enable/disable C++ exception support", True),
+    PathVariable("linker_script", "Use an external linker script", "", PathVariable.PathAccept),
     #FIXME Remove before release (And remove all references to INTERNAL_ONLY)
     BoolVariable("internal_only", "Enable ARM internal only tests", False),
     ("toolchain_prefix", "Override the toolchain prefix", ""),
@@ -105,6 +106,10 @@
 
 Help(vars.GenerateHelpText(env))
 
+if env['linker_script'] and env['os'] != 'bare_metal':
+    print("Linker script is only supported for bare_metal builds")
+    Exit(1)
+
 if env['build'] == "embed_only":
     SConscript('./SConscript', variant_dir=build_path, duplicate=0)
     Return()
@@ -330,8 +335,14 @@
 
 SConscript('./SConscript', variant_dir=build_path, duplicate=0)
 
-if env['examples'] and env['os'] != 'bare_metal' and env['exceptions']:
+if env['examples'] and env['exceptions']:
+    if env['os'] == 'bare_metal' and env['arch'] == 'armv7a':
+        print("Building examples for bare metal and armv7a is not supported. Use examples=0.")
+        Exit(1)
     SConscript('./examples/SConscript', variant_dir='%s/examples' % build_path, duplicate=0)
 
-if env['os'] != 'bare_metal' and env['exceptions']:
+if env['exceptions']:
+    if env['os'] == 'bare_metal' and env['arch'] == 'armv7a':
+        print("WARNING: Building tests for bare metal and armv7a is not supported")
+        Return()
     SConscript('./tests/SConscript', variant_dir='%s/tests' % build_path, duplicate=0)