From e49e3121623be9279aa4ef8bbf0e599755a0d985 Mon Sep 17 00:00:00 2001 From: Valerii Koval Date: Mon, 19 Jun 2023 21:30:18 +0300 Subject: [PATCH] Improve the process of installing Python deps for IDF --- builder/frameworks/espidf.py | 60 ++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/builder/frameworks/espidf.py b/builder/frameworks/espidf.py index b93f085..84e495d 100644 --- a/builder/frameworks/espidf.py +++ b/builder/frameworks/espidf.py @@ -24,6 +24,7 @@ import copy import json import subprocess import sys +import shutil import os import pkg_resources @@ -58,6 +59,7 @@ idf_variant = mcu.lower() # Required until Arduino switches to v5 IDF5 = platform.get_package_version("framework-espidf").split(".")[1].startswith("5") +IDF_ENV_VERSION = "1.0.0" FRAMEWORK_DIR = platform.get_package_dir("framework-espidf") TOOLCHAIN_DIR = platform.get_package_dir( "toolchain-%s" % ("riscv32-esp" if mcu == "esp32c3" else ("xtensa-%s" % mcu)) @@ -1147,40 +1149,71 @@ def install_python_deps(): ) ) +def get_idf_venv_dir(): + # The name of the IDF venv contains the IDF version to avoid possible conflicts and + # unnecessary reinstallation of Python dependencies in cases when Arduino + # as an IDF component requires a different version of the IDF package and + # hence a different set of Python deps or their versions + idf_version = get_original_version(platform.get_package_version("framework-espidf")) + return os.path.join( + env.subst("$PROJECT_CORE_DIR"), "penv", ".espidf-" + idf_version + ) + +def ensure_python_venv_available(): + + def _is_venv_outdated(venv_data_file): + try: + with open(venv_data_file, "r", encoding="utf8") as fp: + venv_data = json.load(fp) + if venv_data.get("version", "") != IDF_ENV_VERSION: + return True + return False + except: + return True -def get_python_exe(): def _create_venv(venv_dir): pip_path = os.path.join( venv_dir, "Scripts" if IS_WINDOWS else "bin", "pip" + (".exe" if IS_WINDOWS else ""), ) - if not os.path.isfile(pip_path): + + if os.path.isdir(venv_dir): + try: + print("Removing an oudated IDF virtual environment") + shutil.rmtree(venv_dir) + except OSError: + print( + "Error: Cannot remove an outdated IDF virtual environment. " \ + "Please remove the `%s` folder manually!" % venv_dir + ) + env.Exit(1) + # Use the built-in PlatformIO Python to create a standalone IDF virtual env env.Execute( env.VerboseAction( '"$PYTHONEXE" -m venv --clear "%s"' % venv_dir, - "Creating a virtual environment for IDF Python dependencies", + "Creating a new virtual environment for IDF Python dependencies", ) ) assert os.path.isfile( pip_path - ), "Error: Failed to create a proper virtual environment. Missing the pip binary!" + ), "Error: Failed to create a proper virtual environment. Missing the `pip` binary!" - # The name of the IDF venv contains the IDF version to avoid possible conflicts and - # unnecessary reinstallation of Python dependencies in cases when Arduino - # as an IDF component requires a different version of the IDF package and - # hence a different set of Python deps or their versions - idf_version = get_original_version(platform.get_package_version("framework-espidf")) - venv_dir = os.path.join( - env.subst("$PROJECT_CORE_DIR"), "penv", ".espidf-" + idf_version) - if not os.path.isdir(venv_dir): + venv_dir = get_idf_venv_dir() + venv_data_file = os.path.join(venv_dir, "pio-idf-venv.json") + if not os.path.isfile(venv_data_file) or _is_venv_outdated(venv_data_file): _create_venv(venv_dir) + with open(venv_data_file, "w", encoding="utf8") as fp: + venv_info = {"version": IDF_ENV_VERSION} + json.dump(venv_info, fp, indent=2) + +def get_python_exe(): python_exe_path = os.path.join( - venv_dir, + get_idf_venv_dir(), "Scripts" if IS_WINDOWS else "bin", "python" + (".exe" if IS_WINDOWS else ""), ) @@ -1196,6 +1229,7 @@ def get_python_exe(): # ESP-IDF requires Python packages with specific versions in a virtual environment # +ensure_python_venv_available() install_python_deps() # ESP-IDF package doesn't contain .git folder, instead package version is specified