Quellcode durchsuchen

HIP: Add CMAKE_HIP_HOST_COMPILER when compiler is NVCC

Also add `HIPHOSTCXX` environment variable.
Brad King vor 2 Jahren
Ursprung
Commit
b3e92775ab

+ 19 - 0
Help/envvar/HIPHOSTCXX.rst

@@ -0,0 +1,19 @@
+HIPHOSTCXX
+-----------
+
+.. versionadded:: 3.28
+
+.. include:: ENV_VAR.txt
+
+Preferred executable for compiling host code when compiling ``HIP``
+language files with the NVIDIA CUDA Compiler. Will only be used by CMake
+on the first configuration to determine ``HIP`` host compiler, after which
+the value for ``HIPHOSTCXX`` is stored in the cache as
+:variable:`CMAKE_HIP_HOST_COMPILER <CMAKE_<LANG>_HOST_COMPILER>`.
+
+This environment variable is primarily meant for use with projects that
+enable ``HIP`` as a first-class language.
+
+.. note::
+
+  Ignored when using :ref:`Visual Studio Generators`.

+ 1 - 0
Help/manual/cmake-env-variables.7.rst

@@ -84,6 +84,7 @@ Environment Variables for Languages
    /envvar/FFLAGS
    /envvar/HIPCXX
    /envvar/HIPFLAGS
+   /envvar/HIPHOSTCXX
    /envvar/ISPC
    /envvar/ISPCFLAGS
    /envvar/OBJC

+ 8 - 5
Help/variable/CMAKE_LANG_HOST_COMPILER.rst

@@ -4,22 +4,25 @@ CMAKE_<LANG>_HOST_COMPILER
 .. versionadded:: 3.10
   ``CMAKE_CUDA_HOST_COMPILER``
 
-This variable is available when ``<LANG>`` is ``CUDA``.
+.. versionadded:: 3.28
+  ``CMAKE_HIP_HOST_COMPILER``
+
+This variable is available when ``<LANG>`` is ``CUDA`` or ``HIP``.
 
 When :variable:`CMAKE_<LANG>_COMPILER_ID` is
 ``NVIDIA``, ``CMAKE_<LANG>_HOST_COMPILER`` selects the compiler executable
-to use when compiling host code for ``CUDA`` language files.
+to use when compiling host code for ``CUDA`` or ``HIP`` language files.
 This maps to the ``nvcc -ccbin`` option.
 
 The ``CMAKE_<LANG>_HOST_COMPILER`` variable may be set explicitly before CUDA
-is first enabled by a :command:`project` or :command:`enable_language`
+or HIP is first enabled by a :command:`project` or :command:`enable_language`
 command.
 This can be done via ``-DCMAKE_<LANG>_HOST_COMPILER=...`` on the command line
 or in a :ref:`toolchain file <Cross Compiling Toolchain>`.  Or, one may set
-the :envvar:`CUDAHOSTCXX` environment variable to
+the :envvar:`CUDAHOSTCXX` or :envvar:`HIPHOSTCXX` environment variable to
 provide a default value.
 
-Once the CUDA language is enabled, the ``CMAKE_<LANG>_HOST_COMPILER``
+Once the CUDA or HIP language is enabled, the ``CMAKE_<LANG>_HOST_COMPILER``
 variable is read-only and changes to it are undefined behavior.
 
 .. note::

+ 10 - 0
Modules/CMakeDetermineHIPCompiler.cmake

@@ -107,6 +107,13 @@ if(NOT CMAKE_HIP_COMPILER_ID_RUN)
     # If the user set CMAKE_HIP_ARCHITECTURES, validate its value.
     include(Internal/CMakeCUDAArchitecturesValidate)
     cmake_cuda_architectures_validate(HIP)
+
+    if(NOT CMAKE_HIP_HOST_COMPILER AND NOT $ENV{HIPHOSTCXX} STREQUAL "")
+      get_filename_component(CMAKE_HIP_HOST_COMPILER $ENV{HIPHOSTCXX} PROGRAM)
+      if(NOT EXISTS "${CMAKE_HIP_HOST_COMPILER}")
+        message(FATAL_ERROR "Could not find compiler set in environment variable HIPHOSTCXX:\n$ENV{HIPHOSTCXX}.\n${CMAKE_HIP_HOST_COMPILER}")
+      endif()
+    endif()
   endif()
 
   if(CMAKE_HIP_COMPILER_ID STREQUAL "Clang")
@@ -114,6 +121,9 @@ if(NOT CMAKE_HIP_COMPILER_ID_RUN)
   elseif(CMAKE_HIP_COMPILER_ID STREQUAL "NVIDIA")
     # Tell nvcc to treat .hip files as CUDA sources.
     list(APPEND CMAKE_HIP_COMPILER_ID_TEST_FLAGS_FIRST "-x cu -v")
+    if(CMAKE_HIP_HOST_COMPILER)
+      string(APPEND CMAKE_HIP_COMPILER_ID_TEST_FLAGS_FIRST " -ccbin=\"${CMAKE_HIP_HOST_COMPILER}\"")
+    endif()
   endif()
 
   # We perform compiler identification for a second time to extract implicit linking info.

+ 2 - 2
Modules/CheckLanguage.cmake

@@ -26,7 +26,7 @@ or :command:`project` commands:
     a previous call, the check is skipped.
 
   :variable:`CMAKE_<LANG>_HOST_COMPILER`
-    This variable is set when ``<lang>`` is ``CUDA``.
+    This variable is set when ``<lang>`` is ``CUDA`` or ``HIP``.
 
     If the check detects an explicit host compiler that is required for
     compilation, this variable will be set to that compiler.
@@ -65,7 +65,7 @@ macro(check_language lang)
     file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang})
 
     set(extra_compiler_variables)
-    if(${lang} STREQUAL CUDA AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
+    if("${lang}" MATCHES "^(CUDA|HIP)$" AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
       set(extra_compiler_variables "set(CMAKE_CUDA_HOST_COMPILER \\\"\${CMAKE_CUDA_HOST_COMPILER}\\\")")
     endif()
 

+ 1 - 1
Tests/CMakeOnly/CheckLanguage/CMakeLists.txt

@@ -13,7 +13,7 @@ endif()
 unset(expect_Fortran)
 set(expect_NoSuchLanguage 0)
 
-set(LANGUAGES C CXX Fortran CUDA NoSuchLanguage)
+set(LANGUAGES C CXX Fortran CUDA HIP NoSuchLanguage)
 if(APPLE)
   list(APPEND LANGUAGES OBJC OBJCXX)
 endif()