Skip to content

check for requirements match of already installed tools #165

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
May 4, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 28 additions & 4 deletions platform.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,30 +57,35 @@
"type": "toolchain",
"optional": true,
"owner": "pioarduino",
"package-version": "14.2.0+20241119",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/xtensa-esp-elf-14.2.0_20241119.zip"
},
"toolchain-riscv32-esp": {
"type": "toolchain",
"optional": true,
"owner": "pioarduino",
"package-version": "14.2.0+20241119",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/riscv32-esp-elf-14.2.0_20241119.zip"
},
"toolchain-esp32ulp": {
"type": "toolchain",
"optional": true,
"owner": "pioarduino",
"package-version": "2.38.0+20240113",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/esp32ulp-elf-2.38_20240113.zip"
},
"tool-xtensa-esp-elf-gdb": {
"tool-xtensa-esp-elf-gdb": {
"type": "debugger",
"optional": true,
"owner": "pioarduino",
"package-version": "16.2.0+20250324",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/xtensa-esp-gdb-v16.2_20250324.zip"
},
"tool-riscv32-esp-elf-gdb": {
"type": "debugger",
"optional": true,
"owner": "pioarduino",
"package-version": "16.2.0+20250324",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/riscv32-esp-gdb-v16.2_20250324.zip"
},
"tool-esptoolpy": {
Expand All @@ -99,72 +104,91 @@
"type": "uploader",
"optional": true,
"owner": "pioarduino",
"package-version": "1.11.0",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/dfuutil-arduino-v1.11.0.zip"
},
"tool-openocd-esp32": {
"type": "debugger",
"optional": true,
"owner": "pioarduino",
"package-version": "2.1200.20250226",
"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": "pioarduino",
"package-version": "3.2.0",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/mklittlefs-3.2.0.zip"
},
"tool-mkfatfs": {
"tool-mklittlefs-4.0.0": {
"type": "uploader",
"optional": true,
"owner": "pioarduino",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/mkfatfs-v2.0.1.zip"
"package-version": "4.0.0",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/mklittlefs-4.0.0.zip"
},
"tool-mkspiffs": {
"type": "uploader",
"optional": true,
"owner": "pioarduino",
"package-version": "2.230.0",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/mkspiffs-v2.230.0.zip"
},
"tool-mkfatfs": {
"type": "uploader",
"optional": true,
"owner": "pioarduino",
"package-version": "2.0.1",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/mkfatfs-v2.0.1.zip"
},
"tool-cppcheck": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"package-version": "2.11.0+230717",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/cppcheck-v2.11.0-230717.zip"
},
"tool-clangtidy": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"package-version": "18.1.1",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/clangtidy-v18.1.1.zip"
},
"tool-pvs-studio": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/pvs-studio-v7.18.zip"
"package-version": "7.36.91321",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/pvs-studio-v7.36.91321.zip"
},
"tool-cmake": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"package-version": "3.30.2",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/cmake-3.30.2.zip"
},
"tool-esp-rom-elfs": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"package-version": "2024.10.11",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/esp-rom-elfs-20241011.zip"
},
"tool-ninja": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"package-version": "1.10.2",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/ninja-1.10.2.zip"
},
"tool-scons": {
"type": "tool",
"optional": true,
"owner": "pioarduino",
"package-version": "4.40801.0",
"version": "https://github.com/pioarduino/registry/releases/download/0.0.1/scons-4.8.1.zip"
}
}
Expand Down
66 changes: 57 additions & 9 deletions platform.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
# limitations under the License.

import os
import requests
import json
import subprocess
import sys
import shutil
Expand Down Expand Up @@ -44,7 +46,7 @@ def configure_default_packages(self, variables, targets):
board_sdkconfig = variables.get("board_espidf.custom_sdkconfig", board_config.get("espidf.custom_sdkconfig", ""))
frameworks = variables.get("pioframework", [])

def install_tool(TOOL):
def install_tool(TOOL, retry_count=0):
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")
Expand Down Expand Up @@ -80,13 +82,37 @@ def install_tool(TOOL):
try:
shutil.rmtree(TOOL_PATH)
except Exception as e:
print(f"Error while removing the tool folder: {e}")
print(f"Error while removing the tool folder: {e}")
pm.install(tl_path)
# tool is already installed, just activate it
if tl_flag and pio_flag and not json_flag:
self.packages[TOOL]["version"] = TOOL_PATH
self.packages[TOOL]["optional"] = False

