#   Copyright (C) 1993-2016 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.

# Please email any bugs, comments, and/or additions to this file to:
# bug-dejagnu@prep.ai.mit.edu

# This file was written by Rob Savoye. (rob@cygnus.com)

load_lib utils-lib.exp

if ![info exists NM] then {
    set NM [findfile $base_dir/nm-new $base_dir/nm-new [transform nm]]
}
if ![info exists NMFLAGS] then {
    set NMFLAGS ""
}
if ![info exists SIZE] then {
    set SIZE [findfile $base_dir/size]
}
if ![info exists SIZEFLAGS] then {
    set SIZEFLAGS ""
}
if ![info exists OBJDUMP] then {
    set OBJDUMP [findfile $base_dir/objdump]
}
if ![info exists OBJDUMPFLAGS] then {
    set OBJDUMPFLAGS ""
}
if ![info exists OBJCOPY] then {
    set OBJCOPY [findfile $base_dir/objcopy]
}
if ![info exists OBJCOPYFLAGS] then {
    set OBJCOPYFLAGS ""
}
if ![info exists AR] then {
    set AR [findfile $base_dir/ar]
}
if ![info exists STRIP] then {
    set STRIP [findfile $base_dir/strip-new $base_dir/strip-new [transform strip]]
}
if ![info exists STRIPFLAGS] then {
    set STRIPFLAGS ""
}
if ![info exists READELF] then {
    set READELF [findfile $base_dir/readelf]
}
if ![info exists READELFFLAGS] then {
    set READELFFLAGS ""
}
if ![info exists ELFEDIT] then {
    set ELFEDIT [findfile $base_dir/elfedit]
}
if ![info exists ELFEDITFLAGS] then {
    set ELFEDITFLAGS ""
}
if ![info exists WINDRES] then {
    set WINDRES [findfile $base_dir/windres]
}
if ![info exists DLLTOOL] then {
    set DLLTOOL [findfile $base_dir/dlltool]
}

if ![file isdirectory tmpdir] {catch "exec mkdir tmpdir" status}

# Make a copy from tmpdir/gas/as and tmpdir/gas/ld to the assembler
# and linker in the build tree, so that we can use a -B option to gcc
# to force it to use the newly built assembler/linker.
if {![file isdirectory tmpdir/gas]} {catch "exec mkdir tmpdir/gas" status}

proc link_or_copy { src dst } {
    if ![catch "exec ln -sf ../../../$src tmpdir/gas/$dst" status] then {return 0}
    if ![catch "exec ln -f ../$src tmpdir/gas/$dst" status] then {return 0}
    catch "exec cp -fpu ../$src tmpdir/gas/$dst" status
}

if {[file isfile gas/as-new[exe_ext]]} then {
    link_or_copy gas/as-new[exe_ext] as[exe_ext]
} else {
    # For non-Windows hosts there may be an executable
    # without a .exe suffix, so try copying that instead.
    link_or_copy gas/as-new as[exe_ext]
}
# This may not be needed any more...
if {[file isfile ld/ld-new[exe_ext]]} then {
    link_or_copy ld/ld-new[exe_ext] ld[exe_ext]
} else {
    link_or_copy ld/ld-new ld[exe_ext]
}
if {[file isfile tmpdir/gas/as[exe_ext]]} then {
    set gcc_gas_flag "-B[pwd]/tmpdir/gas/"
    set dlltool_gas_flag "-S [pwd]/tmpdir/gas/as[exe_ext]"
} else {
    # Testing an installed toolchain.
    set gcc_gas_flag ""
    set dlltool_gas_flag ""
}

#
# binutils_run
#	run a program, returning the output
#	sets binutils_run_failed if the program does not exist
#
proc binutils_run { prog progargs } {
    default_binutils_run $prog $progargs
}

#
# binutils_assemble
#	assemble a file
#
proc binutils_assemble { source object } {
    default_binutils_assemble_flags $source $object ""
}

#
# binutils_assemble_flags
#	assemble a file
#
proc binutils_assemble_flags { source object asflags } {
    default_binutils_assemble_flags $source $object $asflags
}
