Tests: Run MFC test only when explicitly enabled

Previously we used a complicated heuristic to decide whether or not to
run the MFC test, but it sometimes decided incorrectly to run the test.
Since that was first written, we have developed a convention for other
tests to enable them via undocumented cache entries that are added only
on machines known to meet the tests' requirements.  Do that for MFC.
This commit is contained in:
Brad King
2022-02-03 06:42:06 -05:00
parent 9245925810
commit 9d621ceba1
7 changed files with 3 additions and 111 deletions

View File

@@ -5,5 +5,6 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
set(CMake_TEST_FindOpenMP_Fortran "OFF" CACHE BOOL "")
set(CMake_TEST_Java OFF CACHE BOOL "")
set(CMake_TEST_MFC "ON" CACHE BOOL "")
include("${CMAKE_CURRENT_LIST_DIR}/configure_external_test.cmake")

View File

@@ -8,5 +8,6 @@ set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
set(CMake_TEST_FindOpenMP_Fortran "OFF" CACHE BOOL "")
set(CMake_TEST_IPO_WORKS_C "ON" CACHE BOOL "")
set(CMake_TEST_IPO_WORKS_CXX "ON" CACHE BOOL "")
set(CMake_TEST_MFC "ON" CACHE BOOL "")
include("${CMAKE_CURRENT_LIST_DIR}/configure_windows_common.cmake")

View File

@@ -2107,109 +2107,7 @@ if(BUILD_TESTING)
list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/MakeClean")
endif()
if(NOT DEFINED CTEST_RUN_MFC)
set(CTEST_RUN_MFC OFF)
if(MSVC)
set(CTEST_RUN_MFC ON)
# Look for evidence that this is a VCExpress build. If so, avoid
# the MFC test by default.
string(TOLOWER "${CMAKE_MAKE_PROGRAM}" mkprog)
if(mkprog MATCHES "vcexpress")
message(STATUS
"CMAKE_MAKE_PROGRAM indicates vcexpress, avoiding MFC test")
set(CTEST_RUN_MFC OFF)
endif()
# Since MSBuild might also be the "makeprogram" for a VCExpress
# build tree, use one more heuristic, too. The string representing
# the .vcproj file type contains "VCExpress" on machines where an
# express edition of VS was installed last:
if(CTEST_RUN_MFC)
execute_process(COMMAND cmd /c assoc .vcproj
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE ov)
if(ov MATCHES "VCExpress")
message(STATUS
".vcproj file association indicates VCExpress, avoiding MFC test")
set(CTEST_RUN_MFC OFF)
elseif( NOT ov )
message(STATUS
".vcproj has no file association, avoiding MFC test")
set(CTEST_RUN_MFC OFF)
endif()
endif()
if(CTEST_RUN_MFC)
# For the Watcom WMake generator, avoid the MFC test by default.
if("${CMAKE_GENERATOR}" MATCHES "WMake")
message(STATUS
"using the Watcom WMake generator, avoiding MFC test")
set(CTEST_RUN_MFC OFF)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "IntelLLVM")
# clang-cl cannot deal with implicit dependencies in UTF16 files
# (see #18311). IntelLLVM inherits this behavior from Clang.
# TODO: maybe clang should also skip the MFC test
message(STATUS
"using generator other than Visual Studio with clang-cl, avoiding MFC test")
set(CTEST_RUN_MFC OFF)
endif()
endif()
# Last resort, after quick checks are done. Do a try_compile, and avoid
# the MFC test if the simplest possible MFC app cannot be compiled.
if(CTEST_RUN_MFC AND NOT DEFINED HAVE_MFC)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/MFC/try_compile/CMakeLists.txt
${CMAKE_CURRENT_BINARY_DIR}/MFC/try_compile/CMakeLists.txt
COPYONLY
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/MFC/mfc1/stdafx.cpp
${CMAKE_CURRENT_BINARY_DIR}/MFC/try_compile/stdafx.cpp
COPYONLY
)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/MFC/mfc1/stdafx.h
${CMAKE_CURRENT_BINARY_DIR}/MFC/try_compile/stdafx.h
COPYONLY
)
message(STATUS "Looking for MFC")
try_compile(HAVE_MFC
${CMAKE_CURRENT_BINARY_DIR}/MFC/try_compile/build
${CMAKE_CURRENT_BINARY_DIR}/MFC/try_compile
try_compile_mfc
OUTPUT_VARIABLE HAVE_MFC_OUTPUT)
if(HAVE_MFC)
message(STATUS "Looking for MFC - found")
set(HAVE_MFC 1 CACHE INTERNAL "Have MFC")
file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Determining if MFC exists passed with the following output:\n"
"${HAVE_MFC_OUTPUT}\n\n")
else()
message(STATUS "Looking for MFC - not found")
set(HAVE_MFC "" CACHE INTERNAL "Have MFC")
file(APPEND
${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Determining if MFC exists failed with the following output:\n"
"${HAVE_MFC_OUTPUT}\n\n")
endif()
endif()
if(CTEST_RUN_MFC AND NOT HAVE_MFC)
message(STATUS
"cannot compile simplest ever MFC app, avoiding MFC test")
set(CTEST_RUN_MFC OFF)
endif()
endif()
endif()
if(CTEST_RUN_MFC)
if(CMake_TEST_MFC)
add_test(MFC ${CMAKE_CTEST_COMMAND}
--build-and-test
"${CMake_SOURCE_DIR}/Tests/MFC"

View File

@@ -29,9 +29,6 @@ QCOLLECTIONGENERATOR_EXECUTABLE:PATH=C:/qt-i386/bin/qhelpgenerator.exe
# No bootstrap with MSVC tools.
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
# No MFC in base image.
CTEST_RUN_MFC:BOOL=OFF
# No Fortran compiler.
CMAKE_Fortran_COMPILER:FILEPATH=FALSE

View File

@@ -29,9 +29,6 @@ QCOLLECTIONGENERATOR_EXECUTABLE:PATH=C:/qt-x86_64/bin/qhelpgenerator.exe
# No bootstrap with MSVC tools.
CMAKE_SKIP_BOOTSTRAP_TEST:STRING=TRUE
# No MFC in base image.
CTEST_RUN_MFC:BOOL=OFF
# No Fortran compiler.
CMAKE_Fortran_COMPILER:FILEPATH=FALSE

View File

@@ -12,7 +12,6 @@ cd \cmake\src\cmake-ninja && ^
@echo CMake_TEST_IPO_WORKS_C:BOOL=ON
@echo CMake_TEST_IPO_WORKS_CXX:BOOL=ON
@echo CMake_TEST_NO_NETWORK:BOOL=ON
@echo CTEST_RUN_MFC:BOOL=OFF
) && ^
cmake ..\cmake -DCMake_TEST_HOST_CMAKE=1 -G "Ninja" && ^
ninja && ^

View File

@@ -12,7 +12,6 @@ cd \cmake\src\cmake-nmake && ^
@echo CMake_TEST_IPO_WORKS_C:BOOL=ON
@echo CMake_TEST_IPO_WORKS_CXX:BOOL=ON
@echo CMake_TEST_NO_NETWORK:BOOL=ON
@echo CTEST_RUN_MFC:BOOL=OFF
) && ^
cmake ..\cmake -DCMake_TEST_HOST_CMAKE=1 -G "NMake Makefiles" && ^
nmake && ^