Ver Fonte

NVCC: Detect host compiler id and version

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

Fixes: #20901
Brad King há 1 ano atrás
pai
commit
3b4d0df670

+ 2 - 0
Help/manual/cmake-variables.7.rst

@@ -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

+ 8 - 0
Help/release/dev/cuda-host-compiler-id.rst

@@ -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.

+ 5 - 0
Help/variable/CMAKE_LANG_HOST_COMPILER.rst

@@ -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``.

+ 10 - 0
Help/variable/CMAKE_LANG_HOST_COMPILER_ID.rst

@@ -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`.

+ 10 - 0
Help/variable/CMAKE_LANG_HOST_COMPILER_VERSION.rst

@@ -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`.

+ 2 - 0
Modules/CMakeCUDACompiler.cmake.in

@@ -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@")

+ 28 - 0
Modules/CMakeCUDACompilerId.cu.in

@@ -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];

+ 47 - 2
Modules/CMakeDetermineCompilerId.cmake

@@ -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()
 
 #-----------------------------------------------------------------------------

+ 2 - 0
Modules/CMakeHIPCompiler.cmake.in

@@ -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@")

+ 28 - 0
Modules/CMakeHIPCompilerId.hip.in

@@ -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];

+ 10 - 2
Tests/RunCMake/CompilerId/CUDA-stdout.txt

@@ -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=''
+)

+ 2 - 0
Tests/RunCMake/CompilerId/CUDA.cmake

@@ -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}'")

+ 10 - 2
Tests/RunCMake/CompilerId/HIP-stdout.txt

@@ -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=''
+)

+ 2 - 0
Tests/RunCMake/CompilerId/HIP.cmake

@@ -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}'")