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