Blame lib/target.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> and
Packit 62fe53
# extensively modified by Bob Manson <manson@cygnus.com>.
Packit 62fe53
Packit 62fe53
# A hairy pattern to recognize text.
Packit 62fe53
set text "\[- A-Za-z0-9\.\;\"\_\:\'\`\(\)\!\#\=\+\?\&\*]"
Packit 62fe53
Packit 62fe53
# This is a collection of support procs for the target data
Packit 62fe53
# structures. We use a named array, since Tcl has no real data
Packit 62fe53
# structures. Here's the special index words for the array:
Packit 62fe53
#       Required fields are:
Packit 62fe53
#	    name    - the name of the target. (mostly for error messages) This
Packit 62fe53
#		      should also be the string used for this target's array.
Packit 62fe53
#                     It should also be the same as the linker script so we
Packit 62fe53
#		      can find them dynamically.
Packit 62fe53
#       Optional fields are:
Packit 62fe53
#	    ldflags - the flags required to produce a fully linked executable.
Packit 62fe53
#	    config  - the target canonical for this target. This is a regexp
Packit 62fe53
#		      as passed to istarget or isnative.
Packit 62fe53
#	    cflags  - the flags required to produce an object file from a
Packit 62fe53
#		      source file.
Packit 62fe53
#	    connect - the connectmode for this target. This is for both IP and
Packit 62fe53
#		      serial connections.
Packit 62fe53
#	    hostname  - the hostname of the target. This is for TCP/IP based
Packit 62fe53
#		      connections, and is also used for versions of tip that
Packit 62fe53
#		      use /etc/remote.
Packit 62fe53
#	    serial  - the serial port. This is typically /dev/tty? or com?:.
Packit 62fe53
#	    baud    - the baud rate for a serial port connection.
Packit 62fe53
#	    netport - the IP port.
Packit 62fe53
#	    x10     - parameters for the x10 controller (used to reboot)
Packit 62fe53
#	    fileid  - the fileid or spawn id of of the connection.
Packit 62fe53
#	    prompt  - a regexp for matching the prompt.
Packit 62fe53
#	    ioport  - the port for I/O on dual port systems.
Packit 62fe53
#
Packit 62fe53
# there are three main arrays, indexed in with "target", "build", and "host".
Packit 62fe53
# all other targets are indexed with a name usually based on the linker script
Packit 62fe53
# like "idp", or "ex93x.ld".
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
# Set the target connection.
Packit 62fe53
#
Packit 62fe53
proc push_target { name } {
Packit 62fe53
    pop_config target
Packit 62fe53
    push_config target $name
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Set the host connection.
Packit 62fe53
#
Packit 62fe53
proc push_host { name } {
Packit 62fe53
    pop_config host
Packit 62fe53
    push_config host $name
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Set the build connection.
Packit 62fe53
#
Packit 62fe53
proc push_build { name } {
Packit 62fe53
    pop_config build
Packit 62fe53
    push_config build $name
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Set the config for the current host or target connection.
Packit 62fe53
#
Packit 62fe53
proc push_config { type name } {
Packit 62fe53
    global target_info
Packit 62fe53
Packit 62fe53
    verbose "pushing config for $type, name is $name"
Packit 62fe53
    if {[info exists target_info($type,name)]} {
Packit 62fe53
	if { $target_info($type,name) == $name } {
Packit 62fe53
	    error "pushing config for $type, '$name' twice"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    set target_info($type,name) $name
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Set the current connection for target or host.
Packit 62fe53
#
Packit 62fe53
proc pop_config { type  } {
Packit 62fe53
    global target_info
Packit 62fe53
Packit 62fe53
    if {[info exists target_info(${type},name)]} {
Packit 62fe53
	unset target_info(${type},name)
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Unset the target connection.
Packit 62fe53
#
Packit 62fe53
proc pop_target { } {
Packit 62fe53
    pop_config target
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Unset the host connection.
Packit 62fe53
#
Packit 62fe53
proc pop_host { } {
Packit 62fe53
    pop_config host
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Remove extraneous warnings from TEXT.
Packit 62fe53
#
Packit 62fe53
# An example is:
Packit 62fe53
# ld.so: warning: /usr/lib/libc.so.1.8.1 has older revision than expected 9
Packit 62fe53
#
Packit 62fe53
proc prune_warnings { text } {
Packit 62fe53
    global host_triplet
Packit 62fe53
Packit 62fe53
    # remove the \r part of "\r\n" so we don't break all the patterns
Packit 62fe53
    # we want to match.
Packit 62fe53
    regsub -all -- "\r" $text "" text
Packit 62fe53
Packit 62fe53
    # This is from sun4's.  Do it for all machines for now.
Packit 62fe53
    # The "\\1" is to try to preserve a "\n" but only if necessary.
Packit 62fe53
    if {[ishost "sparc-*-sunos*"]} {
Packit 62fe53
	regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # See Brendan for the raison d'etre of this one.
Packit 62fe53
    # http://en.wikipedia.org/wiki/Brendan_Kehoe
Packit 62fe53
    if {[ishost "alpha*-*-*"]} {
Packit 62fe53
	regsub -all "(^|\n)(/usr/(ucb|bin)/ld.*without exceptions was\[^\n\]+\n?)" $text "\\1" text
Packit 62fe53
    }
Packit 62fe53
    if {[ishost "hppa*-*-hpux*"]} {
Packit 62fe53
       # Ignore the compiler's warnings about PA incompatibility.
Packit 62fe53
       regsub -all "(^|\n)\[^\n\]*PA 2.0 object file \[^\n\]* was detected. The linked output may not run on a PA 1.x system." $text "" text
Packit 62fe53
Packit 62fe53
       regsub -all "(^|\n)\[^\n\]*PA 2.0 object file \[^\n\]* was detected. The linked output may not run on a PA 1.x system." $text "" text
Packit 62fe53
Packit 62fe53
       # And the linker's +vcompatwarnings verbage.
Packit 62fe53
       regsub -all "(^|\n)\[^\n\]*Linker features were used that may not be supported\[^\n\]*.\[^\n\]*." $text "" text
Packit 62fe53
Packit 62fe53
       # Ignore these warnings, which the HP aCC compiler seems to
Packit 62fe53
       # generate on HP-UX 10.30 and 11.0.  (Something is probably
Packit 62fe53
       # wrong with some system headers, but still...)
Packit 62fe53
       #
Packit 62fe53
       # This particular warning always is given with a line of warning
Packit 62fe53
       # text, followed by a source line, followed by a line with "^^^"
Packit 62fe53
       # underlining an offending symbol name.  Here we slurp up the
Packit 62fe53
       # warning text and the next two lines, assuming that they are
Packit 62fe53
       # the source line and underline chars.
Packit 62fe53
       #
Packit 62fe53
       regsub -all "Warning .*The linkage directive is ignored for an object or function declared static..\[^\n\]*.\[^\n\]*." $text "" text
Packit 62fe53
Packit 62fe53
       # Ignore these warnings, which I often see from the ANSI C
Packit 62fe53
       # compiler installed on HP-UX 11.0 machines.  (Something is
Packit 62fe53
       # probably wrong with an installation, or perhaps NLS isn't
Packit 62fe53
       # quite healthy yet on 11.0.  In either case, it's easier to
Packit 62fe53
       # "fix" this nit here, than it is to track down & fix the
Packit 62fe53
       # root cause.)
Packit 62fe53
       #
Packit 62fe53
       # This particular warning always is given with a line of warning
Packit 62fe53
       # text, followed by line that says "Using internal messages".
Packit 62fe53
       #
Packit 62fe53
       regsub -all "Warning: Unable to open pxdb message catalog.*" $text "" text
Packit 62fe53
       regsub -all ".* Using internal messages.*" $text "" text
Packit 62fe53
Packit 62fe53
       # Another form of the "unable to find message catalog" warning.
Packit 62fe53
       #
Packit 62fe53
       regsub -all "cpp: warning .*Possibly incorrect message catalog." $text "" text
Packit 62fe53
Packit 62fe53
       # Another odd warning on 11.0.
Packit 62fe53
       #
Packit 62fe53
       regsub -all "aCC .assigner.: Warning .*Could not find library for -l.*" $text "" text
Packit 62fe53
Packit 62fe53
       # Oh heck, just keep adding 'em here...
Packit 62fe53
       #
Packit 62fe53
       regsub -all "aCC .assigner.: Warning .*Could not satisfy instantiation request for \[^\n\]* contained in\[^\n\]*\n\t/lib/pa20_64/lib\[a-zA-Z0-9\]*.sl" $text "" text
Packit 62fe53
Packit 62fe53
      # Remove the lines that are output by the HP F77 compiler to
Packit 62fe53
      # indicate the functions that are being compiled.
Packit 62fe53
      upvar compiler_type compiler_type
Packit 62fe53
      if { [info exists compiler_type] && $compiler_type == "f77" } {
Packit 62fe53
	  regsub -all "\[ \ta-zA-Z_0-9\./\]*:\[\r\n\]+" $text "" text
Packit 62fe53
      }
Packit 62fe53
Packit 62fe53
      # Ignore the warnings about unknown options
Packit 62fe53
      regsub -all ".*warning \[0-9\]+: Unknown option.*ignored.*" $text "" text
Packit 62fe53
Packit 62fe53
      }
Packit 62fe53
Packit 62fe53
    # Ignore these.
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*linker input file unused since linking not done" $text "" text
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*file path prefix \[^\n\]* never used" $text "" text
Packit 62fe53
Packit 62fe53
    # This is from sun4's.  Do it for all machines for now.
Packit 62fe53
    # The "\\1" is to try to preserve a "\n" but only if necessary.
Packit 62fe53
    regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens when compiling on Alpha OSF/1 with cc -g -O.
Packit 62fe53
    regsub -all "(^|\n)(\n*uopt: Warning: file not optimized; use -g3 if both optimization and debug wanted\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens when compiling on Alpha OSF using gas.
Packit 62fe53
    regsub -all "(^|\n)(/usr/.*/ld:\nWarning: Linking some objects which contain exception information sections\n\tand some which do not. This may cause fatal runtime exception handling\n\tproblems\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens on SunOS with cc -g -O.
Packit 62fe53
    regsub -all "(^|\n)(cc: Warning: -O conflicts with -g. -O turned off.\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens when assembling code with the native HP assembler
Packit 62fe53
    regsub -all "(^|\n)(as:\[^\n\]*err#13.\n  .warning.\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # When using the HP assembler, -g isn't supported.
Packit 62fe53
    regsub -all "(^|\n)(cc1: warning: -g is only supported when using GAS on this processor\[^\n\]*\ncc1: warning:\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(cc1plus: warning: -g is only supported when using GAS on this processor\[^\n\]*\ncc1plus: warning:\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens when testing across NFS.
Packit 62fe53
    regsub -all "(^|\n)((NFS|nfs) server \[^\n\]* not responding\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)((NFS|nfs) server \[^\n\]* (ok|is alive again)\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens when testing across NFS on osf4.
Packit 62fe53
    regsub -all "(^|\n)(NFS3 server \[^\n\]* not responding still trying\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(NFS3 server \[^\n\]* ok\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # When using the IRIX 6 o32 assembler, -g isn't supported
Packit 62fe53
    regsub -all "(^|\n)(cc1: warning: `-g' not supported by this configuration of GCC\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(cc1plus: warning: `-g' not supported by this configuration of GCC\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    regsub -all "(^|\n)(cc1: warning: -mabi=32 does not support -g\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(cc1plus: warning: -mabi=32 does not support -g\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens with the o32 assembler on IRIX 6.
Packit 62fe53
    regsub -all "(^|\n)(as: Warning: -O3 is not supported for assembly compiles for ucode compilers; changing to -O2.\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This happens when using g++ on a DWARF system.
Packit 62fe53
    regsub -all "(^|\n)(cc1plus: warning: -g option not supported for C\\+\\+ on systems using the DWARF debugging format\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # This is from sun4's.  Do it for all machines for now.
Packit 62fe53
    # The "\\1" is to try to preserve a "\n" but only if necessary.
Packit 62fe53
    regsub -all "(^|\n)(ld.so: warning:\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # See Brendan for the raison d'etre of this one.
Packit 62fe53
    # http://en.wikipedia.org/wiki/Brendan_Kehoe
Packit 62fe53
    if {[string match "alpha*-*-*" $host_triplet]} {
Packit 62fe53
	regsub -all "(^|\n)(/usr/(ucb|bin)/ld.*without exceptions was\[^\n\]+\n?)" $text "\\1" text
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # Don't pay attention to the AIX4 linker warnings.
Packit 62fe53
    regsub -all "(^|\n)(ld:.*WARNING: Duplicate.*ld:.*Use the -bload\[^\n\]*\n?)" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # Or the IRIX 6 ones.
Packit 62fe53
    regsub -all "(^|\n)(ld(|32|64): WARNING \[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(ld(|32|64): Giving up.*Use -wall\[^\n\]*\n?)+" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # Or the NetBSD ones.
Packit 62fe53
     regsub -all "(^|\n)(\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*warning: this program uses \[^\n\]*)" $text "\\1" text
Packit 62fe53
     regsub -all "(^|\n)(\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*warning: reference to compatibility \[^\n\]*)" $text "\\1" text
Packit 62fe53
     regsub -all "(^|\n)(\[^\n\]*:\[0-9\]+: warning: \[^\n\]* possibly used unsafely, use \[^\n\]*\n?)" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(\[^\n\]*: warning: reference to compatibility glob\[^\n\]*\n?)" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # Or the OpenBSD ones.
Packit 62fe53
    regsub -all "(^|\n)(\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*warning: \[^\n\]* is (often|almost always) misused, please use \[^\n\]*\n?)" $text "\\1" text
Packit 62fe53
    regsub -all "(^|\n)(\[^\n\]*: warning: \[^\n\]* is (often|almost always) misused, please use \[^\n\]*\n?)" $text "\\1" text
Packit 62fe53
Packit 62fe53
    # GNU ld warns about functions marked as dangerous in GNU libc.
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*is dangerous\[^\n\]*" $text "" text
Packit 62fe53
     regsub -all "(^|\n)\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*the use of \[^\n\]* is dangerous, better use \[^\n\]*" $text "" text
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*is dangerous\[^\n\]*" $text "" text
Packit 62fe53
Packit 62fe53
     # Libgloss libnosys defines functions that warn when linked in
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*: In function\[^\n\]*\n\[^\n\]\[^\n\]*is not implemented and will always fail\[^\n\]*" $text "" text
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*is not implemented and will always fail\[^\n\]*" $text "" text
Packit 62fe53
Packit 62fe53
    # libstdc++-v3 tests can emit cpplib warnings due to duplicate -isystem / -I flags
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*: warning: changing search order for system directory\[^\n\]*" $text "" text
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*: warning:   as it has already been specified\[^\n\]*" $text "" text
Packit 62fe53
Packit 62fe53
    # Cygwin cc1 warns about -fpic and -fPIC
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*: warning: -f(pic|PIC) ignored for target \[^\n\]*" $text "" text
Packit 62fe53
Packit 62fe53
    # Ignore linker warning when searching 64bit libraries in /lib.
Packit 62fe53
    regsub -all "(^|\n)\[^\n\]*: skipping incompatible \[^\n\]* when searching for \[^\n\]*" $text "" text
Packit 62fe53
Packit 62fe53
    # It might be tempting to get carried away and delete blank lines, etc.
Packit 62fe53
    # Just delete *exactly* what we're ask to, and that's it.
Packit 62fe53
    return $text
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Invoke the compiler. This gets interesting cause the compiler may
Packit 62fe53
# not be on the same machine we're running DejaGnu on.
Packit 62fe53
#
Packit 62fe53
proc target_compile {source destfile type options} {
Packit 62fe53
    set target [target_info name]
Packit 62fe53
    if { [info procs ${target}_compile] != "" } {
Packit 62fe53
	return [${target}_compile $source $destfile $type $options]
Packit 62fe53
    } else {
Packit 62fe53
	return [default_target_compile $source $destfile $type $options]
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc default_target_compile {source destfile type options} {
Packit 62fe53
    global target_triplet
Packit 62fe53
    global tool_root_dir
Packit 62fe53
    global CFLAGS_FOR_TARGET
Packit 62fe53
    global LDFLAGS_FOR_TARGET
Packit 62fe53
    global compiler_flags
Packit 62fe53
Packit 62fe53
    if { $destfile == "" && $type != "preprocess" && $type != "none" } {
Packit 62fe53
	error "Must supply an output filename for the compile to default_target_compile"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set add_flags ""
Packit 62fe53
    set libs ""
Packit 62fe53
    set compiler_type "c"
Packit 62fe53
    set compiler ""
Packit 62fe53
    set ldflags ""
Packit 62fe53
    set dest [target_info name]
Packit 62fe53
Packit 62fe53
    if {[info exists CFLAGS_FOR_TARGET]} {
Packit 62fe53
	append add_flags " $CFLAGS_FOR_TARGET"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists LDFLAGS_FOR_TARGET]} {
Packit 62fe53
	append ldflags " $LDFLAGS_FOR_TARGET"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists target_info(host,name)]} {
Packit 62fe53
	set host [host_info name]
Packit 62fe53
    } else {
Packit 62fe53
	set host "unix"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    foreach i $options {
Packit 62fe53
Packit 62fe53
	if { $i == "ada" } {
Packit 62fe53
	    set compiler_type "ada"
Packit 62fe53
	    if {[board_info $dest exists adaflags]} {
Packit 62fe53
		append add_flags " [target_info adaflags]"
Packit 62fe53
	    }
Packit 62fe53
	    if {[board_info $dest exists gnatmake]} {
Packit 62fe53
		set compiler [target_info gnatmake]
Packit 62fe53
	    } else {
Packit 62fe53
		set compiler [find_gnatmake]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if { $i == "c++" } {
Packit 62fe53
	    set compiler_type "c++"
Packit 62fe53
	    if {[board_info $dest exists cxxflags]} {
Packit 62fe53
		append add_flags " [target_info cxxflags]"
Packit 62fe53
	    }
Packit 62fe53
	    append add_flags " [g++_include_flags]"
Packit 62fe53
	    if {[board_info $dest exists c++compiler]} {
Packit 62fe53
		set compiler [target_info c++compiler]
Packit 62fe53
	    } else {
Packit 62fe53
		set compiler [find_g++]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if { $i == "d" } {
Packit 62fe53
	    set compiler_type "d"
Packit 62fe53
	    if {[board_info $dest exists dflags]} {
Packit 62fe53
		append add_flags " [target_info dflags]"
Packit 62fe53
	    }
Packit 62fe53
	    if {[board_info $dest exists dcompiler]} {
Packit 62fe53
		set compiler [target_info dcompiler]
Packit 62fe53
	    } else {
Packit 62fe53
		set compiler [find_gdc]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if { $i == "f77" } {
Packit 62fe53
	    set compiler_type "f77"
Packit 62fe53
	    if {[board_info $dest exists f77flags]} {
Packit 62fe53
		append add_flags " [target_info f77flags]"
Packit 62fe53
	    }
Packit 62fe53
	    if {[board_info $dest exists f77compiler]} {
Packit 62fe53
		set compiler [target_info f77compiler]
Packit 62fe53
	    } else {
Packit 62fe53
		set compiler [find_g77]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if { $i == "f90" } {
Packit 62fe53
	    set compiler_type "f90"
Packit 62fe53
	    if {[board_info $dest exists f90flags]} {
Packit 62fe53
		append add_flags " [target_info f90flags]"
Packit 62fe53
	    }
Packit 62fe53
	    if {[board_info $dest exists f90compiler]} {
Packit 62fe53
		set compiler [target_info f90compiler]
Packit 62fe53
	    } else {
Packit 62fe53
		set compiler [find_gfortran]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if {[regexp "^dest=" $i]} {
Packit 62fe53
	    regsub "^dest=" $i "" tmp
Packit 62fe53
	    if {[board_info $tmp exists name]} {
Packit 62fe53
		set dest [board_info $tmp name]
Packit 62fe53
	    } else {
Packit 62fe53
		set dest $tmp
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^compiler=" $i]} {
Packit 62fe53
	    regsub "^compiler=" $i "" tmp
Packit 62fe53
	    set compiler $tmp
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^additional_flags=" $i]} {
Packit 62fe53
	    regsub "^additional_flags=" $i "" tmp
Packit 62fe53
	    append add_flags " $tmp"
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^ldflags=" $i]} {
Packit 62fe53
	    regsub "^ldflags=" $i "" tmp
Packit 62fe53
	    append ldflags " $tmp"
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^libs=" $i]} {
Packit 62fe53
	    regsub "^libs=" $i "" tmp
Packit 62fe53
	    append libs " $tmp"
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^incdir=" $i]} {
Packit 62fe53
	    regsub "^incdir=" $i "-I" tmp
Packit 62fe53
	    append add_flags " $tmp"
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^libdir=" $i]} {
Packit 62fe53
	    regsub "^libdir=" $i "-L" tmp
Packit 62fe53
	    append add_flags " $tmp"
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^ldscript=" $i]} {
Packit 62fe53
	    regsub "^ldscript=" $i "" ldscript
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^redirect=" $i]} {
Packit 62fe53
	    regsub "^redirect=" $i "" redirect
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^optimize=" $i]} {
Packit 62fe53
	    regsub "^optimize=" $i "" optimize
Packit 62fe53
	}
Packit 62fe53
	if {[regexp "^timeout=" $i]} {
Packit 62fe53
	    regsub "^timeout=" $i "" timeout
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $host exists cflags_for_target]} {
Packit 62fe53
	append add_flags " [board_info $host cflags_for_target]"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    global CC_FOR_TARGET
Packit 62fe53
    global CXX_FOR_TARGET
Packit 62fe53
    global D_FOR_TARGET
Packit 62fe53
    global F77_FOR_TARGET
Packit 62fe53
    global F90_FOR_TARGET
Packit 62fe53
    global GNATMAKE_FOR_TARGET
Packit 62fe53
Packit 62fe53
    if {[info exists GNATMAKE_FOR_TARGET]} {
Packit 62fe53
	if { $compiler_type == "ada" } {
Packit 62fe53
	    set compiler $GNATMAKE_FOR_TARGET
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists CC_FOR_TARGET]} {
Packit 62fe53
	if { $compiler == "" } {
Packit 62fe53
	    set compiler $CC_FOR_TARGET
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists CXX_FOR_TARGET]} {
Packit 62fe53
	if { $compiler_type == "c++" } {
Packit 62fe53
	    set compiler $CXX_FOR_TARGET
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists D_FOR_TARGET]} {
Packit 62fe53
	if { $compiler_type == "d" } {
Packit 62fe53
	    set compiler $D_FOR_TARGET
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists F77_FOR_TARGET]} {
Packit 62fe53
	if { $compiler_type == "f77" } {
Packit 62fe53
	    set compiler $F77_FOR_TARGET
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists F90_FOR_TARGET]} {
Packit 62fe53
	if { $compiler_type == "f90" } {
Packit 62fe53
	    set compiler $F90_FOR_TARGET
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { $compiler == "" } {
Packit 62fe53
	set compiler [board_info $dest compiler]
Packit 62fe53
	if { $compiler == "" } {
Packit 62fe53
	    return "default_target_compile: No compiler to compile with"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {![is_remote host]} {
Packit 62fe53
	if { [which $compiler] == 0 } {
Packit 62fe53
	    return "default_target_compile: Can't find $compiler."
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {$type == "object"} {
Packit 62fe53
	append add_flags " -c"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { $type == "preprocess" } {
Packit 62fe53
	append add_flags " -E"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { $type == "assembly" } {
Packit 62fe53
	append add_flags " -S"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists cflags]} {
Packit 62fe53
	append add_flags " [board_info $dest cflags]"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { $type == "executable" } {
Packit 62fe53
	if {[board_info $dest exists ldflags]} {
Packit 62fe53
	    append add_flags " [board_info $dest ldflags]"
Packit 62fe53
	}
Packit 62fe53
	if { $compiler_type == "c++" } {
Packit 62fe53
	    append add_flags " [g++_link_flags]"
Packit 62fe53
	}
Packit 62fe53
	if {[isnative]} {
Packit 62fe53
	    # This is a lose.
Packit 62fe53
	    catch "glob -nocomplain $tool_root_dir/libstdc++/libstdc++.so* $tool_root_dir/libstdc++/libstdc++.sl" tmp
Packit 62fe53
	    if { ${tmp} != "" } {
Packit 62fe53
		if {[regexp ".*solaris2.*" $target_triplet]} {
Packit 62fe53
		    # Solaris 2
Packit 62fe53
		    append add_flags " -R$tool_root_dir/libstdc++"
Packit 62fe53
		} elseif {[regexp ".*(osf|irix5|linux).*" $target_triplet]} {
Packit 62fe53
		    # OSF/1 or IRIX 5
Packit 62fe53
		    append add_flags " -Wl,-rpath,$tool_root_dir/libstdc++"
Packit 62fe53
		} elseif {[regexp ".*hppa.*" $target_triplet]} {
Packit 62fe53
		    # HP-UX
Packit 62fe53
		    append add_flags " -Wl,-a,shared_archive"
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {![info exists ldscript]} {
Packit 62fe53
	set ldscript [board_info $dest ldscript]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    foreach i $options {
Packit 62fe53
	if { $i == "debug" } {
Packit 62fe53
	    if {[board_info $dest exists debug_flags]} {
Packit 62fe53
		append add_flags " [board_info $dest debug_flags]"
Packit 62fe53
	    } else {
Packit 62fe53
		append add_flags " -g"
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists optimize]} {
Packit 62fe53
	append add_flags " $optimize"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { $type == "executable" } {
Packit 62fe53
	append add_flags " $ldflags"
Packit 62fe53
	foreach x $libs {
Packit 62fe53
	    if {[file exists $x]} {
Packit 62fe53
		append source " $x"
Packit 62fe53
	    } else {
Packit 62fe53
		append add_flags " $x"
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if {[board_info $dest exists libs]} {
Packit 62fe53
	    append add_flags " [board_info $dest libs]"
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	# This probably isn't such a good idea, but it avoids nasty
Packit 62fe53
	# hackiness in the testsuites.
Packit 62fe53
	# The math library must be linked in before the C library.  The C
Packit 62fe53
	# library is linked in by the linker script, so this must be before
Packit 62fe53
	# the linker script.
Packit 62fe53
	if {[board_info $dest exists mathlib]} {
Packit 62fe53
	    append add_flags " [board_info $dest mathlib]"
Packit 62fe53
	} else {
Packit 62fe53
	    append add_flags " -lm"
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	# This must be added here.
Packit 62fe53
	append add_flags " $ldscript"
Packit 62fe53
Packit 62fe53
	if {[board_info $dest exists remote_link]} {
Packit 62fe53
	    # Relink option.
Packit 62fe53
	    append add_flags " -Wl,-r"
Packit 62fe53
	}
Packit 62fe53
	if {[board_info $dest exists output_format]} {
Packit 62fe53
	    append add_flags " -Wl,-oformat,[board_info $dest output_format]"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $dest exists multilib_flags]} {
Packit 62fe53
	set add_flags "[board_info $dest multilib_flags] $add_flags"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    verbose "doing compile"
Packit 62fe53
Packit 62fe53
    set sources ""
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	foreach x $source {
Packit 62fe53
	    set file [remote_download host $x]
Packit 62fe53
	    if { $file == "" } {
Packit 62fe53
		warning "Unable to download $x to host."
Packit 62fe53
		return "Unable to download $x to host."
Packit 62fe53
	    } else {
Packit 62fe53
		append sources " $file"
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	set sources $source
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	append add_flags " -o a.out"
Packit 62fe53
	remote_file host delete a.out
Packit 62fe53
    } else {
Packit 62fe53
	if { $destfile != "" } {
Packit 62fe53
	    append add_flags " -o $destfile"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # This is obscure: we put SOURCES at the end when building an
Packit 62fe53
    # object, because otherwise, in some situations, libtool will
Packit 62fe53
    # become confused about the name of the actual source file.
Packit 62fe53
    if {$type == "object"} {
Packit 62fe53
	set opts "$add_flags $sources"
Packit 62fe53
    } else {
Packit 62fe53
	set opts "$sources $add_flags"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	if {[host_info exists use_at]} {
Packit 62fe53
	    set fid [open "atfile" "w"]
Packit 62fe53
	    puts $fid "$opts"
Packit 62fe53
	    close $fid
Packit 62fe53
	    set opts "@[remote_download host atfile]"
Packit 62fe53
	    remote_file build delete atfile
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    verbose "Invoking the compiler as $compiler $opts" 2
Packit 62fe53
Packit 62fe53
    if {[info exists redirect]} {
Packit 62fe53
	verbose "Redirecting output to $redirect" 2
Packit 62fe53
	set status [remote_exec host "$compiler $opts" "" "" $redirect]
Packit 62fe53
    } else {
Packit 62fe53
	if {[info exists timeout]} {
Packit 62fe53
	    verbose "Setting timeout to $timeout" 2
Packit 62fe53
	    set status [remote_exec host "$compiler $opts" "" "" "" $timeout]
Packit 62fe53
	} else {
Packit 62fe53
	    set status [remote_exec host "$compiler $opts"]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set compiler_flags $opts
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	remote_upload host a.out $destfile
Packit 62fe53
	remote_file host delete a.out
Packit 62fe53
    }
Packit 62fe53
    set comp_output [prune_warnings [lindex $status 1]]
Packit 62fe53
    regsub "^\[\r\n\]+" $comp_output "" comp_output
Packit 62fe53
    if { [lindex $status 0] != 0 } {
Packit 62fe53
	verbose -log "compiler exited with status [lindex $status 0]"
Packit 62fe53
    }
Packit 62fe53
    if { [lindex $status 1] != "" } {
Packit 62fe53
	verbose "output is:\n[lindex $status 1]" 2
Packit 62fe53
    }
Packit 62fe53
    if { [lindex $status 0] != 0 && "${comp_output}" == "" } {
Packit 62fe53
	set comp_output "exit status is [lindex $status 0]"
Packit 62fe53
    }
Packit 62fe53
    return ${comp_output}
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc reboot_target { } {
Packit 62fe53
    set result [remote_reboot target]
Packit 62fe53
    puts "REBOOT_TARGET: \"$result\""
Packit 62fe53
    return ${result}
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Invoke this if you really want as to be called directly, rather than
Packit 62fe53
# calling the compiler. FLAGS are any additional flags to pass to the
Packit 62fe53
# assembler.
Packit 62fe53
#
Packit 62fe53
proc target_assemble { source destfile flags } {
Packit 62fe53
    return [default_target_assemble $source $destfile $flags]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc default_target_assemble { source destfile flags } {
Packit 62fe53
    global AS_FOR_TARGET
Packit 62fe53
    global ASFLAGS_FOR_TARGET
Packit 62fe53
Packit 62fe53
    if {[info exists AS_FOR_TARGET]} {
Packit 62fe53
	set AS "$AS_FOR_TARGET"
Packit 62fe53
    } else {
Packit 62fe53
	if {![board_info target exists assembler]} {
Packit 62fe53
	    set AS [find_gas]
Packit 62fe53
	} else {
Packit 62fe53
	    set AS [board_info target assembler]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists ASFLAGS_FOR_TARGET]} {
Packit 62fe53
	append flags " $ASFLAGS_FOR_TARGET"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	set source [remote_download host $source]
Packit 62fe53
	set dest "a.out"
Packit 62fe53
    } else {
Packit 62fe53
	set dest $destfile
Packit 62fe53
    }
Packit 62fe53
    set status [remote_exec host "$AS $source $flags -o $dest"]
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	remote_upload host $dest $destfile
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set comp_output [prune_warnings [lindex $status 1]]
Packit 62fe53
    if { [lindex $status 0] != 0 } {
Packit 62fe53
	verbose -log "assembler exited with status [lindex $status 0]"
Packit 62fe53
    }
Packit 62fe53
    if { [lindex $status 1] != "" } {
Packit 62fe53
	verbose "assembler output is:\n[lindex $status 1]" 2
Packit 62fe53
    }
Packit 62fe53
    return ${comp_output}
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Invoke this if you really want ld to be called directly, rather than
Packit 62fe53
# calling the compiler. FLAGS are any additional flags to pass to the
Packit 62fe53
# linker.
Packit 62fe53
#
Packit 62fe53
proc target_link { objects destfile flags } {
Packit 62fe53
    return [default_link target "$objects" "$destfile" $flags]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc default_link { board objects destfile flags } {
Packit 62fe53
    global LD_FOR_TARGET
Packit 62fe53
    global LDFLAGS_FOR_TARGET
Packit 62fe53
Packit 62fe53
    # return -L's in ldflags
Packit 62fe53
    proc only--Ls { ldflags } {
Packit 62fe53
	set result ""
Packit 62fe53
	set ldflags [split $ldflags]
Packit 62fe53
	set len [llength $ldflags]
Packit 62fe53
	for { set i 0 } { $i < $len } { incr i } {
Packit 62fe53
	    # Note: We ignore the situation where a -L is actually the
Packit 62fe53
	    # argument to an option.
Packit 62fe53
	    set arg [lindex $ldflags $i]
Packit 62fe53
	    regsub "^-Wl," $arg "" arg
Packit 62fe53
	    if {[regexp "^-L" $arg]} {
Packit 62fe53
		# Is the directory in the next arg, or part of this one?
Packit 62fe53
		if { "$arg" == "-L" } {
Packit 62fe53
		    if { $i + 1 < $len } {
Packit 62fe53
			append result " -L [lindex $ldflags $i+1]"
Packit 62fe53
			incr i
Packit 62fe53
		    }
Packit 62fe53
		} else {
Packit 62fe53
		    append result " $arg"
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	return $result
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists LD_FOR_TARGET]} {
Packit 62fe53
	set LD "$LD_FOR_TARGET"
Packit 62fe53
    } else {
Packit 62fe53
	if {![board_info target exists linker]} {
Packit 62fe53
	    set LD [find_ld]
Packit 62fe53
	} else {
Packit 62fe53
	    set LD [board_info target linker]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists LDFLAGS_FOR_TARGET]} {
Packit 62fe53
	append flags " $LDFLAGS_FOR_TARGET"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # `ldflags' consists of arguments to gcc (that are then
Packit 62fe53
    # passed to ld), not arguments to ld directly.
Packit 62fe53
    # We need the -L's.
Packit 62fe53
    if {[board_info $board exists ldflags]} {
Packit 62fe53
	set ldflags [board_info $board ldflags]
Packit 62fe53
	set ldflags [only--Ls $ldflags]
Packit 62fe53
	append flags " $ldflags"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $board exists ldscript]} {
Packit 62fe53
	# strip leading -Wl, if present
Packit 62fe53
	set ldscript [board_info $board ldscript]
Packit 62fe53
	regsub "^-Wl," $ldscript "" ldscript
Packit 62fe53
	append flags " $ldscript"
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	set nobjects ""
Packit 62fe53
	foreach x $objects {
Packit 62fe53
	    set nobjects "$nobjects [remote_download host $x]"
Packit 62fe53
	}
Packit 62fe53
	set objects "$nobjects"
Packit 62fe53
	set dest "a.out"
Packit 62fe53
    } else {
Packit 62fe53
	set dest $destfile
Packit 62fe53
    }
Packit 62fe53
    set status [remote_exec host "$LD $objects $flags -o $dest"]
Packit 62fe53
    if {[is_remote host]} {
Packit 62fe53
	remote_upload host $dest $destfile
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set comp_output [prune_warnings [lindex $status 1]]
Packit 62fe53
    if { [lindex $status 0] != 0 } {
Packit 62fe53
	verbose -log "linker exited with status [lindex $status 0]"
Packit 62fe53
    }
Packit 62fe53
    if { [lindex $status 1] != "" } {
Packit 62fe53
	verbose "linker output is:\n[lindex $status 1]" 2
Packit 62fe53
    }
Packit 62fe53
    return ${comp_output}
Packit 62fe53
}