From fdb8f0f58880ea7a659619b842a548a51039074e Mon Sep 17 00:00:00 2001 From: Robert Maynard Date: Mon, 19 May 2025 11:20:02 -0400 Subject: [PATCH] CUDA: Store CMAKE_CUDA_HOST_COMPILER as an absolute path Isolate its selection from later changes to `PATH`. Fixes: #26942 Co-authored-by: Brad King --- Modules/CMakeDetermineCUDACompiler.cmake | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake index 961092fbb9..45db51f552 100644 --- a/Modules/CMakeDetermineCUDACompiler.cmake +++ b/Modules/CMakeDetermineCUDACompiler.cmake @@ -49,6 +49,29 @@ else() if(NOT EXISTS ${CMAKE_CUDA_HOST_COMPILER}) message(FATAL_ERROR "Could not find compiler set in environment variable CUDAHOSTCXX:\n$ENV{CUDAHOSTCXX}.\n${CMAKE_CUDA_HOST_COMPILER}") endif() + elseif(CMAKE_CUDA_HOST_COMPILER) + # We get here if CMAKE_CUDA_HOST_COMPILER was specified by the user or toolchain file. + if(IS_ABSOLUTE "${CMAKE_CUDA_HOST_COMPILER}") + # Convert to forward slashes. + cmake_path(CONVERT "${CMAKE_CUDA_HOST_COMPILER}" TO_CMAKE_PATH_LIST CMAKE_CUDA_HOST_COMPILER NORMALIZE) + else() + # Convert to absolute path so changes in `PATH` do not impact CUDA compilation. + find_program(_CMAKE_CUDA_HOST_COMPILER_PATH NO_CACHE NAMES "${CMAKE_CUDA_HOST_COMPILER}") + if(_CMAKE_CUDA_HOST_COMPILER_PATH) + set(CMAKE_CUDA_HOST_COMPILER "${_CMAKE_CUDA_HOST_COMPILER_PATH}") + endif() + unset(_CMAKE_CUDA_HOST_COMPILER_PATH) + endif() + if(NOT EXISTS "${CMAKE_CUDA_HOST_COMPILER}") + message(FATAL_ERROR "Could not find compiler set in variable CMAKE_CUDA_HOST_COMPILER:\n ${CMAKE_CUDA_HOST_COMPILER}") + endif() + # If the value was cached, update the cache entry with our modifications. + get_property(_CMAKE_CUDA_HOST_COMPILER_CACHED CACHE CMAKE_CUDA_HOST_COMPILER PROPERTY TYPE) + if(_CMAKE_CUDA_HOST_COMPILER_CACHED) + set_property(CACHE CMAKE_CUDA_HOST_COMPILER PROPERTY VALUE "${CMAKE_CUDA_HOST_COMPILER}") + mark_as_advanced(CMAKE_CUDA_HOST_COMPILER) + endif() + unset(_CMAKE_CUDA_HOST_COMPILER_CACHED) endif() endif()