Fix cmake scripts for CUDA and MSVC (#3713)

* Fix wrong CUDA generators and allow for new ones

* Fix CUDA detection for other generators

* Simplify the changed code

* Remove useless flags for MSVC
diff --git a/aten/CMakeLists.txt b/aten/CMakeLists.txt
index e305d1c..5a31df2 100644
--- a/aten/CMakeLists.txt
+++ b/aten/CMakeLists.txt
@@ -25,11 +25,13 @@
   set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
 endif()
 
-# C++11
-set(CMAKE_CXX_FLAGS "--std=c++11 ${CMAKE_CXX_FLAGS}")
+IF(NOT MSVC)
+  # C++11
+  set(CMAKE_CXX_FLAGS "--std=c++11 ${CMAKE_CXX_FLAGS}")
 
-set(CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}")
-set(CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}")
+  set(CMAKE_C_FLAGS "-fexceptions ${CMAKE_C_FLAGS}")
+  set(CMAKE_CXX_FLAGS "-fexceptions ${CMAKE_CXX_FLAGS}")
+ENDIF(NOT MSVC)
 
 
 # Top-level build config
@@ -53,11 +55,13 @@
   ENDIF()
 ENDIF(MSVC)
 
-IF (CMAKE_VERSION VERSION_LESS "3.1")
-  SET(CMAKE_C_FLAGS "-std=c11 ${CMAKE_C_FLAGS}")
-ELSE ()
-  SET(CMAKE_C_STANDARD 11)
-ENDIF ()
+IF (NOT MSVC)
+  IF (CMAKE_VERSION VERSION_LESS "3.1")
+    SET(CMAKE_C_FLAGS "-std=c11 ${CMAKE_C_FLAGS}")
+  ELSE ()
+    SET(CMAKE_C_STANDARD 11)
+  ENDIF ()
+ENDIF(NOT MSVC)
 
 if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
   if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER "4.9")
@@ -80,7 +84,7 @@
 LIST(APPEND CUDA_NVCC_FLAGS $ENV{TORCH_NVCC_FLAGS})
 CUDA_SELECT_NVCC_ARCH_FLAGS(NVCC_FLAGS_EXTRA $ENV{TORCH_CUDA_ARCH_LIST})
 LIST(APPEND CUDA_NVCC_FLAGS ${NVCC_FLAGS_EXTRA})
-IF(CMAKE_POSITION_INDEPENDENT_CODE)
+IF(CMAKE_POSITION_INDEPENDENT_CODE AND NOT MSVC)
   LIST(APPEND CUDA_NVCC_FLAGS "-Xcompiler -fPIC")
 ENDIF()
 
diff --git a/aten/cmake/FindCUDA/FindCUDA.cmake b/aten/cmake/FindCUDA/FindCUDA.cmake
index e836a6e..3990d67 100644
--- a/aten/cmake/FindCUDA/FindCUDA.cmake
+++ b/aten/cmake/FindCUDA/FindCUDA.cmake
@@ -487,8 +487,9 @@
 # Extra user settable flags
 set(CUDA_NVCC_FLAGS "" CACHE STRING "Semi-colon delimit multiple arguments.")
 
-if(CMAKE_GENERATOR MATCHES "Visual Studio")
-  set(CUDA_HOST_COMPILER "$(VCInstallDir)bin" CACHE FILEPATH "Host side compiler used by NVCC")
+if(MSVC AND NOT "${CMAKE_C_COMPILER}" MATCHES "/cl.exe")
+  find_program(REAL_MSVC_COMPILER cl.exe)
+  set(CUDA_HOST_COMPILER "${REAL_MSVC_COMPILER}" CACHE FILEPATH "Host side compiler used by NVCC")
 else()
   if(APPLE
       AND "${CMAKE_C_COMPILER_ID}" MATCHES "Clang"
diff --git a/aten/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake b/aten/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake
index 4b27441..5e79cdb 100644
--- a/aten/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake
+++ b/aten/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake
@@ -62,8 +62,15 @@
       "  return 0;\n"
       "}\n")
 
+    if(MSVC AND NOT "${CMAKE_C_COMPILER}" MATCHES "/cl.exe")
+      find_program(REAL_MSVC_COMPILER cl.exe)
+      set(CCBIN "${REAL_MSVC_COMPILER}")
+    else()
+      set(CCBIN "${CMAKE_C_COMPILER}")
+    endif()
+
     execute_process(COMMAND "${CUDA_NVCC_EXECUTABLE}" "--run" "${cufile}"
-                    "-ccbin" ${CMAKE_CXX_COMPILER}
+                    "-ccbin" ${CCBIN}
                     WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/CMakeFiles/"
                     RESULT_VARIABLE nvcc_res OUTPUT_VARIABLE nvcc_out
                     ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
diff --git a/cmake/FindCUDA/FindCUDA.cmake b/cmake/FindCUDA/FindCUDA.cmake
index 12fb58d..3990d67 100644
--- a/cmake/FindCUDA/FindCUDA.cmake
+++ b/cmake/FindCUDA/FindCUDA.cmake
@@ -487,8 +487,9 @@
 # Extra user settable flags
 set(CUDA_NVCC_FLAGS "" CACHE STRING "Semi-colon delimit multiple arguments.")
 
-if(CMAKE_GENERATOR MATCHES "Visual Studio")
-  set(CUDA_HOST_COMPILER "${CMAKE_C_COMPILER}" CACHE FILEPATH "Host side compiler used by NVCC")
+if(MSVC AND NOT "${CMAKE_C_COMPILER}" MATCHES "/cl.exe")
+  find_program(REAL_MSVC_COMPILER cl.exe)
+  set(CUDA_HOST_COMPILER "${REAL_MSVC_COMPILER}" CACHE FILEPATH "Host side compiler used by NVCC")
 else()
   if(APPLE
       AND "${CMAKE_C_COMPILER_ID}" MATCHES "Clang"
diff --git a/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake b/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake
index 4b27441..5e79cdb 100644
--- a/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake
+++ b/cmake/FindCUDA/FindCUDA/select_compute_arch.cmake
@@ -62,8 +62,15 @@
       "  return 0;\n"
       "}\n")
 
+    if(MSVC AND NOT "${CMAKE_C_COMPILER}" MATCHES "/cl.exe")
+      find_program(REAL_MSVC_COMPILER cl.exe)
+      set(CCBIN "${REAL_MSVC_COMPILER}")
+    else()
+      set(CCBIN "${CMAKE_C_COMPILER}")
+    endif()
+
     execute_process(COMMAND "${CUDA_NVCC_EXECUTABLE}" "--run" "${cufile}"
-                    "-ccbin" ${CMAKE_CXX_COMPILER}
+                    "-ccbin" ${CCBIN}
                     WORKING_DIRECTORY "${PROJECT_BINARY_DIR}/CMakeFiles/"
                     RESULT_VARIABLE nvcc_res OUTPUT_VARIABLE nvcc_out
                     ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)