Blame lib/libgloss.exp

Packit 62fe53
# Copyright (C) 1992-2016 Free Software Foundation, Inc.
Packit 62fe53
#
Packit 62fe53
# This file is part of DejaGnu.
Packit 62fe53
#
Packit 62fe53
# DejaGnu is free software; you can redistribute it and/or modify it
Packit 62fe53
# under the terms of the GNU General Public License as published by
Packit 62fe53
# the Free Software Foundation; either version 3 of the License, or
Packit 62fe53
# (at your option) any later version.
Packit 62fe53
#
Packit 62fe53
# DejaGnu is distributed in the hope that it will be useful, but
Packit 62fe53
# WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 62fe53
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 62fe53
# General Public License for more details.
Packit 62fe53
#
Packit 62fe53
# You should have received a copy of the GNU General Public License
Packit 62fe53
# along with DejaGnu; if not, write to the Free Software Foundation,
Packit 62fe53
# Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
Packit 62fe53
Packit 62fe53
# This file was written by Rob Savoye <rob@welcomehome.org>.
Packit 62fe53
Packit 62fe53
# this contains a list of gcc options and their respective directories.
Packit 62fe53
Packit 62fe53
# Find the pieces of libgloss for testing the GNU development tools
Packit 62fe53
# needed to link a set of object files into an executable.
Packit 62fe53
# This usually means setting the -L and -B paths correctly.
Packit 62fe53
#
Packit 62fe53
proc libgloss_link_flags { args } {
Packit 62fe53
    global target_cpu
Packit 62fe53
    global srcdir
Packit 62fe53
Packit 62fe53
    # libgloss doesn't work native
Packit 62fe53
    if {[isnative]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # if we're on a remote host, we can't search for the file, so we can only
Packit 62fe53
    # use an installed compiler, so we don't add any paths here.
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    # map the target_cpu to the proper libgloss directory. unfortunately, these
Packit 62fe53
    # directory names are hardcoded into libgloss.
Packit 62fe53
    switch -glob -- $target_cpu {
Packit 62fe53
	"sparc86x" {
Packit 62fe53
	    set cpu sparc
Packit 62fe53
	}
Packit 62fe53
	"sparclite" {
Packit 62fe53
	    set cpu sparc
Packit 62fe53
	}
Packit 62fe53
	"sparclet" {
Packit 62fe53
	    set cpu sparc
Packit 62fe53
	}
Packit 62fe53
	"sparc64*" {
Packit 62fe53
	    set cpu sparc
Packit 62fe53
	}
Packit 62fe53
	"hppa*" {
Packit 62fe53
	    set cpu pa
Packit 62fe53
	}
Packit 62fe53
	"mips*" {
Packit 62fe53
	    set cpu mips
Packit 62fe53
	}
Packit 62fe53
	"powerpc*" {
Packit 62fe53
	    set cpu rs6000
Packit 62fe53
	}
Packit 62fe53
	"d10v*" {
Packit 62fe53
	    set cpu libnosys
Packit 62fe53
	}
Packit 62fe53
	"xscale*" {
Packit 62fe53
	    set cpu arm
Packit 62fe53
	}
Packit 62fe53
	"aarch64*" {
Packit 62fe53
	    set cpu aarch64
Packit 62fe53
	}
Packit 62fe53
	default {
Packit 62fe53
	    set cpu $target_cpu
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gloss_srcdir ""
Packit 62fe53
    # look for the libgloss srcdir sp we can find the linker scripts
Packit 62fe53
    set gloss_srcdir [lookfor_file ${srcdir} libgloss/$cpu]
Packit 62fe53
Packit 62fe53
    # set the proper paths for gcc if the target subdir exists, else assume we
Packit 62fe53
    # have no libgloss support for this target.
Packit 62fe53
    if { $gloss_srcdir == "" } {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
    if {[file exists [file join $gccpath libgloss $cpu]]} {
Packit 62fe53
	verbose "Libgloss path is $gccpath/libgloss/$cpu" 2
Packit 62fe53
	return "-B$gccpath/libgloss/$cpu/ -L$gccpath/libgloss/$cpu -L$gloss_srcdir"
Packit 62fe53
    } else {
Packit 62fe53
	verbose -log "No libgloss support for this target." 2
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# There aren't any, but we'll be orthogonal here.
Packit 62fe53
#
Packit 62fe53
proc libgloss_include_flags { args } {
Packit 62fe53
    return ""
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Find the newlib libraries in the current source tree.
Packit 62fe53
#
Packit 62fe53
proc newlib_link_flags { args } {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    # libgloss doesn't work native
Packit 62fe53
    if {[isnative]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # if we're on a remote host, we can't search for the file, so we can only
Packit 62fe53
    # use an installed compiler, so we don't add any paths here.
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set ld_script_path [lookfor_file ${tool_root_dir} "ld/ldscripts"]
Packit 62fe53
    if { $ld_script_path != "" } {
Packit 62fe53
	set result "-L[file dirname $ld_script_path]"
Packit 62fe53
    } else {
Packit 62fe53
	set result ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    verbose "Looking for $gccpath/newlib"
Packit 62fe53
    if {[file exists [file join $gccpath newlib]]} {
Packit 62fe53
	verbose "Newlib path is $gccpath/newlib"
Packit 62fe53
	return "$result -B$gccpath/newlib/ -L$gccpath/newlib"
Packit 62fe53
    } else {
Packit 62fe53
	verbose "No newlib support for this target"
Packit 62fe53
	return "$result"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc newlib_include_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
Packit 62fe53
    if {[isnative]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    if {[file exists [file join $gccpath newlib]]} {
Packit 62fe53
	verbose "Newlib path is $gccpath/newlib"
Packit 62fe53
Packit 62fe53
	set newlib_dir [lookfor_file ${srcdir} newlib/libc/include/assert.h]
Packit 62fe53
	if { ${newlib_dir} != "" } {
Packit 62fe53
	    set newlib_dir [file dirname ${newlib_dir}]
Packit 62fe53
	}
Packit 62fe53
	# Note - we use -isystem rather than -I because newlib contains
Packit 62fe53
	# system header files.  This is especially important for the
Packit 62fe53
	# limits.h header which makes use of the #include_next directive.
Packit 62fe53
	# #include_next will generate error messages from GCC if compiling
Packit 62fe53
	# in strict ANSI mode or if another limits.h header cannot be found.
Packit 62fe53
	# When it is included via -isystem these things do not happen.
Packit 62fe53
	return " -isystem $gccpath/newlib/targ-include -isystem ${newlib_dir}"
Packit 62fe53
    } else {
Packit 62fe53
	verbose "No newlib support for this target"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc libio_include_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    if { $gccpath == "" } {
Packit 62fe53
	set gccpath "$tool_root_dir"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set libio_bin_dir [lookfor_file ${gccpath} libio/_G_config.h]
Packit 62fe53
Packit 62fe53
    # linux doesn't build _G_config.h and the test above fails, so
Packit 62fe53
    # we search for iostream.list too.
Packit 62fe53
    if { $libio_bin_dir == "" } {
Packit 62fe53
	set libio_bin_dir [lookfor_file ${gccpath} libio/iostream.list]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set libio_src_dir [lookfor_file ${srcdir} libio/Makefile.in]
Packit 62fe53
    if { $libio_bin_dir != "" && $libio_src_dir != "" } {
Packit 62fe53
	set libio_src_dir [file dirname ${libio_src_dir}]
Packit 62fe53
	set libio_bin_dir [file dirname ${libio_bin_dir}]
Packit 62fe53
	# Note - unlike the newlib_include_flags proc above we use the -I
Packit 62fe53
	# switch to specify the include paths.  This is because these headers
Packit 62fe53
	# are not system headers, and if -isystem were to be used GCC would
Packit 62fe53
	# generate an implicit extern "C" { ... } surrounding them.  This
Packit 62fe53
	# will break targets which do not define NO_IMPLICIT_EXTERN_C.
Packit 62fe53
	return " -I${libio_src_dir} -I${libio_bin_dir}"
Packit 62fe53
    } else {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc libio_link_flags { args } {
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    set libio_dir [lookfor_file ${gccpath} libio/libio.a]
Packit 62fe53
    if { $libio_dir != "" } {
Packit 62fe53
	return "-L[file dirname ${libio_dir}]"
Packit 62fe53
    } else {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc g++_include_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global target_alias
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath [get_multilibs]
Packit 62fe53
    set libio_dir ""
Packit 62fe53
    set flags ""
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${srcdir} libg++]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	# See comment in libio_include_flags about using -I.
Packit 62fe53
	append flags " -I${dir} -I${dir}/src"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${srcdir} libstdc++-v3]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	append flags " -I${dir}/include -I${dir}/include/std -I${dir}/include/c_std -I${dir}/libsupc++"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${gccpath} libstdc++-v3]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	append flags " -I${dir}/include -I${dir}/include/${target_alias}"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${srcdir} libstdc++]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	append flags " -I${dir} -I${dir}/stl"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    return "$flags"
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc g++_link_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global ld_library_path
Packit 62fe53
Packit 62fe53
    set gccpath [get_multilibs]
Packit 62fe53
    set libio_dir ""
Packit 62fe53
    set flags ""
Packit 62fe53
    set ld_library_path "."
Packit 62fe53
Packit 62fe53
    if { $gccpath != "" } {
Packit 62fe53
	if {[file exists [file join ${gccpath} lib libstdc++.a]]} {
Packit 62fe53
	    append ld_library_path ":${gccpath}/lib"
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} libg++ libg++.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/libg++ "
Packit 62fe53
	    append ld_library_path ":${gccpath}/libg++"
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} libstdc++ libstdc++.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/libstdc++ "
Packit 62fe53
	    append ld_library_path ":${gccpath}/libstdc++"
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} libstdc++-v3 src .libs libstdc++.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/libstdc++-v3/src/.libs "
Packit 62fe53
	    append ld_library_path ":${gccpath}/libstdc++-v3/src/.libs"
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} libiberty libiberty.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/libiberty "
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} librx librx.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/librx "
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	global tool_root_dir
Packit 62fe53
Packit 62fe53
	set libgpp [lookfor_file ${tool_root_dir} libg++]
Packit 62fe53
	if { $libgpp != "" } {
Packit 62fe53
	    append flags "-L${libgpp} "
Packit 62fe53
	    append ld_library_path ":${libgpp}"
Packit 62fe53
	}
Packit 62fe53
	set libstdcpp [lookfor_file ${tool_root_dir} libstdc++]
Packit 62fe53
	if { $libstdcpp != "" } {
Packit 62fe53
	    append flags "-L${libstdcpp} "
Packit 62fe53
	    append ld_library_path ":${libstdcpp}"
Packit 62fe53
	}
Packit 62fe53
	set libiberty [lookfor_file ${tool_root_dir} libiberty]
Packit 62fe53
	if { $libiberty != "" } {
Packit 62fe53
	    append flags "-L${libiberty} "
Packit 62fe53
	}
Packit 62fe53
	set librx [lookfor_file ${tool_root_dir} librx]
Packit 62fe53
	if { $librx != "" } {
Packit 62fe53
	    append flags "-L${librx} "
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return "$flags"
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc libstdc++_include_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global target_alias
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath [get_multilibs]
Packit 62fe53
    set libio_dir ""
Packit 62fe53
    set flags ""
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${srcdir} libstdc++-v3]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	# See comment in libio_include_flags about using -I.
Packit 62fe53
	append flags " -I${dir}/include -I${dir}/include/std -I${dir}/include/c_std -I${dir}/libsupc++"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath [get_multilibs]
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${gccpath} libstdc++-v3]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	append flags " -I${dir}/include -I${dir}/include/${target_alias}"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set dir [lookfor_file ${srcdir} libstdc++]
Packit 62fe53
    if { ${dir} != "" } {
Packit 62fe53
	append flags " -I${dir} -I${dir}/stl"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    return "$flags"
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc libstdc++_link_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global ld_library_path
Packit 62fe53
Packit 62fe53
    set gccpath [get_multilibs]
Packit 62fe53
    set libio_dir ""
Packit 62fe53
    set flags ""
Packit 62fe53
Packit 62fe53
    if { $gccpath != "" } {
Packit 62fe53
	if {[file exists [file join ${gccpath} libstdc++ libstdc++.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/libstdc++ "
Packit 62fe53
	    append ld_library_path ":${gccpath}/libstdc++"
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} libiberty libiberty.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/libiberty "
Packit 62fe53
	}
Packit 62fe53
	if {[file exists [file join ${gccpath} librx librx.a]]} {
Packit 62fe53
	    append flags "-L${gccpath}/librx "
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	global tool_root_dir
Packit 62fe53
Packit 62fe53
	set libstdcpp [lookfor_file ${tool_root_dir} libstdc++]
Packit 62fe53
	if { $libstdcpp != "" } {
Packit 62fe53
	    append flags "-L${libstdcpp} "
Packit 62fe53
	    append ld_library_path ":${libstdcpp}"
Packit 62fe53
	}
Packit 62fe53
	set libiberty [lookfor_file ${tool_root_dir} libiberty]
Packit 62fe53
	if { $libiberty != "" } {
Packit 62fe53
	    append flags "-L${libiberty} "
Packit 62fe53
	}
Packit 62fe53
	set librx [lookfor_file ${tool_root_dir} librx]
Packit 62fe53
	if { $librx != "" } {
Packit 62fe53
	    append flags "-L${librx} "
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return "$flags"
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Get the list of directories and -m options for gcc. This is kinda bogus that
Packit 62fe53
# generic testing software needs support for gcc hardwired in, but to make
Packit 62fe53
# testing the GNU tools work right, there didn't seem to be any other way.
Packit 62fe53
#
Packit 62fe53
proc get_multilibs { args } {
Packit 62fe53
    global target_alias
Packit 62fe53
    global board
Packit 62fe53
    global board_info
Packit 62fe53
Packit 62fe53
    # if we're on a remote host, we can't search for the file, so we can only
Packit 62fe53
    # use an installed compiler, so we don't add any paths here.
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists board]} {
Packit 62fe53
	set target_board $board
Packit 62fe53
    } else {
Packit 62fe53
	set target_board [target_info name]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { [llength $args] == 0 } {
Packit 62fe53
	if {[board_info $target_board exists multitop]} {
Packit 62fe53
	    return "[board_info $target_board multitop]"
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	set board_info($target_board,multitop) ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { [board_info $target_board exists compiler] } {
Packit 62fe53
	set compiler [board_info $target_board compiler]
Packit 62fe53
    } else {
Packit 62fe53
	set compiler [find_gcc]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { $compiler == "" } {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    foreach x "$compiler" {
Packit 62fe53
	if {[regexp "^-B" "$x"]} {
Packit 62fe53
	    regsub "^-B" "$x" "" comp_base_dir
Packit 62fe53
	    set comp_base_dir [file dirname $comp_base_dir]
Packit 62fe53
	    break
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    regexp "/.* " $compiler compiler
Packit 62fe53
    set compiler [string trimright $compiler " "]
Packit 62fe53
    verbose "compiler is $compiler"
Packit 62fe53
Packit 62fe53
    if { [which $compiler] == 0 } {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { [llength $args] > 0 } {
Packit 62fe53
	set mopts [lindex $args 0]
Packit 62fe53
    } else {
Packit 62fe53
	if { [board_info $target_board exists multilib_flags] } {
Packit 62fe53
	    set mopts [board_info $target_board multilib_flags]
Packit 62fe53
	} else {
Packit 62fe53
	    set mopts ""
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set default_multilib [exec $compiler --print-multi-lib]
Packit 62fe53
    set default_multilib [lindex $default_multilib 0]
Packit 62fe53
    set extra [string trimleft $default_multilib ".;@@"]
Packit 62fe53
Packit 62fe53
    # extract the options and their directory names as know by gcc
Packit 62fe53
    foreach i "[exec $compiler --print-multi-lib]" {
Packit 62fe53
	if {$extra != ""} {
Packit 62fe53
	    # string trimright would do the wrong thing if we included
Packit 62fe53
	    # the leading @@ in $extra
Packit 62fe53
	    set i [string trimright $i $extra]
Packit 62fe53
	    set i [string trimright $i "@@"]
Packit 62fe53
	}
Packit 62fe53
	set opts ""
Packit 62fe53
	set dir ""
Packit 62fe53
	regexp -- "\[a-z0-9=/\.-\]*;" $i dir
Packit 62fe53
	set dir [string trimright $dir "\;@"]
Packit 62fe53
	regexp -- "\;@*\[\@a-zA-Z0-9=/\.-\]*" $i opts
Packit 62fe53
	set opts [split [string trimleft $opts "\;@@"] "@@"]
Packit 62fe53
	lappend multilibs "$dir {$opts }"
Packit 62fe53
Packit 62fe53
	# If args contains arguments don't use the first one as
Packit 62fe53
	# multilib option unless it qualifies as a multilib option.
Packit 62fe53
	if { [llength $args] > 0 } {
Packit 62fe53
	    set override_opt [lindex $args 0]
Packit 62fe53
	    foreach j $opts {
Packit 62fe53
		if {$j == $override_opt} {
Packit 62fe53
		    set mopts $override_opt
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    regsub "^-" $mopts "" moptions
Packit 62fe53
    regsub -all " -" $moptions " " dirty_moptions
Packit 62fe53
    set moptions ""
Packit 62fe53
    foreach x [split $dirty_moptions " "] {
Packit 62fe53
	if { $x != "" && [lsearch -exact $moptions $x] < 0 } {
Packit 62fe53
	    lappend moptions $x
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {![info exists comp_base_dir]} {
Packit 62fe53
	set comp_base_dir [file dirname [file dirname [file dirname [file dirname [file dirname [exec $compiler --print-prog-name=cc1]]]]]]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # search for the top level multilib directory
Packit 62fe53
    set multitop [lookfor_file "${comp_base_dir}" "${target_alias}"]
Packit 62fe53
    if { $multitop == "" } {
Packit 62fe53
	set multitop [lookfor_file "${comp_base_dir}" "libraries"]
Packit 62fe53
	if { $multitop == "" } {
Packit 62fe53
	    set multitop "[lookfor_file ${comp_base_dir} gcc/xgcc]"
Packit 62fe53
	    if { $multitop != "" } {
Packit 62fe53
		set multitop [file dirname [file dirname $multitop]]
Packit 62fe53
	    } else {
Packit 62fe53
		return ""
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath [eval exec "$compiler" --print-multi-directory $mopts]
Packit 62fe53
    set gccpath [lindex $gccpath 0]
Packit 62fe53
    if { $gccpath != "" } {
Packit 62fe53
	verbose "GCC path is $gccpath"
Packit 62fe53
	if { [llength $args] == 0 } {
Packit 62fe53
	    set board_info($target_board,multitop) "$multitop/$gccpath"
Packit 62fe53
	}
Packit 62fe53
	return "$multitop/$gccpath"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # extract the MULTILIB_MATCHES from dumpspecs
Packit 62fe53
    set multimatches ""
Packit 62fe53
    set lines [split [exec $compiler -dumpspecs] "\n"]
Packit 62fe53
    for {set i 0} {$i <= [llength $lines] - 1} {incr i 1} {
Packit 62fe53
	if {"*multilib_matches:" == "[lindex $lines $i]"} {
Packit 62fe53
	    set multimatches [lindex $lines [expr {$i + 1}]]
Packit 62fe53
	    break
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    # if we find some
Packit 62fe53
    if {$multimatches != ""} {
Packit 62fe53
	# Split it into a list of pairs. If an moptions are the first
Packit 62fe53
	# of a pair, then replace it with the second.  If an moption
Packit 62fe53
	# is not in multimatches, we assume it's not a multilib option
Packit 62fe53
Packit 62fe53
	set splitmatches [split $multimatches ";"]
Packit 62fe53
	set multimatches ""
Packit 62fe53
	foreach i $splitmatches {
Packit 62fe53
	    lappend multimatches [split $i " "]
Packit 62fe53
	}
Packit 62fe53
	verbose "multimatches: $multimatches" 3
Packit 62fe53
Packit 62fe53
	verbose "options before multimatches: $moptions" 3
Packit 62fe53
	set toptions $moptions
Packit 62fe53
	set moptions ""
Packit 62fe53
	foreach i $toptions {
Packit 62fe53
	    foreach j $multimatches {
Packit 62fe53
		verbose "comparing [lindex $j 0] == $i" 3
Packit 62fe53
		if {[lindex $j 0] == $i} {
Packit 62fe53
		    lappend moptions [lindex $j 1]
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	verbose "options after multimatches: $moptions" 3
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # make a list of -m<foo> options from the various compiler config variables
Packit 62fe53
    set gccpath ""
Packit 62fe53
Packit 62fe53
    # compare the lists of gcc options with the list of support multilibs
Packit 62fe53
    verbose "Supported multilibs are: $multilibs" 3
Packit 62fe53
    set best 0
Packit 62fe53
    foreach i "$multilibs" {
Packit 62fe53
	set hits 0
Packit 62fe53
	set opts [lindex $i 1]
Packit 62fe53
	if { [llength $opts] <= [llength $moptions] } {
Packit 62fe53
	    foreach j "$moptions" {
Packit 62fe53
		# see if all the -m<foo> options match any of the multilibs
Packit 62fe53
		verbose "Looking in $i for $j" 3
Packit 62fe53
		if { [lsearch -exact $opts $j] >= 0 } {
Packit 62fe53
		    incr hits
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
Packit 62fe53
	    if { $hits > $best } {
Packit 62fe53
		verbose "[lindex $i 0] is better, using as gcc path" 2
Packit 62fe53
		set gccpath "[lindex $i 0]"
Packit 62fe53
		set best $hits
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    if {![info exists multitop]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    verbose "gccpath is $gccpath" 3
Packit 62fe53
Packit 62fe53
    if {[file exists [file join $multitop $gccpath]]} {
Packit 62fe53
	verbose "GCC path is $multitop/$gccpath" 3
Packit 62fe53
	if { [llength $args] == 0 } {
Packit 62fe53
	    set board_info($target_board,multitop) "$multitop/$gccpath"
Packit 62fe53
	}
Packit 62fe53
	return "$multitop/$gccpath"
Packit 62fe53
    } else {
Packit 62fe53
	verbose "GCC path is $multitop" 3
Packit 62fe53
	if { [llength $args] == 0 } {
Packit 62fe53
	    set board_info($target_board,multitop) "$multitop"
Packit 62fe53
	}
Packit 62fe53
	return "$multitop"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_binutils_prog { name } {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
Packit 62fe53
	set file [lookfor_file $tool_root_dir $name]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir ${name}-new]
Packit 62fe53
	}
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir binutils/$name]
Packit 62fe53
	}
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir binutils/${name}-new]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set NAME "$file"
Packit 62fe53
	} else {
Packit 62fe53
	    set NAME [transform $name]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set NAME [transform $name]
Packit 62fe53
    }
Packit 62fe53
    return $NAME
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_gcc {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir xgcc]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/xgcc]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set CC "$file -B[file dirname $file]/"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform gcc]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform gcc]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_gcj {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir gcj]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/gcj]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set CC "$file -B[file dirname $file]/"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform gcj]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform gcj]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_g++ {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir xg++]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/xg++]
Packit 62fe53
	}
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir g++]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set CC "$file -B[file dirname $file]/"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform g++]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform g++]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_gdc {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir gdc]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/gdc]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set CC "$file -B[file dirname $file]/"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform gdc]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform gdc]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_g77 {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir g77]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/g77]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set CC "$file -B[file dirname $file]/"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform g77]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform g77]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_gfortran {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir gfortran]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/gfortran]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set CC "$file -B[file dirname $file]/"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform gfortran]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform gfortran]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_gnatmake {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set file [lookfor_file $tool_root_dir gnatmake]
Packit 62fe53
	if { $file == "" } {
Packit 62fe53
	    set file [lookfor_file $tool_root_dir gcc/gnatmake]
Packit 62fe53
	}
Packit 62fe53
	if { $file != "" } {
Packit 62fe53
	    set root [file dirname $file]
Packit 62fe53
	    set CC "$file -I$root/ada/rts --GCC=$root/xgcc --GNATBIND=$root/gnatbind --GNATLINK=$root/gnatlink -cargs -B$root -largs --GCC=$root/xgcc -B$root -margs"
Packit 62fe53
	} else {
Packit 62fe53
	    set CC [transform gnatmake]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set CC [transform gnatmake]
Packit 62fe53
    }
Packit 62fe53
    return $CC
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_nm {} {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    set NM ""
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set NM [lookfor_file $tool_root_dir nm-new]
Packit 62fe53
	if {$NM == ""} {
Packit 62fe53
	    set NM [lookfor_file $tool_root_dir binutils/nm-new]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    if { $NM == ""} {
Packit 62fe53
	set NM [transform nm]
Packit 62fe53
    }
Packit 62fe53
    return $NM
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc process_multilib_options { args } {
Packit 62fe53
    global board
Packit 62fe53
    global board_variant_list
Packit 62fe53
    global is_gdb_remote
Packit 62fe53
Packit 62fe53
    set is_gdb_remote 0
Packit 62fe53
Packit 62fe53
    if {[board_info $board exists multilib_flags]} {
Packit 62fe53
	return
Packit 62fe53
    }
Packit 62fe53
    eval add_multilib_option $args
Packit 62fe53
Packit 62fe53
    set multilib_flags ""
Packit 62fe53
Packit 62fe53
    foreach x $board_variant_list {
Packit 62fe53
	regsub -all "^\[ \t\]*" "$x" "" x
Packit 62fe53
	regsub -all "\[ \t\]*$" "$x" "" x
Packit 62fe53
Packit 62fe53
	if { $x == "" } {
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
	switch -glob -- $x {
Packit 62fe53
	    "aout" {
Packit 62fe53
		set_board_info obj_format "a.out"
Packit 62fe53
	    }
Packit 62fe53
	    "elf" {
Packit 62fe53
		set_board_info obj_format "elf"
Packit 62fe53
	    }
Packit 62fe53
	    "pe" {
Packit 62fe53
		set_board_info obj_format "pe"
Packit 62fe53
	    }
Packit 62fe53
	    "ecoff" {
Packit 62fe53
		set_board_info obj_format "ecoff"
Packit 62fe53
	    }
Packit 62fe53
	    "stabs" {
Packit 62fe53
		set_board_info debug_flags "-gstabs"
Packit 62fe53
	    }
Packit 62fe53
	    "dwarf2" {
Packit 62fe53
		set_board_info debug_flags "-gdwarf2"
Packit 62fe53
	    }
Packit 62fe53
	    "gdb:*=*" {
Packit 62fe53
		regsub "^gdb:\[^=\]*=(.*)$" "$x" "\\1" value
Packit 62fe53
		regsub "^gdb:(\[^=\]*)=.*$" "$x" "\\1" variable
Packit 62fe53
		set_board_info $variable "$value"
Packit 62fe53
	    }
Packit 62fe53
	    "gdb*remote" {
Packit 62fe53
		set is_gdb_remote 1
Packit 62fe53
	    }
Packit 62fe53
	    "little*endian" -
Packit 62fe53
	    "el" -
Packit 62fe53
	    "EL" {
Packit 62fe53
		append multilib_flags " -EL"
Packit 62fe53
	    }
Packit 62fe53
	    "big*endian" -
Packit 62fe53
	    "eb" -
Packit 62fe53
	    "EB" {
Packit 62fe53
		append multilib_flags " -EB"
Packit 62fe53
	    }
Packit 62fe53
	    "soft*float" {
Packit 62fe53
		append multilib_flags " -msoft-float"
Packit 62fe53
	    }
Packit 62fe53
	    "-*" {
Packit 62fe53
		append multilib_flags " $x"
Packit 62fe53
	    }
Packit 62fe53
	    default {
Packit 62fe53
		append multilib_flags " -m$x"
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    set_board_info multilib_flags $multilib_flags
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc add_multilib_option { args } {
Packit 62fe53
    global board_variant_list
Packit 62fe53
Packit 62fe53
    if {![info exists board_variant_list]} {
Packit 62fe53
	set board_variant_list ""
Packit 62fe53
    }
Packit 62fe53
    set board_variant_list [concat $args $board_variant_list]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_gas { } {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    set AS ""
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set AS [lookfor_file $tool_root_dir as-new]
Packit 62fe53
	if { $AS == "" } {
Packit 62fe53
	    set AS [lookfor_file $tool_root_dir gas/as-new]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    if { $AS == "" } {
Packit 62fe53
	set AS [transform as]
Packit 62fe53
    }
Packit 62fe53
    return $AS
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc find_ld { } {
Packit 62fe53
    global tool_root_dir
Packit 62fe53
Packit 62fe53
    set LD ""
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	set LD [lookfor_file $tool_root_dir ld-new]
Packit 62fe53
	if { $LD == "" } {
Packit 62fe53
	    set LD [lookfor_file $tool_root_dir ld/ld-new]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    if { $LD == "" } {
Packit 62fe53
	set LD [transform ld]
Packit 62fe53
    }
Packit 62fe53
    return $LD
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc build_wrapper { gluefile } {
Packit 62fe53
    global libdir
Packit 62fe53
    global tool
Packit 62fe53
Packit 62fe53
    if {[target_info exists wrap_m68k_aout]} {
Packit 62fe53
	set flags "additional_flags=-DWRAP_M68K_AOUT"
Packit 62fe53
	set result ""
Packit 62fe53
    } elseif {[target_info exists uses_underscores]} {
Packit 62fe53
	set flags "additional_flags=-DUNDERSCORES"
Packit 62fe53
	set result "-Wl,-wrap,_exit -Wl,-wrap,__exit -Wl,-wrap,_main -Wl,-wrap,_abort"
Packit 62fe53
Packit 62fe53
    } else {
Packit 62fe53
	set flags ""
Packit 62fe53
	if {[target_info exists is_vxworks]} {
Packit 62fe53
	    set flags "additional_flags=-DVXWORKS"
Packit 62fe53
	    set result "-Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main -Wl,-wrap,abort"
Packit 62fe53
	} else {
Packit 62fe53
	    set result "-Wl,-wrap,exit -Wl,-wrap,_exit -Wl,-wrap,main -Wl,-wrap,abort"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    if {[target_info exists wrap_compile_flags]} {
Packit 62fe53
	lappend flags "additional_flags=[target_info wrap_compile_flags]"
Packit 62fe53
    }
Packit 62fe53
    if { [target_compile ${libdir}/testglue.c ${gluefile} object $flags] == "" } {
Packit 62fe53
	set gluefile [remote_download host ${gluefile} ${tool}_tg.o]
Packit 62fe53
	return [list $gluefile $result]
Packit 62fe53
    } else {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
Packit 62fe53
proc winsup_include_flags { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
Packit 62fe53
    if {[isnative]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    if {[file exists [file join $gccpath winsup]]} {
Packit 62fe53
	verbose "Winsup path is $gccpath/winsup"
Packit 62fe53
Packit 62fe53
	set winsup_dir [lookfor_file ${srcdir} winsup/include/windows.h]
Packit 62fe53
	if { ${winsup_dir} != "" } {
Packit 62fe53
	    set winsup_dir [file dirname ${winsup_dir}]
Packit 62fe53
	    # See comment in libio_include_flags about using -I.
Packit 62fe53
	    return " -I${winsup_dir}"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    verbose "No winsup support for this target"
Packit 62fe53
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Find the winsup libraries in the current source tree.
Packit 62fe53
#
Packit 62fe53
proc winsup_link_flags { args } {
Packit 62fe53
    # libgloss doesn't work native
Packit 62fe53
    if {[isnative]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # if we're on a remote host, we can't search for the file, so we can only
Packit 62fe53
    # use an installed compiler, so we don't add any paths here.
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set gccpath "[get_multilibs]"
Packit 62fe53
Packit 62fe53
    verbose "Looking for $gccpath/winsup"
Packit 62fe53
    if {[file exists [file join $gccpath winsup]]} {
Packit 62fe53
	verbose "Winsup path is $gccpath/newlib"
Packit 62fe53
	return "-B$gccpath/winsup/ -L$gccpath/winsup"
Packit 62fe53
    } else {
Packit 62fe53
	verbose "No winsup support for this target"
Packit 62fe53
	return ""
Packit 62fe53
    }
Packit 62fe53
}