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