#!/bin/sh
## This file is part of the libpayload project.
##
## 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 [ -z "${V}" ] && [ "${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

# include libpayload config
. $BASE/../libpayload.config

_LDSCRIPT="-Wl,-T,$_LIBDIR/libpayload.ldscript"

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)
		shift
		continue
		;;
	    -m64)
		error "Invalid option --64 - only 32 bit architectures are supported"
		;;
	    -c)
		DOLINK=0
		;;
	    -debug-wrapper)
		DEBUGME=1
		shift
		continue
		;;
	    -Wl,-T,*)
		_LDSCRIPT="$1"
		shift
		continue
		;;
	    *)
		;;
	esac

	CMDLINE="$CMDLINE $1"
	shift
done

if [ "$CONFIG_LP_ARCH_ARM" = "y" ]; then
  _ARCHINCDIR=$_INCDIR/arm
  _ARCHLIBDIR=$_LIBDIR/arm
  _ARCHEXTRA=""
fi

if [ "$CONFIG_LP_ARCH_X86" = "y" ]; then
  _ARCHINCDIR=$_INCDIR/x86
  _ARCHLIBDIR=$_LIBDIR/x86
  _ARCHEXTRA="-m32 "
fi

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

# Check for the -fno-stack-protector silliness

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

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

_LDFLAGS="-L$BASE/../lib $_LDSCRIPT -static"

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

    $DEFAULT_CC $_CFLAGS $CMDLINE
else
    _LIBGCC=`$DEFAULT_CC $_ARCHEXTRA -print-libgcc-file-name`
    if [ $DEBUGME -eq 1 ]; then
	echo "$DEFAULT_CC $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o $CMDLINE -lpayload $_LIBGCC"
    fi

    # Note: $_ARCHLIBDIR/head.o must be the first object being linked, because it
    # contains a Multiboot header.  The Multiboot standard requires this
    # header to be placed below 0x2000 in the resulting image.  See:
    # http://www.gnu.org/software/grub/manual/multiboot/html_node/OS-image-format.html

    $DEFAULT_CC $_CFLAGS $_LDFLAGS $_ARCHLIBDIR/head.o  $CMDLINE -lpayload $_LIBGCC
fi
