xref: /kvm-unit-tests/scripts/mkstandalone.sh (revision 1abbc2cedc79eeee2efa0ef7425310a600fd7461)
1#!/bin/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/functions.bash
9
10escape ()
11{
12	for arg in "${@}"; do
13		printf "%q " "$arg"; # XXX: trailing whitespace
14	done
15}
16
17temp_file ()
18{
19	local var="$1"
20	local file="${2:--}"
21
22	echo "$var=\`mktemp\`"
23	echo "cleanup=\"\$$var \$cleanup\""
24	echo "base64 -d << 'BIN_EOF' | zcat > \$$var || exit 2"
25
26	gzip -c "$file" | base64
27
28	echo "BIN_EOF"
29	echo "chmod +x \$$var"
30}
31
32config_export ()
33{
34	echo "export $(grep ^${1}= config.mak)"
35}
36
37generate_test ()
38{
39	local args=( $(escape "${@}") )
40
41	echo "#!/bin/bash"
42	echo "export STANDALONE=yes"
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 PROCESSOR
49
50	echo "echo BUILD_HEAD=$(cat build-head)"
51
52	if [ ! -f $kernel ]; then
53		echo 'echo "skip '"$testname"' (test kernel not present)"'
54		echo 'exit 2'
55		return
56	fi
57
58	echo "trap 'rm -f \$cleanup' EXIT"
59
60	if [ "$FIRMWARE" ]; then
61		temp_file FIRMWARE "$FIRMWARE"
62		echo 'export FIRMWARE'
63	fi
64
65	temp_file bin "$kernel"
66	args[3]='$bin'
67
68	(echo "#!/bin/bash"
69	 cat scripts/arch-run.bash "$TEST_DIR/run") | temp_file RUNTIME_arch_run
70
71	echo "exec {stdout}>&1"
72	echo "RUNTIME_log_stdout () { cat >&\$stdout; }"
73	echo "RUNTIME_log_stderr () { cat >&2; }"
74
75	cat scripts/runtime.bash
76
77	echo "run ${args[@]}"
78}
79
80function mkstandalone()
81{
82	local testname="$1"
83
84	if [ -z "$testname" ]; then
85		return
86	fi
87
88	if [ -n "$one_testname" ] && [ "$testname" != "$one_testname" ]; then
89		return
90	fi
91
92	standalone=tests/$testname
93
94	generate_test "$@" > $standalone
95
96	chmod +x $standalone
97	echo Written $standalone.
98}
99
100trap 'rm -f $cfg' EXIT
101cfg=$(mktemp)
102
103unittests=$TEST_DIR/unittests.cfg
104one_kernel="$1"
105
106if [ "$one_kernel" ]; then
107	[ ! -f $one_kernel ] && {
108		echo "$one_kernel doesn't exist"
109		exit 1
110	}
111
112	one_kernel_base=$(basename $one_kernel)
113	one_testname="${2:-${one_kernel_base%.*}}"
114
115	if grep -q "\[$one_testname\]" $unittests; then
116		sed -n "/\\[$one_testname\\]/,/^\\[/p" $unittests \
117			| awk '!/^\[/ || NR == 1' > $cfg
118	else
119		echo "[$one_testname]" > $cfg
120		echo "file = $one_kernel_base" >> $cfg
121	fi
122else
123	cp -f $unittests $cfg
124fi
125
126mkdir -p tests
127
128for_each_unittest $cfg mkstandalone
129