[PATCH] build: Use BSP family for options

Sebastian Huber sebastian.huber at embedded-brains.de
Wed Jul 14 06:20:05 UTC 2021


Close #4468.
---
 wscript | 51 ++++++++++++++++++++++++++++-----------------------
 1 file changed, 28 insertions(+), 23 deletions(-)

diff --git a/wscript b/wscript
index 6626fafb74..357e8918df 100755
--- a/wscript
+++ b/wscript
@@ -203,11 +203,11 @@ class Item(object):
     def get_enabled_by(self):
         return self.data["enabled-by"]
 
-    def defaults(self, enable, variant):
+    def defaults(self, enable, variant, family):
         if _is_enabled(enable, self.get_enabled_by()):
             for p in self.links():
-                p.defaults(enable, variant)
-            self.do_defaults(variant)
+                p.defaults(enable, variant, family)
+            self.do_defaults(variant, family)
 
     def configure(self, conf, cic):
         if _is_enabled(conf.env.ENABLE, self.get_enabled_by()):
@@ -223,7 +223,7 @@ class Item(object):
                 p.build(bld, bic)
             self.do_build(bld, bic)
 
-    def do_defaults(self, variant):
+    def do_defaults(self, variant, family):
         return
 
     def prepare_configure(self, conf, cic):
@@ -592,9 +592,6 @@ class BSPItem(Item):
         arch_bsps = bsps.setdefault(data["arch"].strip(), {})
         arch_bsps[data["bsp"].strip()] = self
 
-    def prepare_configure(self, conf, cic):
-        conf.env.BSP_FAMILY = self.data["family"]
-
     def prepare_build(self, bld, bic):
         return BuildItemContext(
             bic.includes + bld.env.BSP_INCLUDES.split(), [], [], []
@@ -689,16 +686,18 @@ class OptionItem(Item):
         super(OptionItem, self).__init__(uid, data)
 
     @staticmethod
-    def _is_variant(variants, variant):
+    def _is_variant(variants, variant, family):
         for pattern in variants:
             if re.match(pattern + "$", variant):
                 return True
+            if re.match(pattern + "$", family):
+                return True
         return False
 
-    def default_value(self, variant):
+    def default_value(self, variant, family):
         value = self.data["default"]
         for default in self.data["default-by-variant"]:
-            if OptionItem._is_variant(default["variants"], variant):
+            if OptionItem._is_variant(default["variants"], variant, family):
                 value = default["value"]
                 break
         if value is None:
@@ -709,8 +708,8 @@ class OptionItem(Item):
             return value
         return self.data["format"].format(value)
 
-    def do_defaults(self, variant):
-        value = self.default_value(variant)
+    def do_defaults(self, variant, family):
+        value = self.default_value(variant, family)
         if value is None:
             return
         description = self.data["description"]
@@ -917,7 +916,7 @@ class OptionItem(Item):
             value = cic.cp.getboolean(conf.variant, name)
             cic.add_option(name)
         except configparser.NoOptionError:
-            value = self.default_value(conf.env.ARCH_BSP)
+            value = self.default_value(conf.env.ARCH_BSP, conf.env.ARCH_FAMILY)
         except ValueError as ve:
             conf.fatal(
                 "Invalid value for configuration option {}: {}".format(name, ve)
@@ -933,7 +932,7 @@ class OptionItem(Item):
             value = cic.cp.get(conf.variant, name)
             cic.add_option(name)
         except configparser.NoOptionError:
-            value = self.default_value(conf.env.ARCH_BSP)
+            value = self.default_value(conf.env.ARCH_BSP, conf.env.ARCH_FAMILY)
             if value is None:
                 return value
         try:
@@ -952,7 +951,7 @@ class OptionItem(Item):
             cic.add_option(name)
             value = no_unicode(value)
         except configparser.NoOptionError:
-            value = self.default_value(conf.env.ARCH_BSP)
+            value = self.default_value(conf.env.ARCH_BSP, conf.env.ARCH_FAMILY)
         return value
 
     def _script(self, conf, cic, value, arg):
@@ -1365,11 +1364,20 @@ def configure_variant(conf, cp, bsp_map, path_list, top_group, variant):
     conf.setenv(variant)
     arch, bsp_name = variant.split("/")
     bsp_base = bsp_map.get(bsp_name, bsp_name)
-    arch_bsp = arch + "/" + bsp_base
 
+    try:
+        bsp_item = bsps[arch][bsp_base]
+    except KeyError:
+        conf.fatal("No such base BSP: '{}'".format(variant))
+
+    bsp_family = self.data["family"]
+    arch_bsp = arch + "/" + bsp_base
+    arch_family = arch + "/" + bsp_family
     conf.env["ARCH"] = arch
     conf.env["ARCH_BSP"] = arch_bsp
+    conf.env["ARCH_FAMILY"] = arch_family
     conf.env["BSP_BASE"] = bsp_base
+    conf.env["BSP_FAMILY"] = bsp_family
     conf.env["BSP_NAME"] = bsp_name
     conf.env["DEST_OS"] = "rtems"
 
@@ -1384,11 +1392,6 @@ def configure_variant(conf, cp, bsp_map, path_list, top_group, variant):
     cic = ConfigItemContext(cp, path_list)
 
     items[conf.env.TOPGROUP].configure(conf, cic)
-
-    try:
-        bsp_item = bsps[arch][bsp_base]
-    except KeyError:
-        conf.fatal("No such base BSP: '{}'".format(variant))
     bsp_item.configure(conf, cic)
 
     options = set([o[0].upper() for o in cp.items(variant)])
@@ -1558,8 +1561,10 @@ COMPILER = {}""".format(
                     )
                 )
                 enable = [compiler, arch, variant]
-                items[top_group].defaults(enable, variant)
-                bsps[arch][bsp].defaults(enable, variant)
+                bsp_item = bsps[arch][bsp]
+                family = arch + "/" + bsp_item.data["family"]
+                items[top_group].defaults(enable, variant, family)
+                bsp_item.defaults(enable, variant, family)
     if first:
         no_matches_error(ctx, white_list)
 
-- 
2.26.2



More information about the devel mailing list