#!/bin/sh

# Build script to build GDB with all targets enabled.

# Copyright (C) 2008 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
