xref: /kvm-unit-tests/configure (revision a991ed2fb5eef30af4e402cc79bcbae067d43e6b)
1#!/usr/bin/env bash
2
3srcdir=$(cd "$(dirname "$0")"; pwd)
4prefix=/usr/local
5cc=gcc
6ld=ld
7objcopy=objcopy
8objdump=objdump
9ar=ar
10addr2line=addr2line
11arch=`uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/'`
12host=$arch
13cross_prefix=
14endian=""
15pretty_print_stacks=yes
16environ_default=yes
17u32_long=
18wa_divide=
19vmm="qemu"
20errata_force=0
21erratatxt="$srcdir/errata.txt"
22
23usage() {
24    cat <<-EOF
25	Usage: $0 [options]
26
27	Options include:
28	    --arch=ARCH            architecture to compile for ($arch)
29	    --processor=PROCESSOR  processor to compile for ($arch)
30	    --vmm=VMM              virtual machine monitor to compile for (qemu
31	                           or kvmtool, default is qemu) (arm/arm64 only)
32	    --cross-prefix=PREFIX  cross compiler prefix
33	    --cc=CC		   c compiler to use ($cc)
34	    --ld=LD		   ld linker to use ($ld)
35	    --prefix=PREFIX        where to install things ($prefix)
36	    --endian=ENDIAN        endianness to compile for (little or big, ppc64 only)
37	    --[enable|disable]-pretty-print-stacks
38	                           enable or disable pretty stack printing (enabled by default)
39	    --[enable|disable]-default-environ
40	                           enable or disable the generation of a default environ when
41	                           no environ is provided by the user (enabled by default)
42	    --erratatxt=FILE       specify a file to use instead of errata.txt. Use
43	                           '--erratatxt=' to ensure no file is used.
44EOF
45    exit 1
46}
47
48while [[ "$1" = -* ]]; do
49    opt="$1"; shift
50    arg=
51    if [[ "$opt" = *=* ]]; then
52	arg="${opt#*=}"
53	opt="${opt%%=*}"
54    fi
55    case "$opt" in
56	--prefix)
57	    prefix="$arg"
58	    ;;
59        --arch)
60	    arch="$arg"
61	    ;;
62        --processor)
63	    processor="$arg"
64	    ;;
65	--vmm)
66	    vmm="$arg"
67	    ;;
68	--cross-prefix)
69	    cross_prefix="$arg"
70	    ;;
71	--endian)
72	    endian="$arg"
73	    ;;
74	--cc)
75	    cc="$arg"
76	    ;;
77	--ld)
78	    ld="$arg"
79	    ;;
80	--enable-pretty-print-stacks)
81	    pretty_print_stacks=yes
82	    ;;
83	--disable-pretty-print-stacks)
84	    pretty_print_stacks=no
85	    ;;
86	--enable-default-environ)
87	    environ_default=yes
88	    ;;
89	--disable-default-environ)
90	    environ_default=no
91	    ;;
92	--erratatxt)
93	    erratatxt=
94	    [ "$arg" ] && erratatxt=$(eval realpath "$arg")
95	    ;;
96	--help)
97	    usage
98	    ;;
99	*)
100	    usage
101	    ;;
102    esac
103done
104
105if [ "$erratatxt" ] && [ ! -f "$erratatxt" ]; then
106    echo "erratatxt: $erratatxt does not exist or is not a regular file"
107    exit 1
108fi
109
110arch_name=$arch
111[ "$arch" = "aarch64" ] && arch="arm64"
112[ "$arch_name" = "arm64" ] && arch_name="aarch64"
113
114[ -z "$processor" ] && processor="$arch"
115
116if [ "$processor" = "arm64" ]; then
117    processor="cortex-a57"
118elif [ "$processor" = "arm" ]; then
119    processor="cortex-a15"
120fi
121
122if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then
123    testdir=x86
124elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
125    testdir=arm
126    if [ "$vmm" = "qemu" ]; then
127        arm_uart_early_addr=0x09000000
128    elif [ "$vmm" = "kvmtool" ]; then
129        arm_uart_early_addr=0x3f8
130        errata_force=1
131    else
132        echo '--vmm must be one of "qemu" or "kvmtool"!'
133        usage
134    fi
135elif [ "$arch" = "ppc64" ]; then
136    testdir=powerpc
137    firmware="$testdir/boot_rom.bin"
138    if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then
139        echo "You must provide endianness (big or little)!"
140        usage
141    fi
142else
143    testdir=$arch
144fi
145if [ ! -d "$srcdir/$testdir" ]; then
146    echo "$testdir does not exist!"
147    exit 1
148fi
149if [ -f "$srcdir/$testdir/run" ]; then
150    ln -fs "$srcdir/$testdir/run" $testdir-run
151fi
152
153# check if uint32_t needs a long format modifier
154cat << EOF > lib-test.c
155__UINT32_TYPE__
156EOF
157u32_long=$("$cross_prefix$cc" -E lib-test.c | grep -v '^#' | grep -q long && echo yes)
158rm -f lib-test.c
159
160# check if slash can be used for division
161if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then
162  cat << EOF > lib-test.S
163foo:
164    movl (8 / 2), %eax
165EOF
166  wa_divide=$("$cross_prefix$cc" -c lib-test.S >/dev/null 2>&1 || echo yes)
167  rm -f lib-test.{o,S}
168fi
169
170# Are we in a separate build tree? If so, link the Makefile
171# and shared stuff so that 'make' and run_tests.sh work.
172if test ! -e Makefile; then
173    echo "linking Makefile..."
174    ln -s "$srcdir/Makefile" .
175
176    echo "linking tests..."
177    mkdir -p $testdir
178    ln -sf "$srcdir/$testdir/run" $testdir/
179    ln -sf "$srcdir/$testdir/unittests.cfg" $testdir/
180    ln -sf "$srcdir/run_tests.sh"
181
182    echo "linking scripts..."
183    ln -sf "$srcdir/scripts"
184fi
185
186# link lib/asm for the architecture
187rm -f lib/asm
188asm="asm-generic"
189if [ -d "$srcdir/lib/$arch/asm" ]; then
190	asm="$srcdir/lib/$arch/asm"
191elif [ -d "$srcdir/lib/$testdir/asm" ]; then
192	asm="$srcdir/lib/$testdir/asm"
193fi
194mkdir -p lib
195ln -sf "$asm" lib/asm
196
197
198# create the config
199cat <<EOF > config.mak
200SRCDIR=$srcdir
201PREFIX=$prefix
202HOST=$host
203ARCH=$arch
204ARCH_NAME=$arch_name
205PROCESSOR=$processor
206CC=$cross_prefix$cc
207LD=$cross_prefix$ld
208OBJCOPY=$cross_prefix$objcopy
209OBJDUMP=$cross_prefix$objdump
210AR=$cross_prefix$ar
211ADDR2LINE=$cross_prefix$addr2line
212TEST_DIR=$testdir
213FIRMWARE=$firmware
214ENDIAN=$endian
215PRETTY_PRINT_STACKS=$pretty_print_stacks
216ENVIRON_DEFAULT=$environ_default
217ERRATATXT=$erratatxt
218U32_LONG_FMT=$u32_long
219WA_DIVIDE=$wa_divide
220EOF
221
222cat <<EOF > lib/config.h
223#ifndef CONFIG_H
224#define CONFIG_H 1
225/*
226 * Generated file. DO NOT MODIFY.
227 *
228 */
229
230EOF
231if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then
232cat <<EOF >> lib/config.h
233
234#define CONFIG_UART_EARLY_BASE ${arm_uart_early_addr}
235#define CONFIG_ERRATA_FORCE ${errata_force}
236
237EOF
238fi
239echo "#endif" >> lib/config.h
240