From a899cc680f04cc817828128a6047d0e1eb2044a1 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:29:26 +0200 Subject: [PATCH 01/14] Update platform.json --- platform.json | 38 +++++++++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/platform.json b/platform.json index 89a2d2f93..d3e80e604 100644 --- a/platform.json +++ b/platform.json @@ -6,13 +6,13 @@ "license": "Apache-2.0", "keywords": [ "dev-platform", - "Wi-Fi", + "WiFi", "Bluetooth", "Xtensa", "RISC-V" ], "engines": { - "platformio": ">=6.1.16" + "platformio": ">=6.1.18" }, "repository": { "type": "git", @@ -85,9 +85,16 @@ }, "tool-esptoolpy": { "type": "uploader", + "optional": false, "owner": "pioarduino", "version": "https://github.com/pioarduino/esptool/releases/download/v4.8.9/esptool.zip" }, + "tl-install": { + "type": "tool", + "optional": false, + "owner": "pioarduino", + "version": "https://github.com/pioarduino/esp_install/releases/download/v5.0.0/esp_install-v5.0.0.zip" + }, "tool-dfuutil-arduino": { "type": "uploader", "optional": true, @@ -96,12 +103,13 @@ }, "tool-openocd-esp32": { "type": "debugger", - "optional": true, - "owner": "platformio", - "version": "~2.1100.0" + "optional": false, + "owner": "pioarduino", + "version": "https://github.com/pioarduino/registry/releases/download/0.0.1/openocd-v0.12.0-esp32-20250226.zip" }, "tool-mklittlefs": { "type": "uploader", + "optional": true, "owner": "tasmota", "version": "^3.2.0" }, @@ -118,34 +126,46 @@ "version": "~2.230.0" }, "tool-cppcheck": { + "type": "tool", "optional": true, "owner": "platformio", "version": "~1.21100" }, "tool-clangtidy": { + "type": "tool", "optional": true, "owner": "platformio", "version": "^1.190100.0" }, "tool-pvs-studio": { + "type": "tool", "optional": true, "owner": "platformio", "version": "^7.18.59866" }, "tool-cmake": { + "type": "tool", "optional": true, "owner": "platformio", "version": "~3.30.2" }, - "tool-esp-rom-elfs": { - "optional": true, - "owner": "platformio", - "version": "0.0.1+20241011" + "tool-esp-rom-elfs": { + "type": "tool", + "optional": true, + "owner": "platformio", + "version": "0.0.1+20241011" }, "tool-ninja": { + "type": "tool", "optional": true, "owner": "platformio", "version": "^1.7.0" + }, + "tool-scons": { + "type": "tool", + "optional": true, + "owner": "platformio", + "version": "~4.40801.0" } } } From acabc699b60971024bf6029dab6d33c9214e63da Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:41:45 +0200 Subject: [PATCH 02/14] install newer OpenOCD via tl_install from github --- platform.py | 64 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 50 insertions(+), 14 deletions(-) diff --git a/platform.py b/platform.py index d27a32b6e..2cf0ffc58 100644 --- a/platform.py +++ b/platform.py @@ -13,13 +13,15 @@ # limitations under the License. import os -import urllib +import subprocess import sys -import json -import re -import requests +import shutil +from os.path import join from platformio.public import PlatformBase, to_unix_path +from platformio.proc import get_pythonexe_path +from platformio.project.config import ProjectConfig +from platformio.package.manager.tool import ToolPackageManager IS_WINDOWS = sys.platform.startswith("win") @@ -29,6 +31,36 @@ if IS_WINDOWS: os.environ["PLATFORMIO_SYSTEM_TYPE"] = "windows_amd64" +python_exe = get_pythonexe_path() +pm = ToolPackageManager() + +def install_tool(TOOL): + TOOLS_PATH_DEFAULT = os.path.join(os.path.expanduser("~"), ".platformio") + IDF_TOOLS = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py") + TOOLS_JSON_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL, "tools.json") + TOOLS_PACK_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL, "package.json") + IDF_TOOLS_CMD = ( + python_exe, + IDF_TOOLS, + "--quiet", + "--non-interactive", + "--tools-json", + TOOLS_JSON_PATH, + "install" + ) + + tl_flag = bool(os.path.exists(IDF_TOOLS)) + json_flag = bool(os.path.exists(TOOLS_JSON_PATH)) + if tl_flag and json_flag: + rc = subprocess.call(IDF_TOOLS_CMD) + if rc != 0: + sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") + else: + tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) + shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) + pm.install(tl_path) + return + class Espressif32Platform(PlatformBase): def configure_default_packages(self, variables, targets): @@ -43,7 +75,12 @@ def configure_default_packages(self, variables, targets): core_variant_build = (''.join(variables.get("build_flags", []))).replace("-D", " ") frameworks = variables.get("pioframework", []) - if "arduino" in frameworks: + # Installer only needed for setup, deactivate + self.packages["tl-install"]["optional"] = True + # Installed not from pio registry, deactivate until needed + self.packages["tool-openocd-esp32"]["optional"] = True + + if "arduino" in frameworks and variables.get("custom_sdkconfig") is None and len(str(board_sdkconfig)) < 3: self.packages["framework-arduinoespressif32"]["optional"] = False self.packages["framework-arduinoespressif32-libs"]["optional"] = False # use matching espressif Arduino libs @@ -93,21 +130,20 @@ def configure_default_packages(self, variables, targets): # Starting from v12, Espressif's toolchains are shipped without # bundled GDB. Instead, it's distributed as separate packages for Xtensa # and RISC-V targets. - for gdb_package in ("tool-xtensa-esp-elf-gdb", "tool-riscv32-esp-elf-gdb"): - self.packages[gdb_package]["optional"] = False - # if IS_WINDOWS: - # Note: On Windows GDB v12 is not able to - # launch a GDB server in pipe mode while v11 works fine - # self.packages[gdb_package]["version"] = "~11.2.0" + if (variables.get("build_type") or "debug" in "".join(targets)) or variables.get("upload_protocol"): + for gdb_package in ("tool-xtensa-esp-elf-gdb", "tool-riscv32-esp-elf-gdb"): + self.packages[gdb_package]["optional"] = False + install_tool("tool-openocd-esp32") + self.packages["tool-openocd-esp32"]["optional"] = False # Common packages for IDF and mixed Arduino+IDF projects if "espidf" in frameworks: self.packages["toolchain-esp32ulp"]["optional"] = False for p in self.packages: if p in ( - "tool-scons", "tool-cmake", "tool-ninja", + "tool-scons", "tool-esp-rom-elfs", ): self.packages[p]["optional"] = False @@ -119,8 +155,8 @@ def configure_default_packages(self, variables, targets): else: self.packages.pop("toolchain-xtensa-esp-elf", None) - if mcu in ("esp32s2", "esp32s3", "esp32c2", "esp32c3", "esp32c6", "esp32h2", "esp32p4"): - if mcu in ("esp32c2", "esp32c3", "esp32c6", "esp32h2", "esp32p4"): + if mcu in ("esp32s2", "esp32s3", "esp32c2", "esp32c3", "esp32c5", "esp32c6", "esp32h2", "esp32p4"): + if mcu in ("esp32c2", "esp32c3", "esp32c5", "esp32c6", "esp32h2", "esp32p4"): self.packages.pop("toolchain-esp32ulp", None) # RISC-V based toolchain for ESP32C3, ESP32C6 ESP32S2, ESP32S3 ULP self.packages["toolchain-riscv32-esp"]["optional"] = False From 1b24fa537d459f80d34b0f0f419984247b4e0df3 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:43:34 +0200 Subject: [PATCH 03/14] Build C6 Blink example in debug mode --- examples/arduino-blink/platformio.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/arduino-blink/platformio.ini b/examples/arduino-blink/platformio.ini index e6c37cb53..ddec96cec 100644 --- a/examples/arduino-blink/platformio.ini +++ b/examples/arduino-blink/platformio.ini @@ -93,6 +93,7 @@ custom_component_remove = espressif/esp_hosted [env:esp32-c6-devkitc-1] platform = espressif32 framework = arduino +build_type = debug board = esp32-c6-devkitc-1 monitor_speed = 115200 custom_component_remove = espressif/esp_hosted From 3b22952d0368d78c6dfa14d076233884394d3f94 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:48:21 +0200 Subject: [PATCH 04/14] Update platform.py --- platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.py b/platform.py index 2cf0ffc58..c0b175298 100644 --- a/platform.py +++ b/platform.py @@ -80,7 +80,7 @@ def configure_default_packages(self, variables, targets): # Installed not from pio registry, deactivate until needed self.packages["tool-openocd-esp32"]["optional"] = True - if "arduino" in frameworks and variables.get("custom_sdkconfig") is None and len(str(board_sdkconfig)) < 3: + if "arduino" in frameworks: self.packages["framework-arduinoespressif32"]["optional"] = False self.packages["framework-arduinoespressif32-libs"]["optional"] = False # use matching espressif Arduino libs From 19f024b8ed6897132db7ec4aa225e3cc8f1eb491 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 13:57:28 +0200 Subject: [PATCH 05/14] Esp32ExceptionDecoder: decode stack overflow backtraces --- monitor/filter_exception_decoder.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monitor/filter_exception_decoder.py b/monitor/filter_exception_decoder.py index d0f4a39b3..9c4df9e83 100644 --- a/monitor/filter_exception_decoder.py +++ b/monitor/filter_exception_decoder.py @@ -32,7 +32,7 @@ class Esp32ExceptionDecoder(DeviceMonitorFilterBase): NAME = "esp32_exception_decoder" - ADDR_PATTERN = re.compile(r"((?:0x[0-9a-fA-F]{8}[: ]?)+)\s?$") + ADDR_PATTERN = re.compile(r"((?:0x[0-9a-fA-F]{8}[: ]?)+)") ADDR_SPLIT = re.compile(r"[ :]") PREFIX_RE = re.compile(r"^ *") From e61acc75f8d44980dff11165dde4a3ab546c935e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:18:33 +0200 Subject: [PATCH 06/14] do not overwrite an existing package.json --- platform.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platform.py b/platform.py index c0b175298..1fe8985d6 100644 --- a/platform.py +++ b/platform.py @@ -57,7 +57,8 @@ def install_tool(TOOL): sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") else: tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) - shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) + if not bool(os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json"))): + shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) pm.install(tl_path) return From 2b71471bfc07a77541cb89866d9039ef5acb0e08 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:56:16 +0200 Subject: [PATCH 07/14] remove redundant `bool` --- platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.py b/platform.py index 1fe8985d6..a3ae5af7c 100644 --- a/platform.py +++ b/platform.py @@ -57,7 +57,7 @@ def install_tool(TOOL): sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") else: tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) - if not bool(os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json"))): + if not os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")): shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) pm.install(tl_path) return From 575ca3e9a2fbfe69c7fefbaa13361f5a209aa359 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 25 Apr 2025 18:25:23 +0200 Subject: [PATCH 08/14] Deactivate tl-install AFTER it is installed --- platform.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platform.py b/platform.py index a3ae5af7c..5f177977c 100644 --- a/platform.py +++ b/platform.py @@ -76,8 +76,9 @@ def configure_default_packages(self, variables, targets): core_variant_build = (''.join(variables.get("build_flags", []))).replace("-D", " ") frameworks = variables.get("pioframework", []) - # Installer only needed for setup, deactivate - self.packages["tl-install"]["optional"] = True + # Installer only needed for setup, deactivate when installed + if bool(os.path.exists(os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py"))): + self.packages["tl-install"]["optional"] = True # Installed not from pio registry, deactivate until needed self.packages["tool-openocd-esp32"]["optional"] = True From 6d2d94c525975abb8e0d1ba870f2866b032a349b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 26 Apr 2025 17:49:44 +0200 Subject: [PATCH 09/14] move installer in class --- platform.py | 76 ++++++++++++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/platform.py b/platform.py index 5f177977c..4deacda59 100644 --- a/platform.py +++ b/platform.py @@ -27,42 +27,13 @@ IS_WINDOWS = sys.platform.startswith("win") # Set Platformio env var to use windows_amd64 for all windows architectures # only windows_amd64 native espressif toolchains are available -# needs platformio core >= 6.1.16b2 or pioarduino core 6.1.16+test +# needs platformio/pioarduino core >= 6.1.17 if IS_WINDOWS: os.environ["PLATFORMIO_SYSTEM_TYPE"] = "windows_amd64" python_exe = get_pythonexe_path() pm = ToolPackageManager() -def install_tool(TOOL): - TOOLS_PATH_DEFAULT = os.path.join(os.path.expanduser("~"), ".platformio") - IDF_TOOLS = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py") - TOOLS_JSON_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL, "tools.json") - TOOLS_PACK_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL, "package.json") - IDF_TOOLS_CMD = ( - python_exe, - IDF_TOOLS, - "--quiet", - "--non-interactive", - "--tools-json", - TOOLS_JSON_PATH, - "install" - ) - - tl_flag = bool(os.path.exists(IDF_TOOLS)) - json_flag = bool(os.path.exists(TOOLS_JSON_PATH)) - if tl_flag and json_flag: - rc = subprocess.call(IDF_TOOLS_CMD) - if rc != 0: - sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") - else: - tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) - if not os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")): - shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) - pm.install(tl_path) - return - - class Espressif32Platform(PlatformBase): def configure_default_packages(self, variables, targets): if not variables.get("board"): @@ -76,11 +47,45 @@ def configure_default_packages(self, variables, targets): core_variant_build = (''.join(variables.get("build_flags", []))).replace("-D", " ") frameworks = variables.get("pioframework", []) + def install_tool(TOOL): + INSTALL_TOOL = "install-" + TOOL.split('-', 1)[-1] + INSTALL_TOOL_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), INSTALL_TOOL) + TOOL_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL) + TOOLS_PATH_DEFAULT = os.path.join(os.path.expanduser("~"), ".platformio") + IDF_TOOLS = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py") + TOOLS_JSON_PATH = os.path.join(INSTALL_TOOL_PATH, "tools.json") + TOOLS_PACK_PATH = os.path.join(INSTALL_TOOL_PATH, "package.json") + IDF_TOOLS_CMD = ( + python_exe, + IDF_TOOLS, + "--quiet", + "--non-interactive", + "--tools-json", + TOOLS_JSON_PATH, + "install" + ) + + tl_flag = bool(os.path.exists(IDF_TOOLS)) + json_flag = bool(os.path.exists(TOOLS_JSON_PATH)) + tool_flag = bool(os.path.exists(TOOL_PATH)) + if tl_flag and json_flag and not tool_flag: + rc = subprocess.call(IDF_TOOLS_CMD) + if rc != 0: + sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") + else: + tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) + if not os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")): + shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) + pm.install(tl_path) + # tool is already installed, just activate it + self.packages[TOOL]["version"] = TOOL_PATH + self.packages[TOOL]["optional"] = False + self.packages.pop(INSTALL_TOOL, None) + return + # Installer only needed for setup, deactivate when installed if bool(os.path.exists(os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py"))): self.packages["tl-install"]["optional"] = True - # Installed not from pio registry, deactivate until needed - self.packages["tool-openocd-esp32"]["optional"] = True if "arduino" in frameworks: self.packages["framework-arduinoespressif32"]["optional"] = False @@ -129,14 +134,13 @@ def configure_default_packages(self, variables, targets): else: del self.packages["tool-dfuutil-arduino"] - # Starting from v12, Espressif's toolchains are shipped without - # bundled GDB. Instead, it's distributed as separate packages for Xtensa - # and RISC-V targets. + # install GDB and OpenOCD when debug mode or upload_protocol is set if (variables.get("build_type") or "debug" in "".join(targets)) or variables.get("upload_protocol"): for gdb_package in ("tool-xtensa-esp-elf-gdb", "tool-riscv32-esp-elf-gdb"): self.packages[gdb_package]["optional"] = False install_tool("tool-openocd-esp32") - self.packages["tool-openocd-esp32"]["optional"] = False + else: + self.packages["install-openocd-esp32"]["optional"] = True # Common packages for IDF and mixed Arduino+IDF projects if "espidf" in frameworks: From ef71a2b31202e58d52d885c2a8479cafd28e1205 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 26 Apr 2025 17:56:06 +0200 Subject: [PATCH 10/14] Update platform.json --- platform.json | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/platform.json b/platform.json index d3e80e604..ecfbbfd87 100644 --- a/platform.json +++ b/platform.json @@ -101,12 +101,18 @@ "owner": "platformio", "version": "~1.11.0" }, - "tool-openocd-esp32": { - "type": "debugger", + "install-openocd-esp32": { + "type": "tool", "optional": false, "owner": "pioarduino", "version": "https://github.com/pioarduino/registry/releases/download/0.0.1/openocd-v0.12.0-esp32-20250226.zip" }, + "tool-openocd-esp32": { + "type": "debugger", + "optional": true, + "owner": "pioarduino", + "version": "" + }, "tool-mklittlefs": { "type": "uploader", "optional": true, From 4284c61d1f9447d0d6ae3ead3fabb0846c405ca8 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 26 Apr 2025 21:04:06 +0200 Subject: [PATCH 11/14] small refactor and clean up --- platform.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/platform.py b/platform.py index 4deacda59..d5f2b6767 100644 --- a/platform.py +++ b/platform.py @@ -42,15 +42,14 @@ def configure_default_packages(self, variables, targets): board_config = self.board_config(variables.get("board")) mcu = variables.get("board_build.mcu", board_config.get("build.mcu", "esp32")) board_sdkconfig = variables.get("board_espidf.custom_sdkconfig", board_config.get("espidf.custom_sdkconfig", "")) - core_variant_board = ''.join(variables.get("board_build.extra_flags", board_config.get("build.extra_flags", ""))) - core_variant_board = core_variant_board.replace("-D", " ") - core_variant_build = (''.join(variables.get("build_flags", []))).replace("-D", " ") frameworks = variables.get("pioframework", []) def install_tool(TOOL): INSTALL_TOOL = "install-" + TOOL.split('-', 1)[-1] + self.packages[INSTALL_TOOL]["optional"] = False INSTALL_TOOL_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), INSTALL_TOOL) TOOL_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL) + TOOL_PACKAGE_PATH = os.path.join(TOOL_PATH, "package.json") TOOLS_PATH_DEFAULT = os.path.join(os.path.expanduser("~"), ".platformio") IDF_TOOLS = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py") TOOLS_JSON_PATH = os.path.join(INSTALL_TOOL_PATH, "tools.json") @@ -67,20 +66,23 @@ def install_tool(TOOL): tl_flag = bool(os.path.exists(IDF_TOOLS)) json_flag = bool(os.path.exists(TOOLS_JSON_PATH)) - tool_flag = bool(os.path.exists(TOOL_PATH)) + tool_flag = bool(os.path.exists(TOOL_PACKAGE_PATH)) if tl_flag and json_flag and not tool_flag: - rc = subprocess.call(IDF_TOOLS_CMD) + rc = subprocess.run(IDF_TOOLS_CMD).returncode if rc != 0: sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") else: tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) if not os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")): shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) - pm.install(tl_path) + pm.install(tl_path) + self.packages[INSTALL_TOOL]["optional"] = True # tool is already installed, just activate it - self.packages[TOOL]["version"] = TOOL_PATH - self.packages[TOOL]["optional"] = False - self.packages.pop(INSTALL_TOOL, None) + if tl_flag and json_flag and tool_flag: + self.packages[TOOL]["version"] = TOOL_PATH + self.packages[TOOL]["optional"] = False + self.packages[INSTALL_TOOL]["optional"] = True + return # Installer only needed for setup, deactivate when installed @@ -117,8 +119,7 @@ def install_tool(TOOL): self.packages["tool-mkfatfs"]["optional"] = False else: self.packages["tool-mkspiffs"]["optional"] = False - if variables.get("upload_protocol"): - self.packages["tool-openocd-esp32"]["optional"] = False + if os.path.isdir("ulp"): self.packages["toolchain-esp32ulp"]["optional"] = False @@ -153,8 +154,6 @@ def install_tool(TOOL): "tool-esp-rom-elfs", ): self.packages[p]["optional"] = False - # elif p in ("tool-mconf", "tool-idf") and IS_WINDOWS: - # self.packages[p]["optional"] = False if mcu in ("esp32", "esp32s2", "esp32s3"): self.packages["toolchain-xtensa-esp-elf"]["optional"] = False From f59c54bfcfac5d28a770bc0c06321f93b392876d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 27 Apr 2025 12:46:11 +0200 Subject: [PATCH 12/14] refactor no need for install folder / entry --- platform.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/platform.py b/platform.py index d5f2b6767..83d761fcf 100644 --- a/platform.py +++ b/platform.py @@ -45,15 +45,13 @@ def configure_default_packages(self, variables, targets): frameworks = variables.get("pioframework", []) def install_tool(TOOL): - INSTALL_TOOL = "install-" + TOOL.split('-', 1)[-1] - self.packages[INSTALL_TOOL]["optional"] = False - INSTALL_TOOL_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), INSTALL_TOOL) + self.packages[TOOL]["optional"] = False TOOL_PATH = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), TOOL) TOOL_PACKAGE_PATH = os.path.join(TOOL_PATH, "package.json") TOOLS_PATH_DEFAULT = os.path.join(os.path.expanduser("~"), ".platformio") IDF_TOOLS = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tl-install", "tools", "idf_tools.py") - TOOLS_JSON_PATH = os.path.join(INSTALL_TOOL_PATH, "tools.json") - TOOLS_PACK_PATH = os.path.join(INSTALL_TOOL_PATH, "package.json") + TOOLS_JSON_PATH = os.path.join(TOOL_PATH, "tools.json") + TOOLS_PIO_PATH = os.path.join(TOOL_PATH, ".piopm") IDF_TOOLS_CMD = ( python_exe, IDF_TOOLS, @@ -66,22 +64,26 @@ def install_tool(TOOL): tl_flag = bool(os.path.exists(IDF_TOOLS)) json_flag = bool(os.path.exists(TOOLS_JSON_PATH)) - tool_flag = bool(os.path.exists(TOOL_PACKAGE_PATH)) - if tl_flag and json_flag and not tool_flag: + pio_flag = bool(os.path.exists(TOOLS_PIO_PATH)) + if tl_flag and json_flag: rc = subprocess.run(IDF_TOOLS_CMD).returncode if rc != 0: sys.stderr.write("Error: Couldn't execute 'idf_tools.py install'\n") else: tl_path = "file://" + join(TOOLS_PATH_DEFAULT, "tools", TOOL) if not os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")): - shutil.copyfile(TOOLS_PACK_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) + shutil.copyfile(TOOL_PACKAGE_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) + self.packages.pop(TOOL, None) + if os.path.exists(TOOL_PATH,) and os.path.isdir(TOOL_PATH): + try: + shutil.rmtree(TOOL_PATH) + except Exception as e: + print(f"Error while removing the tool folder: {e}") pm.install(tl_path) - self.packages[INSTALL_TOOL]["optional"] = True # tool is already installed, just activate it - if tl_flag and json_flag and tool_flag: + if tl_flag and pio_flag and not json_flag: self.packages[TOOL]["version"] = TOOL_PATH self.packages[TOOL]["optional"] = False - self.packages[INSTALL_TOOL]["optional"] = True return @@ -140,8 +142,6 @@ def install_tool(TOOL): for gdb_package in ("tool-xtensa-esp-elf-gdb", "tool-riscv32-esp-elf-gdb"): self.packages[gdb_package]["optional"] = False install_tool("tool-openocd-esp32") - else: - self.packages["install-openocd-esp32"]["optional"] = True # Common packages for IDF and mixed Arduino+IDF projects if "espidf" in frameworks: From 083609d927bbb2fb14148d210758c77f3718e3f1 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 27 Apr 2025 12:55:46 +0200 Subject: [PATCH 13/14] no extra installer entry --- platform.json | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/platform.json b/platform.json index ecfbbfd87..0cb088fe0 100644 --- a/platform.json +++ b/platform.json @@ -101,17 +101,11 @@ "owner": "platformio", "version": "~1.11.0" }, - "install-openocd-esp32": { - "type": "tool", - "optional": false, - "owner": "pioarduino", - "version": "https://github.com/pioarduino/registry/releases/download/0.0.1/openocd-v0.12.0-esp32-20250226.zip" - }, "tool-openocd-esp32": { "type": "debugger", "optional": true, "owner": "pioarduino", - "version": "" + "version": "https://github.com/pioarduino/registry/releases/download/0.0.1/openocd-v0.12.0-esp32-20250226.zip" }, "tool-mklittlefs": { "type": "uploader", From ced2c632156759749f74ac034dd9a0a24a72b56b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 27 Apr 2025 13:40:36 +0200 Subject: [PATCH 14/14] remove trailing `,` --- platform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform.py b/platform.py index 83d761fcf..8080001ac 100644 --- a/platform.py +++ b/platform.py @@ -74,7 +74,7 @@ def install_tool(TOOL): if not os.path.exists(join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")): shutil.copyfile(TOOL_PACKAGE_PATH, join(TOOLS_PATH_DEFAULT, "tools", TOOL, "package.json")) self.packages.pop(TOOL, None) - if os.path.exists(TOOL_PATH,) and os.path.isdir(TOOL_PATH): + if os.path.exists(TOOL_PATH) and os.path.isdir(TOOL_PATH): try: shutil.rmtree(TOOL_PATH) except Exception as e: