1*1b7dd7d3SSergey Bronnikov#!/usr/bin/env bash 27d36db35SAvi Kivity 37d36db35SAvi Kivityprefix=/usr/local 47d36db35SAvi Kivitycc=gcc 57d36db35SAvi Kivityld=ld 67d36db35SAvi Kivityobjcopy=objcopy 7de9d141bSAndrew Jonesobjdump=objdump 87d36db35SAvi Kivityar=ar 9e593c4fdSAndrew Jonesaddr2line=addr2line 10810e9728SLaurent Vivierarch=`uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/'` 11c4306560SAlex Bennéehost=$arch 127d36db35SAvi Kivitycross_prefix= 13f1ccf5d2SLaurent Vivierendian="" 1456c886b0SPeter Feinerpretty_print_stacks=yes 1544f64120SAndrew Jonesu32_long= 167d36db35SAvi Kivity 177d36db35SAvi Kivityusage() { 187d36db35SAvi Kivity cat <<-EOF 197d36db35SAvi Kivity Usage: $0 [options] 207d36db35SAvi Kivity 217d36db35SAvi Kivity Options include: 227d36db35SAvi Kivity --arch=ARCH architecture to compile for ($arch) 235e61cba0SAndrew Jones --processor=PROCESSOR processor to compile for ($arch) 247d36db35SAvi Kivity --cross-prefix=PREFIX cross compiler prefix 257d36db35SAvi Kivity --cc=CC c compiler to use ($cc) 267d36db35SAvi Kivity --ld=LD ld linker to use ($ld) 277d36db35SAvi Kivity --prefix=PREFIX where to install things ($prefix) 28f1ccf5d2SLaurent Vivier --endian=ENDIAN endianness to compile for (little or big, ppc64 only) 2956c886b0SPeter Feiner --[enable|disable]-pretty-print-stacks 3056c886b0SPeter Feiner enable or disable pretty stack printing (enabled by default) 317d36db35SAvi KivityEOF 327d36db35SAvi Kivity exit 1 337d36db35SAvi Kivity} 347d36db35SAvi Kivity 357d36db35SAvi Kivitywhile [[ "$1" = -* ]]; do 367d36db35SAvi Kivity opt="$1"; shift 377d36db35SAvi Kivity arg= 387d36db35SAvi Kivity if [[ "$opt" = *=* ]]; then 397d36db35SAvi Kivity arg="${opt#*=}" 407d36db35SAvi Kivity opt="${opt%%=*}" 417d36db35SAvi Kivity fi 427d36db35SAvi Kivity case "$opt" in 437d36db35SAvi Kivity --prefix) 447d36db35SAvi Kivity prefix="$arg" 457d36db35SAvi Kivity ;; 467d36db35SAvi Kivity --arch) 477d36db35SAvi Kivity arch="$arg" 487d36db35SAvi Kivity ;; 497d36db35SAvi Kivity --processor) 507d36db35SAvi Kivity processor="$arg" 517d36db35SAvi Kivity ;; 527d36db35SAvi Kivity --cross-prefix) 537d36db35SAvi Kivity cross_prefix="$arg" 547d36db35SAvi Kivity ;; 55f1ccf5d2SLaurent Vivier --endian) 56f1ccf5d2SLaurent Vivier endian="$arg" 57f1ccf5d2SLaurent Vivier ;; 587d36db35SAvi Kivity --cc) 597d36db35SAvi Kivity cc="$arg" 607d36db35SAvi Kivity ;; 617d36db35SAvi Kivity --ld) 627d36db35SAvi Kivity ld="$arg" 637d36db35SAvi Kivity ;; 6456c886b0SPeter Feiner --enable-pretty-print-stacks) 6556c886b0SPeter Feiner pretty_print_stacks=yes 6656c886b0SPeter Feiner ;; 6756c886b0SPeter Feiner --disable-pretty-print-stacks) 6856c886b0SPeter Feiner pretty_print_stacks=no 6956c886b0SPeter Feiner ;; 707d36db35SAvi Kivity --help) 717d36db35SAvi Kivity usage 727d36db35SAvi Kivity ;; 737d36db35SAvi Kivity *) 747d36db35SAvi Kivity usage 757d36db35SAvi Kivity ;; 767d36db35SAvi Kivity esac 777d36db35SAvi Kivitydone 7839ac3f84SAndrew Jones 7939ac3f84SAndrew Jonesarch_name=$arch 8039ac3f84SAndrew Jones[ "$arch" = "aarch64" ] && arch="arm64" 8139ac3f84SAndrew Jones[ "$arch_name" = "arm64" ] && arch_name="aarch64" 8239ac3f84SAndrew Jones 835e61cba0SAndrew Jones[ -z "$processor" ] && processor="$arch" 845e61cba0SAndrew Jones 8539ac3f84SAndrew Jonesif [ "$processor" = "arm64" ]; then 8639ac3f84SAndrew Jones processor="cortex-a57" 8739ac3f84SAndrew Joneselif [ "$processor" = "arm" ]; then 885e61cba0SAndrew Jones processor="cortex-a15" 895e61cba0SAndrew Jonesfi 905e61cba0SAndrew Jones 91761db0bdSAndrew Jonesif [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then 92761db0bdSAndrew Jones testdir=x86 9339ac3f84SAndrew Joneselif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then 9439ac3f84SAndrew Jones testdir=arm 951e95c7ccSAndrew Joneselif [ "$arch" = "ppc64" ]; then 961e95c7ccSAndrew Jones testdir=powerpc 973f8d4194SAndrew Jones firmware="$testdir/boot_rom.bin" 98f1ccf5d2SLaurent Vivier if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then 99f1ccf5d2SLaurent Vivier echo "You must provide endianness (big or little)!" 100f1ccf5d2SLaurent Vivier usage 101f1ccf5d2SLaurent Vivier fi 102761db0bdSAndrew Joneselse 103761db0bdSAndrew Jones testdir=$arch 104761db0bdSAndrew Jonesfi 105761db0bdSAndrew Jonesif [ ! -d $testdir ]; then 106761db0bdSAndrew Jones echo "$testdir does not exist!" 107761db0bdSAndrew Jones exit 1 108761db0bdSAndrew Jonesfi 109761db0bdSAndrew Jonesif [ -f $testdir/run ]; then 110761db0bdSAndrew Jones ln -fs $testdir/run $testdir-run 111761db0bdSAndrew Jonesfi 1127d36db35SAvi Kivity 113529046c3SAlex Bennée# check if uint32_t needs a long format modifier 11444f64120SAndrew Jonescat << EOF > lib-test.c 11544f64120SAndrew Jones__UINT32_TYPE__ 116529046c3SAlex BennéeEOF 11744f64120SAndrew Jonesu32_long=$($cross_prefix$cc -E lib-test.c | grep -v '^#' | grep -q long && echo yes) 11844f64120SAndrew Jonesrm -f lib-test.c 119529046c3SAlex Bennée 120f9561e8dSConny Seidel# check for dependent 32 bit libraries 1215e61cba0SAndrew Jonesif [ "$arch" != "arm" ]; then 122f9561e8dSConny Seidelcat << EOF > lib_test.c 123f9561e8dSConny Seidel#include <stdc++.h> 124f9561e8dSConny Seidel#include <boost_thread-mt.h> 125f9561e8dSConny Seidel#include <pthread.h> 126f9561e8dSConny Seidel 127f9561e8dSConny Seidelint main () 128f9561e8dSConny Seidel{} 129f9561e8dSConny SeidelEOF 130f9561e8dSConny Seidel$cc -m32 -o /dev/null lib_test.c &> /dev/null 131f9561e8dSConny Seidelexit=$? 132f9561e8dSConny Seidelif [ $exit -eq 0 ]; then 133f9561e8dSConny Seidel api=true 134f9561e8dSConny Seidelfi 135f9561e8dSConny Seidelrm -f lib_test.c 1365e61cba0SAndrew Jonesfi 137f9561e8dSConny Seidel 1383df0ccccSAndrew Jones# link lib/asm for the architecture 1393df0ccccSAndrew Jonesrm -f lib/asm 1403df0ccccSAndrew Jonesasm=asm-generic 1413df0ccccSAndrew Jonesif [ -d lib/$arch/asm ]; then 1423df0ccccSAndrew Jones asm=$arch/asm 1433df0ccccSAndrew Joneselif [ -d lib/$testdir/asm ]; then 1443df0ccccSAndrew Jones asm=$testdir/asm 1453df0ccccSAndrew Jonesfi 1463df0ccccSAndrew Jonesln -s $asm lib/asm 1473df0ccccSAndrew Jones 1483df0ccccSAndrew Jones# create the config 1497d36db35SAvi Kivitycat <<EOF > config.mak 1507d36db35SAvi KivityPREFIX=$prefix 151c4306560SAlex BennéeHOST=$host 1527d36db35SAvi KivityARCH=$arch 15339ac3f84SAndrew JonesARCH_NAME=$arch_name 1547d36db35SAvi KivityPROCESSOR=$processor 1557d36db35SAvi KivityCC=$cross_prefix$cc 1567d36db35SAvi KivityLD=$cross_prefix$ld 1577d36db35SAvi KivityOBJCOPY=$cross_prefix$objcopy 158de9d141bSAndrew JonesOBJDUMP=$cross_prefix$objdump 1597d36db35SAvi KivityAR=$cross_prefix$ar 160e593c4fdSAndrew JonesADDR2LINE=$cross_prefix$addr2line 161f9561e8dSConny SeidelAPI=$api 162761db0bdSAndrew JonesTEST_DIR=$testdir 1633f8d4194SAndrew JonesFIRMWARE=$firmware 164f1ccf5d2SLaurent VivierENDIAN=$endian 16556c886b0SPeter FeinerPRETTY_PRINT_STACKS=$pretty_print_stacks 166529046c3SAlex BennéeU32_LONG_FMT=$u32_long 1677d36db35SAvi KivityEOF 168