|
|
@@ -0,0 +1,165 @@
|
|
|
+if(NOT DEFINED CMake_SOURCE_DIR)
|
|
|
+ message(FATAL_ERROR "CMake_SOURCE_DIR not defined")
|
|
|
+endif()
|
|
|
+
|
|
|
+if(NOT DEFINED dir)
|
|
|
+ message(FATAL_ERROR "dir not defined")
|
|
|
+endif()
|
|
|
+
|
|
|
+if(NOT DEFINED gen)
|
|
|
+ message(FATAL_ERROR "gen not defined")
|
|
|
+endif()
|
|
|
+
|
|
|
+# Call cmake once to get a baseline/reference output build tree: "Build".
|
|
|
+# Then call cmake N more times, each time making a copy of the entire
|
|
|
+# build tree after cmake is done configuring/generating. At the end,
|
|
|
+# analyze the diffs in the generated build trees. Expect no diffs.
|
|
|
+#
|
|
|
+message(STATUS "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)")
|
|
|
+
|
|
|
+set(N 7)
|
|
|
+
|
|
|
+# First setup source and binary trees:
|
|
|
+#
|
|
|
+execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory
|
|
|
+ ${dir}/Source
|
|
|
+)
|
|
|
+
|
|
|
+execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory
|
|
|
+ ${dir}/Build
|
|
|
+)
|
|
|
+
|
|
|
+execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory
|
|
|
+ ${CMake_SOURCE_DIR}/Tests/CTestTest/SmallAndFast
|
|
|
+ ${dir}/Source
|
|
|
+)
|
|
|
+
|
|
|
+execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory
|
|
|
+ ${dir}/Build
|
|
|
+)
|
|
|
+
|
|
|
+# Patch SmallAndFast to build a .cxx executable too:
|
|
|
+#
|
|
|
+execute_process(COMMAND ${CMAKE_COMMAND} -E copy
|
|
|
+ ${dir}/Source/echoargs.c
|
|
|
+ ${dir}/Source/echoargs.cxx
|
|
|
+)
|
|
|
+file(APPEND "${dir}/Source/CMakeLists.txt" "\nadd_executable(echoargsCXX echoargs.cxx)\n")
|
|
|
+
|
|
|
+# Loop N times, saving a copy of the configured/generated build tree each time:
|
|
|
+#
|
|
|
+foreach(i RANGE 1 ${N})
|
|
|
+ # Equivalent sequence of shell commands:
|
|
|
+ #
|
|
|
+ message(STATUS "${i}: cd Build && cmake -G \"${gen}\" ../Source && cd .. && cp -r Build b${i}")
|
|
|
+
|
|
|
+ # Run cmake:
|
|
|
+ #
|
|
|
+ execute_process(COMMAND ${CMAKE_COMMAND} -G ${gen} ../Source
|
|
|
+ RESULT_VARIABLE result
|
|
|
+ OUTPUT_VARIABLE stdout
|
|
|
+ ERROR_VARIABLE stderr
|
|
|
+ WORKING_DIRECTORY ${dir}/Build
|
|
|
+ )
|
|
|
+
|
|
|
+ message(STATUS "result='${result}'")
|
|
|
+ message(STATUS "stdout='${stdout}'")
|
|
|
+ message(STATUS "stderr='${stderr}'")
|
|
|
+ message(STATUS "")
|
|
|
+
|
|
|
+ # Save this iteration of the Build directory:
|
|
|
+ #
|
|
|
+ execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory
|
|
|
+ ${dir}/b${i}
|
|
|
+ )
|
|
|
+ execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory
|
|
|
+ ${dir}/Build
|
|
|
+ ${dir}/b${i}
|
|
|
+ RESULT_VARIABLE result
|
|
|
+ OUTPUT_VARIABLE stdout
|
|
|
+ ERROR_VARIABLE stderr
|
|
|
+ )
|
|
|
+
|
|
|
+ message(STATUS "result='${result}'")
|
|
|
+ message(STATUS "stdout='${stdout}'")
|
|
|
+ message(STATUS "stderr='${stderr}'")
|
|
|
+ message(STATUS "")
|
|
|
+endforeach()
|
|
|
+
|
|
|
+
|
|
|
+# Function to analyze diffs between two directories.
|
|
|
+# Set DIFF_EXECUTABLE before calling if 'diff' is available.
|
|
|
+#
|
|
|
+function(analyze_directory_diffs d1 d2 diff_count_var)
|
|
|
+ set(diffs 0)
|
|
|
+
|
|
|
+ message(STATUS "Analyzing directory diffs between:")
|
|
|
+ message(STATUS " d1='${d1}'")
|
|
|
+ message(STATUS " d2='${d2}'")
|
|
|
+
|
|
|
+ if(NOT "${d1}" STREQUAL "" AND NOT "${d2}" STREQUAL "")
|
|
|
+ message(STATUS "info: analyzing directories")
|
|
|
+
|
|
|
+ file(GLOB_RECURSE files1 RELATIVE "${d1}" "${d1}/*")
|
|
|
+ file(GLOB_RECURSE files2 RELATIVE "${d2}" "${d2}/*")
|
|
|
+
|
|
|
+ if("${files1}" STREQUAL "${files2}")
|
|
|
+ message(STATUS "info: file lists the same")
|
|
|
+ #message(STATUS " files='${files1}'")
|
|
|
+
|
|
|
+ foreach(f ${files1})
|
|
|
+ execute_process(COMMAND ${CMAKE_COMMAND} -E compare_files
|
|
|
+ ${d1}/${f}
|
|
|
+ ${d2}/${f}
|
|
|
+ RESULT_VARIABLE result
|
|
|
+ OUTPUT_VARIABLE stdout
|
|
|
+ ERROR_VARIABLE stderr
|
|
|
+ )
|
|
|
+ if(result STREQUAL 0)
|
|
|
+ #message(STATUS "info: file '${f}' the same")
|
|
|
+ else()
|
|
|
+ math(EXPR diffs "${diffs} + 1")
|
|
|
+ message(STATUS "warning: file '${f}' differs from d1 to d2")
|
|
|
+ file(READ "${d1}/${f}" f1contents)
|
|
|
+ message(STATUS "contents of file '${d1}/${f}'
|
|
|
+[===[${f1contents}]===]")
|
|
|
+ file(READ "${d2}/${f}" f2contents)
|
|
|
+ message(STATUS "contents of file '${d2}/${f}'
|
|
|
+[===[${f2contents}]===]")
|
|
|
+ if(DIFF_EXECUTABLE)
|
|
|
+ message(STATUS "diff of files '${d1}/${f}' '${d2}/${f}'")
|
|
|
+ message(STATUS "[====[")
|
|
|
+ execute_process(COMMAND ${DIFF_EXECUTABLE} "${d1}/${f}" "${d2}/${f}")
|
|
|
+ message(STATUS "]====]")
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+ endforeach()
|
|
|
+ else()
|
|
|
+ math(EXPR diffs "${diffs} + 1")
|
|
|
+ message(STATUS "warning: file *lists* differ - some files exist in d1/not-d2 or not-d1/d2...")
|
|
|
+ message(STATUS " files1='${files1}'")
|
|
|
+ message(STATUS " files2='${files2}'")
|
|
|
+ endif()
|
|
|
+ endif()
|
|
|
+
|
|
|
+ set(${diff_count_var} ${diffs} PARENT_SCOPE)
|
|
|
+endfunction(analyze_directory_diffs)
|
|
|
+
|
|
|
+
|
|
|
+# Analyze diffs between b1:b2, b2:b3, b3:b4, b4:b5 ... bN-1:bN.
|
|
|
+# Expect no diffs.
|
|
|
+#
|
|
|
+find_program(DIFF_EXECUTABLE diff)
|
|
|
+set(total_diffs 0)
|
|
|
+
|
|
|
+foreach(i RANGE 2 ${N})
|
|
|
+ math(EXPR prev "${i} - 1")
|
|
|
+ set(count 0)
|
|
|
+ analyze_directory_diffs(${dir}/b${prev} ${dir}/b${i} count)
|
|
|
+ message(STATUS "diff count='${count}'")
|
|
|
+ message(STATUS "")
|
|
|
+ math(EXPR total_diffs "${total_diffs} + ${count}")
|
|
|
+endforeach()
|
|
|
+
|
|
|
+message(STATUS "CMAKE_COMMAND='${CMAKE_COMMAND}'")
|
|
|
+message(STATUS "total_diffs='${total_diffs}'")
|