#!/bin/sh

# Copyright (C) 2002, 2007, 2009 Free Software Foundation, Inc.

#This file is part of GCC.

#GCC is free software; you can redistribute it and/or modify it under
#the terms of the GNU General Public License as published by the Free
#Software Foundation; either version 3, or (at your option) any later
#version.

#GCC is distributed in the hope that it will be useful, but WITHOUT
#ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
#FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
#for more details.

#You should have received a copy of the GNU General Public License
#along with GCC; see the file COPYING3.  If not see
#<http://www.gnu.org/licenses/>.

# Basic information
target=arm-marvell-linux-uclibcgnueabi
target_noncanonical=arm-marvell-linux-uclibcgnueabi
version=4.6.4

VERBOSE=0
while [ x$1 = x-v ] ; do
    shift
    VERBOSE=`expr $VERBOSE + 1`
done
export VERBOSE

if [ x$1 = x--help ] ; then
    echo "Usage: mkheaders [options] [prefix [isysroot]]"
    echo "Options:"
    echo "  -v        Print more output (may be repeated for even more output)"
    echo "  --help    This help"
    echo "  --version Print version information"
    exit 0
fi

if [ x$1 = x--version ] ; then
    echo "mkheaders (GCC) version $version"
    echo "Copyright 2002, 2007, 2009 Free Software Foundation, Inc."
    echo "This program is free software; you may redistribute it under the"
    echo "terms of the GNU General Public License.  This program has"
    echo "absolutely no warranty."
    exit 0
fi

# Common prefix for installation directories.
if [ x$1 != x ] ; then
  prefix=$1
  shift
else
  prefix=/home/gccbuilder-i386/work/mgcc4.6/Release/install/armv7-marvell-linux-uclibcgnueabi-softfp-4.6.4_i686
fi

# Allow for alternate isysroot in which to find headers
if [ x$1 != x ] ; then
  isysroot=$1
  shift
else
  isysroot=
fi

# Directory in which to put host dependent programs and libraries
exec_prefix=${prefix}
# Directory in which to put the directories used by the compiler.
libdir=${exec_prefix}/lib
libexecdir=${exec_prefix}/libexec
# Directory in which the compiler finds libraries, etc.
libsubdir=${libdir}/gcc/${target_noncanonical}/${version}
# Directory in which the compiler finds executables
libexecsubdir=${libexecdir}/gcc/${target_noncanonical}/${version}

itoolsdir=${libexecsubdir}/install-tools
itoolsdatadir=${libsubdir}/install-tools
incdir=${libsubdir}/include-fixed
mkinstalldirs="/bin/bash ${itoolsdir}/mkinstalldirs"

cd ${itoolsdir}
rm -rf ${incdir}/*

for ml in `cat ${itoolsdatadir}/fixinc_list`; do
  sysroot_headers_suffix=`echo ${ml} | sed -e 's/;.*$//'`
  multi_dir=`echo ${ml} | sed -e 's/^[^;]*;//'`
  subincdir=${incdir}${multi_dir}
  . ${itoolsdatadir}/mkheaders.conf
  if [ x${STMP_FIXINC} != x ] ; then
	TARGET_MACHINE="${target}" target_canonical="${target}" \
	    MACRO_LIST="${itoolsdatadir}/macro_list" \
	    /bin/bash ./fixinc.sh ${subincdir} \
	    ${isysroot}${SYSTEM_HEADER_DIR} ${OTHER_FIXINCLUDES_DIRS}
	rm -f ${subincdir}/syslimits.h
	if [ -f ${subincdir}/limits.h ]; then
	  mv ${subincdir}/limits.h ${subincdir}/syslimits.h
	else
	  cp ${itoolsdatadir}/gsyslimits.h ${subincdir}/syslimits.h
	fi
  fi

  cp ${itoolsdatadir}/include${multi_dir}/limits.h ${subincdir}
done
