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