Teach compiler ABI check to tolerate try_compile COPY_FILE failure

In CMakeDetermineCompilerABI we use try_compile with the COPY_FILE
option to get a copy of the compiled binary used to detect the ABI
information.  We already tolerate the case when compilation fails.
However, when compilation appears to succeed but does not produce the
expected executable the try_compile command immediately reports an error
because the COPY_FILE fails.

Tolerate COPY_FILE failure without stopping the overall configuration
process by using the try_compile COPY_FILE_ERROR option to capture the
error message.  Log the full error to CMakeError.log and simply report
failure to detect the ABI as if compilation had failed.

Teach the RunCMake.Configure test to cover this case and verify that the
messages show up as expected both in stdout and in CMakeError.log.
This commit is contained in:
Brad King 2013-07-17 14:56:40 -04:00
parent f82c751d7b
commit 4dc4018553
6 changed files with 29 additions and 2 deletions

View File

@ -41,6 +41,7 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
"--no-warn-unused-cli" "--no-warn-unused-cli"
OUTPUT_VARIABLE OUTPUT OUTPUT_VARIABLE OUTPUT
COPY_FILE "${BIN}" COPY_FILE "${BIN}"
COPY_FILE_ERROR _copy_error
) )
# Move result from cache to normal variable. # Move result from cache to normal variable.
set(CMAKE_${lang}_ABI_COMPILED ${CMAKE_${lang}_ABI_COMPILED}) set(CMAKE_${lang}_ABI_COMPILED ${CMAKE_${lang}_ABI_COMPILED})
@ -48,7 +49,7 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
set(CMAKE_${lang}_ABI_COMPILED ${CMAKE_${lang}_ABI_COMPILED} PARENT_SCOPE) set(CMAKE_${lang}_ABI_COMPILED ${CMAKE_${lang}_ABI_COMPILED} PARENT_SCOPE)
# Load the resulting information strings. # Load the resulting information strings.
if(CMAKE_${lang}_ABI_COMPILED) if(CMAKE_${lang}_ABI_COMPILED AND NOT _copy_error)
message(STATUS "Detecting ${lang} compiler ABI info - done") message(STATUS "Detecting ${lang} compiler ABI info - done")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log
"Detecting ${lang} compiler ABI info compiled with the following output:\n${OUTPUT}\n\n") "Detecting ${lang} compiler ABI info compiled with the following output:\n${OUTPUT}\n\n")
@ -131,7 +132,7 @@ function(CMAKE_DETERMINE_COMPILER_ABI lang src)
else() else()
message(STATUS "Detecting ${lang} compiler ABI info - failed") message(STATUS "Detecting ${lang} compiler ABI info - failed")
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
"Detecting ${lang} compiler ABI info failed to compile with the following output:\n${OUTPUT}\n\n") "Detecting ${lang} compiler ABI info failed to compile with the following output:\n${OUTPUT}\n${_copy_error}\n\n")
endif() endif()
endif() endif()
endfunction() endfunction()

View File

@ -0,0 +1,13 @@
set(log "${RunCMake_TEST_BINARY_DIR}/CMakeFiles/CMakeError.log")
if(EXISTS "${log}")
file(READ "${log}" error_log)
else()
set(error_log "")
endif()
if(NOT error_log MATCHES "Cannot copy output executable.*
to destination specified by COPY_FILE:.*
Unable to find the executable at any of:
.*\\.missing")
string(REGEX REPLACE "\n" "\n " error_log " ${error_log}")
set(RunCMake_TEST_FAILED "Log file:\n ${log}\ndoes not have expected COPY_FILE failure message:\n${error_log}")
endif()

View File

@ -0,0 +1,6 @@
# Change the executable suffix that try_compile will use for
# COPY_FILE but not inside the test project. This forces failure.
get_property(in_try_compile GLOBAL PROPERTY IN_TRY_COMPILE)
if(NOT in_try_compile)
set(CMAKE_EXECUTABLE_SUFFIX .missing)
endif()

View File

@ -0,0 +1,4 @@
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - failed
-- Configuring done
-- Generating done

View File

@ -0,0 +1,2 @@
set(CMAKE_USER_MAKE_RULES_OVERRIDE_C ${CMAKE_CURRENT_SOURCE_DIR}/FailCopyFileABI-override.cmake)
enable_language(C)

View File

@ -1,3 +1,4 @@
include(RunCMake) include(RunCMake)
run_cmake(ErrorLogs) run_cmake(ErrorLogs)
run_cmake(FailCopyFileABI)