Skip to content

Commit c008a94

Browse files
authored
Windows fix to use needed path length shorten together with user middleware (#358)
1 parent f33de21 commit c008a94

File tree

1 file changed

+57
-1
lines changed

1 file changed

+57
-1
lines changed

builder/frameworks/arduino.py

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,63 @@ def get_frameworks_in_current_env():
936936
env.AddPostAction("checkprogsize", silent_action)
937937

938938
if IS_WINDOWS:
939-
env.AddBuildMiddleware(smart_include_length_shorten)
939+
# Integrate smart_include_length_shorten with existing middlewares
940+
existing_middlewares = list(env.get("__PIO_BUILD_MIDDLEWARES", []))
941+
942+
if existing_middlewares:
943+
# Wrap user middlewares to work together with smart_include_length_shorten
944+
def integrated_middleware(env, node):
945+
# Create a custom env.Object wrapper that intercepts calls
946+
original_object = env.Object
947+
result_holder = {"result": None, "called": False}
948+
949+
def custom_object_wrapper(_node, **kwargs):
950+
# User middleware called env.Object - capture it
951+
result_holder["called"] = True
952+
result_holder["kwargs"] = kwargs
953+
# Don't actually compile yet, just return a marker
954+
return None
955+
956+
# Temporarily replace env.Object
957+
env.Object = custom_object_wrapper
958+
959+
# Call user middleware - it will call our wrapper
960+
for middleware_func, _ in existing_middlewares:
961+
middleware_func(env, node)
962+
963+
# Restore original env.Object
964+
env.Object = original_object
965+
966+
# Now compile with smart_include_length_shorten
967+
if result_holder["called"] and result_holder.get("kwargs"):
968+
# User middleware wants custom flags - merge them
969+
user_kwargs = result_holder["kwargs"]
970+
971+
# Temporarily apply user's custom flags to env
972+
old_values = {}
973+
for key, value in user_kwargs.items():
974+
if key in env:
975+
old_values[key] = env[key]
976+
env[key] = value
977+
978+
# Compile with smart_include_length_shorten
979+
result = smart_include_length_shorten(env, node)
980+
981+
# Restore original env values
982+
for key, value in old_values.items():
983+
env[key] = value
984+
985+
return result
986+
else:
987+
# No custom flags, just use smart_include_length_shorten
988+
return smart_include_length_shorten(env, node)
989+
990+
# Replace all middlewares with the integrated one
991+
env["__PIO_BUILD_MIDDLEWARES"] = []
992+
env.AddBuildMiddleware(integrated_middleware)
993+
else:
994+
# No user middlewares, just add smart_include_length_shorten
995+
env.AddBuildMiddleware(smart_include_length_shorten)
940996

941997
build_script_path = str(Path(FRAMEWORK_DIR) / "tools" / "pioarduino-build.py")
942998
SConscript(build_script_path)

0 commit comments

Comments
 (0)