From 3ddd7f35760055fc501d454f9029f3987536957b Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 15 Jul 2021 12:58:44 -0400 Subject: 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 03f2db2..ae5aa27 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 1119a45..adea250 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 a18947b..25a3653 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 0d2d0b0..bbe3533 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 10fb0a7..f25788d 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 d9fcc9d..62f0657 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 298272b..20d1f8b 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 36e3efc..4f7185f 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 d98dc9d..2f2546f 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 f7928b6..efac58c 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) -- cgit v0.12