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
This commit is contained in:
parent
7c6234dd21
commit
3ddd7f3576
@ -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)
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user