NVCC: Detect host compiler id and version

Report them in `CMAKE_<LANG>_HOST_COMPILER_{ID,VERSION}` variables.

Fixes: #20901
This commit is contained in:
Brad King 2024-09-20 16:32:01 -04:00
parent 38cacd83a5
commit 3b4d0df670
14 changed files with 166 additions and 6 deletions

View File

@ -637,6 +637,8 @@ Variables for Languages
/variable/CMAKE_LANG_FLAGS_RELWITHDEBINFO
/variable/CMAKE_LANG_FLAGS_RELWITHDEBINFO_INIT
/variable/CMAKE_LANG_HOST_COMPILER
/variable/CMAKE_LANG_HOST_COMPILER_ID
/variable/CMAKE_LANG_HOST_COMPILER_VERSION
/variable/CMAKE_LANG_IGNORE_EXTENSIONS
/variable/CMAKE_LANG_IMPLICIT_INCLUDE_DIRECTORIES
/variable/CMAKE_LANG_IMPLICIT_LINK_DIRECTORIES

View File

@ -0,0 +1,8 @@
cuda-host-compiler-id
---------------------
* The :variable:`CMAKE_<LANG>_HOST_COMPILER_ID` and
:variable:`CMAKE_<LANG>_HOST_COMPILER_VERSION` variables were added,
where ``<LANG>`` is either ``CUDA`` or ``HIP``. They are populated
when :variable:`CMAKE_<LANG>_COMPILER_ID` is ``NVIDIA`` to identify
NVCC's host compiler.

View File

@ -42,3 +42,8 @@ variable is read-only and changes to it are undefined behavior.
.. note::
Ignored when using :ref:`Visual Studio Generators`.
See the :variable:`CMAKE_<LANG>_HOST_COMPILER_ID` and
:variable:`CMAKE_<LANG>_HOST_COMPILER_VERSION` variables for
information about the host compiler used by ``nvcc``, whether
by default or specified by ``CMAKE_<LANG>_HOST_COMPILER``.

View File

@ -0,0 +1,10 @@
CMAKE_<LANG>_HOST_COMPILER_ID
-----------------------------
.. versionadded:: 3.31
This variable is available when ``<LANG>`` is ``CUDA`` or ``HIP``
and :variable:`CMAKE_<LANG>_COMPILER_ID` is ``NVIDIA``.
It contains the identity of the host compiler invoked by ``nvcc``,
either by default or as specified by :variable:`CMAKE_<LANG>_HOST_COMPILER`,
among possibilities documented by :variable:`CMAKE_<LANG>_COMPILER_ID`.

View File

@ -0,0 +1,10 @@
CMAKE_<LANG>_HOST_COMPILER_VERSION
----------------------------------
.. versionadded:: 3.31
This variable is available when ``<LANG>`` is ``CUDA`` or ``HIP``
and :variable:`CMAKE_<LANG>_COMPILER_ID` is ``NVIDIA``.
It contains the version of the host compiler invoked by ``nvcc``,
either by default or as specified by :variable:`CMAKE_<LANG>_HOST_COMPILER`,
in the same format as :variable:`CMAKE_<LANG>_COMPILER_VERSION`.

View File

@ -3,6 +3,8 @@ set(CMAKE_CUDA_HOST_COMPILER "@CMAKE_CUDA_HOST_COMPILER@")
set(CMAKE_CUDA_HOST_LINK_LAUNCHER "@CMAKE_CUDA_HOST_LINK_LAUNCHER@")
set(CMAKE_CUDA_COMPILER_ID "@CMAKE_CUDA_COMPILER_ID@")
set(CMAKE_CUDA_COMPILER_VERSION "@CMAKE_CUDA_COMPILER_VERSION@")
set(CMAKE_CUDA_HOST_COMPILER_ID "@CMAKE_CUDA_HOST_COMPILER_ID@")
set(CMAKE_CUDA_HOST_COMPILER_VERSION "@CMAKE_CUDA_HOST_COMPILER_VERSION@")
set(CMAKE_CUDA_DEVICE_LINKER "@CMAKE_CUDA_DEVICE_LINKER@")
set(CMAKE_CUDA_FATBINARY "@CMAKE_CUDA_FATBINARY@")
set(CMAKE_CUDA_STANDARD_COMPUTED_DEFAULT "@CMAKE_CUDA_STANDARD_COMPUTED_DEFAULT@")

