Spaces:
Runtime error
Runtime error
| #!/usr/bin/env bash | |
| srcdir=$(cd "$(dirname "$0")"; pwd) | |
| prefix=/usr/local | |
| cc=gcc | |
| cxx=g++ | |
| ld=ld | |
| objcopy=objcopy | |
| objdump=objdump | |
| ar=ar | |
| addr2line=addr2line | |
| arch=`uname -m | sed -e 's/i.86/i386/;s/arm.*/arm/;s/ppc64.*/ppc64/'` | |
| host=$arch | |
| cross_prefix= | |
| endian="" | |
| pretty_print_stacks=yes | |
| environ_default=yes | |
| u32_long= | |
| usage() { | |
| cat <<-EOF | |
| Usage: $0 [options] | |
| Options include: | |
| --arch=ARCH architecture to compile for ($arch) | |
| --processor=PROCESSOR processor to compile for ($arch) | |
| --cross-prefix=PREFIX cross compiler prefix | |
| --cc=CC c compiler to use ($cc) | |
| --cxx=CXX c++ compiler to use ($cxx) | |
| --ld=LD ld linker to use ($ld) | |
| --prefix=PREFIX where to install things ($prefix) | |
| --endian=ENDIAN endianness to compile for (little or big, ppc64 only) | |
| --[enable|disable]-pretty-print-stacks | |
| enable or disable pretty stack printing (enabled by default) | |
| --[enable|disable]-default-environ | |
| enable or disable the generation of a default environ when | |
| no environ is provided by the user (enabled by default) | |
| EOF | |
| exit 1 | |
| } | |
| while [[ "$1" = -* ]]; do | |
| opt="$1"; shift | |
| arg= | |
| if [[ "$opt" = *=* ]]; then | |
| arg="${opt#*=}" | |
| opt="${opt%%=*}" | |
| fi | |
| case "$opt" in | |
| --prefix) | |
| prefix="$arg" | |
| ;; | |
| --arch) | |
| arch="$arg" | |
| ;; | |
| --processor) | |
| processor="$arg" | |
| ;; | |
| --cross-prefix) | |
| cross_prefix="$arg" | |
| ;; | |
| --endian) | |
| endian="$arg" | |
| ;; | |
| --cc) | |
| cc="$arg" | |
| ;; | |
| --cxx) | |
| cxx="$arg" | |
| ;; | |
| --ld) | |
| ld="$arg" | |
| ;; | |
| --enable-pretty-print-stacks) | |
| pretty_print_stacks=yes | |
| ;; | |
| --disable-pretty-print-stacks) | |
| pretty_print_stacks=no | |
| ;; | |
| --enable-default-environ) | |
| environ_default=yes | |
| ;; | |
| --disable-default-environ) | |
| environ_default=no | |
| ;; | |
| --help) | |
| usage | |
| ;; | |
| *) | |
| usage | |
| ;; | |
| esac | |
| done | |
| arch_name=$arch | |
| [ "$arch" = "aarch64" ] && arch="arm64" | |
| [ "$arch_name" = "arm64" ] && arch_name="aarch64" | |
| [ -z "$processor" ] && processor="$arch" | |
| if [ "$processor" = "arm64" ]; then | |
| processor="cortex-a57" | |
| elif [ "$processor" = "arm" ]; then | |
| processor="cortex-a15" | |
| fi | |
| if [ "$arch" = "i386" ] || [ "$arch" = "x86_64" ]; then | |
| testdir=x86 | |
| elif [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then | |
| testdir=arm | |
| elif [ "$arch" = "ppc64" ]; then | |
| testdir=powerpc | |
| firmware="$testdir/boot_rom.bin" | |
| if [ "$endian" != "little" ] && [ "$endian" != "big" ]; then | |
| echo "You must provide endianness (big or little)!" | |
| usage | |
| fi | |
| else | |
| testdir=$arch | |
| fi | |
| if [ ! -d "$srcdir/$testdir" ]; then | |
| echo "$testdir does not exist!" | |
| exit 1 | |
| fi | |
| if [ -f "$srcdir/$testdir/run" ]; then | |
| ln -fs "$srcdir/$testdir/run" $testdir-run | |
| fi | |
| # check if uint32_t needs a long format modifier | |
| cat << EOF > lib-test.c | |
| __UINT32_TYPE__ | |
| EOF | |
| u32_long=$($cross_prefix$cc -E lib-test.c | grep -v '^#' | grep -q long && echo yes) | |
| rm -f lib-test.c | |
| # api/: check for dependent 32 bit libraries and gnu++11 support | |
| if [ "$testdir" = "x86" ]; then | |
| echo 'int main () {}' > lib-test.c | |
| $cc -m32 -o /dev/null -lstdc++ -lpthread -lrt lib-test.c &> /dev/null | |
| exit=$? | |
| $cxx -m32 -o /dev/null -std=gnu++11 lib-test.c &> /dev/null | |
| if [ $? -eq 0 -a $exit -eq 0 ]; then | |
| api=true | |
| fi | |
| rm -f lib-test.c | |
| fi | |
| # Are we in a separate build tree? If so, link the Makefile | |
| # and shared stuff so that 'make' and run_tests.sh work. | |
| if test ! -e Makefile; then | |
| echo "linking Makefile..." | |
| ln -s "$srcdir/Makefile" . | |
| echo "linking tests..." | |
| mkdir -p $testdir | |
| ln -sf "$srcdir/$testdir/run" $testdir/ | |
| ln -sf "$srcdir/$testdir/unittests.cfg" $testdir/ | |
| ln -sf "$srcdir/run_tests.sh" | |
| echo "linking scripts..." | |
| ln -sf "$srcdir/scripts" | |
| fi | |
| # link lib/asm for the architecture | |
| rm -f lib/asm | |
| asm=asm-generic | |
| if [ -d "$srcdir/lib/$arch/asm" ]; then | |
| asm="$srcdir/lib/$arch/asm" | |
| elif [ -d "$srcdir/lib/$testdir/asm" ]; then | |
| asm="$srcdir/lib/$testdir/asm" | |
| fi | |
| mkdir -p lib | |
| ln -sf "$asm" lib/asm | |
| # create the config | |
| cat <<EOF > config.mak | |
| SRCDIR=$srcdir | |
| PREFIX=$prefix | |
| HOST=$host | |
| ARCH=$arch | |
| ARCH_NAME=$arch_name | |
| PROCESSOR=$processor | |
| CC=$cross_prefix$cc | |
| CXX=$cross_prefix$cxx | |
| LD=$cross_prefix$ld | |
| OBJCOPY=$cross_prefix$objcopy | |
| OBJDUMP=$cross_prefix$objdump | |
| AR=$cross_prefix$ar | |
| ADDR2LINE=$cross_prefix$addr2line | |
| API=$api | |
| TEST_DIR=$testdir | |
| FIRMWARE=$firmware | |
| ENDIAN=$endian | |
| PRETTY_PRINT_STACKS=$pretty_print_stacks | |
| ENVIRON_DEFAULT=$environ_default | |
| ERRATATXT=errata.txt | |
| U32_LONG_FMT=$u32_long | |
| EOF | |