diff --git a/firmware-patch.diff b/firmware-patch.diff index 323df6a..52dd48f 100644 --- a/firmware-patch.diff +++ b/firmware-patch.diff @@ -17,10 +17,10 @@ index cc742c6c1..545b0923a 100644 \ No newline at end of file diff --git a/bin/mpm_pio.py b/bin/mpm_pio.py new file mode 100644 -index 000000000..044c87186 +index 000000000..c75573465 --- /dev/null +++ b/bin/mpm_pio.py -@@ -0,0 +1,108 @@ +@@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +""" +Mesh Plugin Manager (MPM) - PlatformIO build integration shim. @@ -38,14 +38,14 @@ index 000000000..044c87186 +Import("env") # type: ignore[name-defined] # noqa: F821 + + -+def find_site_packages(venv_dir): ++def find_site_packages(venv_dir, label=""): + """Find site-packages directory in a venv (handles different Python versions).""" + if not os.path.isdir(venv_dir): -+ print(f"MPM: {venv_dir} does not exist or is not a directory") ++ print(f"MPM: {strip_root_dir(venv_dir)} ({label}) does not exist or is not a directory") + return None + lib_dir = os.path.join(venv_dir, "lib") + if not os.path.isdir(lib_dir): -+ print(f"MPM: {lib_dir} does not exist or is not a directory") ++ print(f"MPM: {strip_root_dir(lib_dir)} ({label}) does not exist or is not a directory") + return None + pattern = os.path.join(lib_dir, "python*/site-packages") + matches = glob.glob(pattern) @@ -55,12 +55,12 @@ index 000000000..044c87186 +def add_to_path(directory, env_var="PATH", label=""): + """Add directory to environment variable if it exists and isn't already present.""" + if not directory or not os.path.isdir(directory): -+ print(f"MPM: {directory} does not exist or is not a directory") ++ print(f"MPM: {strip_root_dir(directory)} ({label}) does not exist or is not a directory") + return False + current = os.environ.get(env_var, "") + if directory not in current: + os.environ[env_var] = f"{directory}:{current}" if current else directory -+ print(f"MPM: Added {label or directory} to {env_var}") ++ print(f"MPM: Added {strip_root_dir(directory)} ({label}) to {env_var}") + return True + return False + @@ -68,11 +68,11 @@ index 000000000..044c87186 +def add_to_sys_path(directory, label=""): + """Add directory to sys.path if it exists and isn't already present.""" + if not directory or not os.path.isdir(directory): -+ print(f"MPM: {directory} does not exist or is not a directory") ++ print(f"MPM: {strip_root_dir(directory)} ({label}) does not exist or is not a directory") + return False + if directory not in sys.path: + sys.path.insert(0, directory) -+ print(f"MPM: Added {directory} to sys.path") ++ print(f"MPM: Added {strip_root_dir(directory)} ({label}) to sys.path") + return True + return False + @@ -82,6 +82,14 @@ index 000000000..044c87186 +project_dir = env["PROJECT_DIR"] # type: ignore[name-defined] # noqa: F821 +print(f"MPM DEBUG: project_dir = {project_dir}") + ++root_dir = os.path.abspath(os.path.join(project_dir, "..")) ++print(f"MPM DEBUG: root_dir = {root_dir}") ++ ++def strip_root_dir(path): ++ if path is None: ++ return "./" ++ return "./" + os.path.relpath(path, root_dir) ++ +# First, try to find mpm source and mpm's .venv for local development +# (mpm is at ../../mpm relative to firmware directory) +mpm_dir = os.path.join(project_dir, "..", "mpm") @@ -89,32 +97,32 @@ index 000000000..044c87186 +mpm_source_dir = os.path.join(mpm_dir, "src") +mpm_venv_dir = os.path.join(mpm_dir, ".venv") +firmware_venv_dir = os.path.join(project_dir, ".venv") -+mpm_site_packages = find_site_packages(mpm_venv_dir) -+firmware_site_packages = find_site_packages(firmware_venv_dir) ++mpm_site_packages = find_site_packages(mpm_venv_dir, "mpm .venv") ++firmware_site_packages = find_site_packages(firmware_venv_dir, "firmware .venv") +mpm_venv_bin = os.path.join(mpm_venv_dir, "bin") +firmware_venv_bin = os.path.join(firmware_venv_dir, "bin") + +print(f"MPM Directories:") -+print(f" mpm_dir: {mpm_dir}") -+print(f" mpm_source_dir: {mpm_source_dir}") -+print(f" mpm_venv_dir: {mpm_venv_dir}") -+print(f" firmware_venv_dir: {firmware_venv_dir}") -+print(f" mpm_site_packages: {mpm_site_packages}") -+print(f" firmware_site_packages: {firmware_site_packages}") -+print(f" mpm_venv_bin: {mpm_venv_bin}") -+print(f" firmware_venv_bin: {firmware_venv_bin}") ++print(f" mpm_dir: {strip_root_dir(mpm_dir)}") ++print(f" mpm_source_dir: {strip_root_dir(mpm_source_dir)}") ++print(f" mpm_venv_dir: {strip_root_dir(mpm_venv_dir)}") ++print(f" firmware_venv_dir: {strip_root_dir(firmware_venv_dir)}") ++print(f" mpm_site_packages: {strip_root_dir(mpm_site_packages)}") ++print(f" firmware_site_packages: {strip_root_dir(firmware_site_packages)}") ++print(f" mpm_venv_bin: {strip_root_dir(mpm_venv_bin)}") ++print(f" firmware_venv_bin: {strip_root_dir(firmware_venv_bin) }") + +# These are in reverse order because they are prepended to sys.path +add_to_sys_path(firmware_site_packages, "firmware .venv") # Look for this last +add_to_sys_path(mpm_site_packages, "mpm .venv") # Look for this next -+add_to_sys_path(mpm_source_dir, "mpm source") # Look for this first ++add_to_sys_path(mpm_source_dir, "mpm/src") # Look for this first + +# Add .venv/bin to PATH (prioritize mpm's .venv) -+add_to_path(firmware_venv_bin, "PATH") -+add_to_path(mpm_venv_bin, "PATH") ++add_to_path(firmware_venv_bin, "PATH", "firmware .venv/bin") ++add_to_path(mpm_venv_bin, "PATH", "mpm .venv/bin") + -+for site_packages in [mpm_site_packages, firmware_site_packages]: -+ add_to_path(site_packages, "PYTHONPATH") ++add_to_path(mpm_site_packages, "PYTHONPATH", "mpm .venv/site-packages") ++add_to_path(firmware_site_packages, "PYTHONPATH", "firmware .venv/site-packages") + +# Use the installed `mpm` package +from mesh_plugin_manager.build import init_plugins # type: ignore[import]