[PATCH olpc-os-builder] Add support for (non-recursively) including config files in the build config

Sascha Silbe silbe at activitycentral.com
Sat Apr 2 13:33:20 EDT 2011


This is useful for building several similar, but distinct images (e.g.
XO-1 vs. XO-1.5, Gnome vs. no Gnome).

Signed-off-by: Sascha Silbe <silbe at activitycentral.com>
---
 doc/README   |    7 +++++++
 osbuilder.py |   36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+), 0 deletions(-)

diff --git a/doc/README b/doc/README
index 16e6d4f..a8b8d47 100644
--- a/doc/README
+++ b/doc/README
@@ -158,6 +158,13 @@ modules_<ANYTHING>
     Additional modules to include (allowing you to append to the list of
     modules in an additional configuration file)
 
+include
+
+    Additional config files to include (non-recursive). Except for
+    global.modules, your main config will override values set in the
+    included configs. You can use all values defined in the DEFAULT
+    sections of the included configs for interpolation.
+
 
 In general, options need to be set with care.  Aim to stick with the
 values shown in the examples where possible.  For example, if you were
diff --git a/osbuilder.py b/osbuilder.py
index 7fa7750..d00ba05 100755
--- a/osbuilder.py
+++ b/osbuilder.py
@@ -283,6 +283,17 @@ class OsBuilder(object):
                                      os.path.dirname(self.build_config)})
         self.cfg.read(self.build_config)
 
+        # read in additional config files included by the build config for
+        # module list interpolations
+        if self.cfg.has_option('global', 'include'):
+            for file_name in self.cfg.get('global', 'include').split(','):
+                file_name = file_name.strip()
+                if not file_name:
+                    continue
+
+                self.cfg.read(os.path.join(os.path.dirname(self.build_config),
+                                           file_name))
+
         # read in defaults specified on the command line
         if self.additional_defaults is not None:
             self.cfg.read(self.additional_defaults)
@@ -327,6 +338,10 @@ class OsBuilder(object):
 
     def read_config(self):
         """Read and validate config (including module defaults)"""
+        includes = []
+        if self.cfg.has_option('global', 'include'):
+            includes = self.cfg.get('global', 'include').split(',')
+
         # reset config since we want to load the module defaults first
         self.cfg = SafeConfigParser({'oob_config_dir':
                                      os.path.dirname(self.build_config)})
@@ -348,9 +363,30 @@ class OsBuilder(object):
         if self.additional_defaults is not None:
             self.cfg.read(self.additional_defaults)
 
+        # read in additional config files included by the build config
+        for file_name in includes:
+            file_name = file_name.strip()
+            if not file_name:
+                continue
+
+            self.cfg.read(os.path.join(os.path.dirname(self.build_config),
+                                       file_name))
+
         # now load the users config, overriding other settings where specified
         self.cfg.read(self.build_config)
 
+        # check that the modules list is the same as with the initial config
+        # file load order
+        modules = []
+        for option in self.cfg.options('global'):
+            if not option.startswith('modules_') and option != "modules":
+                continue
+            modules.extend([module.strip() for module in self.cfg.get('global', option).split(',')])
+
+        if set(modules) != set(self.modules):
+            raise OsBuilderException('List of modules depends on config file load order: %r != %r' % (
+                                     sorted(set(modules)), sorted(set(self.modules))))
+
         for section in self.cfg.sections():
             m = re.match(r"[A-Za-z_][A-Za-z0-9_]*$", section)
             if not m:
-- 
1.7.4.1



More information about the Devel mailing list