xref: /kvm-unit-tests/scripts/mkstandalone.sh (revision d55c941e41167d5aaacae87f1c9ae8416636c44f)
1#!/usr/bin/env bash
2
3if [ ! -f config.mak ]; then
4	echo "run ./configure && make first. See ./configure -h"
5	exit 1
6fi
7source config.mak
8source scripts/common.bash
9source scripts/vmm.bash
10
11vmm_check_supported
12
13temp_file ()
14{
15	local var="$1"
16	local file="${2:--}"
17
18	echo "$var=\`mktemp\`"
19	echo "cleanup=\"\$$var \$cleanup\""
20	echo "base64 -d << 'BIN_EOF' | zcat > \$$var || exit 2"
21
22	gzip -c "$file" | base64
23
24	echo "BIN_EOF"
25	echo "chmod +x \$$var"
26}
27
28config_export ()
29{
30	echo "export $(grep ^${1}= config.mak)"
31}
32
33generate_test ()
34{
35	local args=()
36	for arg in "${@}"; do
37		args+=("$(printf "%q" "$arg")")
38	done
39
40	echo "#!/usr/bin/env bash"
41	echo "export KUT_STANDALONE=yes"
42	echo "export ENVIRON_DEFAULT=$ENVIRON_DEFAULT"
43	echo "export HOST=\$(uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/')"
44	echo "export PRETTY_PRINT_STACKS=no"
45
46	config_export ARCH
47	config_export ARCH_NAME
48	config_export TARGET_CPU
49	config_export DEFAULT_QEMU_CPU
50	config_export TARGET
51
52	echo "echo BUILD_HEAD=$(cat build-head)"
53
54	if [ ! -f $kernel ]; then
55		echo 'echo "skip '"$testname"' (test kernel not present)"'
56		echo 'exit 2'
57		return
58	fi
59
60	echo "trap 'rm -f \$cleanup' EXIT"
61
62	if [ "$FIRMWARE" ]; then
63		temp_file FIRMWARE "$FIRMWARE"
64		echo 'export FIRMWARE'
65	fi
66
67	if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ]; then
68		temp_file ERRATATXT "$ERRATATXT"
69		echo 'export ERRATATXT'
70	fi
71
72	temp_file bin "$kernel"
73	# Don't want to expand $bin but print it as-is.
74	# shellcheck disable=SC2016
75	args[3]='$bin'
76
77	(echo "#!/usr/bin/env bash"
78	 cat scripts/vmm.bash scripts/arch-run.bash "$TEST_DIR/run") \
79		| temp_file RUNTIME_arch_run
80
81	echo "exec {stdout}>&1"
82	echo "RUNTIME_log_stdout () { cat >&\$stdout; }"
83	echo "RUNTIME_log_stderr () { cat >&2; }"
84
85	cat scripts/vmm.bash
86	cat scripts/runtime.bash
87
88	echo "run ${args[*]}"
89}
90
91function mkstandalone()
92{
93	local testname="$1"
94
95	if [ -n "$one_testname" ] && [ "$testname" != "$one_testname" ]; then
96		return
97	fi
98
99	standalone=tests/$testname
100
101	generate_test "$@" > $standalone
102
103	chmod +x $standalone
104	echo Written $standalone.
105}
106
107if [ "$ENVIRON_DEFAULT" = "yes" ] && [ "$ERRATATXT" ] && [ ! -f "$ERRATATXT" ]; then
108	echo "$ERRATATXT not found. (ERRATATXT=$ERRATATXT)" >&2
109	exit 2
110fi
111
112trap 'rm -f $cfg' EXIT
113cfg=$(mktemp)
114
115unittests=$TEST_DIR/unittests.cfg
116one_kernel="$1"
117
118if [ "$one_kernel" ]; then
119	[ ! -f $one_kernel ] && {
120		echo "$one_kernel doesn't exist"
121		exit 1
122	}
123
124	one_kernel_base=$(basename $one_kernel)
125	one_testname="${2:-${one_kernel_base%.*}}"
126
127	if grep -q "\[$one_testname\]" $unittests; then
128		sed -n "/\\[$one_testname\\]/,/^\\[/p" $unittests \
129			| awk '!/^\[/ || NR == 1' > $cfg
130	else
131		echo "[$one_testname]" > $cfg
132		echo "file = $one_kernel_base" >> $cfg
133	fi
134else
135	cp -f $unittests $cfg
136fi
137
138mkdir -p tests
139
140for_each_unittest $cfg mkstandalone
141