Skip to content
Snippets Groups Projects
Commit 625ef88a authored by Robert Maynard's avatar Robert Maynard Committed by Brad King
Browse files

CUDA: Add CMAKE_CUDA_HOST_COMPILER support on Windows non-VS generators

parent 995be109
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,10 @@ ignored if the :variable:`CMAKE_CUDA_HOST_COMPILER` variable is defined. ...@@ -15,6 +15,10 @@ ignored if the :variable:`CMAKE_CUDA_HOST_COMPILER` variable is defined.
This environment variable is primarily meant for use with projects that This environment variable is primarily meant for use with projects that
enable ``CUDA`` as a first-class language. enable ``CUDA`` as a first-class language.
.. note::
Ignored when using :ref:`Visual Studio Generators`.
.. versionadded:: 3.13 .. versionadded:: 3.13
The :module:`FindCUDA` The :module:`FindCUDA`
module will use this variable to initialize its ``CUDA_HOST_COMPILER`` setting. module will use this variable to initialize its ``CUDA_HOST_COMPILER`` setting.
...@@ -23,3 +23,7 @@ is read-only and changes to it are undefined behavior. ...@@ -23,3 +23,7 @@ is read-only and changes to it are undefined behavior.
:variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` is ``NVIDIA``, :variable:`CMAKE_CUDA_COMPILER_ID <CMAKE_<LANG>_COMPILER_ID>` is ``NVIDIA``,
it does not make sense to set ``CMAKE_CUDA_HOST_COMPILER`` without also it does not make sense to set ``CMAKE_CUDA_HOST_COMPILER`` without also
setting ``CMAKE_CUDA_COMPILER`` to NVCC. setting ``CMAKE_CUDA_COMPILER`` to NVCC.
.. note::
Ignored when using :ref:`Visual Studio Generators`.
...@@ -110,13 +110,6 @@ include(CMakeCommonLanguageInclude) ...@@ -110,13 +110,6 @@ include(CMakeCommonLanguageInclude)
# CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION # CMAKE_CUDA_COMPILE_SEPARABLE_COMPILATION
# CMAKE_CUDA_LINK_EXECUTABLE # CMAKE_CUDA_LINK_EXECUTABLE
if(CMAKE_CUDA_HOST_COMPILER AND CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
# FIXME: This is too late for the Platform/Windows-NVIDIA-CUDA module to
# see it, so we do not support CMAKE_CUDA_HOST_COMPILER on Windows.
# Move this to Compiler/NVIDIA-CUDA and update the VS generator too.
string(APPEND _CMAKE_CUDA_EXTRA_FLAGS " -ccbin=<CMAKE_CUDA_HOST_COMPILER>")
endif()
# create a shared library # create a shared library
if(NOT CMAKE_CUDA_CREATE_SHARED_LIBRARY) if(NOT CMAKE_CUDA_CREATE_SHARED_LIBRARY)
set(CMAKE_CUDA_CREATE_SHARED_LIBRARY set(CMAKE_CUDA_CREATE_SHARED_LIBRARY
......
...@@ -11,6 +11,9 @@ if( NOT ( ("${CMAKE_GENERATOR}" MATCHES "Make") OR ...@@ -11,6 +11,9 @@ if( NOT ( ("${CMAKE_GENERATOR}" MATCHES "Make") OR
endif() endif()
if(${CMAKE_GENERATOR} MATCHES "Visual Studio") if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
if(DEFINED ENV{CUDAHOSTCXX} OR DEFINED CMAKE_CUDA_HOST_COMPILER)
message(WARNING "Visual Studio does not support specifying CUDAHOSTCXX or CMAKE_CUDA_HOST_COMPILER. Using the C++ compiler provided by Visual Studio.")
endif()
else() else()
if(NOT CMAKE_CUDA_COMPILER) if(NOT CMAKE_CUDA_COMPILER)
set(CMAKE_CUDA_COMPILER_INIT NOTFOUND) set(CMAKE_CUDA_COMPILER_INIT NOTFOUND)
...@@ -39,13 +42,13 @@ else() ...@@ -39,13 +42,13 @@ else()
endif() endif()
mark_as_advanced(CMAKE_CUDA_COMPILER) mark_as_advanced(CMAKE_CUDA_COMPILER)
endif()
#Allow the user to specify a host compiler #Allow the user to specify a host compiler except for Visual Studio
if(NOT $ENV{CUDAHOSTCXX} STREQUAL "") if(NOT $ENV{CUDAHOSTCXX} STREQUAL "")
get_filename_component(CMAKE_CUDA_HOST_COMPILER $ENV{CUDAHOSTCXX} PROGRAM) get_filename_component(CMAKE_CUDA_HOST_COMPILER $ENV{CUDAHOSTCXX} PROGRAM)
if(NOT EXISTS ${CMAKE_CUDA_HOST_COMPILER}) if(NOT EXISTS ${CMAKE_CUDA_HOST_COMPILER})
message(FATAL_ERROR "Could not find compiler set in environment variable CUDAHOSTCXX:\n$ENV{CUDAHOSTCXX}.\n${CMAKE_CUDA_HOST_COMPILER}") message(FATAL_ERROR "Could not find compiler set in environment variable CUDAHOSTCXX:\n$ENV{CUDAHOSTCXX}.\n${CMAKE_CUDA_HOST_COMPILER}")
endif()
endif() endif()
endif() endif()
......
...@@ -24,21 +24,17 @@ else() ...@@ -24,21 +24,17 @@ else()
set(_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS "") set(_CMAKE_CUDA_EXTRA_DEVICE_LINK_FLAGS "")
endif() endif()
if(CMAKE_CUDA_HOST_COMPILER AND NOT CMAKE_GENERATOR MATCHES "Visual Studio")
string(APPEND _CMAKE_CUDA_EXTRA_FLAGS " -ccbin=<CMAKE_CUDA_HOST_COMPILER>")
endif()
if (CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 10.2.89) if (CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL 10.2.89)
# The -MD flag was only added to nvcc in 10.2 so # The -MD flag was only added to nvcc in 10.2 so
# before that we had to invoke the compiler twice # before that we had to invoke the compiler twice
# to get header dependency information # to get header dependency information
set(CMAKE_DEPFILE_FLAGS_CUDA "-MD -MT <DEP_TARGET> -MF <DEP_FILE>") set(CMAKE_DEPFILE_FLAGS_CUDA "-MD -MT <DEP_TARGET> -MF <DEP_FILE>")
else() else()
if(CMAKE_CUDA_HOST_COMPILER AND NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") set(CMAKE_CUDA_DEPENDS_EXTRA_COMMANDS "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -M <SOURCE> -MT <OBJECT> -o <DEP_FILE>")
# FIXME: Move the main -ccbin= flag from CMakeCUDAInformation to
# a block above, remove this copy, and update the VS generator too.
set(_CMAKE_CUDA_EXTRA_FLAGS_LOCAL " -ccbin=<CMAKE_CUDA_HOST_COMPILER>")
else()
set(_CMAKE_CUDA_EXTRA_FLAGS_LOCAL "")
endif()
set(CMAKE_CUDA_DEPENDS_EXTRA_COMMANDS "<CMAKE_CUDA_COMPILER> ${_CMAKE_CUDA_EXTRA_FLAGS}${_CMAKE_CUDA_EXTRA_FLAGS_LOCAL} <DEFINES> <INCLUDES> <FLAGS> ${_CMAKE_COMPILE_AS_CUDA_FLAG} -M <SOURCE> -MT <OBJECT> -o <DEP_FILE>")
unset(_CMAKE_CUDA_EXTRA_FLAGS_LOCAL)
endif() endif()
set(CMAKE_CUDA_DEPFILE_FORMAT gcc) set(CMAKE_CUDA_DEPFILE_FORMAT gcc)
if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER) if((NOT DEFINED CMAKE_DEPENDS_USE_COMPILER OR CMAKE_DEPENDS_USE_COMPILER)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment