# Copyright 2013-2021 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/>.

# This file is a dejagnu "board file" and is used to run the testsuite
# with contrib/cc-with-tweaks.sh.
#
# NOTE: If using dwz, We assume it is in $PATH.
#
# Example usage:
# bash$ cd $objdir/gdb
# bash$ make check \
#   RUNTESTFLAGS='--target_board=cc-with-tweaks' \
#   CC_WITH_TWEAKS_FLAGS='-z'
#
# Note: this does not work from $objdir with make check-gdb because
# CC_WITH_TWEAKS_FLAGS is not passed down from the top level Makefile.
#
# The default value of CC_WITH_TWEAKS_FLAGS is "".

if ![info exists CC_WITH_TWEAKS_FLAGS] {
    set CC_WITH_TWEAKS_FLAGS ""
}

# This is needed otherwise dejagnu tries to rsh to host "cc-with-tweaks".
load_board_description "local-board"

# This is based on baseboards/unix.exp.
# At the moment we only support systems that unix.exp supports.
load_generic_config "unix"
process_multilib_options ""
set found_gcc [find_gcc]
set found_gxx [find_g++]
set found_gnatmake [find_gnatmake]
set found_f90 [find_gfortran]
set found_f77 [find_g77]
set_board_info compiler "$found_gcc"

set contrib_dir [file normalize $srcdir/../contrib]
if ![info exists CC_FOR_TARGET] {
    set CC_FOR_TARGET "$found_gcc"
}
set CC_FOR_TARGET "$contrib_dir/cc-with-tweaks.sh $CC_WITH_TWEAKS_FLAGS $CC_FOR_TARGET"
if ![info exists CXX_FOR_TARGET] {
    set CXX_FOR_TARGET "$found_gxx"
}
set CXX_FOR_TARGET "$contrib_dir/cc-with-tweaks.sh $CC_WITH_TWEAKS_FLAGS $CXX_FOR_TARGET"
if ![info exists GNATMAKE_FOR_TARGET] {
    set GNATMAKE_FOR_TARGET "$found_gnatmake"
}
set GNATMAKE_FOR_TARGET "$contrib_dir/cc-with-tweaks.sh $CC_WITH_TWEAKS_FLAGS $GNATMAKE_FOR_TARGET"
if ![info exists F90_FOR_TARGET] {
    set F90_FOR_TARGET "$found_f90"
}
set F90_FOR_TARGET "$contrib_dir/cc-with-tweaks.sh $CC_WITH_TWEAKS_FLAGS $F90_FOR_TARGET"
if ![info exists F77_FOR_TARGET] {
    set F77_FOR_TARGET "$found_f77"
}
set F77_FOR_TARGET "$contrib_dir/cc-with-tweaks.sh $CC_WITH_TWEAKS_FLAGS $F77_FOR_TARGET"

set env(GDB) \
    [cached_file gdb.sh "$GDB $INTERNAL_GDBFLAGS $GDBFLAGS \"\$@\"" 1]
