foreach(arg RunCMake_GENERATOR RunCMake_SOURCE_DIR RunCMake_BINARY_DIR ) if(NOT DEFINED ${arg}) message(FATAL_ERROR "${arg} not given!") endif() endforeach() function(run_cmake test) set(top_src "${RunCMake_SOURCE_DIR}") set(top_bin "${RunCMake_BINARY_DIR}") if(EXISTS ${top_src}/${test}-result.txt) file(READ ${top_src}/${test}-result.txt expect_result) string(REGEX REPLACE "\n+$" "" expect_result "${expect_result}") else() set(expect_result 0) endif() foreach(o out err) if(EXISTS ${top_src}/${test}-std${o}.txt) file(READ ${top_src}/${test}-std${o}.txt expect_std${o}) string(REGEX REPLACE "\n+$" "" expect_std${o} "${expect_std${o}}") else() unset(expect_std${o}) endif() endforeach() set(source_dir "${top_src}") set(binary_dir "${top_bin}/${test}-build") file(REMOVE_RECURSE "${binary_dir}") file(MAKE_DIRECTORY "${binary_dir}") execute_process( COMMAND ${CMAKE_COMMAND} "${source_dir}" -G "${RunCMake_GENERATOR}" -DRunCMake_TEST=${test} WORKING_DIRECTORY "${binary_dir}" OUTPUT_VARIABLE actual_stdout ERROR_VARIABLE actual_stderr RESULT_VARIABLE actual_result ) set(msg "") if(NOT "${actual_result}" STREQUAL "${expect_result}") set(msg "${msg}Result is [${actual_result}], not [${expect_result}].\n") endif() foreach(o out err) string(REGEX REPLACE "\n+$" "" actual_std${o} "${actual_std${o}}") set(expect_${o} "") if(DEFINED expect_std${o}) if(NOT "${actual_std${o}}" MATCHES "${expect_std${o}}") string(REGEX REPLACE "\n" "\n expect-${o}> " expect_${o} " expect-${o}> ${expect_std${o}}") set(expect_${o} "Expected std${o} to match:\n${expect_${o}}\n") set(msg "${msg}std${o} does not match that expected.\n") endif() endif() endforeach() if(msg) string(REGEX REPLACE "\n" "\n actual-out> " actual_out " actual-out> ${actual_stdout}") string(REGEX REPLACE "\n" "\n actual-err> " actual_err " actual-err> ${actual_stderr}") message(SEND_ERROR "${test} - FAILED:\n" "${msg}" "${expect_out}" "Actual stdout:\n${actual_out}\n" "${expect_err}" "Actual stderr:\n${actual_err}\n" ) else() message(STATUS "${test} - PASSED") endif() endfunction()