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