Browse Source

CUDA: Fix CUDA_ARCHITECTURES policy CMP0104 check in try_compile

Since commit e98588aaba (CUDA: Add CUDA_ARCHITECTURES target property,
2020-03-12), `CMAKE_CUDA_ARCHITECTURES` is both initialized and required
by policy CMP0104's `NEW` behavior.  Inside a `try_compile` project we
use `cmake_minimum_required(VERSION ...)` with the current running
version of CMake.  Now that our version number is 3.18, `CMP0104` gets
set to `NEW` in the `try_compile`.  If the outer projects does not set
the policy then `CMAKE_CUDA_ARCHITECTURES` is not available and the
`try_compile` fails to generate.

Teach `try_compile` to check the outer project's policy status and
set policy CMP0104 to `OLD` if needed to match.

Fixes: #20794
Brad King 5 years ago
parent
commit
5bf9a290e7
1 changed files with 8 additions and 0 deletions
  1. 8 0
      Source/cmCoreTryCompile.cxx

+ 8 - 0
Source/cmCoreTryCompile.cxx

@@ -567,6 +567,14 @@ int cmCoreTryCompile::TryCompileCode(std::vector<std::string> const& argv,
               *msvcRuntimeLibraryDefault ? "NEW" : "OLD");
     }
 
+    /* Set CUDA architectures policy to match outer project.  */
+    if (this->Makefile->GetPolicyStatus(cmPolicies::CMP0104) !=
+          cmPolicies::NEW &&
+        testLangs.find("CUDA") != testLangs.end() &&
+        this->Makefile->GetSafeDefinition(kCMAKE_CUDA_ARCHITECTURES).empty()) {
+      fprintf(fout, "cmake_policy(SET CMP0104 OLD)\n");
+    }
+
     std::string projectLangs;
     for (std::string const& li : testLangs) {
       projectLangs += " " + li;