From e374158cd048adfa8f49dd3449cbef6647dcbe44 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:17:55 +0100 Subject: [PATCH 1/5] Add smart_include_length_shorten to build middlewares Ensure smart_include_length_shorten is added to build middlewares on Windows. --- builder/frameworks/arduino.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/builder/frameworks/arduino.py b/builder/frameworks/arduino.py index 8565fc256..a09fa9584 100644 --- a/builder/frameworks/arduino.py +++ b/builder/frameworks/arduino.py @@ -936,7 +936,9 @@ def get_frameworks_in_current_env(): env.AddPostAction("checkprogsize", silent_action) if IS_WINDOWS: - env.AddBuildMiddleware(smart_include_length_shorten) + if not env.get("__PIO_BUILD_MIDDLEWARES"): + env["__PIO_BUILD_MIDDLEWARES"] = [] + env["__PIO_BUILD_MIDDLEWARES"].append(env.AddBuildMiddleware(smart_include_length_shorten)) build_script_path = str(Path(FRAMEWORK_DIR) / "tools" / "pioarduino-build.py") SConscript(build_script_path) From bba836b4a3646516c17f15168d21dfb3d775e29a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:22:07 +0100 Subject: [PATCH 2/5] Fix indentation issue in Arduino build middleware --- builder/frameworks/arduino.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/builder/frameworks/arduino.py b/builder/frameworks/arduino.py index a09fa9584..fb7caa6f4 100644 --- a/builder/frameworks/arduino.py +++ b/builder/frameworks/arduino.py @@ -938,7 +938,7 @@ def get_frameworks_in_current_env(): if IS_WINDOWS: if not env.get("__PIO_BUILD_MIDDLEWARES"): env["__PIO_BUILD_MIDDLEWARES"] = [] - env["__PIO_BUILD_MIDDLEWARES"].append(env.AddBuildMiddleware(smart_include_length_shorten)) + env["__PIO_BUILD_MIDDLEWARES"].append(env.AddBuildMiddleware(smart_include_length_shorten)) build_script_path = str(Path(FRAMEWORK_DIR) / "tools" / "pioarduino-build.py") SConscript(build_script_path) From 38dac4139e6a9b136c05c7ce5d91e2a21d3f4e00 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 Dec 2025 12:47:47 +0100 Subject: [PATCH 3/5] Integrate smart_include_length_shorten with middlewares --- builder/frameworks/arduino.py | 58 +++++++++++++++++++++++++++++++++-- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/builder/frameworks/arduino.py b/builder/frameworks/arduino.py index fb7caa6f4..762718f1f 100644 --- a/builder/frameworks/arduino.py +++ b/builder/frameworks/arduino.py @@ -936,9 +936,63 @@ def get_frameworks_in_current_env(): env.AddPostAction("checkprogsize", silent_action) if IS_WINDOWS: - if not env.get("__PIO_BUILD_MIDDLEWARES"): + # Integrate smart_include_length_shorten with existing middlewares + existing_middlewares = list(env.get("__PIO_BUILD_MIDDLEWARES", [])) + + if existing_middlewares: + # Wrap user middlewares to work together with smart_include_length_shorten + def integrated_middleware(env, node): + # Create a custom env.Object wrapper that intercepts calls + original_object = env.Object + result_holder = {"result": None, "called": False} + + def custom_object_wrapper(node_arg, **kwargs): + # User middleware called env.Object - capture it + result_holder["called"] = True + result_holder["kwargs"] = kwargs + # Don't actually compile yet, just return a marker + return None + + # Temporarily replace env.Object + env.Object = custom_object_wrapper + + # Call user middleware - it will call our wrapper + for middleware_func, _ in existing_middlewares: + middleware_func(env, node) + + # Restore original env.Object + env.Object = original_object + + # Now compile with smart_include_length_shorten + if result_holder["called"] and result_holder.get("kwargs"): + # User middleware wants custom flags - merge them + user_kwargs = result_holder["kwargs"] + + # Temporarily apply user's custom flags to env + old_values = {} + for key, value in user_kwargs.items(): + if key in env: + old_values[key] = env[key] + env[key] = value + + # Compile with smart_include_length_shorten + result = smart_include_length_shorten(env, node) + + # Restore original env values + for key, value in old_values.items(): + env[key] = value + + return result + else: + # No custom flags, just use smart_include_length_shorten + return smart_include_length_shorten(env, node) + + # Replace all middlewares with the integrated one env["__PIO_BUILD_MIDDLEWARES"] = [] - env["__PIO_BUILD_MIDDLEWARES"].append(env.AddBuildMiddleware(smart_include_length_shorten)) + env.AddBuildMiddleware(integrated_middleware) + else: + # No user middlewares, just add smart_include_length_shorten + env.AddBuildMiddleware(smart_include_length_shorten) build_script_path = str(Path(FRAMEWORK_DIR) / "tools" / "pioarduino-build.py") SConscript(build_script_path) From 929e96107c9777595c99df9e2f15025a8e2b18e0 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 Dec 2025 13:45:14 +0100 Subject: [PATCH 4/5] Enhance middleware function argument handling Update middleware handling to support varying argument counts. --- builder/frameworks/arduino.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/builder/frameworks/arduino.py b/builder/frameworks/arduino.py index 762718f1f..62b4300b1 100644 --- a/builder/frameworks/arduino.py +++ b/builder/frameworks/arduino.py @@ -957,8 +957,21 @@ def custom_object_wrapper(node_arg, **kwargs): env.Object = custom_object_wrapper # Call user middleware - it will call our wrapper - for middleware_func, _ in existing_middlewares: - middleware_func(env, node) + for middleware_func, pattern in existing_middlewares: + # Mirror PlatformIO: callbacks may be def f(node) or def f(env, node) + try: + argcount = middleware_func.__code__.co_argcount + except AttributeError: + argcount = 1 + if argcount == 2: + result = middleware_func(env, node) + else: + result = middleware_func(node) + # Honor return value: None drops the node + if result is None: + return None + if result is not node: + node = result # Restore original env.Object env.Object = original_object From b769742eb1c97278baf049b982eb9143410bdb05 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 8 Dec 2025 14:05:06 +0100 Subject: [PATCH 5/5] revert coderabbitai refactor suggestion --- builder/frameworks/arduino.py | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/builder/frameworks/arduino.py b/builder/frameworks/arduino.py index 62b4300b1..82cd33746 100644 --- a/builder/frameworks/arduino.py +++ b/builder/frameworks/arduino.py @@ -946,7 +946,7 @@ def integrated_middleware(env, node): original_object = env.Object result_holder = {"result": None, "called": False} - def custom_object_wrapper(node_arg, **kwargs): + def custom_object_wrapper(_node, **kwargs): # User middleware called env.Object - capture it result_holder["called"] = True result_holder["kwargs"] = kwargs @@ -957,21 +957,8 @@ def custom_object_wrapper(node_arg, **kwargs): env.Object = custom_object_wrapper # Call user middleware - it will call our wrapper - for middleware_func, pattern in existing_middlewares: - # Mirror PlatformIO: callbacks may be def f(node) or def f(env, node) - try: - argcount = middleware_func.__code__.co_argcount - except AttributeError: - argcount = 1 - if argcount == 2: - result = middleware_func(env, node) - else: - result = middleware_func(node) - # Honor return value: None drops the node - if result is None: - return None - if result is not node: - node = result + for middleware_func, _ in existing_middlewares: + middleware_func(env, node) # Restore original env.Object env.Object = original_object