From 3ddd7f35760055fc501d454f9029f3987536957b Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Thu, 15 Jul 2021 12:58:44 -0400
Subject: [PATCH] enable_language: Fix test for working compiler with CMP0126
 NEW behavior

Update the logic that converts a `try_compile` result from a cache
entry to a normal variable to tolerate an existing normal variable
under CMP0126 NEW behavior.  Otherwise the `try_compile` result
is ignored because CMake uses the false value of the normal variable,
and CMake incorrectly reports that the compiler does not work.

This went unnoticed for some languages (e.g. C and CXX) because the
check for a working compiler is skipped if ABI detection works.
It does affect other languages (e.g. CSharp).

Fixes: #22423
---
 Modules/CMakeTestCCompiler.cmake       | 3 +++
 Modules/CMakeTestCSharpCompiler.cmake  | 3 +++
 Modules/CMakeTestCUDACompiler.cmake    | 4 ++++
 Modules/CMakeTestCXXCompiler.cmake     | 3 +++
 Modules/CMakeTestFortranCompiler.cmake | 3 +++
 Modules/CMakeTestHIPCompiler.cmake     | 3 +++
 Modules/CMakeTestOBJCCompiler.cmake    | 3 +++
 Modules/CMakeTestOBJCXXCompiler.cmake  | 3 +++
 Modules/CMakeTestSwiftCompiler.cmake   | 3 +++
 Tests/CSharpOnly/CMakeLists.txt        | 3 +++
 10 files changed, 31 insertions(+)

diff --git a/Modules/CMakeTestCCompiler.cmake b/Modules/CMakeTestCCompiler.cmake
index 03f2db2d22..ae5aa27af9 100644
--- a/Modules/CMakeTestCCompiler.cmake
+++ b/Modules/CMakeTestCCompiler.cmake
@@ -50,6 +50,9 @@ if(NOT CMAKE_C_COMPILER_WORKS)
     "int main(int argc, char* argv[])\n"
     "#endif\n"
     "{ (void)argv; return argc-1;}\n")
+  # Clear result from normal variable.
+  unset(CMAKE_C_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_C_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCCompiler.c
     OUTPUT_VARIABLE __CMAKE_C_COMPILER_OUTPUT)
diff --git a/Modules/CMakeTestCSharpCompiler.cmake b/Modules/CMakeTestCSharpCompiler.cmake
index 1119a45632..adea250fa0 100644
--- a/Modules/CMakeTestCSharpCompiler.cmake
+++ b/Modules/CMakeTestCSharpCompiler.cmake
@@ -30,6 +30,9 @@ if(NOT CMAKE_CSharp_COMPILER_WORKS)
     "   }"
     "}"
     )
+  # Clear result from normal variable.
+  unset(CMAKE_CSharp_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_CSharp_COMPILER_WORKS ${CMAKE_BINARY_DIR} "${test_compile_file}"
     OUTPUT_VARIABLE __CMAKE_CSharp_COMPILER_OUTPUT
     )
diff --git a/Modules/CMakeTestCUDACompiler.cmake b/Modules/CMakeTestCUDACompiler.cmake
index a18947bb43..25a365358b 100644
--- a/Modules/CMakeTestCUDACompiler.cmake
+++ b/Modules/CMakeTestCUDACompiler.cmake
@@ -36,6 +36,10 @@ if(NOT CMAKE_CUDA_COMPILER_WORKS)
     "#endif\n"
     "int main(){return 0;}\n")
 
+  # Clear result from normal variable.
+  unset(CMAKE_CUDA_COMPILER_WORKS)
+
+  # Puts test result in cache variable.
   try_compile(CMAKE_CUDA_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/main.cu
     OUTPUT_VARIABLE __CMAKE_CUDA_COMPILER_OUTPUT)
diff --git a/Modules/CMakeTestCXXCompiler.cmake b/Modules/CMakeTestCXXCompiler.cmake
index 0d2d0b0530..bbe35334be 100644
--- a/Modules/CMakeTestCXXCompiler.cmake
+++ b/Modules/CMakeTestCXXCompiler.cmake
@@ -43,6 +43,9 @@ if(NOT CMAKE_CXX_COMPILER_WORKS)
     "# error \"The CMAKE_CXX_COMPILER is set to a C compiler\"\n"
     "#endif\n"
     "int main(){return 0;}\n")
+  # Clear result from normal variable.
+  unset(CMAKE_CXX_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_CXX_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCXXCompiler.cxx
     OUTPUT_VARIABLE __CMAKE_CXX_COMPILER_OUTPUT)
