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

# Make the boards under testsuite/boards automatically available to
# DejaGnu.  This is sourced by the `site.exp' file generated in the
# root of the testsuite's build directory.

# Append GDB's boards dir to DejaGnu's board dir list, making sure
# that that is the last boards dir in the list, so that boards found
# in directories appended to the list by either the global config
# site.exp, or in `$(dirname $DEJAGNU)/boards' override GDB's boards.
# Unfortunately, there's no standard way to get that behavior.  To
# make it happen, we trace all writes to the $boards_dirs global, and
# make sure our dir is always the last in the list.  This relies on
# the fact that DejaGnu always writes to this variable, even if just
# to set it to the empty list, which it does.
#
proc append_gdb_boards_dir { name1 name2 op } {
    global srcdir
    global boards_dir

    # In case someone wants to point at GDB's boards dir in the global
    # config before some other board dir, in which case we should not
    # push it to the end of the list, use an unlikely path to GDB's
    # boards, so it compares different to other simpler but equivalent
    # paths.
    set gdb_boards_dir "${srcdir}/boards/../boards"

    # Keep our board dir last in the list.
    set idx [lsearch -exact $boards_dir "$gdb_boards_dir"]
    if { $idx >= 0 } {
	set boards_dir [lreplace $boards_dir $idx $idx]
    }
    lappend boards_dir "${gdb_boards_dir}"
}
trace variable "boards_dir" w append_gdb_boards_dir
