Browse Source

Tools: build all vehicles in build-with-disabled-features

master
Peter Barker 7 years ago committed by Randy Mackay
parent
commit
4847a61868
  1. 160
      Tools/autotest/build-with-disabled-features.py

160
Tools/autotest/build-with-disabled-features.py

@ -34,22 +34,13 @@ from pysim import util
class Builder(): class Builder():
def __init__(self): def __init__(self, spec):
self.config = 'ArduCopter/APM_Config.h' self.config = spec["config"]
self.autotest_build = "build.ArduCopter" self.autotest_build = spec["builddir"]
# list other features that have to be disabled when a feature # list other features that have to be disabled when a feature
# is disabled (recursion not done; be exhaustive): # is disabled (recursion not done; be exhaustive):
self.reverse_deps = { self.reverse_deps = spec["reverse-deps"]
"AC_FENCE": ["AC_AVOID_ENABLED"],
"PROXIMITY_ENABLED": ["AC_AVOID_ENABLED"],
"AC_RALLY": ["AC_TERRAIN"],
"MODE_AUTO_ENABLED": ["AC_TERRAIN", "MODE_GUIDED"],
"MODE_RTL_ENABLED": ["MODE_AUTO_ENABLED", "AC_TERRAIN"],
"BEACON_ENABLED": ["AC_AVOID_ENABLED"],
"MODE_CIRCLE_ENABLED": ["MODE_AUTO_ENABLED", "AC_TERRAIN"],
"MODE_GUIDED_ENABLED": ["MODE_AUTO_ENABLED", "AC_TERRAIN"],
}
def reverse_deps_for_var(self, var): def reverse_deps_for_var(self, var):
return self.reverse_deps.get(var, []) return self.reverse_deps.get(var, [])
@ -59,29 +50,56 @@ class Builder():
def get_config_variables(self): def get_config_variables(self):
ret = [] ret = []
r = (' *# *define +([A-Z_]+)\s+'
'(ENABLED|DISABLED|!HAL_MINIMIZE_FEATURES)')
with open(util.reltopdir(self.config)) as fd: with open(util.reltopdir(self.config)) as fd:
for line in fd: for line in fd:
match = re.match('//#define ([A-Z_]+)\s+(ENABLED|DISABLED)', match = re.match(r, line)
line) if match is None:
if match is not None: continue
ret.append(match.group(1)) if match.group(1) in ("ENABLE", "DISABLE",
return ret "!HAL_MINIMIZE_FEATURES"):
continue
ret.append( (match.group(1), match.group(2) ))
return set(ret)
def disable_option_in_config(self, var): def disable_option_in_config(self, var):
tmpfile = util.reltopdir(self.config) + ".tmp" tmpfile = util.reltopdir(self.config) + ".tmp"
shutil.move(self.config, tmpfile) shutil.move(self.config, tmpfile)
out_fd = open(self.config, 'w+') with open(self.config, 'w+') as out_fd:
with open(util.reltopdir(tmpfile)) as fd: with open(util.reltopdir(tmpfile)) as fd:
for line in fd: did_enable = False
things_to_toggle = self.reverse_deps_for_var(var) for line in fd:
things_to_toggle.append(var) regex = ' *# *define +%s\s+(ENABLED|DISABLED|!HAL_MINIMIZE_FEATURES)' % (var[0],)
for thing in things_to_toggle: match = re.match(regex, line)
line = re.sub( if match is not None:
'//(#define\s+%s\s+(ENABLED|DISABLED))' % thing, if (match.group(1) in ["ENABLED",
"\\1", "!HAL_MINIMIZE_FEATURES"]):
line) fnoo = "DISABLED"
out_fd.write(line) else:
out_fd.close() fnoo = "ENABLED"
did_enable = True
line = "#define %s %s\n" % (var[0], fnoo)
out_fd.write(line)
# turn dependencies on or off:
tmpfile = util.reltopdir(self.config) + ".tmp-deps"
shutil.move(self.config, tmpfile)
with open(self.config, 'w+') as out_fd:
with open(util.reltopdir(tmpfile)) as fd:
for line in fd:
things_to_toggle = self.reverse_deps_for_var(var[0])
for thing in things_to_toggle:
regex = ' *# *define +%s\s+(ENABLED|DISABLED|!HAL_MINIMIZE_FEATURES)' % thing
match = re.match(regex, line)
if match is not None:
if did_enable:
fnoo = "ENABLED"
else:
fnoo = "DISABLED"
line = "#define %s %s\n" % (thing, fnoo)
out_fd.write(line)
def backup_config_filepath(self): def backup_config_filepath(self):
return util.reltopdir(self.config) + ".backup" return util.reltopdir(self.config) + ".backup"
@ -102,22 +120,92 @@ class Builder():
return ret == 0 return ret == 0
def run(self): def run(self):
self.progress("Doing: %s" % (self.autotest_build,))
self.backup_config() self.backup_config()
successes = [] successes = []
failures = [] failures = []
for var in self.get_config_variables(): for var in self.get_config_variables():
print("var: %s" % str(var))
self.disable_option_in_config(var) self.disable_option_in_config(var)
if self.build_works(): if self.build_works():
self.progress("%s OK" % var) self.progress("%s OK" % var[0])
successes.append(var) successes.append(var[0])
else: else:
self.progress("%s BAD" % var) self.progress("%s BAD" % var[0])
failures.append(var) failures.append(var[0])
self.restore_config() self.restore_config()
self.successes = successes
self.failures = failures
self.progress("Successes: %s" % str(successes)) self.progress("Successes: %s" % str(successes))
self.progress("Failures: %s" % str(failures)) self.progress("Failures: %s" % str(failures))
class BuilderCopter(Builder):
def get_config_variables(self):
ret = []
r = '//#define ([A-Z_]+)\s+(ENABLED|DISABLED!HAL_MINIMIZE_FEATURES)'
with open(util.reltopdir(self.config)) as fd:
for line in fd:
print("line: %s" % line)
match = re.match(r, line)
if match is not None:
ret.append(match.group(1))
return ret
# read reverse dep "MODE_AUTO_ENABLED": ["AC_TERRAIN", "MODE_GUIDED"] thusly:
# "if mode-auto is disabled then you must also disable terrain and guided mode"
builder = Builder() specs = [
builder.run() {
"config": 'ArduCopter/config.h',
"builddir": "build.ArduCopter",
"reverse-deps": {
"AC_FENCE": ["AC_AVOID_ENABLED", "MODE_FOLLOW_ENABLED"],
"PROXIMITY_ENABLED": ["AC_AVOID_ENABLED", "MODE_FOLLOW_ENABLED" ],
"AC_RALLY": ["AC_TERRAIN"],
"MODE_AUTO_ENABLED": ["AC_TERRAIN", "MODE_GUIDED"],
"MODE_RTL_ENABLED": ["MODE_AUTO_ENABLED", "AC_TERRAIN"],
"BEACON_ENABLED": ["AC_AVOID_ENABLED", "MODE_FOLLOW_ENABLED"],
"MODE_CIRCLE_ENABLED": ["MODE_AUTO_ENABLED", "AC_TERRAIN"],
"MODE_GUIDED_ENABLED": ["MODE_AUTO_ENABLED", "AC_TERRAIN"],
"AC_AVOID_ENABLED": ["MODE_FOLLOW_ENABLED"],
},
}, {
"config": 'ArduPlane/config.h',
"builddir": "build.ArduPlane",
"reverse-deps": {
},
}, {
"config": 'APMrover2/config.h',
"builddir": "build.APMrover2",
"reverse-deps": {
},
}, {
"config": 'ArduSub/config.h',
"builddir": "build.ArduSub",
"reverse-deps": {
"AC_FENCE": ["AVOIDANCE_ENABLED"],
"PROXIMITY_ENABLED": ["AVOIDANCE_ENABLED"],
"AC_RALLY": ["AC_TERRAIN"],
},
}, {
"config": 'AntennaTracker/config.h',
"builddir": "build.AntennaTracker",
"reverse-deps": {
},
},
]
builders = []
for spec in specs:
builder = Builder(spec)
builder.run()
builders.append(builder)
print("")
for builder in builders:
print("Builder: %s" % builder.autotest_build)
print(" Successes: %s" % builder.successes)
print(" Failures: %s" % builder.failures)

Loading…
Cancel
Save