#   Copyright 1993, 1994, 1995, 1997, 1999, 2001, 2002, 2004
#   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 2 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 util-defs.exp
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 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]} then {
    catch "exec mkdir tmpdir/gas" status
    if {[file isfile ../gas/as-new[exe_ext]]} then {
	catch "exec cp ../gas/as-new[exe_ext] tmpdir/gas/as[exe_ext]" status
    } else {
	# For non-Windows hosts there may be an executable
	# without a .exe suffix, so try copying that instead.
	catch "exec cp ../gas/as-new tmpdir/gas/as[exe_ext]" status
    }
    # This may not be needed any more...
    if {[file isfile ../ld/ld-new[exe_ext]]} then {
	catch "exec cp ../ld/ld-new[exe_ext] tmpdir/gas/ld[exe_ext]" status
    } else {
	catch "exec cp ../ld/ld-new tmpdir/gas/ld[exe_ext]" status
    }
}
set gcc_gas_flag "-B[pwd]/tmpdir/gas/"
set dlltool_gas_flag "-S [pwd]/tmpdir/gas/as[exe_ext]"

#
# 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 $source $object
}
