check_language (CUDA) does not respect `CUDA_HOST_COMPILER` reborn
As I wrote in #19013 (closed) there is still a different behaviour in enable_language() and check_language().
I don't know how to reopen a closed issue so I create a new one.
With CMAKE 3.16.2, this code called with cmake .. -DCMAKE_CUDA_HOST_COMPILER=/usr/bin/gcc
fails to find a CUDA compiler whereas an enable_language(CUDA) succeeds.
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
cmake_policy(SET CMP0074 NEW)
set (LANGUAGES "Fortran;C")
project(p LANGUAGES ${LANGUAGES})
include(CheckLanguage)
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
message(STATUS "CUDA detected, enabling language")
list(APPEND LANGUAGES "CUDA")
enable_language(CUDA)
message(STATUS "CUDA enabled (version ${CMAKE_CUDA_COMPILER_VERSION})")
set(HAVE_CUDA TRUE)
else ()
message(STATUS "CUDA not detected")
set(HAVE_CUDA FALSE)
endif ()
It can be fixed by copying check_language() macro and changing the if(lang STREQUAL CUDA)
into if(${lang} STREQUAL CUDA)
:
cmake_minimum_required(VERSION 3.16 FATAL_ERROR)
cmake_policy(SET CMP0074 NEW)
set (LANGUAGES "Fortran;C")
project(p LANGUAGES ${LANGUAGES})
#include(CheckLanguage)
macro(check_language lang)
if(NOT DEFINED CMAKE_${lang}_COMPILER)
set(_desc "Looking for a ${lang} compiler")
message(STATUS ${_desc})
file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang})
set(extra_compiler_variables)
message(STATUS "lang: ${lang}")
if(${lang} STREQUAL CUDA)
set(extra_compiler_variables "set(CMAKE_CUDA_HOST_COMPILER \\\"\${CMAKE_CUDA_HOST_COMPILER}\\\")")
message(STATUS "extra_compiler_variables: ${extra_compiler_variables}")
endif()
set(content
"cmake_minimum_required(VERSION ${CMAKE_VERSION})
project(Check${lang} ${lang})
file(WRITE \"\${CMAKE_CURRENT_BINARY_DIR}/result.cmake\"
\"set(CMAKE_${lang}_COMPILER \\\"\${CMAKE_${lang}_COMPILER}\\\")\\n\"
\"${extra_compiler_variables}\\n\"
)"
)
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/CMakeLists.txt"
"${content}")
if(CMAKE_GENERATOR_INSTANCE)
set(_D_CMAKE_GENERATOR_INSTANCE "-DCMAKE_GENERATOR_INSTANCE:INTERNAL=${CMAKE_GENERATOR_INSTANCE}")
else()
set(_D_CMAKE_GENERATOR_INSTANCE "")
endif()
execute_process(
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}
COMMAND ${CMAKE_COMMAND} . -G ${CMAKE_GENERATOR}
-A "${CMAKE_GENERATOR_PLATFORM}"
-T "${CMAKE_GENERATOR_TOOLSET}"
${_D_CMAKE_GENERATOR_INSTANCE}
OUTPUT_VARIABLE output
ERROR_VARIABLE output
RESULT_VARIABLE result
)
include(${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang}/result.cmake OPTIONAL)
if(CMAKE_${lang}_COMPILER AND "${result}" STREQUAL "0")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"${_desc} passed with the following output:\n"
"${output}\n")
else()
set(CMAKE_${lang}_COMPILER NOTFOUND)
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"${_desc} failed with the following output:\n"
"${output}\n")
endif()
message(STATUS "${_desc} - ${CMAKE_${lang}_COMPILER}")
set(CMAKE_${lang}_COMPILER "${CMAKE_${lang}_COMPILER}" CACHE FILEPATH "${lang} compiler")
mark_as_advanced(CMAKE_${lang}_COMPILER)
if(CMAKE_${lang}_HOST_COMPILER)
message(STATUS "Looking for a ${lang} host compiler - ${CMAKE_${lang}_HOST_COMPILER}")
set(CMAKE_${lang}_HOST_COMPILER "${CMAKE_${lang}_HOST_COMPILER}" CACHE FILEPATH "${lang} host compiler")
mark_as_advanced(CMAKE_${lang}_HOST_COMPILER)
endif()
endif()
endmacro()
check_language(CUDA)
if (CMAKE_CUDA_COMPILER)
message(STATUS "CUDA detected, enabling language")
list(APPEND LANGUAGES "CUDA")
enable_language(CUDA)
message(STATUS "CUDA enabled (version ${CMAKE_CUDA_COMPILER_VERSION})")
set(HAVE_CUDA TRUE)
else ()
message(STATUS "CUDA not detected")
set(HAVE_CUDA FALSE)
endif ()
Regards,
XL