diff --git a/pio-scripts/fixup_usermods.py b/pio-scripts/fixup_usermods.py deleted file mode 100644 index 5b8cddf329..0000000000 --- a/pio-scripts/fixup_usermods.py +++ /dev/null @@ -1,17 +0,0 @@ -Import('env') - -# Patch up each usermod's include folders to include anything referenced by wled -# This is because usermods need to include wled.h -lib_builders = env.GetLibBuilders() -um_deps = [dep for dep in lib_builders if "/usermods" in dep.src_dir] -other_deps = [dep for dep in lib_builders if "/usermods" not in dep.src_dir] - -for um in um_deps: - # Add include paths for all non-usermod dependencies - for dep in other_deps: - for dir in dep.get_include_dirs(): - um.env.PrependUnique(CPPPATH=dir) - # Add the wled folder to the include path - um.env.PrependUnique(CPPPATH=env["PROJECT_SRC_DIR"]) - -#raise RuntimeError("debug") diff --git a/pio-scripts/load_usermods.py b/pio-scripts/load_usermods.py index 55b9c4b1b4..f530782006 100644 --- a/pio-scripts/load_usermods.py +++ b/pio-scripts/load_usermods.py @@ -1,17 +1,19 @@ Import('env') -import os +from pathlib import Path # For OS-agnostic path manipulation -def find_usermod(mod_dir: str, mod: str): +usermod_dir = Path(env["PROJECT_DIR"]) / "usermods" + +def find_usermod(mod: str): """Locate this library in the usermods folder. We do this to avoid needing to rename a bunch of folders; this could be removed later """ # Check name match - mp = f"{mod_dir}/{mod}" - if os.path.exists(mp): + mp = usermod_dir / mod + if mp.exists(): return mp - mp = f"{mod_dir}/usermod_v2_{mod}" - if os.path.exists(mp): + mp = usermod_dir / f"usermod_v2_{mod}" + if mp.exists(): return mp raise RuntimeError(f"Couldn't locate module {mod} in usermods directory!") @@ -21,6 +23,34 @@ def find_usermod(mod_dir: str, mod: str): deps = env.GetProjectOption('lib_deps') src_dir = proj.get("platformio", "src_dir") src_dir = src_dir.replace('\\','/') - mod_paths = {mod: find_usermod(f"{src_dir}/../usermods", mod) for mod in usermods.split(" ")} + mod_paths = {mod: find_usermod(mod) for mod in usermods.split(" ")} usermods = [f"{mod} = symlink://{path}" for mod, path in mod_paths.items()] proj.set("env:" + env['PIOENV'], 'lib_deps', deps + usermods) + + +# Monkey-patch ConfigureProjectLibBuilder to mark up the dependencies +# Save the old value +cpl = env.ConfigureProjectLibBuilder +# Our new wrapper +def cpl_wrapper(env): + result = cpl.clone(env)() + # Update usermod properties + lib_builders = env.GetLibBuilders() + um_deps = [dep for dep in lib_builders if usermod_dir in Path(dep.src_dir).parents] + other_deps = [dep for dep in lib_builders if usermod_dir not in Path(dep.src_dir).parents] + for um in um_deps: + # Add include paths for all non-usermod dependencies + for dep in other_deps: + for dir in dep.get_include_dirs(): + um.env.PrependUnique(CPPPATH=dir) + # Add the wled folder to the include path + um.env.PrependUnique(CPPPATH=env["PROJECT_SRC_DIR"]) + # Make sure we link directly, not through an archive + # Archives drop the .dtor table section we need + build = um._manifest.get("build", {}) + build["libArchive"] = False + um._manifest["build"] = build + return result + +# Replace the old one with ours +env.AddMethod(cpl_wrapper, "ConfigureProjectLibBuilder") diff --git a/platformio.ini b/platformio.ini index a64295e51c..93219d2f7d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -115,7 +115,6 @@ extra_scripts = post:pio-scripts/strip-floats.py pre:pio-scripts/user_config_copy.py pre:pio-scripts/load_usermods.py - post:pio-scripts/fixup_usermods.py pre:pio-scripts/build_ui.py ; post:pio-scripts/obj-dump.py ;; convenience script to create a disassembly dump of the firmware (hardcore debugging)