summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Mauderer <christian.mauderer@embedded-brains.de>2018-04-05 15:02:28 +0200
committerChristian Mauderer <christian.mauderer@embedded-brains.de>2018-04-05 15:02:28 +0200
commit5aca4e1c04cc596a1202ff880ec186ce205fd817 (patch)
tree99c6ca1c06f487e031fe6738df8f372755f96700
parent3c4924bcefb7d3c2deabd79fecf45ee1cd5e9268 (diff)
FIXME: waf: Build multiple configurations.ticket-3351
-rw-r--r--buildset/extended.ini2
-rw-r--r--waf_libbsd.py3
-rw-r--r--wscript87
3 files changed, 57 insertions, 35 deletions
diff --git a/buildset/extended.ini b/buildset/extended.ini
index e761cf95..94e13c17 100644
--- a/buildset/extended.ini
+++ b/buildset/extended.ini
@@ -3,4 +3,4 @@ name = extended
extends = base.ini
[modules-enabled]
-tests = 0
+dev_nic_broadcomm = 0
diff --git a/waf_libbsd.py b/waf_libbsd.py
index b17bac5a..fffdf9fe 100644
--- a/waf_libbsd.py
+++ b/waf_libbsd.py
@@ -304,9 +304,6 @@ class Builder(builder.ModuleManager):
includes = conf.env.IFLAGS,
mandatory = False)
- def configure(self, conf):
- pass
-
def build(self, bld):
# This is only necessary for build. But it depends on the waflib which
# is only available in a waf context. But we need the module manager for
diff --git a/wscript b/wscript
index 48af6293..453b39a8 100644
--- a/wscript
+++ b/wscript
@@ -51,8 +51,9 @@ try:
import configparser
except ImportError:
import ConfigParser as configparser
+import waflib.Options
-builders = None
+builders = {}
BUILDSET_DIR = "buildset"
BUILDSET_DEFAULT = "buildset/base.ini"
@@ -88,8 +89,6 @@ def load_config(conf, f):
ini = load_ini(conf, f)
config = {}
- if not ini.has_option('general', 'name'):
- conf.fatal("'{}' is missing a general/name.".format(f))
config['name'] = ini.get('general', 'name')
config['modules-enabled'] = []
@@ -101,21 +100,59 @@ def load_config(conf, f):
config['modules-enabled'].append(mod)
return config
-def create_builder(conf):
+def check_buildsets(ctx, buildset_opt):
+ buildsets = []
+ if buildset_opt == []:
+ buildset_opt.append(BUILDSET_DEFAULT)
+ for bs in buildset_opt:
+ if os.path.isdir(bs):
+ for f in os.listdir(bs):
+ if f[-4:] == ".ini":
+ buildsets += [os.path.join(bs,f)]
+ else:
+ for f in bs.split(','):
+ buildsets += [f]
+ return buildsets
+
+def post_init(ctx, env, context_classes):
+ buildsets = check_buildsets(ctx, env.options['buildset'])
+ bsnames = []
+
global builders
- if builders is not None:
- conf.fatal('builders created multiple times')
- builders = []
- for bs in conf.env.BUILDSET:
+
+ for bs in buildsets:
+ # create builder objects
builder = waf_libbsd.Builder()
libbsd.load(builder)
- bsconfig = load_config(conf, bs)
+ bsconfig = load_config(ctx, bs)
+ bsname = bsconfig['name']
+ bsnames += [bsname]
builder.updateConfiguration(bsconfig)
builder.generate(rtems_version)
- builders.append(builder)
+ builders[bsname]=builder
+
+ # Update the contextes for build variants
+ for y in context_classes:
+ newcmd = y.cmd + '-' + bsname
+ newvariant = y.variant + '-' + bsname
+ class context(y):
+ cmd = newcmd
+ variant = newvariant
+ libbsd_buildset_name = bsname
+
+ # Transform the commands to per build variant commands
+ commands = []
+ for cmd in waflib.Options.commands:
+ if cmd.startswith(('build', 'clean', 'install')):
+ for bsname in bsnames:
+ commands += [cmd + '-' + bsname]
+ else:
+ commands += [cmd]
+ waflib.Options.commands = commands
def init(ctx):
- rtems.init(ctx, version = rtems_version, long_commands = True)
+ rtems.init(ctx, version = rtems_version, long_commands = True,
+ post_init = post_init)
def options(opt):
rtems.options(opt)
@@ -156,8 +193,14 @@ def bsp_configure(conf, arch_bsp):
conf.fatal("RTEMS kernel POSIX support is disabled; configure RTEMS with --enable-posix")
if rtems.check_networking(conf):
conf.fatal("RTEMS kernel contains the old network support; configure RTEMS with --disable-networking")
+ env = conf.env.derive()
for builder in builders:
- builder.bsp_configure(conf, arch_bsp)
+ ab = conf.env.RTEMS_ARCH_BSP
+ variant = ab + "-" + builder
+ conf.msg('Configure variant: ', variant)
+ conf.setenv(variant, env)
+ builders[builder].bsp_configure(conf, arch_bsp)
+ conf.setenv(ab)
def configure(conf):
if conf.options.auto_regen:
@@ -169,26 +212,8 @@ def configure(conf):
conf.env.NET_CONFIG = conf.options.net_config
conf.env.FREEBSD_OPTIONS =conf.options.freebsd_options
conf.env.OPTIMIZATION = conf.options.optimization
- conf.env.BUILDSET = []
- if conf.options.buildset == []:
- conf.options.buildset.append(BUILDSET_DEFAULT)
- for bs in conf.options.buildset:
- if os.path.isdir(bs):
- for f in os.listdir(bs):
- if f[-4:] == ".ini":
- conf.env.BUILDSET.append(os.path.join(bs,f))
- else:
- for f in bs.split(','):
- conf.env.BUILDSET.append(f)
-
- create_builder(conf);
rtems.configure(conf, bsp_configure)
- conf.msg('Enabled buildsets: ', conf.env.BUILDSET)
- for builder in builders:
- builder.configure(conf)
def build(bld):
- create_builder(bld);
rtems.build(bld)
- for builder in builders:
- builder.build(bld)
+ builders[bld.libbsd_buildset_name].build(bld)