flexible config scripts
authorTimo Savola <tsavola@movial.fi>
Tue, 29 Apr 2008 18:28:30 +0000 (21:28 +0300)
committerTimo Savola <tsavola@movial.fi>
Tue, 29 Apr 2008 18:28:30 +0000 (21:28 +0300)
changes:

    * only the "config" script is parsed by default (which must exist)

    * scripts can parse other scripts (such as "config.local", "boards"
      and "components") by calling parse()

    * command-line options override scripts' settings

    * as a special case, the debug command-line option takes effect before
      parsing scripts

matrix/build.py
matrix/cache.py
matrix/components.py
matrix/config.py
matrix/git.py
matrix/graph.py
matrix/matrix.py
matrix/repositories.py
matrix/rootfs.py

index e35454f..d21525f 100644 (file)
@@ -8,8 +8,8 @@ from sets import Set as set
 
 import cache
 import components
-import config
 import log
+from config import config
 
 Error = RuntimeError
 InternalError = Exception
index 229b7fc..c880f77 100644 (file)
@@ -5,13 +5,17 @@ import os
 import re
 from sets import Set as set
 
-import config
 import git
+from config import config
 
 Error = RuntimeError
 
 regex = re.compile(r'([^\s]+)[\s]?([^\s]*)')
 
+def init():
+       if not os.path.exists(config.cache_dir):
+               os.makedirs(config.cache_dir)
+
 def contains(c):
        if c.cached is None:
                c.cached = __contains(c)
index 6ec1224..f4c835a 100644 (file)
@@ -6,8 +6,8 @@ import re
 from glob import glob
 from sets import Set as set
 
-import config
 import log
+from config import config
 from repositories import Repository
 
 Error = RuntimeError
index 6b9b5d5..afc7e99 100644 (file)
@@ -2,29 +2,16 @@
 # Authors: Timo Savola <tsavola@movial.fi>
 #          Kalle Vahlman <kalle.vahlman@movial.fi>
 
-import os as _os
-import components as _components
-
-top_dir = _os.environ.get('MATRIX_TOPDIR', '')
-cache_dir = _os.path.join(top_dir, 'build-cache')
-global_cache_dir = '/usr/share/matrix/build-cache'
-script_dir = None
-
-boards = {}
-board = None
-components = {}
-roots = []
-flags = []
-libc = 'glibc'
-verbose = False
-debug = False
-force = False
-keep_going = False
-jobs = 1
-make_jobs = 1
+import os
 
 class Board(object):
-       def __init__(self, name, arch, gcc_march, gcc_mcpu='', gcc_mfpu='', gcc_options='', gnu_host='', flash_erase_size='65536', flash_pad_size='0'):
+       def __init__(self, name, arch, gcc_march,
+                    gcc_mcpu=None,
+                    gcc_mfpu=None,
+                    gcc_options=None,
+                    gnu_host=None,
+                    flash_erase_size=65536,
+                    flash_pad_size=0):
                self.name = name
                self.arch = arch
                self.gcc_march = gcc_march
@@ -35,24 +22,67 @@ class Board(object):
                self.flash_erase_size = flash_erase_size
                self.flash_pad_size = flash_pad_size
 
-               boards[name] = self
+               config.boards[name] = self
 
 def Component(*args, **kwargs):
-       c = _components.Component(*args, **kwargs)
-       components[c.name] = c
+       import components
+
+       c = components.Component(*args, **kwargs)
+       config.components[c.name] = c
        return c
 
 def PlatformProvidedComponent(*args, **kwargs):
-       c = _components.PlatformProvidedComponent(*args, **kwargs)
-       components[c.name] = c
+       import components
+
+       c = components.PlatformProvidedComponent(*args, **kwargs)
+       config.components[c.name] = c
        return c
 
