mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-30 10:47:19 +02:00
bugfix: Fix windows path case sensitivity
This commit fixes an issue where paths on Windows are case insensitive, for instance when setting the build folder its name would be converted to lowercase. The culprit is our realpath() function, that was calling os.path.normcase() internally, since we are removing that call it makes sense to just remove the function entirely and call os.path.realpath() wherever necessary. Closes https://github.com/espressif/esp-idf/issues/10282
This commit is contained in:
12
tools/idf.py
12
tools/idf.py
@ -38,7 +38,7 @@ import python_version_checker # noqa: E402
|
|||||||
try:
|
try:
|
||||||
from idf_py_actions.errors import FatalError # noqa: E402
|
from idf_py_actions.errors import FatalError # noqa: E402
|
||||||
from idf_py_actions.tools import (PROG, SHELL_COMPLETE_RUN, SHELL_COMPLETE_VAR, PropertyDict, # noqa: E402
|
from idf_py_actions.tools import (PROG, SHELL_COMPLETE_RUN, SHELL_COMPLETE_VAR, PropertyDict, # noqa: E402
|
||||||
debug_print_idf_version, get_target, merge_action_lists, print_warning, realpath)
|
debug_print_idf_version, get_target, merge_action_lists, print_warning)
|
||||||
if os.getenv('IDF_COMPONENT_MANAGER') != '0':
|
if os.getenv('IDF_COMPONENT_MANAGER') != '0':
|
||||||
from idf_component_manager import idf_extensions
|
from idf_component_manager import idf_extensions
|
||||||
except ImportError:
|
except ImportError:
|
||||||
@ -64,9 +64,9 @@ def check_environment() -> List:
|
|||||||
|
|
||||||
# verify that IDF_PATH env variable is set
|
# verify that IDF_PATH env variable is set
|
||||||
# find the directory idf.py is in, then the parent directory of this, and assume this is IDF_PATH
|
# find the directory idf.py is in, then the parent directory of this, and assume this is IDF_PATH
|
||||||
detected_idf_path = realpath(os.path.join(os.path.dirname(__file__), '..'))
|
detected_idf_path = os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))
|
||||||
if 'IDF_PATH' in os.environ:
|
if 'IDF_PATH' in os.environ:
|
||||||
set_idf_path = realpath(os.environ['IDF_PATH'])
|
set_idf_path = os.path.realpath(os.environ['IDF_PATH'])
|
||||||
if set_idf_path != detected_idf_path:
|
if set_idf_path != detected_idf_path:
|
||||||
print_warning(
|
print_warning(
|
||||||
'WARNING: IDF_PATH environment variable is set to %s but %s path indicates IDF directory %s. '
|
'WARNING: IDF_PATH environment variable is set to %s but %s path indicates IDF directory %s. '
|
||||||
@ -616,7 +616,7 @@ def init_cli(verbose_output: List=None) -> Any:
|
|||||||
)
|
)
|
||||||
@click.option('-C', '--project-dir', default=os.getcwd(), type=click.Path())
|
@click.option('-C', '--project-dir', default=os.getcwd(), type=click.Path())
|
||||||
def parse_project_dir(project_dir: str) -> Any:
|
def parse_project_dir(project_dir: str) -> Any:
|
||||||
return realpath(project_dir)
|
return os.path.realpath(project_dir)
|
||||||
|
|
||||||
# Set `complete_var` to not existing environment variable name to prevent early cmd completion
|
# Set `complete_var` to not existing environment variable name to prevent early cmd completion
|
||||||
project_dir = parse_project_dir(standalone_mode=False, complete_var='_IDF.PY_COMPLETE_NOT_EXISTING')
|
project_dir = parse_project_dir(standalone_mode=False, complete_var='_IDF.PY_COMPLETE_NOT_EXISTING')
|
||||||
@ -624,11 +624,11 @@ def init_cli(verbose_output: List=None) -> Any:
|
|||||||
all_actions: Dict = {}
|
all_actions: Dict = {}
|
||||||
# Load extensions from components dir
|
# Load extensions from components dir
|
||||||
idf_py_extensions_path = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_py_actions')
|
idf_py_extensions_path = os.path.join(os.environ['IDF_PATH'], 'tools', 'idf_py_actions')
|
||||||
extension_dirs = [realpath(idf_py_extensions_path)]
|
extension_dirs = [os.path.realpath(idf_py_extensions_path)]
|
||||||
extra_paths = os.environ.get('IDF_EXTRA_ACTIONS_PATH')
|
extra_paths = os.environ.get('IDF_EXTRA_ACTIONS_PATH')
|
||||||
if extra_paths is not None:
|
if extra_paths is not None:
|
||||||
for path in extra_paths.split(';'):
|
for path in extra_paths.split(';'):
|
||||||
path = realpath(path)
|
path = os.path.realpath(path)
|
||||||
if path not in extension_dirs:
|
if path not in extension_dirs:
|
||||||
extension_dirs.append(path)
|
extension_dirs.append(path)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
import fnmatch
|
import fnmatch
|
||||||
import json
|
import json
|
||||||
@ -19,7 +19,7 @@ from idf_py_actions.constants import GENERATORS, PREVIEW_TARGETS, SUPPORTED_TARG
|
|||||||
from idf_py_actions.errors import FatalError
|
from idf_py_actions.errors import FatalError
|
||||||
from idf_py_actions.global_options import global_options
|
from idf_py_actions.global_options import global_options
|
||||||
from idf_py_actions.tools import (PropertyDict, TargetChoice, ensure_build_directory, get_target, idf_version,
|
from idf_py_actions.tools import (PropertyDict, TargetChoice, ensure_build_directory, get_target, idf_version,
|
||||||
merge_action_lists, print_hints, realpath, run_target)
|
merge_action_lists, print_hints, run_target)
|
||||||
|
|
||||||
|
|
||||||
def action_extensions(base_actions: Dict, project_path: str) -> Any:
|
def action_extensions(base_actions: Dict, project_path: str) -> Any:
|
||||||
@ -164,14 +164,14 @@ def action_extensions(base_actions: Dict, project_path: str) -> Any:
|
|||||||
ensure_build_directory(args, ctx.info_name, True)
|
ensure_build_directory(args, ctx.info_name, True)
|
||||||
|
|
||||||
def validate_root_options(ctx: Context, args: PropertyDict, tasks: List) -> None:
|
def validate_root_options(ctx: Context, args: PropertyDict, tasks: List) -> None:
|
||||||
args.project_dir = realpath(args.project_dir)
|
args.project_dir = os.path.realpath(args.project_dir)
|
||||||
if args.build_dir is not None and args.project_dir == realpath(args.build_dir):
|
if args.build_dir is not None and args.project_dir == os.path.realpath(args.build_dir):
|
||||||
raise FatalError(
|
raise FatalError(
|
||||||
'Setting the build directory to the project directory is not supported. Suggest dropping '
|
'Setting the build directory to the project directory is not supported. Suggest dropping '
|
||||||
"--build-dir option, the default is a 'build' subdirectory inside the project directory.")
|
"--build-dir option, the default is a 'build' subdirectory inside the project directory.")
|
||||||
if args.build_dir is None:
|
if args.build_dir is None:
|
||||||
args.build_dir = os.path.join(args.project_dir, 'build')
|
args.build_dir = os.path.join(args.project_dir, 'build')
|
||||||
args.build_dir = realpath(args.build_dir)
|
args.build_dir = os.path.realpath(args.build_dir)
|
||||||
|
|
||||||
def idf_version_callback(ctx: Context, param: str, value: str) -> None:
|
def idf_version_callback(ctx: Context, param: str, value: str) -> None:
|
||||||
if not value or ctx.resilient_parsing:
|
if not value or ctx.resilient_parsing:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# SPDX-FileCopyrightText: 2022 Espressif Systems (Shanghai) CO LTD
|
# SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
import asyncio
|
import asyncio
|
||||||
import os
|
import os
|
||||||
@ -36,16 +36,6 @@ def executable_exists(args: List) -> bool:
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def realpath(path: str) -> str:
|
|
||||||
"""
|
|
||||||
Return the cannonical path with normalized case.
|
|
||||||
|
|
||||||
It is useful on Windows to comparision paths in case-insensitive manner.
|
|
||||||
On Unix and Mac OS X it works as `os.path.realpath()` only.
|
|
||||||
"""
|
|
||||||
return os.path.normcase(os.path.realpath(path))
|
|
||||||
|
|
||||||
|
|
||||||
def _idf_version_from_cmake() -> Optional[str]:
|
def _idf_version_from_cmake() -> Optional[str]:
|
||||||
version_path = os.path.join(os.environ['IDF_PATH'], 'tools/cmake/version.cmake')
|
version_path = os.path.join(os.environ['IDF_PATH'], 'tools/cmake/version.cmake')
|
||||||
regex = re.compile(r'^\s*set\s*\(\s*IDF_VERSION_([A-Z]{5})\s+(\d+)')
|
regex = re.compile(r'^\s*set\s*\(\s*IDF_VERSION_([A-Z]{5})\s+(\d+)')
|
||||||
@ -475,10 +465,10 @@ def ensure_build_directory(args: 'PropertyDict', prog_name: str, always_run_cmak
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
home_dir = cache['CMAKE_HOME_DIRECTORY']
|
home_dir = cache['CMAKE_HOME_DIRECTORY']
|
||||||
if realpath(home_dir) != realpath(project_dir):
|
if os.path.realpath(home_dir) != os.path.realpath(project_dir):
|
||||||
raise FatalError(
|
raise FatalError(
|
||||||
"Build directory '%s' configured for project '%s' not '%s'. Run '%s fullclean' to start again." %
|
"Build directory '%s' configured for project '%s' not '%s'. Run '%s fullclean' to start again." %
|
||||||
(build_dir, realpath(home_dir), realpath(project_dir), prog_name))
|
(build_dir, os.path.realpath(home_dir), os.path.realpath(project_dir), prog_name))
|
||||||
except KeyError:
|
except KeyError:
|
||||||
pass # if cmake failed part way, CMAKE_HOME_DIRECTORY may not be set yet
|
pass # if cmake failed part way, CMAKE_HOME_DIRECTORY may not be set yet
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user