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