#!/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" = "ppc64le" -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 x86_64
        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