View File

@ -16,6 +16,28 @@ char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
@CMAKE_CUDA_COMPILER_ID_PLATFORM_CONTENT@
@CMAKE_CUDA_COMPILER_ID_ERROR_FOR_TEST@
#ifdef HOST_COMPILER_ID
char const* info_host_compiler = "INFO" ":" "host_compiler[" HOST_COMPILER_ID "]";
#endif
#ifdef HOST_COMPILER_VERSION
char const* info_host_compiler_version = "INFO" ":" "host_compiler_version[" HOST_COMPILER_VERSION "]";
#elif defined(HOST_COMPILER_VERSION_MAJOR)
char const info_host_compiler_version[] = {
'I', 'N', 'F', 'O', ':','h','o','s','t','_',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
HOST_COMPILER_VERSION_MAJOR,
# ifdef HOST_COMPILER_VERSION_MINOR
'.', HOST_COMPILER_VERSION_MINOR,
# ifdef HOST_COMPILER_VERSION_PATCH
'.', HOST_COMPILER_VERSION_PATCH,
# ifdef HOST_COMPILER_VERSION_TWEAK
'.', HOST_COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
#define CXX_STD_11 201103L
#define CXX_STD_14 201402L
#define CXX_STD_17 201703L
@ -74,6 +96,12 @@ int main(int argc, char* argv[])
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#ifdef HOST_COMPILER_ID
require += info_host_compiler[argc];
#endif
#ifdef HOST_COMPILER_VERSION_MAJOR
require += info_host_compiler_version[argc];
#endif
require += info_language_standard_default[argc];
require += info_language_extensions_default[argc];

View File

@ -347,8 +347,17 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
else()
set(_archid "")
endif()
if(CMAKE_${lang}_HOST_COMPILER_ID)
set(_hostcc " with host compiler ${CMAKE_${lang}_HOST_COMPILER_ID}")
if(CMAKE_${lang}_HOST_COMPILER_VERSION)
string(APPEND _hostcc " ${CMAKE_${lang}_HOST_COMPILER_VERSION}")
endif()
else()
set(_hostcc "")
endif()
message(STATUS "The ${lang} compiler identification is "
"${CMAKE_${lang}_COMPILER_ID}${_archid}${_version}${_variant}")
"${CMAKE_${lang}_COMPILER_ID}${_archid}${_version}${_variant}${_hostcc}")
unset(_hostcc)
unset(_archid)
unset(_version)
unset(_variant)
@ -373,6 +382,8 @@ function(CMAKE_DETERMINE_COMPILER_ID lang flagvar src)
set(CMAKE_${lang}_COMPILER_WRAPPER "${CMAKE_${lang}_COMPILER_WRAPPER}" PARENT_SCOPE)
set(CMAKE_${lang}_SIMULATE_ID "${CMAKE_${lang}_SIMULATE_ID}" PARENT_SCOPE)
set(CMAKE_${lang}_SIMULATE_VERSION "${CMAKE_${lang}_SIMULATE_VERSION}" PARENT_SCOPE)
set(CMAKE_${lang}_HOST_COMPILER_ID "${CMAKE_${lang}_HOST_COMPILER_ID}" PARENT_SCOPE)
set(CMAKE_${lang}_HOST_COMPILER_VERSION "${CMAKE_${lang}_HOST_COMPILER_VERSION}" PARENT_SCOPE)
set(CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT "${CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT}" PARENT_SCOPE)
set(CMAKE_${lang}_EXTENSIONS_COMPUTED_DEFAULT "${CMAKE_${lang}_EXTENSIONS_COMPUTED_DEFAULT}" PARENT_SCOPE)
set(CMAKE_${lang}_COMPILER_PRODUCED_OUTPUT "${COMPILER_${lang}_PRODUCED_OUTPUT}" PARENT_SCOPE)
@ -395,6 +406,22 @@ function(CMAKE_DETERMINE_COMPILER_ID_WRITE lang src)
PLATFORM_DEFAULT_COMPILER
)
if(lang MATCHES "^(CUDA|HIP)$")
compiler_id_detection(CMAKE_${lang}_HOST_COMPILER_ID_CONTENT CXX
PREFIX HOST_
ID_STRING
VERSION_STRINGS
)
string(APPEND CMAKE_${lang}_COMPILER_ID_CONTENT
"\n"
"\n"
"/* Detect host compiler used by NVCC. */\n"
"#ifdef __NVCC__\n"
"${CMAKE_${lang}_HOST_COMPILER_ID_CONTENT}\n"
"#endif /* __NVCC__ */\n"
)
endif()
unset(src_in CACHE)
string(CONFIGURE "${ID_CONTENT_IN}" ID_CONTENT_OUT @ONLY)
file(WRITE ${CMAKE_${lang}_COMPILER_ID_DIR}/${src} "${ID_CONTENT_OUT}")
@ -941,6 +968,8 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
set(ARCHITECTURE_ID)
set(SIMULATE_ID)
set(SIMULATE_VERSION)
set(HOST_COMPILER_ID)
set(HOST_COMPILER_VERSION)
set(CMAKE_${lang}_COMPILER_ID_STRING_REGEX ".?I.?N.?F.?O.?:.?[A-Za-z0-9_]+\\[[^]]*\\]")
foreach(encoding "" "ENCODING;UTF-16LE" "ENCODING;UTF-16BE")
cmake_policy(PUSH)
@ -1027,6 +1056,13 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
if("${info}" MATCHES "INFO:qnxnto\\[\\]")
set(COMPILER_QNXNTO 1)
endif()
if("${info}" MATCHES "INFO:host_compiler\\[([^]\"]*)\\]")
set(HOST_COMPILER_ID "${CMAKE_MATCH_1}")
endif()
if("${info}" MATCHES "INFO:host_compiler_version\\[([^]\"]*)\\]")
string(REGEX REPLACE "^0+([0-9]+)" "\\1" HOST_COMPILER_VERSION "${CMAKE_MATCH_1}")
string(REGEX REPLACE "\\.0+([0-9])" ".\\1" HOST_COMPILER_VERSION "${HOST_COMPILER_VERSION}")
endif()
if("${info}" MATCHES "INFO:standard_default\\[([^]\"]*)\\]")
set(CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT "${CMAKE_MATCH_1}")
endif()
@ -1088,6 +1124,8 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
set(CMAKE_${lang}_COMPILER_VERSION_INTERNAL "${COMPILER_VERSION_INTERNAL}")
set(CMAKE_${lang}_SIMULATE_ID "${SIMULATE_ID}")
set(CMAKE_${lang}_SIMULATE_VERSION "${SIMULATE_VERSION}")
set(CMAKE_${lang}_HOST_COMPILER_ID "${HOST_COMPILER_ID}")
set(CMAKE_${lang}_HOST_COMPILER_VERSION "${HOST_COMPILER_VERSION}")
endif()
# Check the compiler identification string.
@ -1095,7 +1133,12 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
# The compiler identification was found.
string(APPEND _CMAKE_${lang}_COMPILER_ID_LOG
"The ${lang} compiler identification is ${CMAKE_${lang}_COMPILER_ID}, found in:\n"
" ${file}\n\n")
" ${file}\n")
if(CMAKE_${lang}_HOST_COMPILER_ID)
string(APPEND _CMAKE_${lang}_COMPILER_ID_LOG
"The host compiler identification is ${CMAKE_${lang}_HOST_COMPILER_ID}\n")
endif()
string(APPEND _CMAKE_${lang}_COMPILER_ID_LOG "\n")
else()
# The compiler identification could not be found.
string(APPEND _CMAKE_${lang}_COMPILER_ID_LOG
@ -1144,6 +1187,8 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
set(COMPILER_QNXNTO "${COMPILER_QNXNTO}" PARENT_SCOPE)
set(CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT "${CMAKE_${lang}_STANDARD_COMPUTED_DEFAULT}" PARENT_SCOPE)
set(CMAKE_${lang}_EXTENSIONS_COMPUTED_DEFAULT "${CMAKE_${lang}_EXTENSIONS_COMPUTED_DEFAULT}" PARENT_SCOPE)
set(CMAKE_${lang}_HOST_COMPILER_ID "${CMAKE_${lang}_HOST_COMPILER_ID}" PARENT_SCOPE)
set(CMAKE_${lang}_HOST_COMPILER_VERSION "${CMAKE_${lang}_HOST_COMPILER_VERSION}" PARENT_SCOPE)
endfunction()
#-----------------------------------------------------------------------------

View File

@ -3,6 +3,8 @@ set(CMAKE_HIP_HOST_COMPILER "@CMAKE_HIP_HOST_COMPILER@")
set(CMAKE_HIP_HOST_LINK_LAUNCHER "@CMAKE_HIP_HOST_LINK_LAUNCHER@")
set(CMAKE_HIP_COMPILER_ID "@CMAKE_HIP_COMPILER_ID@")
set(CMAKE_HIP_COMPILER_VERSION "@CMAKE_HIP_COMPILER_VERSION@")
set(CMAKE_HIP_HOST_COMPILER_ID "@CMAKE_HIP_HOST_COMPILER_ID@")
set(CMAKE_HIP_HOST_COMPILER_VERSION "@CMAKE_HIP_HOST_COMPILER_VERSION@")
set(CMAKE_HIP_STANDARD_COMPUTED_DEFAULT "@CMAKE_HIP_STANDARD_COMPUTED_DEFAULT@")
set(CMAKE_HIP_EXTENSIONS_COMPUTED_DEFAULT "@CMAKE_HIP_EXTENSIONS_COMPUTED_DEFAULT@")
set(CMAKE_HIP_STANDARD_LATEST "@CMAKE_HIP_STANDARD_LATEST@")

View File

@ -16,6 +16,28 @@ char const* info_simulate = "INFO" ":" "simulate[" SIMULATE_ID "]";
@CMAKE_HIP_COMPILER_ID_PLATFORM_CONTENT@
@CMAKE_HIP_COMPILER_ID_ERROR_FOR_TEST@
#ifdef HOST_COMPILER_ID
char const* info_host_compiler = "INFO" ":" "host_compiler[" HOST_COMPILER_ID "]";
#endif
#ifdef HOST_COMPILER_VERSION
char const* info_host_compiler_version = "INFO" ":" "host_compiler_version[" HOST_COMPILER_VERSION "]";
#elif defined(HOST_COMPILER_VERSION_MAJOR)
char const info_host_compiler_version[] = {
'I', 'N', 'F', 'O', ':','h','o','s','t','_',
'c','o','m','p','i','l','e','r','_','v','e','r','s','i','o','n','[',
HOST_COMPILER_VERSION_MAJOR,
# ifdef HOST_COMPILER_VERSION_MINOR
'.', HOST_COMPILER_VERSION_MINOR,
# ifdef HOST_COMPILER_VERSION_PATCH
'.', HOST_COMPILER_VERSION_PATCH,
# ifdef HOST_COMPILER_VERSION_TWEAK
'.', HOST_COMPILER_VERSION_TWEAK,
# endif
# endif
# endif
']','\0'};
#endif
#
#define CXX_STD_98 199711L
#define CXX_STD_11 201103L
#define CXX_STD_14 201402L
@ -66,6 +88,12 @@ int main(int argc, char* argv[])
#endif
#ifdef SIMULATE_VERSION_MAJOR
require += info_simulate_version[argc];
#endif
#ifdef HOST_COMPILER_ID
require += info_host_compiler[argc];
#endif
#ifdef HOST_COMPILER_VERSION_MAJOR
require += info_host_compiler_version[argc];
#endif
require += info_language_standard_default[argc];
require += info_language_extensions_default[argc];

View File

@ -1,3 +1,11 @@
-- CMAKE_CUDA_COMPILER='[^']+'
-- CMAKE_CUDA_COMPILER_ID='[A-Za-z]+'
(-- CMAKE_CUDA_COMPILER='[^']+'
-- CMAKE_CUDA_COMPILER_ID='NVIDIA'
-- CMAKE_CUDA_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
-- CMAKE_CUDA_HOST_COMPILER_ID='[A-Za-z]+'
-- CMAKE_CUDA_HOST_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
|-- CMAKE_CUDA_COMPILER='[^']+'
-- CMAKE_CUDA_COMPILER_ID='([^N]|N[^V]|NV[^I]|NVI[^D]|NVID[^I]|NVIDI[^A])[A-Za-z]*'
-- CMAKE_CUDA_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
-- CMAKE_CUDA_HOST_COMPILER_ID=''
-- CMAKE_CUDA_HOST_COMPILER_VERSION=''
)

