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