#!/bin/sh
##
## Copyright (C) 2008 Advanced Micro Devices, Inc.
##
## Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions
## are met:
## 1. Redistributions of source code must retain the above copyright
##    notice, this list of conditions and the following disclaimer.
## 2. Redistributions in binary form must reproduce the above copyright
##    notice, this list of conditions and the following disclaimer in the
##    documentation and/or other materials provided with the distribution.
## 3. The name of the author may not be used to endorse or promote products
##    derived from this software without specific prior written permission.
##
## THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
## ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
## SUCH DAMAGE.

# GCC wrapper for libpayload
if [ "${V}" = "1" ]; then
	DEBUGME=1
else
	DEBUGME=0
fi

if [ $DEBUGME -eq 1 ]; then
	echo "CC = $CC"
fi

# let's not recurse.
# This is a hack, I know, but it makes sure that really simple user errors
# don't fork-bomb your machine.
if [ -n "$CC" ]; then
b=`basename "$CC"`
if [ "$b" = "lpgcc" ]; then
CC=""
fi
fi

if [ "$CC" != "" ]; then
DEFAULT_CC=$CC
else
DEFAULT_CC=gcc
fi

BASE=`dirname $0`

# This will set the _LIBDIR and _INCDIR variables used below
. $BASE/lp.functions

if [ $_LIBDIR != $_OBJ ]; then
	_DOTCONFIG=$BASE/../libpayload.config
	_XCOMPILE=$BASE/../libpayload.xcompile
else
	_DOTCONFIG=$_OBJ/libpayload.config
	_XCOMPILE=$_OBJ/xcompile
fi

# include libpayload config
if [ -f $_DOTCONFIG ]; then
	. $_DOTCONFIG
else
	echo "Can't find config"
	exit 1
fi

if [ "$CONFIG_LP_ARCH_ARM" = "y" ]; then
  _ARCHDIR=arm
  _ARCHEXTRA=""

fi
if [ "$CONFIG_LP_ARCH_ARM64" = "y" ]; then
  _ARCHDIR=arm64
  _ARCHEXTRA=""
fi
if [ "$CONFIG_LP_ARCH_X86" = "y" ]; then
  _ARCHDIR=x86
  if [ "$CONFIG_LP_ARCH_X86_32" = "y" ]; then
    _ARCHEXTRA="-m32 "
  else
    _ARCHEXTRA="-m64 "
  fi
fi
if [ "$CONFIG_LP_ARCH_MOCK" = "y" ]; then
  _ARCHDIR=mock
  _ARCHEXTRA=""
fi

_ARCHINCDIR=$_INCDIR/$_ARCHDIR
_ARCHLIBDIR=$_LIBDIR/$_ARCHDIR

if [ -f $_LIBDIR/libpayload.ldscript ]; then
	_LDDIR=$_LIBDIR
elif [ -f $BASE/../arch/$_ARCHDIR/libpayload.ldscript ]; then
	_LDDIR=$BASE/../arch/$_ARCHDIR
fi
# Host arch should youse default linker script
if [ "$CONFIG_LP_ARCH_MOCK" = "y" ]; then
  _LDSCRIPT=""
else
  _LDSCRIPT="-Wl,-T,$_LDDIR/libpayload.ldscript"
fi

trygccoption() {
	$DEFAULT_CC $1 -S -xc /dev/null -o /dev/null &> /dev/null
	return $?
}

DOLINK=1

# This variable will contain the command line that the user wants to
# pass to gas

CMDLINE=

# Process various flags that would change our behavior

while [ $# -gt 0 ]; do
	case $1 in
	    -m32|-fno-stack-protector|-m64)
		shift
		continue
		;;
	    -c)
		DOLINK=0
		;;
	    -debug-wrapper)
		DEBUGME=1
		shift
		continue
		;;
	    -Wl,-T,*)
		_LDSCRIPT="$1"
		shift
		continue
		;;
	    *)
		;;
	esac

	CMDLINE="$CMDLINE $1"
	shift
