diff --git a/Tools/ardupilotwaf/boards.py b/Tools/ardupilotwaf/boards.py index e0f8b032f1..bbc72a392b 100644 --- a/Tools/ardupilotwaf/boards.py +++ b/Tools/ardupilotwaf/boards.py @@ -585,12 +585,12 @@ class chibios(Board): def pre_build(self, bld): '''pre-build hook that gets called before dynamic sources''' - super(chibios, self).pre_build(bld) from waflib.Context import load_tool module = load_tool('chibios', [], with_sys_path=True) fun = getattr(module, 'pre_build', None) if fun: fun(bld) + super(chibios, self).pre_build(bld) class linux(Board): def configure_env(self, cfg, env): diff --git a/Tools/ardupilotwaf/chibios.py b/Tools/ardupilotwaf/chibios.py index 6ee51841f2..8c89578306 100644 --- a/Tools/ardupilotwaf/chibios.py +++ b/Tools/ardupilotwaf/chibios.py @@ -352,24 +352,8 @@ def configure(cfg): cfg.msg('Default parameters', cfg.options.default_parameters, color='YELLOW') env.DEFAULT_PARAMETERS = cfg.options.default_parameters - # we need to run chibios_hwdef.py at configure stage to generate the ldscript.ld - # that is needed by the remaining configure checks - import subprocess - - if env.BOOTLOADER: - env.HWDEF = srcpath('libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef-bl.dat' % env.BOARD) - env.BOOTLOADER_OPTION="--bootloader" - else: - env.HWDEF = srcpath('libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef.dat' % env.BOARD) - env.BOOTLOADER_OPTION="" - hwdef_script = srcpath('libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py') - hwdef_out = env.BUILDROOT - if not os.path.exists(hwdef_out): - os.mkdir(hwdef_out) - python = sys.executable try: - cmd = "{0} '{1}' -D '{2}' '{3}' {4} --params '{5}'".format(python, hwdef_script, hwdef_out, env.HWDEF, env.BOOTLOADER_OPTION, cfg.options.default_parameters) - ret = subprocess.call(cmd, shell=True) + ret = generate_hwdef_h(env) except Exception: cfg.fatal("Failed to process hwdef.dat") if ret != 0: @@ -379,11 +363,39 @@ def configure(cfg): setup_can_build(cfg) setup_optimization(cfg.env) +def generate_hwdef_h(env): + '''run chibios_hwdef.py''' + import subprocess + + if env.BOOTLOADER: + env.HWDEF = os.path.join(env.SRCROOT, 'libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef-bl.dat' % env.BOARD) + env.BOOTLOADER_OPTION="--bootloader" + else: + env.HWDEF = os.path.join(env.SRCROOT, 'libraries/AP_HAL_ChibiOS/hwdef/%s/hwdef.dat' % env.BOARD) + env.BOOTLOADER_OPTION="" + hwdef_script = os.path.join(env.SRCROOT, 'libraries/AP_HAL_ChibiOS/hwdef/scripts/chibios_hwdef.py') + hwdef_out = env.BUILDROOT + if not os.path.exists(hwdef_out): + os.mkdir(hwdef_out) + python = sys.executable + cmd = "{0} '{1}' -D '{2}' '{3}' {4} --params '{5}'".format(python, hwdef_script, hwdef_out, env.HWDEF, env.BOOTLOADER_OPTION, env.DEFAULT_PARAMETERS) + return subprocess.call(cmd, shell=True) + def pre_build(bld): '''pre-build hook to change dynamic sources''' load_env_vars(bld.env) if bld.env.HAL_WITH_UAVCAN: bld.get_board().with_uavcan = True + hwdef_h = os.path.join(bld.env.BUILDROOT, 'hwdef.h') + if not os.path.exists(hwdef_h): + print("Generating hwdef.h") + try: + ret = generate_hwdef_h(bld.env) + except Exception: + bld.fatal("Failed to process hwdef.dat") + if ret != 0: + bld.fatal("Failed to process hwdef.dat ret=%d" % ret) + setup_optimization(bld.env) def build(bld): @@ -394,7 +406,8 @@ def build(bld): bld.env.get_flat('PYTHON'), bld.env.HWDEF, bld.env.BOOTLOADER_OPTION, bld.env.default_parameters), group='dynamic_sources', target=[bld.bldnode.find_or_declare('hwdef.h'), - bld.bldnode.find_or_declare('ldscript.ld')] + bld.bldnode.find_or_declare('ldscript.ld'), + bld.bldnode.find_or_declare('hw.dat')] ) bld( @@ -405,6 +418,7 @@ def build(bld): ) common_src = [bld.bldnode.find_or_declare('hwdef.h'), + bld.bldnode.find_or_declare('hw.dat'), bld.bldnode.find_or_declare('modules/ChibiOS/include_dirs')] common_src += bld.path.ant_glob('libraries/AP_HAL_ChibiOS/hwdef/common/*.[ch]') common_src += bld.path.ant_glob('libraries/AP_HAL_ChibiOS/hwdef/common/*.mk') diff --git a/Tools/ardupilotwaf/embed.py b/Tools/ardupilotwaf/embed.py index daae8c00fa..160d16b5c2 100644 --- a/Tools/ardupilotwaf/embed.py +++ b/Tools/ardupilotwaf/embed.py @@ -68,6 +68,9 @@ def create_embedded_h(filename, files, uncompressed=False): out = open(filename, "wb") write_encode(out, '''// generated embedded files for AP_ROMFS\n\n''') + # remove duplicates and sort + files = sorted(list(set(files))) + for i in range(len(files)): (name, filename) = files[i] if not embed_file(out, filename, i, name, uncompressed):