Build: Enhance handling of images

This change enhances the assembly and signing of images with scripting.
Macros that are needed for these processes are now extracted from
the flash_layout.h files with python scripts.
The built images are not modified.

Change-Id: Iba00bdd3217b302df8968ce2619e31a1bc961e42
Signed-off-by: Sverteczky, Marcell <marcell.sverteczky@arm.com>
diff --git a/bl2/ext/mcuboot/scripts/macro_parser.py b/bl2/ext/mcuboot/scripts/macro_parser.py
new file mode 100644
index 0000000..3f7feb6
--- /dev/null
+++ b/bl2/ext/mcuboot/scripts/macro_parser.py
@@ -0,0 +1,70 @@
+#! /usr/bin/env python3

+#

+# -----------------------------------------------------------------------------

+# Copyright (c) 2019, Arm Limited. All rights reserved.

+#

+# SPDX-License-Identifier: BSD-3-Clause

+#

+# -----------------------------------------------------------------------------

+

+

+import re

+import os

+

+expression_re = re.compile(r"[(]?(([(]?(((0x)[0-9a-fA-F]+)|([0-9]+))[)]?)\s*([\+\-]\s*([(]?(((0x)[0-9a-fA-F]+)|([0-9]+))[)]?)\s*)*)[)]?")

+

+# Simple parser that takes a string and evaluates an expression from it.

+# The expression might contain additions and subtractions amongst numbers that

+# are written in decimal or hexadecimal form.

+# The parses can process expressions in which the parentheses does not change

+# the sign of the following number or numbers in an expression.

+# Thus the parser can process the following expression: (x + y)

+# However it will not calculate the correct sum for the expression below:

+# (x - (y + z))

+def parse_and_sum(text):

+    m = expression_re.match(text)

+    if m is None:

+        msg = "The script was probably invoked manually"

+        msg += " with having certain macros nested in flash_layouts.h.\n"

+        msg += "Please revisit the flash_layout.h file and hardcode values"

+        msg += " for the (NON-)SECURE_IMAGE_OFFSET and"

+        msg += " (NON-)SECURE_IMAGE_MAX_SIZE macros"

+        raise Exception(msg)

+

+    nums = re.findall(r'(0x[A-Fa-f0-9]+)|[\d]+', m.group(0))

+    for i in range(len(nums)):

+        nums[i] = int(nums[i], 0)

+    ops = re.findall(r'\+|\-', m.group(0))

+    sum = nums[0]

+    for i in range(len(ops)):

+        if ops[i] == '+':

+            sum += nums[i+1]

+        else:

+            sum -= nums[i+1]

+    return sum

+

+

+# Opens a file that contains the macro of interest, then finds the macro with

+# a regular expression, parses the expression that is defined for the given

+# macro. Lastly it evaluates the expression with the parse_and_sum function

+def evaluate_macro(file, regexp, matchGroupKey, matchGroupData):

+    regexp_compiled = re.compile(regexp)

+

+    if os.path.isabs(file):

+        configFile = file

+    else:

+        scriptsDir = os.path.dirname(os.path.abspath(__file__))

+        configFile = os.path.join(scriptsDir, file)

+

+    macroValue = {}

+    with open(configFile, 'r') as macros_preprocessed_file:

+        for line in macros_preprocessed_file:

+            m = regexp_compiled.match(line)

+            if m is not None:

+                macroValue[m.group(matchGroupKey)] = \

+                parse_and_sum(m.group(matchGroupData))

+

+    if (matchGroupKey == 0 and not macroValue):

+        macroValue["None"] = None

+

+    return list(macroValue.values())[0] if (matchGroupKey == 0) else macroValue