HIP: Add CMAKE_HIP_HOST_COMPILER when compiler is NVCC

Also add `HIPHOSTCXX` environment variable.
This commit is contained in:
Brad King
2023-09-25 16:00:22 -04:00
parent e43918b4ca
commit b3e92775ab
6 changed files with 41 additions and 8 deletions

View File

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

View File

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

View File

@@ -4,22 +4,25 @@ CMAKE_<LANG>_HOST_COMPILER
.. versionadded:: 3.10 .. versionadded:: 3.10
``CMAKE_CUDA_HOST_COMPILER`` ``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 When :variable:`CMAKE_<LANG>_COMPILER_ID` is
``NVIDIA``, ``CMAKE_<LANG>_HOST_COMPILER`` selects the compiler executable ``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. This maps to the ``nvcc -ccbin`` option.
The ``CMAKE_<LANG>_HOST_COMPILER`` variable may be set explicitly before CUDA 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. command.
This can be done via ``-DCMAKE_<LANG>_HOST_COMPILER=...`` on the command line 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 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. 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. variable is read-only and changes to it are undefined behavior.
.. note:: .. note::

View File

@@ -107,6 +107,13 @@ if(NOT CMAKE_HIP_COMPILER_ID_RUN)
# If the user set CMAKE_HIP_ARCHITECTURES, validate its value. # If the user set CMAKE_HIP_ARCHITECTURES, validate its value.
include(Internal/CMakeCUDAArchitecturesValidate) include(Internal/CMakeCUDAArchitecturesValidate)
cmake_cuda_architectures_validate(HIP) 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() endif()
if(CMAKE_HIP_COMPILER_ID STREQUAL "Clang") 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") elseif(CMAKE_HIP_COMPILER_ID STREQUAL "NVIDIA")
# Tell nvcc to treat .hip files as CUDA sources. # Tell nvcc to treat .hip files as CUDA sources.
list(APPEND CMAKE_HIP_COMPILER_ID_TEST_FLAGS_FIRST "-x cu -v") 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() endif()
# We perform compiler identification for a second time to extract implicit linking info. # We perform compiler identification for a second time to extract implicit linking info.

View File

@@ -26,7 +26,7 @@ or :command:`project` commands:
a previous call, the check is skipped. a previous call, the check is skipped.
:variable:`CMAKE_<LANG>_HOST_COMPILER` :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 If the check detects an explicit host compiler that is required for
compilation, this variable will be set to that compiler. 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}) file(REMOVE_RECURSE ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/Check${lang})
set(extra_compiler_variables) 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}\\\")") set(extra_compiler_variables "set(CMAKE_CUDA_HOST_COMPILER \\\"\${CMAKE_CUDA_HOST_COMPILER}\\\")")
endif() endif()

View File

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