On Wed, May 3, 2023 at 11:12 AM Sebastian Huber < sebastian.hu...@embedded-brains.de> wrote:
> Hello Philip, > > On 28.04.23 11:27, Philip Kirkpatrick wrote: > > I don't know if anyone else will find this useful or if it already > > exists and I duplicated some effort, but I find it difficult to just > > read the files in the spec folder and understand how they are connected > > and what files are used in BSPs I'm interested in. I looked through the > > wscript and didn't see an existing way to dump the item tree for a given > > configuration, so I added it. The patch is as follows: > > this looks like a useful addition. I would make it a new command, for > example "./waf viewspec". > > I originally didn't do it that way because I was having a hard time figuring out how to add a new command that could get the build context for the correct variant and I needed to move on. I had some time today to look into it again today and got it figured out. > > > --- > > diff --git a/wscript b/wscript > > index 567f42db2f..4e59188188 100755 > > --- a/wscript > > +++ b/wscript > > @@ -151,6 +151,61 @@ def _is_enabled(enabled, enabled_by): > > return _IS_ENABLED_OP[key](enabled, value) > > return enabled_by in enabled > > > > +color_true = '\x1b[32m' > > +color_false = '\x1b[31m' > > +color_clear = '\x1b[0m' > > + > > +def _get_enabler_op_and(enabled, enabled_by): > > + and_str = "{ " > > + first = True > > + for next_enabled_by in enabled_by: > > + if first: > > + first = False > > + else: > > + and_str = and_str + " and " > > + and_str = and_str + _get_enabler(enabled, next_enabled_by) > > + return and_str + " }" > > Can this be simplified to > > " and ".join(_get_enabler(enabled, next_enabled_by) for next_enabled_by > in enabled_by) > > ? > Yes, it can! Thinking as a C programmer, I had no idea python could do that. "_get_enabler_op_or" can (and has been) also be reduced. > > + > > + > > +def _get_enabler_op_not(enabled, enabled_by): > > + return "{ " + color_true + "not " + color_false + > > _get_enabler(enabled, enabled_by) + color_clear + " }" > > + > > + > > +def _get_enabler_op_or(enabled, enabled_by): > > + or_str = "{ " > > + first = True > > + for next_enabled_by in enabled_by: > > + if first: > > + first = False > > + else: > > + or_str = or_str + " or " > > + if _is_enabled(enabled, next_enabled_by): > > + color_start = color_true > > + color_end = color_clear > > + else: > > + color_start = color_false > > + color_end = color_clear > > + or_str = or_str + color_start + _get_enabler(enabled, > > next_enabled_by) + color_end > > + return or_str + " }" > > + > > + > > +_GET_ENABLER_OP = { > > + "and": _get_enabler_op_and, > > + "not": _get_enabler_op_not, > > + "or": _get_enabler_op_or, > > +} > > + > > + > > +def _get_enabler(enabled, enabled_by): > > + if isinstance(enabled_by, bool): > > + return color_true + str(enabled_by) + color_clear > > + if isinstance(enabled_by, list): > > + return _get_enabler_op_or(enabled, enabled_by) > > + if isinstance(enabled_by, dict): > > + key, value = next(iter(enabled_by.items())) > > + return _GET_ENABLER_OP[key](enabled, value) > > + return enabled_by > > + > > > > def _asm_explicit_target(self, node): > > task = self.create_task("asm", node, > > @@ -233,6 +288,14 @@ class Item(object): > > "Build error related to item spec:{}: {}".format( > > self.uid, str(e))) > > > > + > > + def dump_spec(self, bld, bic, depth): > > + if _is_enabled(bld.env.ENABLE, self.get_enabled_by()): > > + enabler = _get_enabler(bld.env.ENABLE, > self.get_enabled_by()) > > + print("│ " * depth + "├──" + self.uid + " # enabled-by: " > > + enabler) > > + for p in self.links(): > > + p.dump_spec(bld, bic, depth + 1) > > + > > def do_defaults(self, enabled): > > return > > > > @@ -1320,6 +1383,14 @@ def options(ctx): > > help= > > "sets the option identified by KEY to the VALUE in the build > > specification; it is intended for RTEMS maintainers and may be used in > > the bspdefaults and configure commands", > > ) > > + rg.add_option( > > + "--rtems-dumpspec", > > + action="store_true", > > + dest="rtems_dump_spec", > > + default=False, > > + help= > > + "dumps the currently enable spec yaml files and the links tree; > > it is intended for RTEMS maintainers and may be used in the build > commands", > > + ) > > > > > > def check_environment(conf): > > @@ -1587,8 +1658,14 @@ def build(bld): > > long_command_line_workaround(bld) > > bic = BuildItemContext(bld.env.ARCH_INCLUDES.split(), [], [], [], > > [], [], > > []) > > - bsps[bld.env.ARCH][bld.env.BSP_BASE].build(bld, bic) > > - items[bld.env.TOPGROUP].build(bld, bic) > > + if(bld.options.rtems_dump_spec): > > + print("BSPS:") > > + bsps[bld.env.ARCH][bld.env.BSP_BASE].dump_spec(bld, bic, 0) > > + print("items:") > > + items[bld.env.TOPGROUP].dump_spec(bld, bic, 0) > > + else: > > + bsps[bld.env.ARCH][bld.env.BSP_BASE].build(bld, bic) > > + items[bld.env.TOPGROUP].build(bld, bic) > > > > > > def add_log_filter(name): > > --- > > > > > > _______________________________________________ > > devel mailing list > > devel@rtems.org > > http://lists.rtems.org/mailman/listinfo/devel > > -- > embedded brains GmbH > Herr Sebastian HUBER > Dornierstr. 4 > 82178 Puchheim > Germany > email: sebastian.hu...@embedded-brains.de > phone: +49-89-18 94 741 - 16 > fax: +49-89-18 94 741 - 08 > > Registergericht: Amtsgericht München > Registernummer: HRB 157899 > Vertretungsberechtigte Geschäftsführer: Peter Rasmussen, Thomas Dörfler > Unsere Datenschutzerklärung finden Sie hier: > https://embedded-brains.de/datenschutzerklaerung/ --- --- /home/phil-k/RTEMS/TMP/rtems/wscript +++ /home/phil-k/RTEMS/rtems-tools/rtems/wscript @@ -151,6 +151,40 @@ return _IS_ENABLED_OP[key](enabled, value) return enabled_by in enabled +color_true = '\x1b[32m' +color_false = '\x1b[31m' +color_clear = '\x1b[0m' + +def _get_enabler_op_and(enabled, enabled_by): + return "{ " + " and ".join(_get_enabler(enabled, next_enabled_by) for next_enabled_by in enabled_by) + " }" + + +def _get_enabler_op_not(enabled, enabled_by): + return "{ " + color_true + "not " + color_false + _get_enabler(enabled, enabled_by) + color_clear + " }" + + +def _get_enabler_op_or(enabled, enabled_by): + return "{ " + " or ".join((color_true if _is_enabled(enabled, next_enabled_by) else color_false) + \ + _get_enabler(enabled, next_enabled_by) + color_clear for next_enabled_by in enabled_by) + " }" + + +_GET_ENABLER_OP = { + "and": _get_enabler_op_and, + "not": _get_enabler_op_not, + "or": _get_enabler_op_or, +} + + +def _get_enabler(enabled, enabled_by): + if isinstance(enabled_by, bool): + return color_true + str(enabled_by) + color_clear + if isinstance(enabled_by, list): + return _get_enabler_op_or(enabled, enabled_by) + if isinstance(enabled_by, dict): + key, value = next(iter(enabled_by.items())) + return _GET_ENABLER_OP[key](enabled, value) + return enabled_by + def _asm_explicit_target(self, node): task = self.create_task("asm", node, @@ -232,6 +266,14 @@ raise type(e)( "Build error related to item spec:{}: {}".format( self.uid, str(e))) + + + def dump_spec(self, bld, bic, depth): + if _is_enabled(bld.env.ENABLE, self.get_enabled_by()): + enabler = _get_enabler(bld.env.ENABLE, self.get_enabled_by()) + print("│ "*depth + "├──" + self.uid + " # enabled-by: " + enabler) + for p in self.links(): + p.dump_spec(bld, bic, depth + 1) def do_defaults(self, enabled): return @@ -1683,3 +1725,47 @@ print(variant) if first: no_matches_error(ctx, white_list) + + +def append_variant_viewspec(bld): + import waflib.Options + from waflib.Build import BuildContext + + for var in bld.env["VARIANTS"]: + class magic(BuildContext): + cmd = "viewspec_" + var + fun = "viewspec" + variant = var + + waflib.Options.commands.append(bld.cmd + "_" + var) + +def viewspec(bld): + if not bld.variant: + check_forbidden_options( + bld, + [ + "compiler", + "config", + "options", + "specs", + "tools", + "top_group", + "version", + ], + ) + load_items(bld, bld.env.SPECS) + append_variant_viewspec(bld) + return + long_command_line_workaround(bld) + bic = BuildItemContext([], [], [], [], [], [], + []) + + print("BSPS:") + bsps[bld.env.ARCH][bld.env.BSP_BASE].dump_spec(bld, bic, 0) + print("items:") + items[bld.env.TOPGROUP].dump_spec(bld, bic, 0) + +from waflib.Build import BuildContext +class viewspec_magic(BuildContext): + cmd = 'viewspec' + fun = 'viewspec' ---
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel