summaryrefslogtreecommitdiffstats
path: root/cmake/scripts/common/CheckCommits.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake/scripts/common/CheckCommits.cmake')
-rw-r--r--cmake/scripts/common/CheckCommits.cmake75
1 files changed, 75 insertions, 0 deletions
diff --git a/cmake/scripts/common/CheckCommits.cmake b/cmake/scripts/common/CheckCommits.cmake
new file mode 100644
index 0000000..304e623
--- /dev/null
+++ b/cmake/scripts/common/CheckCommits.cmake
@@ -0,0 +1,75 @@
+find_package(Git REQUIRED)
+
+macro(sanity_check message)
+ if(status_code)
+ message(FATAL_ERROR "${message}")
+ endif()
+endmacro()
+
+# Check that there are no changes in working-tree
+execute_process(COMMAND ${GIT_EXECUTABLE} diff --quiet
+ RESULT_VARIABLE status_code)
+sanity_check("Cannot run with working tree changes. Commit, stash or drop them.")
+
+# Setup base of tests
+set(check_base $ENV{CHECK_BASE})
+if(NOT check_base)
+ set(check_base origin/master)
+endif()
+
+# Setup end of tests
+set(check_head $ENV{CHECK_HEAD})
+if(NOT check_head)
+ set(check_head HEAD)
+endif()
+
+# Setup target to build
+set(check_target $ENV{CHECK_TARGET})
+if(NOT check_target)
+ set(check_target check)
+endif()
+
+# Build threads
+set(build_threads $ENV{CHECK_THREADS})
+if(NOT build_threads)
+ if(UNIX)
+ execute_process(COMMAND nproc
+ OUTPUT_VARIABLE build_threads)
+ string(REGEX REPLACE "(\r?\n)+$" "" build_threads "${build_threads}")
+ endif()
+endif()
+
+# Record current HEAD
+execute_process(COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD
+ OUTPUT_VARIABLE current_branch)
+
+string(REGEX REPLACE "(\r?\n)+$" "" current_branch "${current_branch}")
+
+# Grab revision list
+execute_process(COMMAND ${GIT_EXECUTABLE} rev-list ${check_base}..${check_head} --reverse
+ OUTPUT_VARIABLE rev_list)
+
+string(REPLACE "\n" ";" rev_list ${rev_list})
+foreach(rev ${rev_list})
+ # Checkout
+ message("Testing revision ${rev}")
+ execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${rev}
+ RESULT_VARIABLE status_code)
+ sanity_check("Failed to checkout ${rev}")
+
+ # Build
+ if(build_threads GREATER 2)
+ execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${CMAKE_BINARY_DIR}" "--target" "${check_target}" "--use-stderr" "--" "-j${build_threads}"
+ RESULT_VARIABLE status_code)
+ else()
+ execute_process(COMMAND ${CMAKE_COMMAND} "--build" "${CMAKE_BINARY_DIR}" "--target" "${check_target}" "--use-stderr"
+ RESULT_VARIABLE status_code)
+ endif()
+ if(status_code)
+ execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${current_branch})
+ endif()
+ sanity_check("Failed to build target for revision ${rev}")
+endforeach()
+
+message("Everything checks out fine")
+execute_process(COMMAND ${GIT_EXECUTABLE} checkout ${current_branch})