-def parse(path):
-       if _os.path.isabs(path):
-               path = _os.path.join(top_dir, path)
+def parse(name, required=False):
+       if os.path.isabs(name):
+               path = os.path.join(config.top_dir, name)
+       else:
+               path = name
+
+       if os.path.exists(path):
+               if config.debug:
+                       print 'Parsing', path
+
+               execfile(path, actions, config.__dict__)
+       else:
+               msg = 'Config file not found: %s' % name
+               if required:
+                       raise RuntimeError(msg)
+               elif config.debug:
+                       print msg
+
+actions = dict(
+       Board = Board,
+       Component = Component,
+       PlatformProvidedComponent = PlatformProvidedComponent,
+       parse = parse,
+)
+
+class Config(object):
+       def __init__(self):
+               self.top_dir = os.environ.get('MATRIX_TOPDIR', '')
+
+               __cache_dir = os.path.join(self.top_dir, 'build-cache')
+               self.cache_dir = os.environ.get('MATRIX_CACHEDIR', __cache_dir)
+
+               self.script_dir = None
 
-       if _os.path.exists(path):
-               if debug:
-                       print 'Reading', path
+               self.boards = {}
+               self.board = None
+               self.components = {}
+               self.roots = []
+               self.flags = []
+               self.libc = 'glibc'
+               self.verbose = False
+               self.debug = False
+               self.force = False
+               self.keep_going = False
+               self.jobs = 1
+               self.make_jobs = 1
 
-               execfile(path, globals(), globals())
+config = Config()
index fdb2447..a781b5b 100644 (file)
@@ -7,7 +7,7 @@ import os
 import signal
 import sys
 
-import config
+from config import config
 
 class Error(RuntimeError):
        def __init__(self, args, workdir=None):
index 6340836..f77d282 100644 (file)
@@ -5,7 +5,7 @@ import os
 import sys
 
 import components
-import config
+from config import config
 
 
 class Option(object):
index d2d4b27..32737c1 100644 (file)
@@ -11,28 +11,26 @@ from sets import Set as set
 
 import cache
 import components
-import config
 import git
 import log
+from config import config
+from config import parse as config_parse
 from build import build, build_only
 
 Error = RuntimeError
 
 def main():
-       config.parse('config.local')
+       command, targets, options = parse_args()
 
-       command, targets = parse_args()
+       if 'debug' in options:
+               config.debug = options['debug']
 
-       config.parse('config')
-       config.parse('boards')
-       config.parse('components')
+       config_parse('config', True)
 
-       if 'global-cache' in config.flags:
-               config.cache_dir = config.global_cache_dir
-
-       if not os.path.exists(config.cache_dir):
-               os.makedirs(config.cache_dir)
+       for name in options:
+               setattr(config, name, options[name])
 
+       cache.init()
        all_targets = components.init()
 
        for i in xrange(len(targets)):
@@ -81,6 +79,12 @@ commands:
 '''
 
 def parse_args():
+       options = {}
+
+       class Values(object):
+               def __setattr__(self, name, value):
+                       options[name] = value
+
        def help(option, opt, value, parser):
                print_help(sys.stdout, parser)
                sys.exit(0)
@@ -143,12 +147,12 @@ def parse_args():
                dest='make_jobs', action='callback', callback=set_jobs,
                type='int')
 
-       opts, args = parser.parse_args(values=config)
+       values, args = parser.parse_args(values=Values())
        if not args:
                print_help(sys.stderr, parser)
                sys.exit(1)
 
-       return args[0], args[1:]
+       return args[0], args[1:], options
 
 def execute(args):
        if config.debug:
index aa09188..7abc968 100644 (file)
@@ -3,9 +3,9 @@
 
 import os
 
-import config
 import git
 import log
+from config import config
 
 Error = RuntimeError
 
index cf5b78e..b19be2e 100644 (file)
@@ -9,7 +9,7 @@ import re
 import shutil
 import sys
 
-import config
+from config import config
 
 image_type_list = (
        'jffs2',