code_size_compare: support to measure code size with multiple tools

For time being, code_size_compare.py only supports `size`. This
commit builds up foundation to extend code size measurement with
other tools.

Signed-off-by: Yanray Wang <yanray.wang@arm.com>
diff --git a/scripts/code_size_compare.py b/scripts/code_size_compare.py
index 8f3730f..6b2b3a9 100755
--- a/scripts/code_size_compare.py
+++ b/scripts/code_size_compare.py
@@ -88,20 +88,25 @@
         "-a " + SupportedArch.ARMV8_M.value + " -c " + SupportedConfig.TFM_MEDIUM.value,
     ]
 
-    def __init__(self, size_version: SimpleNamespace) -> None:
+    def __init__(
+            self,
+            size_version: SimpleNamespace,
+            host_arch: str
+    ) -> None:
         """
         size_version: SimpleNamespace containing info for code size measurement.
         size_version.arch: architecture to measure code size on.
         size_version.config: configuration type to measure code size with.
-        size_version.host_arch: host architecture.
+        host_arch: host architecture.
         """
         self.size_version = size_version
+        self.host_arch = host_arch
 
     def infer_make_command(self) -> str:
         """Infer build command based on architecture and configuration."""
 
         if self.size_version.config == SupportedConfig.DEFAULT.value and \
-            self.size_version.arch == self.size_version.host_arch:
+            self.size_version.arch == self.host_arch:
             return 'make -j lib CFLAGS=\'-Os \' '
         elif self.size_version.arch == SupportedArch.ARMV8_M.value and \
              self.size_version.config == SupportedConfig.TFM_MEDIUM.value:
@@ -118,7 +123,7 @@
                 print(comb)
             print("\nFor your system, please use:")
             for comb in CodeSizeBuildInfo.SupportedArchConfig:
-                if "default" in comb and self.size_version.host_arch not in comb:
+                if "default" in comb and self.host_arch not in comb:
                     continue
                 print(comb)
             sys.exit(1)
@@ -133,10 +138,12 @@
             self,
             revision: str,
             make_cmd: str,
+            measure_cmd: str
     ) -> None:
         """
         revision: Git revision.(E.g: commit)
-        make_cmd: command to build library objects.
+        make_cmd: command to build objects in library.
+        measure_cmd: command to measure code size for objects in library.
         """
         self.repo_path = "."
         self.git_command = "git"
@@ -144,6 +151,7 @@
 
         self.revision = revision
         self.make_cmd = make_cmd
+        self.measure_cmd = measure_cmd
 
     @staticmethod
     def validate_revision(revision: str) -> bytes:
@@ -196,8 +204,8 @@
         for mod, st_lib in MBEDTLS_STATIC_LIB.items():
             try:
                 result = subprocess.check_output(
-                    ["size", st_lib, "-t"], cwd=git_worktree_path,
-                    universal_newlines=True
+                    [self.measure_cmd + ' ' + st_lib], cwd=git_worktree_path,
+                    shell=True, universal_newlines=True
                 )
                 res[mod] = result
             except subprocess.CalledProcessError as e:
@@ -434,6 +442,7 @@
             self,
             old_size_version: SimpleNamespace,
             new_size_version: SimpleNamespace,
+            code_size_common: SimpleNamespace,
             result_dir: str,
     ) -> None:
         """
@@ -450,33 +459,46 @@
 
         self.old_size_version = old_size_version
         self.new_size_version = new_size_version
+        self.code_size_common = code_size_common
         self.old_size_version.make_cmd = \
-                CodeSizeBuildInfo(self.old_size_version).infer_make_command()
+                CodeSizeBuildInfo(self.old_size_version,\
+                    self.code_size_common.host_arch).infer_make_command()
         self.new_size_version.make_cmd = \
-                CodeSizeBuildInfo(self.new_size_version).infer_make_command()
+                CodeSizeBuildInfo(self.new_size_version,\
+                    self.code_size_common.host_arch).infer_make_command()
         self.git_command = "git"
         self.make_clean = 'make clean'
-        self.code_size_generator = CodeSizeGeneratorWithSize()
+        self.code_size_generator = self.__init_code_size_generator__(\
+                self.code_size_common.measure_cmd)
 
     @staticmethod
-    def cal_code_size(size_version: SimpleNamespace):
+    def __init_code_size_generator__(measure_cmd):
+        if re.match(r'size', measure_cmd.strip()):
+            return CodeSizeGeneratorWithSize()
+        else:
+            print("Error: unsupported tool:", measure_cmd.strip().split(' ')[0])
+            sys.exit(1)
+
+
+    def cal_code_size(self, size_version: SimpleNamespace):
         """Calculate code size of library objects in a UTF-8 encoding"""
 
-        return CodeSizeCalculator(size_version.revision, size_version.make_cmd).\
-                cal_libraries_code_size()
+        return CodeSizeCalculator(size_version.revision, size_version.make_cmd,\
+                self.code_size_common.measure_cmd).cal_libraries_code_size()
 
-    @staticmethod
-    def gen_file_name(old_size_version, new_size_version=None):
+    def gen_file_name(self, old_size_version, new_size_version=None):
         if new_size_version:
-            return '{}-{}-{}-{}-{}-{}.csv'\
+            return '{}-{}-{}-{}-{}-{}-{}.csv'\
                     .format(old_size_version.revision[:7],
                             old_size_version.arch, old_size_version.config,
                             new_size_version.revision[:7],
-                            new_size_version.arch, new_size_version.config)
+                            new_size_version.arch, new_size_version.config,
+                            self.code_size_common.measure_cmd.strip().split(' ')[0])
         else:
-            return '{}-{}-{}.csv'\
+            return '{}-{}-{}-{}.csv'\
                     .format(old_size_version.revision[:7],
-                            old_size_version.arch, old_size_version.config)
+                            old_size_version.arch, old_size_version.config,
+                            self.code_size_common.measure_cmd.strip().split(' ')[0])
 
     def gen_code_size_report(self, size_version: SimpleNamespace):
         """Generate code size record and write it into a file."""
@@ -565,7 +587,6 @@
         revision=old_revision,
         config=comp_args.config,
         arch=comp_args.arch,
-        host_arch=detect_arch(),
         make_cmd='',
     )
     new_size_version = SimpleNamespace(
@@ -573,12 +594,15 @@
         revision=new_revision,
         config=comp_args.config,
         arch=comp_args.arch,
-        host_arch=detect_arch(),
         make_cmd='',
     )
+    code_size_common = SimpleNamespace(
+        host_arch=detect_arch(),
+        measure_cmd='size -t',
+    )
 
     size_compare = CodeSizeComparison(old_size_version, new_size_version,\
-            comp_args.result_dir)
+            code_size_common, comp_args.result_dir)
     return_code = size_compare.get_comparision_results()
     sys.exit(return_code)