# Copyright 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 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