View File

@ -2,3 +2,5 @@ enable_language(CUDA)
message(STATUS "CMAKE_CUDA_COMPILER='${CMAKE_CUDA_COMPILER}'")
message(STATUS "CMAKE_CUDA_COMPILER_ID='${CMAKE_CUDA_COMPILER_ID}'")
message(STATUS "CMAKE_CUDA_COMPILER_VERSION='${CMAKE_CUDA_COMPILER_VERSION}'")
message(STATUS "CMAKE_CUDA_HOST_COMPILER_ID='${CMAKE_CUDA_HOST_COMPILER_ID}'")
message(STATUS "CMAKE_CUDA_HOST_COMPILER_VERSION='${CMAKE_CUDA_HOST_COMPILER_VERSION}'")

View File

@ -1,3 +1,11 @@
-- CMAKE_HIP_COMPILER='[^']+'
-- CMAKE_HIP_COMPILER_ID='[A-Za-z]+'
(-- CMAKE_HIP_COMPILER='[^']+'
-- CMAKE_HIP_COMPILER_ID='NVIDIA'
-- CMAKE_HIP_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
-- CMAKE_HIP_HOST_COMPILER_ID='[A-Za-z]+'
-- CMAKE_HIP_HOST_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
|-- CMAKE_HIP_COMPILER='[^']+'
-- CMAKE_HIP_COMPILER_ID='([^N]|N[^V]|NV[^I]|NVI[^D]|NVID[^I]|NVIDI[^A])[A-Za-z]*'
-- CMAKE_HIP_COMPILER_VERSION='([0-9]+)(\.([0-9]+))?(\.([0-9]+))?(\.([0-9]+))?'
-- CMAKE_HIP_HOST_COMPILER_ID=''
-- CMAKE_HIP_HOST_COMPILER_VERSION=''
)

View File

@ -2,3 +2,5 @@ enable_language(HIP)
message(STATUS "CMAKE_HIP_COMPILER='${CMAKE_HIP_COMPILER}'")
message(STATUS "CMAKE_HIP_COMPILER_ID='${CMAKE_HIP_COMPILER_ID}'")
message(STATUS "CMAKE_HIP_COMPILER_VERSION='${CMAKE_HIP_COMPILER_VERSION}'")
message(STATUS "CMAKE_HIP_HOST_COMPILER_ID='${CMAKE_HIP_HOST_COMPILER_ID}'")
message(STATUS "CMAKE_HIP_HOST_COMPILER_VERSION='${CMAKE_HIP_HOST_COMPILER_VERSION}'")