#!/bin/sh

#
# MOLPATH is needed if you want to build openbios-mol.elf
#
MOLPATH=$HOME/mol-0.9.71

if [ x"$1" = x -o "$1" = "-help" ]; then
  printf "Usage:\n  $0 [arch-config]...\n"
  printf "arch-config values supported for native or cross compiled builds:\n"
  printf " amd64, ppc, sparc32, sparc64, x86\n\n"
  printf "Add \"unix-\" prefix to compile openbios-unix executable (native only)\n"
  printf "Add \"builtin-\" prefix to compile openbios-builtin executables\n\n"
  printf "Without prefixes, builtin and unix targets are selected\n\n"
  printf "Special targets: mol-ppc briq-ppc pearpc-ppc qemu-ppc qemu-ppc64 xbox-x86\n\n"
  printf "Example: $0 builtin-sparc32 unix-amd64 builtin-amd64\n"
  exit 0
fi

is_bigendian()
{
    cpu=$1

    if test "$cpu" = "powerpc" -o "$cpu" = "ppc" \
        -o "$cpu" = "powerpc64" -o "$cpu" = "ppc64" \
        -o "$cpu" = "mips" -o "$cpu" = "s390" \
        -o "$cpu" = "sparc32" -o "$cpu" = "sparc64" \
        -o "$cpu" = "m68k" -o "$cpu" = "armv4b"; then
        echo yes
    else
        echo no
    fi
}

longbits()
{
    cpu=$1
    if test "$cpu" = "sparc64" -o "$cpu" = "ia64" \
        -o "$cpu" = "amd64" -o "$cpu" = "x86_64" \
        -o "$cpu" = "powerpc64" -o "$cpu" = "ppc64" \
        -o "$cpu" = "alpha"; then
        echo 64
    else
        echo 32
    fi
}

basearch()
{
    arch=$1
    case $arch in
    powerpc|ppc64|powerpc64)
        echo ppc
        ;;
    *)
        echo $arch
        ;;
    esac
}

crosscflags()
{
    host=$1
    target=$2

    hostbigendian=$(is_bigendian $host)
    hostlongbits=$(longbits $host)

    targetbigendian=$(is_bigendian $target)
    targetlongbits=$(longbits $target)

    if test "$targetbigendian" = "$hostbigendian"; then
        cflags="-USWAP_ENDIANNESS"
    else
        cflags="-DSWAP_ENDIANNESS"
    fi

    if test "$targetlongbits" = "$hostlongbits"; then
        cflags="$cflags -DNATIVE_BITWIDTH_EQUALS_HOST_BITWIDTH"
    elif test "$targetlongbits" -lt "$hostlongbits"; then
        cflags="$cflags -DNATIVE_BITWIDTH_SMALLER_THAN_HOST_BITWIDTH"
    else
        cflags="$cflags -DNATIVE_BITWIDTH_LARGER_THAN_HOST_BITWIDTH"
    fi

    if test "$target" = "sparc64" -o "$target" = "ia64" \
         -o "$target" = "amd64" -o "$target" = "x86_64" \
         -o "$target" = "alpha"; then
        if test "$host" = "x86"; then
            cflags="$cflags -DNEED_FAKE_INT128_T"
        elif test "$host" = "arm"; then
            cflags="$cflags -DNEED_FAKE_INT128_T"
        elif test "$host" = "ppc" -a `uname -s` = "Darwin"; then
            cflags="$cflags -DNEED_FAKE_INT128_T"
        fi
    fi

    CROSSCFLAGS=$cflags
}

archname()
{
    HOSTARCH=`uname -m | sed -e s/i.86/x86/ -e s/i86pc/x86/ \
	-e s/sun4u/sparc64/ -e s/sparc$/sparc32/ \
	-e s/arm.*/arm/ -e s/sa110/arm/ -e s/x86_64/amd64/ \
	-e "s/Power Macintosh/ppc/"`
}

select_prefix()
{
    BASEARCH=$(basearch $ARCH)
    for target_arch ; do
        TARGETS="${target_arch}-unknown-linux-gnu- ${target_arch}-linux-gnu- ${target_arch}-linux- ${target_arch}-elf- ${target_arch}-eabi-"

        if [ x"$CROSS_COMPILE" != "x" ]; then
            TARGETS=$CROSS_COMPILE
        fi

        for TARGET in $TARGETS
        do
            if type ${TARGET}gcc > /dev/null 2>&1
            then
                return
            fi
        done
        if [ "$BASEARCH" = "$(basearch $HOSTARCH)" ]; then
            TARGET=""
            return
        fi
    done
    echo "ERROR: no $* cross-compiler found !" 1>&2
    exit 1
}

config_set_boolean()
{
    option=`echo $1 | tr a-z A-Z`
    echo "<option name=\"$option\" type=\"boolean\" value=\"true\" />"
}

exists()
{
    type "$1" >/dev/null 2>&1
}


SRCDIR=`dirname "$0"`/../..
BUILDDIR=`pwd`

# make source path absolute
SRCDIR=`cd "$SRCDIR"; pwd`

if test "x$HOSTARCH" = "x"; then
    archname
fi

VERSION=`head $SRCDIR/VERSION`

echo "Configuring OpenBIOS on $HOSTARCH for $*"

if exists toke; then
    :
else
    echo "Unable to locate toke executable from the fcode-utils package - aborting"
    exit 1
fi

target_list=""
for target in $*; do
    case $target in
        unix-*|builtin-*|plain-*|mol-ppc|briq-ppc|pearpc-ppc|qemu-ppc|qemu-ppc64|xbox-x86)
        target_list="$target_list $target"
        ;;
        cross-*)
        echo "\"cross-\" prefix is no longer needed"
        target=`echo $target | sed s/cross-//g`
        target_list="$target_list builtin-$target"
        ;;
        *)
        #default: build builtin and if possible, unix target
        target_list="$target_list builtin-$target unix-$target"
        ;;
    esac
done

arch_list=""
for target in $target_list; do
    arch=`echo $target | sed s/.*-//g`
    if ! test -f $SRCDIR/config/examples/${arch}_config.xml; then
        echo "Cannot find $SRCDIR/config/examples/${arch}_config.xml" >&2
        exit 1
    fi
    if ! echo $arch_list | grep -q "$arch"; then
        arch_list="$arch_list $arch"
    fi
done

