summaryrefslogtreecommitdiff
path: root/scripts/force-make
blob: 7aa6513313ad337e2b7bd864ac3cef30535dd8ad (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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[@]}"