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