summaryrefslogtreecommitdiff
path: root/scripts/force-make
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/force-make')
-rwxr-xr-xscripts/force-make82
1 files changed, 82 insertions, 0 deletions
diff --git a/scripts/force-make b/scripts/force-make
new file mode 100755
index 0000000..7aa6513
--- /dev/null
+++ b/scripts/force-make
@@ -0,0 +1,82 @@
+#!/bin/bash
+# Make wrapper with ability to decrease paralelism and try again.
+# (C) 2018-2020 CZ.NIC, z.s.p.o.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+set -eu
+
+usage() {
+ echo "Usage: $0 [OPTION].. [-- [ARGUMENTS]..]" >&2
+}
+
+help() {
+ usage
+ cat >&2 <<EOF
+This is make wrapper that tries to run build really hard. It runs build multiple
+times while it decreases paralelism. You can set amount of retries done given
+number of parallel jobs. You can also specify speed how fast number of parallel
+jobs are going to decay using -d option. There is last additional run on top of it
+all that appends all arguments to make call passed to -f option.
+
+Options:
+ -j NUM Number of parallel jobs, modified and passed to make (in default 1)
+ -d OP Divider used to decrease number of parallel jobs (in default 2)
+ -c NUM Number of retries before paralelism is decreased (in default set to 1)
+ -f ARGS Additional argument to be used for last single job attempt (can be
+ passed multiple times)
+EOF
+}
+
+jobs_count="1"
+jobs_divider="2"
+retry_count="1"
+fallback=()
+while getopts "j:d:c:f:h" opt; do
+ case "$opt" in
+ j)
+ jobs_count="$OPTARG"
+ ;;
+ d)
+ jobs_divider="$OPTARG"
+ ;;
+ c)
+ retry_count="$OPTARG"
+ ;;
+ f)
+ fallback+=("$OPTARG")
+ ;;
+ h)
+ help
+ exit 0
+ ;;
+ *)
+ usage
+ exit 1
+ ;;
+ esac
+done
+shift $((OPTIND - 1))
+
+
+while [ "$jobs_count" -gt 1 ]; do
+ while [ "$retry_count" -gt 0 ]; do
+ if make -j "$jobs_count" "$@"; then
+ exit 0 # Success
+ fi
+ retry_count="$((retry_count - 1))"
+ done
+ jobs_count="$((jobs_count / jobs_divider))"
+done
+
+make "$@" "${fallback[@]}"