done

_CFLAGS="$_ARCHEXTRA -nostdinc -nostdlib -I$_INCDIR -I$_ARCHINCDIR -D__LIBPAYLOAD__=1"

if [ $_LIBDIR = $_OBJ ]; then
    _CFLAGS="$_CFLAGS -I$_OBJ"

    if [ "$CONFIG_LP_PDCURSES" = y ]; then
	_CFLAGS="$_CFLAGS -I$BASE/../curses/PDCurses -I$BASE/../curses/pdcurses-backend"
	_CFLAGS="$_CFLAGS -I$BASE/../curses/form -I$BASE/../curses/menu"
    fi

    if [ "$CONFIG_LP_TINYCURSES" = y ]; then
	_CFLAGS="$_CFLAGS -I$BASE/../curses"
    fi

    _CFLAGS="$_CFLAGS -include $BASE/../../../src/commonlib/bsd/include/commonlib/bsd/compiler.h"
    _CFLAGS="$_CFLAGS -I$BASE/../../../src/commonlib/bsd/include"
    if [ "$CONFIG_LP_GPL" = y ]; then
    _CFLAGS="$_CFLAGS -I$BASE/../../../src/commonlib/include"
    fi
    _CFLAGS="$_CFLAGS -I$BASE/../../../3rdparty/vboot/firmware/include"
else
    _CFLAGS="$_CFLAGS -include $BASE/../include/commonlib/bsd/compiler.h"
    _CFLAGS="$_CFLAGS -I$_VBOOTINCDIR"
fi

# Check for the -fno-stack-protector silliness

trygccoption -fno-stack-protector
[ $? -eq 0 ] && _CFLAGS="$_CFLAGS -fno-stack-protector"

_CFLAGS="$_CFLAGS -include $BASE/../include/kconfig.h"
_CFLAGS="$_CFLAGS -I`$DEFAULT_CC $_ARCHEXTRA -print-search-dirs | head -n 1 | cut -d' ' -f2`include"

if [ "$CONFIG_LP_VBOOT_LIB" = y ]; then
	if [ "$CONFIG_LP_VBOOT_TPM2_MODE" = y ]; then
		_CFLAGS="$_CFLAGS -DTPM2_MODE"
	else
		_CFLAGS="$_CFLAGS -DTPM1_MODE"
	fi
fi

_LDFLAGS="-L$_LIBDIR $_LDSCRIPT -static -Wl,--gc-sections"

if [ $DOLINK -eq 0 ]; then
    if [ $DEBUGME -eq 1 ]; then
	echo "$DEFAULT_CC $CMDLINE $_CFLAGS"
    fi

    $DEFAULT_CC $CMDLINE $_CFLAGS
else
    _LIBGCC=`$DEFAULT_CC $_ARCHEXTRA -print-libgcc-file-name`

    if [ "$CONFIG_LP_ARM64_A53_ERRATUM_843419" = y ] &&
       grep -q fix-cortex-a53-843419 $_XCOMPILE; then
            _LDFLAGS="$_LDFLAGS -Wl,--fix-cortex-a53-843419"
    fi

    _LDFLAGS="$_LDFLAGS -Wl,--defsym=CONFIG_LP_BASE_ADDRESS=$CONFIG_LP_BASE_ADDRESS"
    _LDFLAGS="$_LDFLAGS -Wl,--defsym=CONFIG_LP_HEAP_SIZE=$CONFIG_LP_HEAP_SIZE"
    _LDFLAGS="$_LDFLAGS -Wl,--defsym=CONFIG_LP_STACK_SIZE=$CONFIG_LP_STACK_SIZE"

    if [ $DEBUGME -eq 1 ]; then
	echo "$DEFAULT_CC $_LDFLAGS $CMDLINE $_CFLAGS -lpayload $_LIBGCC"
    fi

    $DEFAULT_CC $_LDFLAGS $CMDLINE $_CFLAGS -lpayload -xnone $_LIBGCC
fi
