#!/usr/bin/env bash srcdir=$(cd "$(dirname "$0")"; pwd) prefix=/usr/local cc=gcc 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= vmm="qemu" errata_force=0 erratatxt="$srcdir/errata.txt" usage() { cat <<-EOF Usage: $0 [options] Options include: --arch=ARCH architecture to compile for ($arch) --processor=PROCESSOR processor to compile for ($arch) --vmm=VMM virtual machine monitor to compile for (qemu or kvmtool, default is qemu) (arm/arm64 only) --cross-prefix=PREFIX cross compiler prefix --cc=CC c compiler to use ($cc) --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) --erratatxt=FILE specify a file to use instead of errata.txt. Use '--erratatxt=' to ensure no file is used. 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" ;; --vmm) vmm="$arg" ;; --cross-prefix) cross_prefix="$arg" ;; --endian) endian="$arg" ;; --cc) cc="$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 ;; --erratatxt) erratatxt= [ "$arg" ] && erratatxt=$(eval realpath "$arg") ;; --help) usage ;; *) usage ;; esac done if [ "$erratatxt" ] && [ ! -f "$erratatxt" ]; then echo "erratatxt: $erratatxt does not exist or is not a regular file" exit 1 fi 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 if [ "$vmm" = "qemu" ]; then arm_uart_early_addr=0x09000000 elif [ "$vmm" = "kvmtool" ]; then arm_uart_early_addr=0x3f8 errata_force=1 else echo '--vmm must be one of "qemu" or "kvmtool"!' usage fi 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 # 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 < config.mak SRCDIR=$srcdir PREFIX=$prefix HOST=$host ARCH=$arch ARCH_NAME=$arch_name PROCESSOR=$processor CC=$cross_prefix$cc LD=$cross_prefix$ld OBJCOPY=$cross_prefix$objcopy OBJDUMP=$cross_prefix$objdump AR=$cross_prefix$ar ADDR2LINE=$cross_prefix$addr2line TEST_DIR=$testdir FIRMWARE=$firmware ENDIAN=$endian PRETTY_PRINT_STACKS=$pretty_print_stacks ENVIRON_DEFAULT=$environ_default ERRATATXT=$erratatxt U32_LONG_FMT=$u32_long EOF cat < lib/config.h #ifndef CONFIG_H #define CONFIG_H 1 /* * Generated file. DO NOT MODIFY. * */ EOF if [ "$arch" = "arm" ] || [ "$arch" = "arm64" ]; then cat <> lib/config.h #define CONFIG_UART_EARLY_BASE ${arm_uart_early_addr} #define CONFIG_ERRATA_FORCE ${errata_force} EOF fi echo "#endif" >> lib/config.h