File size: 1,756 Bytes
76f9669 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
import os
import warnings
def _paths_differ(a: str, b: str) -> bool:
"""
Return True if paths are observably different.
Strategy:
1) Compare os.path.normcase(os.path.normpath(...)) for quick, robust textual equality.
- Handles trailing slashes and case-insensitivity on Windows.
2) If still different AND both exist, use os.path.samefile to resolve symlinks/junctions.
3) Otherwise (nonexistent paths or samefile unavailable), treat as different.
"""
norm_a = os.path.normcase(os.path.normpath(a))
norm_b = os.path.normcase(os.path.normpath(b))
if norm_a == norm_b:
return False
try:
if os.path.exists(a) and os.path.exists(b):
# samefile raises on non-existent paths; only call when both exist.
return not os.path.samefile(a, b)
except OSError:
# Fall through to "different" if samefile isn't applicable/available.
pass
# If normalized strings differ and we couldn't prove they're the same entry, treat as different.
return True
def get_cuda_home_or_path() -> str | None:
cuda_home = os.environ.get("CUDA_HOME")
cuda_path = os.environ.get("CUDA_PATH")
if cuda_home and cuda_path and _paths_differ(cuda_home, cuda_path):
warnings.warn(
"Both CUDA_HOME and CUDA_PATH are set but differ:\n"
f" CUDA_HOME={cuda_home}\n"
f" CUDA_PATH={cuda_path}\n"
"Using CUDA_HOME (higher priority).",
UserWarning,
stacklevel=2,
)
if cuda_home is not None:
return cuda_home
return cuda_path
|