From 434bc9977f7f3e83c2538571b9546ee3ff0291c6 Mon Sep 17 00:00:00 2001 From: hf Date: Wed, 17 Jul 2024 09:12:58 +0100 Subject: [PATCH 1/3] tools: Add parameter to check_build.py for building with specific products Introduces -p flag to allow for building with specific products. The flag can take in a list of parameters, i.e. "-p juno host morello" will only check builds for those 3 products. Signed-off-by: Haaris Farooq --- tools/check_build.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/tools/check_build.py b/tools/check_build.py index ffa1058df..da694b709 100755 --- a/tools/check_build.py +++ b/tools/check_build.py @@ -63,26 +63,34 @@ def do_build(build_info: List[Build], output_path: str) -> \ return results -def build_all(config_file: str, - ignore_errors: bool, - log_level: str, - output_path: str): +def build_products(config_file: str, + ignore_errors: bool, + log_level: str, + products: List[str], + output_path: str): banner('Test building products') results = Results() try: with open(config_file, 'r') as file: - products = Product.from_yaml(file) + all_products = Product.from_yaml(file) except IOError: print(f'Error opening {config_file} file') results.append(("Opening yaml file", 1)) return results - for product in products: + if products: + products_to_build = [product for product in all_products + if product.name in products] + else: + products_to_build = all_products + + for product in products_to_build: if log_level != "": product.log_level = Parameter(log_level) - results.extend(do_build(product.builds, output_path)) + builds = product.builds + results.extend(do_build(builds, output_path)) if not ignore_errors and results.errors: print('Errors detected! Excecution stopped') break @@ -119,6 +127,11 @@ def parse_args(argv, prog_name): is not given, the default location is \ {BUILD_OUTPUT_DIR_DEFAULT}') + parser.add_argument('-p', '--products', dest='products', + required=False, default=[], type=str, nargs='+', + help='Specify one or more products to build for. \ + Accepts a space separated list') + return parser.parse_args(argv) @@ -126,10 +139,11 @@ def main(argv=[], prog_name=''): args = parse_args(argv, prog_name) results = Results() - results.extend(build_all(args.config_file, - args.ignore_errors, - args.log_level, - args.output_path)) + results.extend(build_products(args.config_file, + args.ignore_errors, + args.log_level, + args.products, + args.output_path)) print(results) return 0 if not results.errors else 1 -- GitLab From 0db8caa15c6e996bd3c18aa99ab5430ea7e0d38a Mon Sep 17 00:00:00 2001 From: Haaris Farooq Date: Wed, 24 Jul 2024 14:38:35 +0100 Subject: [PATCH 2/3] tools: Add unique build directories for each build Currently, when a build is built in check_build.py, every build is written to the same directory which is the default output path specified. Now, each build is given its own build directory which is a concatenation of its properties which is: output_path/product-group/platform/log-level/variant/toolchain/mode Signed-off-by: Haaris Farooq --- tools/check_build.py | 12 +++++++++--- tools/product.py | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/tools/check_build.py b/tools/check_build.py index da694b709..956effd31 100755 --- a/tools/check_build.py +++ b/tools/check_build.py @@ -39,10 +39,16 @@ def do_build(build_info: List[Build], output_path: str) -> \ files = [] for build in build_info: - file_path = os.path.join(output_path, build.file_name()) + build_output_path = os.path.join(output_path, + build.build_output_directory()) + + if not os.path.exists(build_output_path): + os.makedirs(build_output_path) + + file_path = os.path.join(build_output_path, build.file_name()) files.append(open(file_path, "w", encoding="utf-8")) - build_cmd = build.command(output_path) + build_cmd = build.command(build_output_path) build_id = subprocess.Popen( build_cmd, @@ -92,7 +98,7 @@ def build_products(config_file: str, builds = product.builds results.extend(do_build(builds, output_path)) if not ignore_errors and results.errors: - print('Errors detected! Excecution stopped') + print('Errors detected! Execution stopped') break return results diff --git a/tools/product.py b/tools/product.py index 51807e949..773ebaad7 100644 --- a/tools/product.py +++ b/tools/product.py @@ -65,6 +65,19 @@ class Build: filename += '.txt' return filename + def build_output_directory(self): + parts = [] + if self.product_group: + parts.append(self.product_group) + parts.append(self.name) + if self.log_level: + parts.append(self.log_level.name) + if self.variant: + parts.append('platform_variant_' + str(self.variant.name)) + parts.append(self.toolchain.name) + parts.append(self.build_type.name) + return '/'.join(parts) + def command(self, build_path=None): cmd = 'make -f Makefile.cmake ' name = self.product_group + '/' + self.name if self.product_group \ -- GitLab From 0e64924675aa2f0bb2c32e0f70f8684c6bd1881a Mon Sep 17 00:00:00 2001 From: Haaris Farooq Date: Wed, 24 Jul 2024 14:56:55 +0100 Subject: [PATCH 3/3] tools: Add configuration attribute to builds Added a configuration attribute that allows for building with any pre-defined configuration of flags and not just the default flags. Signed-off-by: Haaris Farooq --- tools/product.py | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/tools/product.py b/tools/product.py index 773ebaad7..57bd71742 100644 --- a/tools/product.py +++ b/tools/product.py @@ -40,6 +40,7 @@ class Build: log_level: Parameter product_group: str variant: Parameter = None + config: Parameter = None def tag(self): name = self.product_group + '/' + self.name if self.product_group \ @@ -52,6 +53,8 @@ class Build: build_str += ' - Variant {}'.format(self.variant.name) if self.log_level: build_str += ' - Log Level {}'.format(self.log_level.name) + if self.config: + build_str += ' - Config {}'.format(self.config.name) return build_str def file_name(self): @@ -62,6 +65,8 @@ class Build: filename += f'_{self.log_level.name}' if self.variant: filename += f'_{self.variant.name}' + if self.config: + filename += f'_{self.config.name}' filename += '.txt' return filename @@ -72,6 +77,8 @@ class Build: parts.append(self.name) if self.log_level: parts.append(self.log_level.name) + if self.config: + parts.append(self.config.name) if self.variant: parts.append('platform_variant_' + str(self.variant.name)) parts.append(self.toolchain.name) @@ -96,6 +103,9 @@ class Build: cmd += Build.__extra_arg__(extra) for extra in self.build_type.arguments: cmd += Build.__extra_arg__(extra) + if self.config: + cmd += ' '.join(Build.__extra_arg__(extra) + for extra in self.config.arguments) + ' ' if build_path: cmd += f'BUILD_PATH={build_path} ' return cmd @@ -124,6 +134,7 @@ class Product: variants: List[Parameter] = field(default_factory=lambda: [None]) log_level: Parameter = None product_group: str = field(default=None) + configs: List[Parameter] = field(default_factory=lambda: [None]) @classmethod def from_yaml(cls, yaml_file): @@ -151,21 +162,32 @@ class Product: product_properties['build_types'] = \ Parameter.from_yaml(build_types) + default_config = Parameter(name='default', arguments=()) + if 'configs' in yaml_entry: + configs = yaml_entry['configs'] + parsed_configs = Parameter.from_yaml(configs) + if default_config not in parsed_configs: + parsed_configs.insert(0, default_config) + product_properties['configs'] = parsed_configs + products.append(cls(**product_properties)) return products @property def builds(self) -> List[Build]: - builds = [] - for toolchain in self.toolchains: - for build_type in self.build_types: - for variant in self.variants: - builds.append(Build( - self.name, - toolchain, - build_type, - self.log_level, - self.product_group, - variant)) - return builds + return [ + Build( + self.name, + toolchain, + build_type, + self.log_level, + self.product_group, + variant, + config + ) + for config in self.configs + for toolchain in self.toolchains + for build_type in self.build_types + for variant in self.variants + ] -- GitLab