fix(espidf): pick the python venv matching the IDF tree's version

The newest-env-wins heuristic pinned a 5.x env for a 4.4 tree — each
generation's dependency check only accepts its own requirement set. The
version is read from tools/cmake/version.cmake of the active IDF tree,
falling back to the newest env when unreadable.
This commit is contained in:
David Montero Crespo 2026-07-22 08:10:16 +02:00
parent e876fbef7f
commit e259a5dc19
1 changed files with 20 additions and 2 deletions

View File

@ -1261,8 +1261,26 @@ class ESPIDFCompiler:
# configure). We also invoke cmake directly (not via idf.py),
# where the PYTHON property falls back to the bare `python`
# from PATH — so the venv's bin must lead the PATH too.
for venv in sorted(Path(tools_path).glob('python_env/idf*_env'),
reverse=True):
# Prefer the env matching THIS IDF tree's version (a 5.x env
# satisfies 5.x requirements but fails 4.4's dependency check
# and vice versa); fall back to the newest available.
idf_ver_prefix = 'idf'
try:
ver_src = open(os.path.join(self.idf_path, 'tools', 'cmake',
'version.cmake'),
encoding='utf-8').read()
major = re.search(r'IDF_VERSION_MAJOR (\d+)', ver_src)
minor = re.search(r'IDF_VERSION_MINOR (\d+)', ver_src)
if major and minor:
idf_ver_prefix = f'idf{major.group(1)}.{minor.group(1)}'
except OSError:
pass
venv_candidates = sorted(
Path(tools_path).glob(f'python_env/{idf_ver_prefix}*_env'),
reverse=True,
) or sorted(Path(tools_path).glob('python_env/idf*_env'),
reverse=True)
for venv in venv_candidates:
if (venv / 'bin' / 'python').exists():
env['IDF_PYTHON_ENV_PATH'] = str(venv)
env['PATH'] = (str(venv / 'bin') + os.pathsep