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