#!/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=mipsel-unknown-linux-gnu
target_noncanonical=mipsel-linux-gnu
version=4.8.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=/opt/toolchains/stbgcc-4.8-1.0
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