with open(TOOL_PACKAGE_PATH, "r") as file:
package_data = json.load(file)
# check installed tool version against listed in platforms.json
if "package-version" in self.packages[TOOL] \
and "version" in package_data \
and self.packages[TOOL]["package-version"] == package_data["version"]:
self.packages[TOOL]["version"] = TOOL_PATH
self.packages[TOOL]["optional"] = False
elif "package-version" not in self.packages[TOOL]:
# No version check needed, just use the installed tool
self.packages[TOOL]["version"] = TOOL_PATH
self.packages[TOOL]["optional"] = False
elif "version" not in package_data:
print(f"Warning: Cannot determine installed version for {TOOL}. Reinstalling...")
else: # Installed version does not match required version, deinstall existing and install needed
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}")
if retry_count >= 3: # Limit to 3 retries
print(f"Failed to install {TOOL} after multiple attempts. Please check your network connection and try again manually.")
return
print(f"Wrong version for {TOOL}. Installing needed version...")
install_tool(TOOL, retry_count + 1)

return

# Installer only needed for setup, deactivate when installed
Expand Down Expand Up @@ -130,7 +156,6 @@ def install_tool(TOOL):
# Set mandatory toolchains
for toolchain in toolchain_data["toolchains"]:
install_tool(toolchain)

# Set ULP toolchain if applicable
ulp_toolchain = toolchain_data.get("ulp_toolchain")
if ulp_toolchain and os.path.isdir("ulp"):
Expand Down Expand Up @@ -169,6 +194,13 @@ def install_tool(TOOL):
if "buildfs" in targets:
filesystem = variables.get("board_build.filesystem", "littlefs")
if filesystem == "littlefs":
# ensure use of mklittlefs 3.2.0
piopm_path = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tool-mklittlefs", ".piopm")
if os.path.exists(piopm_path):
with open(piopm_path, "r") as file:
package_data = json.load(file)
if package_data['version'] == "4.0.0":
os.remove(piopm_path)
install_tool("tool-mklittlefs")
elif filesystem == "fatfs":
install_tool("tool-mkfatfs")
Expand All @@ -179,9 +211,25 @@ def install_tool(TOOL):
filesystem = variables.get("board_build.filesystem", "littlefs")
if filesystem == "littlefs":
# Use Tasmota mklittlefs v4.0.0 to unpack, older version is incompatible
self.packages["tool-mklittlefs"]["version"] = "https://github.com/pioarduino/registry/releases/download/0.0.1/mklittlefs-4.0.0.zip"
self.packages["tool-mklittlefs"]["optional"] = False
install_tool("tool-mklittlefs")
# make sure mklittlefs 3.2.0 is installed
mklittlefs_dir = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tool-mklittlefs")
if not os.path.exists(mklittlefs_dir):
install_tool("tool-mklittlefs")
if os.path.exists(os.path.join(mklittlefs_dir, "tools.json")):
install_tool("tool-mklittlefs")
mklittlefs400_dir = os.path.join(ProjectConfig.get_instance().get("platformio", "packages_dir"), "tool-mklittlefs-4.0.0")
if not os.path.exists(mklittlefs400_dir):
# install mklittlefs 4.0.0
install_tool("tool-mklittlefs-4.0.0")
if os.path.exists(os.path.join(mklittlefs400_dir, "tools.json")):
install_tool("tool-mklittlefs-4.0.0")
# use mklittlefs 4.0.0 instead of 3.2.0 by copying over
if os.path.exists(mklittlefs400_dir):
shutil.copyfile(
os.path.join(mklittlefs_dir, "package.json"),
os.path.join(mklittlefs400_dir, "package.json"),
)
shutil.copytree(mklittlefs400_dir, mklittlefs_dir, dirs_exist_ok=True)

# Currently only Arduino Nano ESP32 uses the dfuutil tool as uploader
if variables.get("board") == "arduino_nano_esp32":
Expand Down