#!/bin/sh

# Build script to build GDB with all targets enabled.

# Copyright (C) 2008-2012 Free Software Foundation, Inc.
# This program 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 of the License, or
# (at your option) any later version.
#
# This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.

# Make certain that the script is not running in an internationalized
# environment. The script is grepping for GDB's output.

# Contributed by Markus Deuling <deuling@de.ibm.com>.
# Based on gdb_mbuild.sh from Richard Earnshaw.


LANG=c ; export LANG
LC_ALL=c ; export LC_ALL

# Prints a usage message.
usage()
{
  cat <<EOF
Usage: gdb_buildall.sh [ <options> ... ] <srcdir> <builddir>

Options:

  --bfd64        Enable 64-bit BFD.
  --clean        Delete build directory after check.
  -e <regexp>    Regular expression for selecting the targets to build.
  --force        Force rebuild.
  -j <makejobs>  Run <makejobs> in parallel.  Passed to make.
                 On a single cpu machine, 2 is recommended.
 Arguments:
   <srcdir>       Source code directory.
   <builddir>     Build directory.

 Environment variables examined (with default if not defined):
   MAKE (make)"
EOF
  exit 1
}

### Command line options.
makejobs=
force=false
targexp=""
bfd_flag=""
clean=false
while test $# -gt 0
do
  case "$1" in
  -j )
      # Number of parallel make jobs.
      shift
      test $# -ge 1 || usage
      makejobs="-j $1"
      ;;
      --clean )
        # Shall the build directory be deleted after processing?
        clean=true
        ;;
    -e )
      # A regular expression for selecting targets
      shift
      test $# -ge 1 || usage
      targexp="${targexp} -e ${1}"
      ;;
    --force )
      # Force a rebuild
      force=true ;
      ;;
    --bfd64)
      # Enable 64-bit BFD
      bfd_flag="--enable-64-bit-bfd"
      ;;
    -* ) usage ;;
    *) break ;;
  esac
  shift
done

if test $# -ne 2
then
  usage
fi

### Environment.

# Convert these to absolute directory paths.
srcdir=`cd $1 && /bin/pwd` || exit 1
builddir=`cd $2 && /bin/pwd` || exit 1
# Version of make to use
make=${MAKE:-make}
MAKE=${make}
export MAKE
# We dont want GDB do dump cores.
ulimit -c 0

# Just make sure we're in the right directory.
maintainers=${srcdir}/gdb/MAINTAINERS
if [ ! -r ${maintainers} ]
then
    echo Maintainers file ${maintainers} not found
    exit 1
fi


# Build GDB with all targets enabled.
echo "Starting gdb_buildall.sh ..."

trap "exit 1"  1 2 15
dir=${builddir}/ALL

# Should a scratch rebuild be forced, for perhaps the entire build be skipped?
if ${force}
then
  echo ... forcing rebuild
  rm -rf ${dir}
fi

# Did the previous configure attempt fail?  If it did restart from scratch
if test -d ${dir} -a ! -r ${dir}/Makefile
then
  echo ... removing partially configured 
  rm -rf ${dir}
  if test -d ${dir}
  then
    echo "... ERROR: Unable to remove directory ${dir}"
    exit 1
  fi
fi

# Create build directory.
mkdir -p ${dir}
cd ${dir} || exit 1

# Configure GDB.
if test ! -r Makefile
then
  # Default SIMOPTS to GDBOPTS.
  test -z "${simopts}" && simopts="${gdbopts}"

  # The config options.
  __build="--enable-targets=all"
  __enable_gdb_build_warnings=`test -z "${gdbopts}" \
    || echo "--enable-gdb-build-warnings=${gdbopts}"`
  __enable_sim_build_warnings=`test -z "${simopts}" \
    || echo "--enable-sim-build-warnings=${simopts}"`
  __configure="${srcdir}/configure \
    ${__build} ${bfd_flag}\
    ${__enable_gdb_build_warnings} \
    ${__enable_sim_build_warnings}"
  echo ... ${__configure}
  trap "echo Removing partially configured ${dir} directory ...; rm -rf ${dir}; exit 1" 1 2 15
  ${__configure} > Config.log 2>&1
  trap "exit 1"  1 2 15

  # Without Makefile GDB won't build.
  if test ! -r Makefile
  then
    echo "... CONFIG ERROR: GDB couldn't be configured " | tee -a Config.log
    echo "... CONFIG ERROR: see Config.log for details "
    exit 1
  fi
fi

# Build GDB, if not built.
gdb_bin="gdb/gdb"
if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
then
  echo ... ${make} ${makejobs}
  ( ${make} ${makejobs} all-gdb || rm -f gdb/gdb gdb/gdb.exe
  ) > Build.log 2>&1

  # If the build fails, exit.
  if test ! -x gdb/gdb -a ! -x gdb/gdb.exe
  then
    echo "... BUILD ERROR: GDB couldn't be compiled " | tee -a Build.log
    echo "... BUILD ERROR: see Build.log for details "
    exit 1
  fi
  if test -x gdb/gdb.exe
  then
    gdb_bin="gdb/gdb.exe"
  fi
fi


# Retrieve a list of settable architectures by invoking "set architecture"
# without parameters.
cat <<EOF > arch
set architecture
quit
EOF
./gdb/gdb --batch -nx -x arch 2>&1 | cat > gdb_archs
tail -n 1 gdb_archs | sed 's/auto./\n/g' | sed 's/,/\n/g' |  sed 's/Requires an argument. Valid arguments are/\n/g' | sed '/^[ ]*$/d' > arch
mv arch gdb_archs

if test "${targexp}" != ""
then
  alltarg=`cat gdb_archs | grep ${targexp}`
else 
  alltarg=`cat gdb_archs`
fi
rm -f gdb_archs

# Test all architectures available in ALLTARG
echo "maint print architecture for"
echo "$alltarg" | while read target
do
  cat <<EOF > x
set architecture ${target}
maint print architecture
quit
EOF
  log_file=$target.log
  log_file=${log_file//:/_}
  echo -n "... ${target}"
  ./gdb/gdb -batch -nx -x x 2>&1 | cat > $log_file
  # Check GDBs results
  if test ! -s $log_file
  then
    echo " ERR: gdb printed no output" | tee -a $log_file
  elif test `grep -o internal-error $log_file | tail -n 1`
  then
    echo " ERR: gdb panic" | tee -a $log_file
  else
    echo " OK"
  fi
  
  # Create a sed script that cleans up the output from GDB.
  rm -f mbuild.sed
  # Rules to replace <0xNNNN> with the corresponding function's name.
  sed -n -e '/<0x0*>/d' -e 's/^.*<0x\([0-9a-f]*\)>.*$/0x\1/p' $log_file \
  | sort -u \
  | while read addr
  do
    func="`addr2line -f -e ./$gdb_bin -s ${addr} | sed -n -e 1p`"
    echo "s/<${addr}>/<${func}>/g"
  done >> mbuild.sed
  # Rules to strip the leading paths off of file names.
  echo 's/"\/.*\/gdb\//"gdb\//g' >> mbuild.sed
  # Run the script.
  sed -f mbuild.sed $log_file > Mbuild.log

  mv Mbuild.log ${builddir}/$log_file
  rm -rf $log_file x mbuild.sed
done
echo "done."

# Clean up build directory if necessary.
if ${clean}
then
  echo "cleanning up $dir"
  rm -rf ${dir}
fi

exit 0