for ARCH in $arch_list; do
    unix="no"
    builtin="no"
    plain="no"
    mol="no"
    briq="no"
    pearpc="no"
    qemu="no"
    xbox="no"
    cross="no"

    for target in $target_list; do
        case $target in
            *-$ARCH)
            :
            ;;
            *)
            continue
            ;;
        esac
        case $target in
            mol-ppc)
            mol="yes"
            ;;
            briq-ppc)
            briq="yes"
            ;;
            pearpc-ppc)
            pearpc="yes"
            ;;
            builtin-ppc|qemu-ppc|builtin-ppc64|qemu-ppc64)
            qemu="yes"
            ;;
            xbox-x86)
            xbox="yes"
            ;;
            builtin-sparc32)
            builtin="yes"
            qemu="yes"
            ;;
            builtin-sparc64)
            builtin="yes"
            qemu="yes"
            ;;
            unix-*)
            if [ "$ARCH" != "$HOSTARCH" ]; then
                # Can't cross compile Unix target
                continue
            fi
            unix="yes"
            ;;
            builtin-*)
            builtin="yes"
            ;;
            plain-*)
            plain="yes"
            ;;
        esac
    done

    case $ARCH in
        amd64)
        select_prefix x86_64
        CFLAGS="-fno-builtin"
        AS_FLAGS=
        ;;

        ppc)
        select_prefix powerpc powerpc64
        if [ "$unix" = "no" ]; then
            # 604 cpu includes support for PReP as well as Mac
            CFLAGS="-m32 -mcpu=604 -msoft-float -fno-builtin-bcopy -fno-builtin-log2"
            AS_FLAGS="-m32"
        else
            CFLAGS="-fno-builtin"
            AS_FLAGS=
        fi
        ;;

        ppc64)
        select_prefix powerpc64

        # 970 cpu is used in all 64-bit Macs but disable altivec
        CFLAGS="-mcpu=970 -mno-altivec -Wa,-a64 -m64 -msoft-float -fno-builtin"
        AS_FLAGS="-Wa,-a64"
        ;;

        sparc32)
        select_prefix sparc sparc64
        CFLAGS="-Wa,-xarch=v8 -Wa,-32 -m32 -mcpu=supersparc -fno-builtin"
        AS_FLAGS="-Wa,-xarch=v8 -Wa,-32"
        ;;

        sparc64)
        select_prefix sparc64
        CFLAGS="-Wa,-xarch=v9b -Wa,-64 -m64 -mcpu=ultrasparc -mcmodel=medany -fno-builtin"
        AS_FLAGS="-Wa,-xarch=v9b -Wa,-64"
        ;;

        x86)
        select_prefix i486
        CFLAGS="-fno-builtin -m32"
        AS_FLAGS="-Wa,-32"
        ;;
    esac
    if [ "$ARCH" != "$HOSTARCH" -o `uname -s` = "Darwin" ]; then
        cross="yes"
    fi
    crosscflags $HOSTARCH $ARCH
    OBJDIR=$BUILDDIR/obj-$ARCH
    ODIRS="$ODIRS $OBJDIR"

    printf "Initializing build tree $OBJDIR..."
    rm -rf "$OBJDIR"
    mkdir "$OBJDIR"
    mkdir -p $OBJDIR/target
    mkdir -p $OBJDIR/target/include
    mkdir -p $OBJDIR/target/arch
    mkdir -p $OBJDIR/target/arch/unix
    mkdir -p $OBJDIR/target/arch/$ARCH
    mkdir -p $OBJDIR/target/libgcc
    mkdir -p $OBJDIR/target/kernel
    mkdir -p $OBJDIR/target/libopenbios
    mkdir -p $OBJDIR/target/packages
    mkdir -p $OBJDIR/target/fs
    mkdir -p $OBJDIR/target/fs/grubfs
    mkdir -p $OBJDIR/target/fs/hfs
    mkdir -p $OBJDIR/target/fs/hfsplus
    mkdir -p $OBJDIR/target/fs/iso9660
    mkdir -p $OBJDIR/target/fs/ext2
    mkdir -p $OBJDIR/target/drivers
    mkdir -p $OBJDIR/target/libc
    mkdir -p $OBJDIR/host/include
    mkdir -p $OBJDIR/host/kernel
    mkdir -p $OBJDIR/forth
    ln -s  $SRCDIR/include/arch/$BASEARCH $OBJDIR/target/include/asm
    #compile the host binary with target settings instead
    #ln -s $SRCDIR/include/arch/$HOSTARCH $OBJDIR/host/include/asm
    if [ "$mol" = "yes" ]; then
        printf "\nUsing MOL path $MOLPATH...\n"
        mkdir -p $OBJDIR/target/arch/ppc/mol
        ln -s $MOLPATH/src/shared/osi_calls.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/shared/osi.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/shared/prom.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/include/boothelper_sh.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/include/video_sh.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/include/pseudofs_sh.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/include/kbd_sh.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/drivers/disk/include/scsi_sh.h $OBJDIR/target/include/
        ln -s $MOLPATH/src/drivers/disk/include/ablk_sh.h $OBJDIR/target/include/
    fi
    if [ "$briq" = "yes" ]; then
        mkdir -p $OBJDIR/target/arch/ppc/briq
    fi
    if [ "$pearpc" = "yes" ]; then
        mkdir -p $OBJDIR/target/arch/ppc/pearpc
    fi
    if [ "$qemu" = "yes" ]; then
        mkdir -p $OBJDIR/target/arch/ppc/qemu
    fi
    if [ "$xbox" = "yes" ]; then
        mkdir -p $OBJDIR/target/arch/x86/xbox
    fi
    echo "ok."

    ODIR=$OBJDIR

    printf "Creating target config.mak..."
    echo "ARCH=$ARCH" > $ODIR/config.mak
    if [ "$cross" = "yes" ]; then
        echo "TARGET=$TARGET" >> $ODIR/config.mak
    fi
    echo "CFLAGS=$CFLAGS" >> $ODIR/config.mak
    echo "AS_FLAGS=$AS_FLAGS" >> $ODIR/config.mak
    echo "HOSTARCH?=$HOSTARCH" >> $ODIR/config.mak
    echo "CROSSCFLAGS=$CROSSCFLAGS" >> $ODIR/config.mak
    echo "VERSION=\"$VERSION\"" >> $ODIR/config.mak
    echo "SRCDIR=$SRCDIR" >> $ODIR/config.mak
    echo "ok."

    printf "Creating target rules.mak..."
    ln -s $SRCDIR/config/xml/rules.xml $ODIR/rules.xml
    echo "<?xml version=\"1.0\"?><config>" > $ODIR/config.xml
    # Generic
    config_set_boolean CONFIG_$ARCH >> $ODIR/config.xml
    if [ "$BASEARCH" != "$ARCH" ]; then
        config_set_boolean CONFIG_$BASEARCH >> $ODIR/config.xml
    fi
    if [ "$mol" = "yes" ]; then
        config_set_boolean CONFIG_MOL >> $ODIR/config.xml
    fi
    if [ "$briq" = "yes" ]; then
        config_set_boolean CONFIG_BRIQ >> $ODIR/config.xml
    fi
    if [ "$pearpc" = "yes" ]; then
        config_set_boolean CONFIG_PEARPC >> $ODIR/config.xml
    fi
    if [ "$qemu" = "yes" ]; then
        config_set_boolean CONFIG_QEMU >> $ODIR/config.xml
    fi
    if [ "$xbox" = "yes" ]; then
        config_set_boolean CONFIG_XBOX >> $ODIR/config.xml
    fi
    if [ "$targetbigendian" = "yes" ]; then
        config_set_boolean CONFIG_BIG_ENDIAN >> $ODIR/config.xml
    else
        config_set_boolean CONFIG_LITTLE_ENDIAN >> $ODIR/config.xml
    fi
    # Kernel binaries
    if [ "$plain" = "yes" ]; then
        config_set_boolean CONFIG_IMAGE_ELF >> $ODIR/config.xml
    fi
    if [ "$builtin" = "yes" ]; then
        config_set_boolean CONFIG_IMAGE_ELF_EMBEDDED >> $ODIR/config.xml
    fi
    # Build hosted Unix binary?
    if [ "$unix" = "yes" ]; then
        config_set_boolean CONFIG_HOST_UNIX >> $ODIR/config.xml
        #config_set_boolean CONFIG_UNIX_QT >> $ODIR/config.xml
        #config_set_boolean CONFIG_PLUGINS >> $ODIR/config.xml
    fi
    cat $SRCDIR/config/examples/${ARCH}_config.xml >> $ODIR/config.xml

    cd $ODIR
    echo "</config>" >> $ODIR/config.xml
    ln -s $SRCDIR/Makefile.target $ODIR/Makefile
    xsltproc $SRCDIR/config/xml/xinclude.xsl $SRCDIR/build.xml > $ODIR/build-full.xml
    xsltproc $SRCDIR/config/xml/makefile.xsl $ODIR/build-full.xml > $ODIR/rules.mak
    echo "ok."
    printf "Creating config files..."
    xsltproc $SRCDIR/config/xml/config-c.xsl $ODIR/config.xml > $ODIR/host/include/autoconf.h
    xsltproc $SRCDIR/config/xml/config-c.xsl $ODIR/config.xml > $ODIR/target/include/autoconf.h
    xsltproc $SRCDIR/config/xml/config-forth.xsl $ODIR/config.xml > $ODIR/forth/config.fs
    echo "ok."

    cd $BUILDDIR
done

if [ "$SRCDIR" != "$BUILDDIR" ]; then
    ln -s $SRCDIR/Makefile $BUILDDIR
fi

echo "ODIRS=$ODIRS" >> $BUILDDIR/config-host.mak
echo "TARGETS=$arch_list" >> $BUILDDIR/config-host.mak