diff --git a/Modules/CMakeTestFortranCompiler.cmake b/Modules/CMakeTestFortranCompiler.cmake
index 10fb0a7a66..f25788df49 100644
--- a/Modules/CMakeTestFortranCompiler.cmake
+++ b/Modules/CMakeTestFortranCompiler.cmake
@@ -36,6 +36,9 @@ if(NOT CMAKE_Fortran_COMPILER_WORKS)
         PRINT *, 'Hello'
         END
   ")
+  # Clear result from normal variable.
+  unset(CMAKE_Fortran_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_Fortran_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f
     OUTPUT_VARIABLE OUTPUT)
diff --git a/Modules/CMakeTestHIPCompiler.cmake b/Modules/CMakeTestHIPCompiler.cmake
index d9fcc9d8fe..62f06573ad 100644
--- a/Modules/CMakeTestHIPCompiler.cmake
+++ b/Modules/CMakeTestHIPCompiler.cmake
@@ -46,6 +46,9 @@ if(NOT CMAKE_HIP_COMPILER_WORKS)
     "# error \"The CMAKE_HIP_COMPILER is set to a C/CXX compiler\"\n"
     "#endif\n"
     "int main(){return 0;}\n")
+  # Clear result from normal variable.
+  unset(CMAKE_HIP_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_HIP_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testHIPCompiler.hip
     OUTPUT_VARIABLE __CMAKE_HIP_COMPILER_OUTPUT)
diff --git a/Modules/CMakeTestOBJCCompiler.cmake b/Modules/CMakeTestOBJCCompiler.cmake
index 298272b85a..20d1f8be93 100644
--- a/Modules/CMakeTestOBJCCompiler.cmake
+++ b/Modules/CMakeTestOBJCCompiler.cmake
@@ -47,6 +47,9 @@ if(NOT CMAKE_OBJC_COMPILER_WORKS)
     "#endif\n"
     "int main(int argc, char* argv[])\n"
     "{ (void)argv; return argc-1;}\n")
+  # Clear result from normal variable.
+  unset(CMAKE_OBJC_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_OBJC_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testOBJCCompiler.m
     OUTPUT_VARIABLE __CMAKE_OBJC_COMPILER_OUTPUT)
diff --git a/Modules/CMakeTestOBJCXXCompiler.cmake b/Modules/CMakeTestOBJCXXCompiler.cmake
index 36e3efc509..4f7185f700 100644
--- a/Modules/CMakeTestOBJCXXCompiler.cmake
+++ b/Modules/CMakeTestOBJCXXCompiler.cmake
@@ -46,6 +46,9 @@ if(NOT CMAKE_OBJCXX_COMPILER_WORKS)
     "# error \"The CMAKE_OBJCXX_COMPILER is not an Objective-C++ compiler\"\n"
     "#endif\n"
     "int main(){return 0;}\n")
+  # Clear result from normal variable.
+  unset(CMAKE_OBJCXX_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_OBJCXX_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testOBJCXXCompiler.mm
     OUTPUT_VARIABLE __CMAKE_OBJCXX_COMPILER_OUTPUT)
diff --git a/Modules/CMakeTestSwiftCompiler.cmake b/Modules/CMakeTestSwiftCompiler.cmake
index d98dc9dfa3..2f2546f865 100644
--- a/Modules/CMakeTestSwiftCompiler.cmake
+++ b/Modules/CMakeTestSwiftCompiler.cmake
@@ -23,6 +23,9 @@ if(NOT CMAKE_Swift_COMPILER_WORKS)
   PrintTestCompilerStatus("Swift")
   file(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/main.swift
     "print(\"CMake\")\n")
+  # Clear result from normal variable.
+  unset(CMAKE_Swift_COMPILER_WORKS)
+  # Puts test result in cache variable.
   try_compile(CMAKE_Swift_COMPILER_WORKS ${CMAKE_BINARY_DIR}
     ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/main.swift
     OUTPUT_VARIABLE __CMAKE_Swift_COMPILER_OUTPUT)
diff --git a/Tests/CSharpOnly/CMakeLists.txt b/Tests/CSharpOnly/CMakeLists.txt
index f7928b675f..efac58cc6f 100644
--- a/Tests/CSharpOnly/CMakeLists.txt
+++ b/Tests/CSharpOnly/CMakeLists.txt
@@ -1,4 +1,7 @@
 cmake_minimum_required(VERSION 3.3)
+if(POLICY CMP0126)
+  cmake_policy(SET CMP0126 NEW)
+endif()
 # a simple CSharp only test case
 project (CSharpOnly CSharp)
 
-- 
GitLab