Create helper script to output build configs
Instead of being able to export in json format for use with CI scripts,
export into a property format. This lists *single* build configurations,
and the environment variables to set for a single build of this format.
Change-Id: Ideabcdbefe6677401a4b9d60b2b623ba43b71bf8
Signed-off-by: Dean Birch <dean.birch@arm.com>
diff --git a/build_helper/__init__.py b/build_helper/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/build_helper/__init__.py
diff --git a/configs.py b/configs.py
new file mode 100755
index 0000000..3b5bc7d
--- /dev/null
+++ b/configs.py
@@ -0,0 +1,76 @@
+#!/usr/bin/env python
+"""
+Script for querying specific build configurations of TF-M.
+Can list available build configurations, and can give environment
+variables to build a specific build configuration using run-build.sh
+"""
+
+import argparse
+import os
+import sys
+
+from tfm_ci_pylib.tfm_build_manager import TFM_Build_Manager
+from build_helper.build_helper_configs import config_full
+from build_helper.build_helper_configs import _builtin_configs
+
+
+__copyright__ = """
+/*
+ * Copyright (c) 2020, Arm Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+ """
+
+
+def get_build_manager(group=None):
+ """Get a TFM_Build_Manager instance, silencing stdout"""
+ config = config_full
+ if group:
+ config = _builtin_configs[group]
+ _dir = os.getcwd()
+ # Block default stdout from __init__
+ sys.stdout = open(os.devnull, "w")
+ build_manager = TFM_Build_Manager(_dir, _dir, config)
+ # Allow stdout again
+ sys.stdout = sys.__stdout__
+ return build_manager
+
+
+def list_configs(group):
+ """Lists available configurations"""
+ build_manager = get_build_manager(group)
+ build_manager.print_config()
+
+
+def print_config_environment(config, group=None):
+ """Prints particular configuration environment variables"""
+ build_manager = get_build_manager(group)
+ build_manager.print_config_environment(config)
+
+
+if __name__ == "__main__":
+ PARSER = argparse.ArgumentParser(description="Extract build configurations.")
+ PARSER.add_argument(
+ "config",
+ default=None,
+ nargs="?",
+ help="Configuration to print environment variables for. "
+ "Then run-build.sh can be run directly with these set. "
+ "If not specified, the available configurations are printed",
+ )
+ PARSER.add_argument(
+ "-g",
+ "--group",
+ default=None,
+ help="Only list configurations under a certain group. ",
+ choices=list(_builtin_configs.keys()),
+ )
+ ARGS = PARSER.parse_args()
+
+ # By default print available configs
+ if not ARGS.config:
+ list_configs(ARGS.group)
+ else:
+ print_config_environment(ARGS.config, group=ARGS.group)
diff --git a/tfm_ci_pylib/tfm_build_manager.py b/tfm_ci_pylib/tfm_build_manager.py
index 0849a4b..8eac0a4 100644
--- a/tfm_ci_pylib/tfm_build_manager.py
+++ b/tfm_ci_pylib/tfm_build_manager.py
@@ -70,6 +70,38 @@
super(TFM_Build_Manager, self).__init__(name="TFM_Build_Manager")
+ def print_config(self):
+ """Prints a list of available build configurations"""
+ print("\n".join(list(self._tbm_build_cfg.keys())))
+
+ def print_config_environment(self, config):
+ """
+ For a given build configuration from output of print_config
+ method, print environment variables to build.
+ """
+ if config not in self._tbm_build_cfg:
+ print("Error: no such config {}".format(config), file=sys.stderr)
+ sys.exit(1)
+ config_details = self._tbm_build_cfg[config]
+ argument_list = [
+ "TARGET_PLATFORM={}",
+ "COMPILER={}",
+ "PROJ_CONFIG={}",
+ "CMAKE_BUILD_TYPE={}",
+ "BL2={}",
+ ]
+ print(
+ "\n".join(argument_list)
+ .format(
+ config_details.target_platform,
+ config_details.compiler,
+ config_details.proj_config,
+ config_details.cmake_build_type,
+ config_details.with_mcuboot,
+ )
+ .strip()
+ )
+
def pre_eval(self):
""" Tests that need to be run in set-up state """
return True