Blame runtest.exp

Packit 62fe53
# runtest.exp -- Test framework driver
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
set frame_version	1.6.1
Packit 62fe53
if {![info exists argv0]} {
Packit 62fe53
    send_error "Must use a version of Expect greater than 5.0\n"
Packit 62fe53
    exit 1
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# trap some signals so we know whats happening. These definitions are only
Packit 62fe53
# temporary until we read in the library stuff
Packit 62fe53
#
Packit 62fe53
trap { send_user "\ninterrupted by user\n"; exit 130 } SIGINT
Packit 62fe53
trap { send_user "\nquit\n";                exit 131 } SIGQUIT
Packit 62fe53
trap { send_user "\nterminated\n";          exit 143 } SIGTERM
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Initialize a few global variables used by all tests.
Packit 62fe53
# `reset_vars' resets several of these, we define them here to document their
Packit 62fe53
# existence.  In fact, it would be nice if all globals used by some interface
Packit 62fe53
# of dejagnu proper were documented here.
Packit 62fe53
#
Packit 62fe53
# Keep these all lowercase.  Interface variables used by the various
Packit 62fe53
# testsuites (eg: the gcc testsuite) should be in all capitals
Packit 62fe53
# (eg: TORTURE_OPTIONS).
Packit 62fe53
#
Packit 62fe53
set mail_logs   0		;# flag for mailing of summary and diff logs
Packit 62fe53
set psum_file   "latest"	;# file name of previous summary to diff against
Packit 62fe53
Packit 62fe53
set exit_status	0		;# exit code returned by this program
Packit 62fe53
Packit 62fe53
set xfail_flag  0		;# indicates that a failure is expected
Packit 62fe53
set xfail_prms	0		;# GNATS prms id number for this expected failure
Packit 62fe53
set kfail_flag  0		;# indicates that it is a known failure
Packit 62fe53
set kfail_prms	0		;# bug id for the description of the known failure
Packit 62fe53
set sum_file	""		;# name of the file that contains the summary log
Packit 62fe53
set base_dir	""		;# the current working directory
Packit 62fe53
set xml_file    ""              ;# handle on the XML file if requested
Packit 62fe53
set xml         0               ;# flag for requesting xml
Packit 62fe53
set logname     ""		;# the users login name
Packit 62fe53
set prms_id	0               ;# GNATS prms id number
Packit 62fe53
set bug_id	0               ;# optional bug id number
Packit 62fe53
set dir		""		;# temp variable for directory names
Packit 62fe53
set srcdir      "."		;# source directory containing the test suite
Packit 62fe53
set ignoretests ""		;# list of tests to not execute
Packit 62fe53
set objdir	"."		;# directory where test case binaries live
Packit 62fe53
set reboot      0
Packit 62fe53
set configfile  site.exp	;# (local to this file)
Packit 62fe53
set multipass   ""		;# list of passes and var settings
Packit 62fe53
set errno	"";		;#
Packit 62fe53
set exit_error  1		;# Toggle for whether to set the exit status
Packit 62fe53
				;# on Tcl bugs in test case drivers.
Packit 62fe53
#
Packit 62fe53
# These describe the host and target environments.
Packit 62fe53
#
Packit 62fe53
set build_triplet  ""		;# type of architecture to run tests on
Packit 62fe53
set build_os	   ""		;# type of os the tests are running on
Packit 62fe53
set build_vendor   ""		;# vendor name of the OS or workstation the test are running on
Packit 62fe53
set build_cpu      ""		;# type of the cpu tests are running on
Packit 62fe53
set host_triplet   ""		;# type of architecture to run tests on, sometimes remotely
Packit 62fe53
set host_os	   ""		;# type of os the tests are running on
Packit 62fe53
set host_vendor    ""		;# vendor name of the OS or workstation the test are running on
Packit 62fe53
set host_cpu       ""		;# type of the cpu tests are running on
Packit 62fe53
set target_triplet ""		;# type of architecture to run tests on, final remote
Packit 62fe53
set target_os	   ""		;# type of os the tests are running on
Packit 62fe53
set target_vendor  ""		;# vendor name of the OS or workstation the test are running on
Packit 62fe53
set target_cpu     ""		;# type of the cpu tests are running on
Packit 62fe53
set target_alias   ""		;# standard abbreviation of target
Packit 62fe53
set compiler_flags ""		;# the flags used by the compiler
Packit 62fe53
Packit 62fe53
# Various ccache versions provide incorrect debug info such as ignoring
Packit 62fe53
# different current directory, breaking GDB testsuite.
Packit 62fe53
set env(CCACHE_DISABLE) 1
Packit 62fe53
unset -nocomplain env(CCACHE_NODISABLE)
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# some convenience abbreviations
Packit 62fe53
#
Packit 62fe53
if {![info exists hex]} {
Packit 62fe53
    set hex "0x\[0-9A-Fa-f\]+"
Packit 62fe53
}
Packit 62fe53
if {![info exists decimal]} {
Packit 62fe53
    set decimal "\[0-9\]+"
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# set the base dir (current working directory)
Packit 62fe53
#
Packit 62fe53
set base_dir [pwd]
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# These are tested in case they are not initialized in $configfile. They are
Packit 62fe53
# tested here instead of the init module so they can be overridden by command
Packit 62fe53
# line options.
Packit 62fe53
#
Packit 62fe53
if {![info exists all_flag]} {
Packit 62fe53
    set all_flag 0
Packit 62fe53
}
Packit 62fe53
if {![info exists binpath]} {
Packit 62fe53
    set binpath ""
Packit 62fe53
}
Packit 62fe53
if {![info exists debug]} {
Packit 62fe53
    set debug 0
Packit 62fe53
}
Packit 62fe53
if {![info exists options]} {
Packit 62fe53
    set options ""
Packit 62fe53
}
Packit 62fe53
if {![info exists outdir]} {
Packit 62fe53
    set outdir "."
Packit 62fe53
}
Packit 62fe53
if {![info exists reboot]} {
Packit 62fe53
    set reboot 1
Packit 62fe53
}
Packit 62fe53
if {![info exists tracelevel]} {
Packit 62fe53
    set tracelevel 0
Packit 62fe53
}
Packit 62fe53
if {![info exists verbose]} {
Packit 62fe53
    set verbose 0
Packit 62fe53
}
Packit 62fe53
if {![info exists log_dialog]} {
Packit 62fe53
    set log_dialog 0
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# verbose [-n] [-log] [--] message [level]
Packit 62fe53
#
Packit 62fe53
# Print MESSAGE if the verbose level is >= LEVEL.
Packit 62fe53
# The default value of LEVEL is 1.
Packit 62fe53
# "-n" says to not print a trailing newline.
Packit 62fe53
# "-log" says to add the text to the log file even if it won't be printed.
Packit 62fe53
# Note that the apparent behaviour of `send_user' dictates that if the message
Packit 62fe53
# is printed it is also added to the log file.
Packit 62fe53
# Use "--" if MESSAGE begins with "-".
Packit 62fe53
#
Packit 62fe53
# This is defined here rather than in framework.exp so we can use it
Packit 62fe53
# while still loading in the support files.
Packit 62fe53
#
Packit 62fe53
proc verbose { args } {
Packit 62fe53
    global verbose
Packit 62fe53
    set newline 1
Packit 62fe53
    set logfile 0
Packit 62fe53
Packit 62fe53
    set i 0
Packit 62fe53
    if { [string index [lindex $args 0] 0] == "-" } {
Packit 62fe53
	for { set i 0 } { $i < [llength $args] } { incr i } {
Packit 62fe53
	    if { [lindex $args $i] == "--" } {
Packit 62fe53
		incr i
Packit 62fe53
		break
Packit 62fe53
	    } elseif { [lindex $args $i] == "-n" } {
Packit 62fe53
		set newline 0
Packit 62fe53
	    } elseif { [lindex $args $i] == "-log" } {
Packit 62fe53
		set logfile 1
Packit 62fe53
	    } elseif { [lindex $args $i] == "-x" } {
Packit 62fe53
		set xml 1
Packit 62fe53
	    } elseif { [string index [lindex $args $i] 0] == "-" } {
Packit 62fe53
		clone_output "ERROR: verbose: illegal argument: [lindex $args $i]"
Packit 62fe53
		return
Packit 62fe53
	    } else {
Packit 62fe53
		break
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	if { [llength $args] == $i } {
Packit 62fe53
	    clone_output "ERROR: verbose: nothing to print"
Packit 62fe53
	    return
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set level 1
Packit 62fe53
    if { [llength $args] > $i + 1 } {
Packit 62fe53
	set level [lindex $args [expr { $i + 1 }]]
Packit 62fe53
    }
Packit 62fe53
    set message [lindex $args $i]
Packit 62fe53
Packit 62fe53
    if { $verbose >= $level } {
Packit 62fe53
	# We assume send_user also sends the text to the log file (which
Packit 62fe53
	# appears to be the case though the docs aren't clear on this).
Packit 62fe53
	if { $newline } {
Packit 62fe53
	    send_user -- "$message\n"
Packit 62fe53
	} else {
Packit 62fe53
	    send_user -- "$message"
Packit 62fe53
	}
Packit 62fe53
    } elseif { $logfile } {
Packit 62fe53
	if { $newline } {
Packit 62fe53
	    send_log -- "$message\n"
Packit 62fe53
	} else {
Packit 62fe53
	    send_log -- "$message"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Transform a tool name to get the installed name.
Packit 62fe53
# target_triplet is the canonical target name.  target_alias is the
Packit 62fe53
# target name used when configure was run.
Packit 62fe53
#
Packit 62fe53
proc transform { name } {
Packit 62fe53
    global target_triplet
Packit 62fe53
    global target_alias
Packit 62fe53
    global host_triplet
Packit 62fe53
    global board
Packit 62fe53
Packit 62fe53
    if {[string match $target_triplet $host_triplet]} {
Packit 62fe53
	return $name
Packit 62fe53
    }
Packit 62fe53
    if {[string match "native" $target_triplet]} {
Packit 62fe53
	return $name
Packit 62fe53
    }
Packit 62fe53
    if {[board_info host exists no_transform_name]} {
Packit 62fe53
	return $name
Packit 62fe53
    }
Packit 62fe53
    if {[string match "" $target_triplet]} {
Packit 62fe53
	return $name
Packit 62fe53
    } else {
Packit 62fe53
	if {[info exists board]} {
Packit 62fe53
	    if {[board_info $board exists target_install]} {
Packit 62fe53
		set target_install [board_info $board target_install]
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	if {[target_info exists target_install]} {
Packit 62fe53
	    set target_install [target_info target_install]
Packit 62fe53
	}
Packit 62fe53
	if {[info exists target_alias]} {
Packit 62fe53
	    set tmp ${target_alias}-${name}
Packit 62fe53
	} elseif {[info exists target_install]} {
Packit 62fe53
	    if { [lsearch -exact $target_install $target_alias] >= 0 } {
Packit 62fe53
		set tmp ${target_alias}-${name}
Packit 62fe53
	    } else {
Packit 62fe53
		set tmp "[lindex $target_install 0]-${name}"
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	verbose "Transforming $name to $tmp"
Packit 62fe53
	return $tmp
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# findfile arg0 [arg1] [arg2]
Packit 62fe53
#
Packit 62fe53
# Find a file and see if it exists. If you only care about the false
Packit 62fe53
# condition, then you'll need to pass a null "" for arg1.
Packit 62fe53
#	arg0 is the filename to look for. If the only arg,
Packit 62fe53
#            then that's what gets returned. If this is the
Packit 62fe53
#            only arg, then if it exists, arg0 gets returned.
Packit 62fe53
#            if it doesn't exist, return only the prog name.
Packit 62fe53
#       arg1 is optional, and it's what gets returned if
Packit 62fe53
#	     the file exists.
Packit 62fe53
#       arg2 is optional, and it's what gets returned if
Packit 62fe53
#            the file doesn't exist.
Packit 62fe53
#
Packit 62fe53
proc findfile { args } {
Packit 62fe53
    # look for the file
Packit 62fe53
    verbose "Seeing if [lindex $args 0] exists." 2
Packit 62fe53
    if {[file exists [lindex $args 0]]} {
Packit 62fe53
	if { [llength $args] > 1 } {
Packit 62fe53
	    verbose "Found file, returning [lindex $args 1]"
Packit 62fe53
	    return [lindex $args 1]
Packit 62fe53
	} else {
Packit 62fe53
	    verbose "Found file, returning [lindex $args 0]"
Packit 62fe53
	    return [lindex $args 0]
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	if { [llength $args] > 2 } {
Packit 62fe53
	    verbose "Didn't find file [lindex $args 0], returning [lindex $args 2]"
Packit 62fe53
	    return [lindex $args 2]
Packit 62fe53
	} else {
Packit 62fe53
	    verbose "Didn't find file, returning [file tail [lindex $args 0]]"
Packit 62fe53
	    return [transform [file tail [lindex $args 0]]]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# load_file [-1] [--] file1 [ file2 ... ]
Packit 62fe53
#
Packit 62fe53
# Utility to source a file.  All are sourced in order unless the flag "-1"
Packit 62fe53
# is given in which case we stop after finding the first one.
Packit 62fe53
# The result is 1 if a file was found, 0 if not.
Packit 62fe53
# If a tcl error occurs while sourcing a file, we print an error message
Packit 62fe53
# and exit.
Packit 62fe53
#
Packit 62fe53
proc load_file { args } {
Packit 62fe53
    set i 0
Packit 62fe53
    set only_one 0
Packit 62fe53
    if { [lindex $args $i] == "-1" } {
Packit 62fe53
	set only_one 1
Packit 62fe53
	incr i
Packit 62fe53
    }
Packit 62fe53
    if { [lindex $args $i] == "--" } {
Packit 62fe53
	incr i
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set found 0
Packit 62fe53
    foreach file [lrange $args $i end] {
Packit 62fe53
	verbose "Looking for $file" 2
Packit 62fe53
	# In Tcl, "file exists" fails if the filename looks like
Packit 62fe53
	# ~/FILE and the environment variable HOME does not exist.
Packit 62fe53
	if {! [catch {file exists $file} result] && $result} {
Packit 62fe53
	    set found 1
Packit 62fe53
	    verbose "Found $file"
Packit 62fe53
	    if { [catch "uplevel #0 source $file"] == 1 } {
Packit 62fe53
		send_error "ERROR: tcl error sourcing $file.\n"
Packit 62fe53
		global errorInfo
Packit 62fe53
		if {[info exists errorInfo]} {
Packit 62fe53
		    send_error "$errorInfo\n"
Packit 62fe53
		}
Packit 62fe53
		exit 1
Packit 62fe53
	    }
Packit 62fe53
	    if { $only_one } {
Packit 62fe53
		break
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return $found
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# search_and_load_file -- search DIRLIST looking for FILELIST.
Packit 62fe53
# TYPE is used when displaying error and progress messages.
Packit 62fe53
#
Packit 62fe53
proc search_and_load_file { type filelist dirlist } {
Packit 62fe53
    set found 0
Packit 62fe53
Packit 62fe53
    foreach dir $dirlist {
Packit 62fe53
	foreach initfile $filelist {
Packit 62fe53
	    verbose "Looking for $type ${dir}/${initfile}" 2
Packit 62fe53
	    if {[file exists [file join ${dir} ${initfile}]]} {
Packit 62fe53
		set found 1
Packit 62fe53
		set error ""
Packit 62fe53
		if { ${type} != "library file" } {
Packit 62fe53
		    send_user "Using ${dir}/${initfile} as ${type}.\n"
Packit 62fe53
		} else {
Packit 62fe53
		    verbose "Loading ${dir}/${initfile}"
Packit 62fe53
		}
Packit 62fe53
		if {[catch "uplevel #0 source ${dir}/${initfile}" error] == 1} {
Packit 62fe53
		    global errorInfo
Packit 62fe53
		    send_error "ERROR: tcl error sourcing ${type} ${dir}/${initfile}.\n${error}\n"
Packit 62fe53
		    if {[info exists errorInfo]} {
Packit 62fe53
			send_error "$errorInfo\n"
Packit 62fe53
		    }
Packit 62fe53
		    exit 1
Packit 62fe53
		}
Packit 62fe53
		break
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	if { $found } {
Packit 62fe53
	    break
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return $found
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Give a usage statement.
Packit 62fe53
#
Packit 62fe53
proc usage { } {
Packit 62fe53
    global tool
Packit 62fe53
Packit 62fe53
    send_user "USAGE: runtest \[options...\]\n"
Packit 62fe53
    send_user "\t--all, -a\t\tPrint all test output to screen\n"
Packit 62fe53
    send_user "\t--build \[triplet\]\tThe canonical triplet of the build machine\n"
Packit 62fe53
    send_user "\t--debug\t\t\tSet expect debugging ON\n"
Packit 62fe53
    send_user "\t--directory name\tRun only the tests in directory 'name'\n"
Packit 62fe53
    send_user "\t--help\t\t\tPrint help text\n"
Packit 62fe53
    send_user "\t--host \[triplet\]\tThe canonical triplet of the host machine\n"
Packit 62fe53
    send_user "\t--host_board \[name\]\tThe host board to use\n"
Packit 62fe53
    send_user "\t--ignore \[name(s)\]\tThe names of specific tests to ignore\n"
Packit 62fe53
    send_user "\t--log_dialog\t\t\Emit Expect output on stdout\n"
Packit 62fe53
    send_user "\t--mail \[name(s)\]\tWhom to mail the results to\n"
Packit 62fe53
    send_user "\t--objdir \[name\]\t\tThe test suite binary directory\n"
Packit 62fe53
    send_user "\t--outdir \[name\]\t\tThe directory to put logs in\n"
Packit 62fe53
    send_user "\t--reboot\t\tReboot the target (if supported)\n"
Packit 62fe53
    send_user "\t--srcdir \[name\]\t\tThe test suite source code directory\n"
Packit 62fe53
    send_user "\t--status\t\tSet the exit status to fail on Tcl errors\n"
Packit 62fe53
    send_user "\t--strace \[number\]\tTurn on Expect tracing\n"
Packit 62fe53
    send_user "\t--target \[triplet\]\tThe canonical triplet of the target board\n"
Packit 62fe53
    send_user "\t--target_board \[name(s)\] The list of target boards to run tests on\n"
Packit 62fe53
    send_user "\t--tool \[name(s)\]\tRun tests on these tools\n"
Packit 62fe53
    send_user "\t--tool_exec \[name\]\tThe path to the tool executable to test\n"
Packit 62fe53
    send_user "\t--tool_opts \[options\]\tA list of additional options to pass to the tool\n"
Packit 62fe53
    send_user "\t--verbose, -v\t\tProduce verbose output\n"
Packit 62fe53
    send_user "\t--version, -V\t\tPrint all relevant version numbers\n"
Packit 62fe53
    send_user "\t--xml, -x\t\tWrite out an XML results file\n"
Packit 62fe53
    send_user "\t--D\[0-1\]\t\tTcl debugger\n"
Packit 62fe53
    send_user "\tscript.exp\[=arg(s)\]\tRun these tests only\n"
Packit 62fe53
    if { [info exists tool] } {
Packit 62fe53
	if { [info procs ${tool}_option_help] != "" } {
Packit 62fe53
	    ${tool}_option_help
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Parse the arguments the first time looking for these.  We will ultimately
Packit 62fe53
# parse them twice.  Things are complicated because:
Packit 62fe53
# - we want to parse --verbose early on
Packit 62fe53
# - we don't want config files to override command line arguments
Packit 62fe53
#   (eg: $base_dir/$configfile vs --host/--target)
Packit 62fe53
# - we need some command line arguments before we can process some config files
Packit 62fe53
#   (eg: --objdir before $objdir/$configfile, --host/--target before $DEJAGNU)
Packit 62fe53
# The use of `arg_host_triplet' and `arg_target_triplet' lets us avoid parsing
Packit 62fe53
# the arguments three times.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
set arg_host_triplet ""
Packit 62fe53
set arg_target_triplet ""
Packit 62fe53
set arg_build_triplet ""
Packit 62fe53
set argc [ llength $argv ]
Packit 62fe53
for { set i 0 } { $i < $argc } { incr i } {
Packit 62fe53
    set option [lindex $argv $i]
Packit 62fe53
Packit 62fe53
    # make all options have two hyphens
Packit 62fe53
    switch -glob -- $option {
Packit 62fe53
	"--*" {
Packit 62fe53
	}
Packit 62fe53
	"-*" {
Packit 62fe53
	    set option "-$option"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # split out the argument for options that take them
Packit 62fe53
    switch -glob -- $option {
Packit 62fe53
	"--*=*" {
Packit 62fe53
	    regexp {^[^=]*=(.*)$} $option nil optarg
Packit 62fe53
	}
Packit 62fe53
	"--bu*" -
Packit 62fe53
	"--ho*" -
Packit 62fe53
	"--ig*"  -
Packit 62fe53
	"--m*"  -
Packit 62fe53
	"--n*"  -
Packit 62fe53
	"--ob*" -
Packit 62fe53
	"--ou*" -
Packit 62fe53
	"--sr*" -
Packit 62fe53
	"--str*" -
Packit 62fe53
	"--ta*" -
Packit 62fe53
	"--di*" -
Packit 62fe53
	"--to*" {
Packit 62fe53
	    incr i
Packit 62fe53
	    set optarg [lindex $argv $i]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    switch -glob -- $option {
Packit 62fe53
	"--bu*" {			# (--build) the build host configuration
Packit 62fe53
	    set arg_build_triplet $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--host_bo*" {
Packit 62fe53
	    set host_board $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ho*" {			# (--host) the host configuration
Packit 62fe53
	    set arg_host_triplet $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ob*" {			# (--objdir) where the test case object code lives
Packit 62fe53
	    set objdir $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--sr*" {			# (--srcdir) where the testsuite source code lives
Packit 62fe53
	    set srcdir $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--target_bo*" {
Packit 62fe53
	    set target_list $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ta*" {			# (--target) the target configuration
Packit 62fe53
	    set arg_target_triplet $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--tool_opt*" {
Packit 62fe53
	    set TOOL_OPTIONS $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--tool_exec*" {
Packit 62fe53
	    set TOOL_EXECUTABLE $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--to*" {			# (--tool) specify tool name
Packit 62fe53
	    set tool $optarg
Packit 62fe53
	    set comm_line_tool $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--di*" {
Packit 62fe53
	    set cmdline_dir_to_run $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--v" -
Packit 62fe53
	"--verb*" {			# (--verbose) verbose output
Packit 62fe53
	    incr verbose
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"[A-Z0-9_-.]*=*" { # process makefile style args like CC=gcc, etc...
Packit 62fe53
	    if {[regexp "^(\[A-Z0-9_-\]+)=(.*)$" $option junk var val]} {
Packit 62fe53
		set $var $val
Packit 62fe53
		verbose "$var is now $val"
Packit 62fe53
		append makevars "set $var $val;" ;# FIXME: Used anywhere?
Packit 62fe53
		unset junk var val
Packit 62fe53
	    } else {
Packit 62fe53
		send_error "Illegal variable specification:\n"
Packit 62fe53
		send_error "$option\n"
Packit 62fe53
	    }
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
verbose "Verbose level is $verbose"
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# get the users login name
Packit 62fe53
#
Packit 62fe53
if {[string match "" $logname]} {
Packit 62fe53
    if {[info exists env(USER)]} {
Packit 62fe53
	set logname $env(USER)
Packit 62fe53
    } else {
Packit 62fe53
	if {[info exists env(LOGNAME)]} {
Packit 62fe53
	    set logname $env(LOGNAME)
Packit 62fe53
	} else {
Packit 62fe53
	    # try getting it with whoami
Packit 62fe53
	    catch "set logname [exec whoami]" tmp
Packit 62fe53
	    if {[string match "*couldn't find*to execute*" $tmp]} {
Packit 62fe53
		# try getting it with who am i
Packit 62fe53
		unset tmp
Packit 62fe53
		catch "set logname [exec who am i]" tmp
Packit 62fe53
		if {[string match "*Command not found*" $tmp]} {
Packit 62fe53
		    send_user "ERROR: couldn't get the users login name\n"
Packit 62fe53
		    set logname "Unknown"
Packit 62fe53
		} else {
Packit 62fe53
		    set logname [lindex [split $logname " !"] 1]
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# lookfor_file -- try to find a file by searching up multiple directory levels
Packit 62fe53
#
Packit 62fe53
proc lookfor_file { dir name } {
Packit 62fe53
    foreach x ". .. ../.. ../../.. ../../../.." {
Packit 62fe53
	verbose "$dir/$x/$name" 2
Packit 62fe53
	if {[file exists [file join $dir $name]]} {
Packit 62fe53
	    return [file join $dir $name]
Packit 62fe53
	}
Packit 62fe53
	set dir [remote_file build dirname $dir]
Packit 62fe53
    }
Packit 62fe53
    return ""
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# load_lib -- load a library by sourcing it
Packit 62fe53
#
Packit 62fe53
# If there a multiple files with the same name, stop after the first one found.
Packit 62fe53
# The order is first look in the install dir, then in a parallel dir in the
Packit 62fe53
# source tree (up one or two levels), then in the current dir.
Packit 62fe53
#
Packit 62fe53
proc load_lib { file } {
Packit 62fe53
    global verbose libdir libdirs srcdir base_dir execpath tool
Packit 62fe53
    global loaded_libs
Packit 62fe53
Packit 62fe53
    if {[info exists loaded_libs($file)]} {
Packit 62fe53
	return
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set loaded_libs($file) ""
Packit 62fe53
    set search_dirs [list ../lib $libdir $libdir/lib [file dirname [file dirname $srcdir]]/dejagnu/lib $srcdir/lib $execpath/lib . [file dirname [file dirname [file dirname $srcdir]]]/dejagnu/lib]
Packit 62fe53
    if {[info exists libdirs]} {
Packit 62fe53
        lappend search_dirs $libdirs
Packit 62fe53
    }
Packit 62fe53
    if { [search_and_load_file "library file" $file $search_dirs ] == 0 } {
Packit 62fe53
	send_error "ERROR: Couldn't find library file $file.\n"
Packit 62fe53
	exit 1
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
verbose "Login name is $logname"
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Begin sourcing the config files.
Packit 62fe53
# All are sourced in order.
Packit 62fe53
#
Packit 62fe53
# Search order:
Packit 62fe53
#	$base_dir/$configfile -> $objdir/$configfile ->
Packit 62fe53
#	installed -> $DEJAGNU -> $HOME/.dejagnurc
Packit 62fe53
#
Packit 62fe53
# For the normal case, we rely on $base_dir/$configfile to set
Packit 62fe53
# host_triplet and target_triplet.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
load_file $base_dir/$configfile
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# If objdir didn't get set in $base_dir/$configfile, set it to $base_dir.
Packit 62fe53
# Make sure we source $objdir/$configfile in case $base_dir/$configfile doesn't
Packit 62fe53
# exist and objdir was given on the command line.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
if {[expr {[string match "." $objdir] || [string match $srcdir $objdir]}]} {
Packit 62fe53
    set objdir $base_dir
Packit 62fe53
} else {
Packit 62fe53
    load_file $objdir/$configfile
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Well, this just demonstrates the real problem...
Packit 62fe53
if {![info exists tool_root_dir]} {
Packit 62fe53
    set tool_root_dir [file dirname $objdir]
Packit 62fe53
    if {[file exists [file join $tool_root_dir testsuite]]} {
Packit 62fe53
	set tool_root_dir [file dirname $tool_root_dir]
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
verbose "Using test sources in $srcdir"
Packit 62fe53
verbose "Using test binaries in $objdir"
Packit 62fe53
verbose "Tool root directory is $tool_root_dir"
Packit 62fe53
Packit 62fe53
set execpath [file dirname $argv0]
Packit 62fe53
set libdir   [file dirname $execpath]/dejagnu
Packit 62fe53
if {[info exists env(DEJAGNULIBS)]} {
Packit 62fe53
    set libdir $env(DEJAGNULIBS)
Packit 62fe53
}
Packit 62fe53
# list of extra search directories used by load_lib to look for libs
Packit 62fe53
set libdirs {}
Packit 62fe53
Packit 62fe53
verbose "Using $libdir to find libraries"
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# If the host or target was given on the command line, override the above
Packit 62fe53
# config files.  We allow $DEJAGNU to massage them though in case it would
Packit 62fe53
# ever want to do such a thing.
Packit 62fe53
#
Packit 62fe53
if { $arg_host_triplet != "" } {
Packit 62fe53
    set host_triplet $arg_host_triplet
Packit 62fe53
}
Packit 62fe53
if { $arg_build_triplet != "" } {
Packit 62fe53
    set build_triplet $arg_build_triplet
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# If we only specify --host, then that must be the build machine too,
Packit 62fe53
# and we're stuck using the old functionality of a simple cross test.
Packit 62fe53
if {[expr { $build_triplet == ""  &&  $host_triplet != "" } ]} {
Packit 62fe53
    set build_triplet $host_triplet
Packit 62fe53
}
Packit 62fe53
# If we only specify --build, then we'll use that as the host too.
Packit 62fe53
if {[expr { $build_triplet != "" && $host_triplet == "" } ]} {
Packit 62fe53
    set host_triplet $build_triplet
Packit 62fe53
}
Packit 62fe53
unset arg_host_triplet arg_build_triplet
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# If the build machine type hasn't been specified by now, use config.guess.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
if {[expr {$build_triplet == "" && $host_triplet == ""}]} {
Packit 62fe53
    # find config.guess
Packit 62fe53
    foreach dir "$libdir $libdir/libexec $libdir/.. $execpath $srcdir $srcdir/.. $srcdir/../.." {
Packit 62fe53
	verbose "Looking for ${dir}/config.guess" 2
Packit 62fe53
	if {[file exists [file join ${dir} config.guess]]} {
Packit 62fe53
	    set config_guess [file join ${dir} config.guess]
Packit 62fe53
	    verbose "Found [file join ${dir} config.guess]"
Packit 62fe53
	    break
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # get the canonical triplet
Packit 62fe53
    if {![info exists config_guess]} {
Packit 62fe53
	send_error "ERROR: Couldn't find config.guess program.\n"
Packit 62fe53
	exit 1
Packit 62fe53
    }
Packit 62fe53
    catch "exec $config_guess" build_triplet
Packit 62fe53
    switch -- $build_triplet {
Packit 62fe53
	"No uname command or uname output not recognized" -
Packit 62fe53
	"Unable to guess system type" {
Packit 62fe53
	    verbose "WARNING: Uname output not recognized"
Packit 62fe53
	    set build_triplet unknown
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    verbose "Assuming build host is $build_triplet"
Packit 62fe53
    if { $host_triplet == "" } {
Packit 62fe53
	set host_triplet $build_triplet
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Figure out the target. If the target hasn't been specified, then we have to
Packit 62fe53
# assume we are native.
Packit 62fe53
#
Packit 62fe53
if { $arg_target_triplet != "" } {
Packit 62fe53
    set target_triplet $arg_target_triplet
Packit 62fe53
} elseif { $target_triplet == "" } {
Packit 62fe53
    set target_triplet $build_triplet
Packit 62fe53
    verbose "Assuming native target is $target_triplet" 2
Packit 62fe53
}
Packit 62fe53
unset arg_target_triplet
Packit 62fe53
#
Packit 62fe53
# Default target_alias to target_triplet.
Packit 62fe53
#
Packit 62fe53
if {![info exists target_alias]} {
Packit 62fe53
    set target_alias $target_triplet
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc get_local_hostname { } {
Packit 62fe53
    if {[catch "info hostname" hb]} {
Packit 62fe53
	set hb ""
Packit 62fe53
    } else {
Packit 62fe53
	regsub "\\..*$" $hb "" hb
Packit 62fe53
    }
Packit 62fe53
    verbose "hostname=$hb" 3
Packit 62fe53
    return $hb
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# We put these here so that they can be overridden later by site.exp or
Packit 62fe53
# friends.
Packit 62fe53
#
Packit 62fe53
# Set up the target as machine NAME. We also load base-config.exp as a
Packit 62fe53
# default configuration. The config files are sourced with the global
Packit 62fe53
# variable $board set to the name of the current target being defined.
Packit 62fe53
#
Packit 62fe53
proc setup_target_hook { whole_name name } {
Packit 62fe53
    global board
Packit 62fe53
    global host_board
Packit 62fe53
Packit 62fe53
    if {[info exists host_board]} {
Packit 62fe53
	set hb $host_board
Packit 62fe53
    } else {
Packit 62fe53
	set hb [get_local_hostname]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set board $whole_name
Packit 62fe53
Packit 62fe53
    global board_type
Packit 62fe53
    set board_type "target"
Packit 62fe53
Packit 62fe53
    load_config base-config.exp
Packit 62fe53
    if {![load_board_description ${name} ${whole_name} ${hb}]} {
Packit 62fe53
	if { $name != "unix" } {
Packit 62fe53
	    perror "couldn't load description file for ${name}"
Packit 62fe53
	    exit 1
Packit 62fe53
	} else {
Packit 62fe53
	    load_generic_config "unix"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[board_info $board exists generic_name]} {
Packit 62fe53
	load_tool_target_config [board_info $board generic_name]
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    unset board
Packit 62fe53
    unset board_type
Packit 62fe53
Packit 62fe53
    push_target $whole_name
Packit 62fe53
Packit 62fe53
    if { [info procs ${whole_name}_init] != "" } {
Packit 62fe53
	${whole_name}_init $whole_name
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { ![isnative] && ![is_remote target] } {
Packit 62fe53
	global env build_triplet target_triplet
Packit 62fe53
	if { (![info exists env(DEJAGNU)]) && ($build_triplet != $target_triplet) } {
Packit 62fe53
	    warning "Assuming target board is the local machine (which is probably wrong).\nYou may need to set your DEJAGNU environment variable."
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Clean things up afterwards.
Packit 62fe53
#
Packit 62fe53
proc cleanup_target_hook { name } {
Packit 62fe53
    global tool
Packit 62fe53
    # Clean up the target board.
Packit 62fe53
    if { [info procs "${name}_exit"] != "" } {
Packit 62fe53
	${name}_exit
Packit 62fe53
    }
Packit 62fe53
    # We also call the tool exit routine here.
Packit 62fe53
    if {[info exists tool]} {
Packit 62fe53
	if { [info procs "${tool}_exit"] != "" } {
Packit 62fe53
	    ${tool}_exit
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    remote_close target
Packit 62fe53
    pop_target
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc setup_host_hook { name } {
Packit 62fe53
    global board
Packit 62fe53
    global board_info
Packit 62fe53
    global board_type
Packit 62fe53
Packit 62fe53
    set board $name
Packit 62fe53
    set board_type "host"
Packit 62fe53
Packit 62fe53
    load_board_description $name
Packit 62fe53
    unset board
Packit 62fe53
    unset board_type
Packit 62fe53
    push_host $name
Packit 62fe53
    if { [info procs ${name}_init] != "" } {
Packit 62fe53
	${name}_init $name
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc setup_build_hook { name } {
Packit 62fe53
    global board
Packit 62fe53
    global board_info
Packit 62fe53
    global board_type
Packit 62fe53
Packit 62fe53
    set board $name
Packit 62fe53
    set board_type "build"
Packit 62fe53
Packit 62fe53
    load_board_description $name
Packit 62fe53
    unset board
Packit 62fe53
    unset board_type
Packit 62fe53
    push_build $name
Packit 62fe53
    if { [info procs ${name}_init] != "" } {
Packit 62fe53
	${name}_init $name
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Find and load the global config file if it exists.
Packit 62fe53
# The global config file is used to set the connect mode and other
Packit 62fe53
# parameters specific to each particular target.
Packit 62fe53
# These files assume the host and target have been set.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
if { [load_file -- $libdir/$configfile] == 0 } {
Packit 62fe53
    # If $DEJAGNU isn't set either then there isn't any global config file.
Packit 62fe53
    # Warn the user as there really should be one.
Packit 62fe53
    if { ! [info exists env(DEJAGNU)] } {
Packit 62fe53
	send_error "WARNING: Couldn't find the global config file.\n"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
if {[info exists env(DEJAGNU)]} {
Packit 62fe53
    if { [load_file -- $env(DEJAGNU)] == 0 } {
Packit 62fe53
	# It may seem odd to only issue a warning if there isn't a global
Packit 62fe53
	# config file, but issue an error if $DEJAGNU is erroneously defined.
Packit 62fe53
	# Since $DEJAGNU is set there is *supposed* to be a global config file,
Packit 62fe53
	# so the current behaviour seems reasonable.
Packit 62fe53
	send_error "WARNING: global config file $env(DEJAGNU) not found.\n"
Packit 62fe53
    }
Packit 62fe53
    if {![info exists boards_dir]} {
Packit 62fe53
	set boards_dir "[file dirname $env(DEJAGNU)]/boards"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Load user .dejagnurc file last as the ultimate override.
Packit 62fe53
load_file ~/.dejagnurc
Packit 62fe53
Packit 62fe53
if {![info exists boards_dir]} {
Packit 62fe53
    set boards_dir ""
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# parse out the config parts of the triplet name
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
# build values
Packit 62fe53
if { $build_cpu == "" } {
Packit 62fe53
    regsub -- "-.*-.*" ${build_triplet} "" build_cpu
Packit 62fe53
}
Packit 62fe53
if { $build_vendor == "" } {
Packit 62fe53
    regsub -- "^\[a-z0-9\]*-" ${build_triplet} "" build_vendor
Packit 62fe53
    regsub -- "-.*" ${build_vendor} "" build_vendor
Packit 62fe53
}
Packit 62fe53
if { $build_os == "" } {
Packit 62fe53
    regsub -- ".*-.*-" ${build_triplet} "" build_os
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# host values
Packit 62fe53
if { $host_cpu == "" } {
Packit 62fe53
    regsub -- "-.*-.*" ${host_triplet} "" host_cpu
Packit 62fe53
}
Packit 62fe53
if { $host_vendor == "" } {
Packit 62fe53
    regsub -- "^\[a-z0-9\]*-" ${host_triplet} "" host_vendor
Packit 62fe53
    regsub -- "-.*" ${host_vendor} "" host_vendor
Packit 62fe53
}
Packit 62fe53
if { $host_os == "" } {
Packit 62fe53
    regsub -- ".*-.*-" ${host_triplet} "" host_os
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# target values
Packit 62fe53
if { $target_cpu == "" } {
Packit 62fe53
    regsub -- "-.*-.*" ${target_triplet} "" target_cpu
Packit 62fe53
}
Packit 62fe53
if { $target_vendor == "" } {
Packit 62fe53
    regsub -- "^\[a-z0-9\]*-" ${target_triplet} "" target_vendor
Packit 62fe53
    regsub -- "-.*" ${target_vendor} "" target_vendor
Packit 62fe53
}
Packit 62fe53
if { $target_os == "" } {
Packit 62fe53
    regsub -- ".*-.*-" ${target_triplet} "" target_os
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Load the primary tool initialization file.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc load_tool_init { file } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global loaded_libs
Packit 62fe53
Packit 62fe53
    if {[info exists loaded_libs($file)]} {
Packit 62fe53
	return
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set loaded_libs($file) ""
Packit 62fe53
Packit 62fe53
    if {[file exists [file join ${srcdir} lib $file]]} {
Packit 62fe53
	verbose "Loading library file ${srcdir}/lib/$file"
Packit 62fe53
	if { [catch "uplevel #0 source ${srcdir}/lib/$file"] == 1 } {
Packit 62fe53
	    send_error "ERROR: tcl error sourcing library file ${srcdir}/lib/$file.\n"
Packit 62fe53
	    global errorInfo
Packit 62fe53
	    if {[info exists errorInfo]} {
Packit 62fe53
		send_error "$errorInfo\n"
Packit 62fe53
	    }
Packit 62fe53
	    exit 1
Packit 62fe53
	}
Packit 62fe53
    } else {
Packit 62fe53
	warning "Couldn't find tool init file"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# load the testing framework libraries
Packit 62fe53
#
Packit 62fe53
load_lib utils.exp
Packit 62fe53
load_lib framework.exp
Packit 62fe53
load_lib debugger.exp
Packit 62fe53
load_lib remote.exp
Packit 62fe53
load_lib target.exp
Packit 62fe53
load_lib targetdb.exp
Packit 62fe53
load_lib libgloss.exp
Packit 62fe53
Packit 62fe53
# Initialize the test counters and reset them to 0.
Packit 62fe53
init_testcounts
Packit 62fe53
reset_vars
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Parse the command line arguments.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
# Load the tool initialization file. Allow the --tool option to override
Packit 62fe53
# what's set in the site.exp file.
Packit 62fe53
if {[info exists comm_line_tool]} {
Packit 62fe53
    set tool $comm_line_tool
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
if {[info exists tool]} {
Packit 62fe53
    load_tool_init ${tool}.exp
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
set argc [ llength $argv ]
Packit 62fe53
for { set i 0 } { $i < $argc } { incr i } {
Packit 62fe53
    set option [ lindex $argv $i ]
Packit 62fe53
Packit 62fe53
    # make all options have two hyphens
Packit 62fe53
    switch -glob -- $option {
Packit 62fe53
	"--*" {
Packit 62fe53
	}
Packit 62fe53
	"-*" {
Packit 62fe53
	    set option "-$option"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # split out the argument for options that take them
Packit 62fe53
    switch -glob -- $option {
Packit 62fe53
	"--*=*" {
Packit 62fe53
	    regexp {^[^=]*=(.*)$} $option nil optarg
Packit 62fe53
	}
Packit 62fe53
	"--bu*" -
Packit 62fe53
	"--ho*" -
Packit 62fe53
	"--ig*"  -
Packit 62fe53
	"--m*"  -
Packit 62fe53
	"--n*"  -
Packit 62fe53
	"--ob*" -
Packit 62fe53
	"--ou*" -
Packit 62fe53
	"--sr*" -
Packit 62fe53
	"--str*" -
Packit 62fe53
	"--ta*" -
Packit 62fe53
	"--di*" -
Packit 62fe53
	"--to*" {
Packit 62fe53
	    incr i
Packit 62fe53
	    set optarg [lindex $argv $i]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    switch -glob -- $option {
Packit 62fe53
	"--V*" -
Packit 62fe53
	"--vers*" {			# (--version) version numbers
Packit 62fe53
	    send_user "DejaGnu version\t$frame_version\n"
Packit 62fe53
	    send_user "Expect version\t[exp_version]\n"
Packit 62fe53
	    send_user "Tcl version\t[ info tclversion ]\n"
Packit 62fe53
	    exit 0
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--v*" {			# (--verbose) verbose output
Packit 62fe53
	    # Already parsed.
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--bu*" {			# (--build) the build host configuration
Packit 62fe53
	    # Already parsed (and don't set again).  Let $DEJAGNU rename it.
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ho*" {			# (--host) the host configuration
Packit 62fe53
	    # Already parsed (and don't set again).  Let $DEJAGNU rename it.
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--target_bo*" {
Packit 62fe53
	    # Set it again, father knows best.
Packit 62fe53
	    set target_list $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ta*" {			# (--target) the target configuration
Packit 62fe53
	    # Already parsed (and don't set again).  Let $DEJAGNU rename it.
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--a*" {			# (--all) print all test output to screen
Packit 62fe53
	    set all_flag 1
Packit 62fe53
	    verbose "Print all test output to screen"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--di*" {
Packit 62fe53
	    # Already parsed (and don't set again).  Let $DEJAGNU rename it.
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
Packit 62fe53
	"--de*" {			# (--debug) expect internal debugging
Packit 62fe53
	    if {[file exists ./dbg.log]} {
Packit 62fe53
		catch [file delete -force -- dbg.log]
Packit 62fe53
	    }
Packit 62fe53
	    if { $verbose > 2 } {
Packit 62fe53
		exp_internal -f dbg.log 1
Packit 62fe53
	    } else {
Packit 62fe53
		exp_internal -f dbg.log 0
Packit 62fe53
	    }
Packit 62fe53
	    verbose "Expect Debugging is ON"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--D[01]" {			# (-Debug) turn on Tcl debugger
Packit 62fe53
	    # The runtest shell script handles this option, but it
Packit 62fe53
	    # still appears in the options in the Tcl code.
Packit 62fe53
	    verbose "Tcl debugger is ON"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--m*" {			# (--mail) mail the output
Packit 62fe53
	    set mailing_list $optarg
Packit 62fe53
	    set mail_logs 1
Packit 62fe53
	    verbose "Mail results to $mailing_list"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--r*" {			# (--reboot) reboot the target
Packit 62fe53
	    set reboot 1
Packit 62fe53
	    verbose "Will reboot the target (if supported)"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ob*" {			# (--objdir) where the test case object code lives
Packit 62fe53
	    # Already parsed, but parse again to make sure command line
Packit 62fe53
	    # options override any config file.
Packit 62fe53
	    set objdir $optarg
Packit 62fe53
	    verbose "Using test binaries in $objdir"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ou*" {			# (--outdir) where to put the output files
Packit 62fe53
	    set outdir $optarg
Packit 62fe53
	    verbose "Test output put in $outdir"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--log_dialog*" {
Packit 62fe53
	    incr log_dialog
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"*.exp" {			#  specify test names to run
Packit 62fe53
	    set all_runtests($option) ""
Packit 62fe53
	    verbose "Running only tests $option"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"*.exp=*" {			#  specify test names to run
Packit 62fe53
	    set tmp [split $option "="]
Packit 62fe53
	    set all_runtests([lindex $tmp 0]) [lindex $tmp 1]
Packit 62fe53
	    verbose "Running only tests $option"
Packit 62fe53
	    unset tmp
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--ig*" {			#  (--ignore) specify test names to exclude
Packit 62fe53
	    set ignoretests $optarg
Packit 62fe53
	    verbose "Ignoring test $ignoretests"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--sr*" {			# (--srcdir) where the testsuite source code lives
Packit 62fe53
	    # Already parsed, but parse again to make sure command line
Packit 62fe53
	    # options override any config file.
Packit 62fe53
Packit 62fe53
	    set srcdir $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--str*" {			# (--strace) expect trace level
Packit 62fe53
	    set tracelevel $optarg
Packit 62fe53
	    strace $tracelevel
Packit 62fe53
	    verbose "Source Trace level is now $tracelevel"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--sta*" {			# (--status) exit status flag
Packit 62fe53
	    # preserved for compatability, do nothing
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--tool_opt*" {
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--tool_exec*" {
Packit 62fe53
	    set TOOL_EXECUTABLE $optarg
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--to*" {			# (--tool) specify tool name
Packit 62fe53
	    set tool $optarg
Packit 62fe53
	    verbose "Testing $tool"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--x*" {
Packit 62fe53
	    set xml 1
Packit 62fe53
	    verbose "XML logging turned on"
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"--he*" {			# (--help) help text
Packit 62fe53
	    usage
Packit 62fe53
	    exit 0
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	"[A-Z0-9_-.]*=*" { # skip makefile style args like CC=gcc, etc... (processed in first pass)
Packit 62fe53
	    continue
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	default {
Packit 62fe53
	    if {[info exists tool]} {
Packit 62fe53
		if { [info procs ${tool}_option_proc] != "" } {
Packit 62fe53
		    if {[${tool}_option_proc $option]} {
Packit 62fe53
			continue
Packit 62fe53
		    }
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	    send_error "\nIllegal Argument \"$option\"\n"
Packit 62fe53
	    send_error "try \"runtest --help\" for option list\n"
Packit 62fe53
	    exit 1
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# check for a few crucial variables
Packit 62fe53
#
Packit 62fe53
if {![info exists tool]} {
Packit 62fe53
    send_error "WARNING: No tool specified\n"
Packit 62fe53
    set tool ""
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# initialize a few Tcl variables to something other than their default
Packit 62fe53
#
Packit 62fe53
if { $verbose > 2 || $log_dialog } {
Packit 62fe53
    log_user 1
Packit 62fe53
} else {
Packit 62fe53
    log_user 0
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
set timeout 10
Packit 62fe53
Packit 62fe53
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# open log files
Packit 62fe53
#
Packit 62fe53
open_logs
Packit 62fe53
Packit 62fe53
# print the config info
Packit 62fe53
clone_output "Test run by $logname on [timestamp -format %c]"
Packit 62fe53
if {[is3way]} {
Packit 62fe53
    clone_output "Target is $target_triplet"
Packit 62fe53
    clone_output "Host   is $host_triplet"
Packit 62fe53
    clone_output "Build  is $build_triplet"
Packit 62fe53
} else {
Packit 62fe53
    if {[isnative]} {
Packit 62fe53
	clone_output "Native configuration is $target_triplet"
Packit 62fe53
    } else {
Packit 62fe53
	clone_output "Target is $target_triplet"
Packit 62fe53
	clone_output "Host   is $host_triplet"
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
clone_output "\n\t\t=== $tool tests ===\n"
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Look for the generic board configuration file. It searches in several
Packit 62fe53
# places: ${libdir}/config, ${libdir}/../config, and $boards_dir.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc load_generic_config { name } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global configfile
Packit 62fe53
    global libdir
Packit 62fe53
    global env
Packit 62fe53
    global board
Packit 62fe53
    global board_info
Packit 62fe53
    global boards_dir
Packit 62fe53
    global board_type
Packit 62fe53
Packit 62fe53
    if {[info exists board]} {
Packit 62fe53
	if {![info exists board_info($board,generic_name)]} {
Packit 62fe53
	    set board_info($board,generic_name) $name
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {[info exists board_type]} {
Packit 62fe53
	set type "for $board_type"
Packit 62fe53
    } else {
Packit 62fe53
	set type ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set dirlist [concat ${libdir}/config [file dirname $libdir]/config $boards_dir]
Packit 62fe53
    set result [search_and_load_file "generic interface file $type" ${name}.exp $dirlist]
Packit 62fe53
Packit 62fe53
    return $result
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Load the tool-specific target description.
Packit 62fe53
#
Packit 62fe53
proc load_config { args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global board_type
Packit 62fe53
Packit 62fe53
    set found 0
Packit 62fe53
Packit 62fe53
    return [search_and_load_file "tool-and-target-specific interface file" $args [list ${srcdir}/config ${srcdir}/../config ${srcdir}/../../config ${srcdir}/../../../config]]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Find the files that set up the configuration for the target. There
Packit 62fe53
# are assumed to be two of them; one defines a basic set of
Packit 62fe53
# functionality for the target that can be used by all tool
Packit 62fe53
# testsuites, and the other defines any necessary tool-specific
Packit 62fe53
# functionality. These files are loaded via load_config.
Packit 62fe53
#
Packit 62fe53
# These used to all be named $target_abbrev-$tool.exp, but as the
Packit 62fe53
# $tool variable goes away, it's now just $target_abbrev.exp.  First
Packit 62fe53
# we look for a file named with both the abbrev and the tool names.
Packit 62fe53
# Then we look for one named with just the abbrev name. Finally, we
Packit 62fe53
# look for a file called default, which is the default actions, as
Packit 62fe53
# some tools could be purely host based. Unknown is mostly for error
Packit 62fe53
# trapping.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc load_tool_target_config { name } {
Packit 62fe53
    global target_os libdir srcdir
Packit 62fe53
Packit 62fe53
    set found [load_config "${name}.exp" "${target_os}.exp" "default.exp" "unknown.exp"]
Packit 62fe53
Packit 62fe53
    if { $found == 0 } {
Packit 62fe53
	send_error "WARNING: Couldn't find tool config file for $name, using default.\n"
Packit 62fe53
	# If we can't load the tool init file, this must be a simple natively hosted
Packit 62fe53
	# test suite, so we use the default procs for Unix.
Packit 62fe53
	if { [search_and_load_file "library file" default.exp [list $libdir $libdir/config [file dirname [file dirname $srcdir]]/dejagnu/config $srcdir/config . [file dirname [file dirname [file dirname $srcdir]]]/dejagnu/config]] == 0 } {
Packit 62fe53
	    send_error "ERROR: Couldn't find default tool init file.\n"
Packit 62fe53
	    exit 1
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Find the file that describes the machine specified by board_name.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc load_board_description { board_name args } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global configfile
Packit 62fe53
    global libdir
Packit 62fe53
    global env
Packit 62fe53
    global board
Packit 62fe53
    global board_info
Packit 62fe53
    global boards_dir
Packit 62fe53
    global board_type
Packit 62fe53
Packit 62fe53
    set dejagnu ""
Packit 62fe53
Packit 62fe53
    if { [llength $args] > 0 } {
Packit 62fe53
	set whole_name [lindex $args 0]
Packit 62fe53
    } else {
Packit 62fe53
	set whole_name $board_name
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set board_info($whole_name,name) $whole_name
Packit 62fe53
    if {![info exists board]} {
Packit 62fe53
	set board $whole_name
Packit 62fe53
	set board_set 1
Packit 62fe53
    } else {
Packit 62fe53
	set board_set 0
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    set dirlist {}
Packit 62fe53
    if { [llength $args] > 1 } {
Packit 62fe53
	set suffix [lindex $args 1]
Packit 62fe53
	if { ${suffix} != "" } {
Packit 62fe53
	    foreach x ${boards_dir} {
Packit 62fe53
		lappend dirlist ${x}/${suffix}
Packit 62fe53
	    }
Packit 62fe53
	    lappend dirlist ${libdir}/baseboards/${suffix}
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    set dirlist [concat $dirlist $boards_dir]
Packit 62fe53
    lappend dirlist ${libdir}/baseboards
Packit 62fe53
    verbose "dirlist is $dirlist"
Packit 62fe53
    if {[info exists board_type]} {
Packit 62fe53
	set type "for $board_type"
Packit 62fe53
    } else {
Packit 62fe53
	set type ""
Packit 62fe53
    }
Packit 62fe53
    if {![info exists board_info($whole_name,isremote)]} {
Packit 62fe53
	set board_info($whole_name,isremote) 1
Packit 62fe53
	if {[info exists board_type]} {
Packit 62fe53
	    if { $board_type == "build" } {
Packit 62fe53
		set board_info($whole_name,isremote) 0
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	if { ${board_name} == [get_local_hostname] } {
Packit 62fe53
	    set board_info($whole_name,isremote) 0
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    search_and_load_file "standard board description file $type" standard.exp $dirlist
Packit 62fe53
    set found [search_and_load_file "board description file $type" ${board_name}.exp $dirlist]
Packit 62fe53
    if { $board_set != 0 } {
Packit 62fe53
	unset board
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    return $found
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Find the base-level file that describes the machine specified by args. We
Packit 62fe53
# only look in one directory, ${libdir}/baseboards.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc load_base_board_description { board_name } {
Packit 62fe53
    global srcdir
Packit 62fe53
    global configfile
Packit 62fe53
    global libdir
Packit 62fe53
    global env
Packit 62fe53
    global board
Packit 62fe53
    global board_info
Packit 62fe53
    global board_type
Packit 62fe53
Packit 62fe53
    set board_set 0
Packit 62fe53
    set board_info($board_name,name) $board_name
Packit 62fe53
    if {![info exists board]} {
Packit 62fe53
	set board $board_name
Packit 62fe53
	set board_set 1
Packit 62fe53
    }
Packit 62fe53
    if {[info exists board_type]} {
Packit 62fe53
	set type "for $board_type"
Packit 62fe53
    } else {
Packit 62fe53
	set type ""
Packit 62fe53
    }
Packit 62fe53
    if {![info exists board_info($board_name,isremote)]} {
Packit 62fe53
	set board_info($board_name,isremote) 1
Packit 62fe53
	if {[info exists board_type]} {
Packit 62fe53
	    if { $board_type == "build" } {
Packit 62fe53
		set board_info($board_name,isremote) 0
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if { ${board_name} == [get_local_hostname] } {
Packit 62fe53
	set board_info($board_name,isremote) 0
Packit 62fe53
    }
Packit 62fe53
    set found [search_and_load_file "board description file $type" ${board_name}.exp ${libdir}/baseboards]
Packit 62fe53
    if { $board_set != 0 } {
Packit 62fe53
	unset board
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    return $found
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Source the testcase in TEST_FILE_NAME.
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
proc runtest { test_file_name } {
Packit 62fe53
    global prms_id
Packit 62fe53
    global bug_id
Packit 62fe53
    global test_result
Packit 62fe53
    global errcnt
Packit 62fe53
    global errorInfo
Packit 62fe53
    global tool
Packit 62fe53
Packit 62fe53
    clone_output "Running $test_file_name ..."
Packit 62fe53
    set prms_id	0
Packit 62fe53
    set bug_id	0
Packit 62fe53
    set test_result ""
Packit 62fe53
Packit 62fe53
    if {[file exists $test_file_name]} {
Packit 62fe53
	set timestart [timestamp]
Packit 62fe53
Packit 62fe53
	if {[info exists tool]} {
Packit 62fe53
	    if { [info procs "${tool}_init"] != "" } {
Packit 62fe53
		${tool}_init $test_file_name
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if { [catch "uplevel #0 source $test_file_name"] == 1 } {
Packit 62fe53
	    # If we have a Tcl error, propagate the exit status so
Packit 62fe53
	    # that 'make' (if it invokes runtest) notices the error.
Packit 62fe53
	    global exit_status exit_error
Packit 62fe53
	    # exit error is set by the --status command line option
Packit 62fe53
	    if { $exit_status == 0 } {
Packit 62fe53
		set exit_status 2
Packit 62fe53
	    }
Packit 62fe53
	    # We can't call `perror' here, it resets `errorInfo'
Packit 62fe53
	    # before we want to look at it.  Also remember that perror
Packit 62fe53
	    # increments `errcnt'.  If we do call perror we'd have to
Packit 62fe53
	    # reset errcnt afterwards.
Packit 62fe53
	    clone_output "ERROR: tcl error sourcing $test_file_name."
Packit 62fe53
	    if {[info exists errorInfo]} {
Packit 62fe53
		clone_output "ERROR: $errorInfo"
Packit 62fe53
		unset errorInfo
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	if {[info exists tool]} {
Packit 62fe53
	    if { [info procs "${tool}_finish"] != "" } {
Packit 62fe53
		${tool}_finish
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	set timeend [timestamp]
Packit 62fe53
	set timediff [expr {$timeend - $timestart}]
Packit 62fe53
	verbose -log "testcase $test_file_name completed in $timediff seconds" 4
Packit 62fe53
    } else {
Packit 62fe53
	# This should never happen, but maybe if the file got removed
Packit 62fe53
	# between the `find' above and here.
Packit 62fe53
	perror "$test_file_name does not exist." 0
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
# Trap some signals so we know what's happening.  These replace the previous
Packit 62fe53
# ones because we've now loaded the library stuff.
Packit 62fe53
#
Packit 62fe53
if {![exp_debug]} {
Packit 62fe53
    foreach sig {{SIGINT {interrupted by user} 130} \
Packit 62fe53
		     {SIGQUIT {interrupted by user} 131} \
Packit 62fe53
		     {SIGTERM {terminated} 143}} {
Packit 62fe53
	set signal [lindex $sig 0]
Packit 62fe53
	set str [lindex $sig 1]
Packit 62fe53
	set code [lindex $sig 2]
Packit 62fe53
	trap "send_error \"got a \[trap -name\] signal, $str \\n\"; set exit_status $code; log_and_exit;" $signal
Packit 62fe53
	verbose "setting trap for $signal to $str" 1
Packit 62fe53
    }
Packit 62fe53
    unset signal str sig
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Given a list of targets, process any iterative lists.
Packit 62fe53
#
Packit 62fe53
proc process_target_variants { target_list } {
Packit 62fe53
    set result {}
Packit 62fe53
    foreach x $target_list {
Packit 62fe53
	if {[regexp "\\(" $x]} {
Packit 62fe53
	    regsub "^.*\\((\[^()\]*)\\)$" "$x" "\\1" variant_list
Packit 62fe53
	    regsub "\\(\[^(\]*$" "$x" "" x
Packit 62fe53
	    set list [process_target_variants $x]
Packit 62fe53
	    set result {}
Packit 62fe53
	    foreach x $list {
Packit 62fe53
		set result [concat $result [iterate_target_variants $x [split $variant_list ","]]]
Packit 62fe53
	    }
Packit 62fe53
	} elseif {[regexp "\{" $x]} {
Packit 62fe53
	    regsub "^.*\{(\[^\{\}\]*)\}$" "$x" "\\1" variant_list
Packit 62fe53
	    regsub "\{\[^\{\]*$" "$x" "" x
Packit 62fe53
	    set list [process_target_variants $x]
Packit 62fe53
	    foreach x $list {
Packit 62fe53
		foreach i [split $variant_list ","] {
Packit 62fe53
		    set name $x
Packit 62fe53
		    if { $i != "" } {
Packit 62fe53
			append name "/" $i
Packit 62fe53
		    }
Packit 62fe53
		    lappend result $name
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	} else {
Packit 62fe53
	    lappend result "$x"
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    return $result
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
proc iterate_target_variants { target variants } {
Packit 62fe53
    return [iterate_target_variants_two $target $target $variants]
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Given a list of variants, produce the list of all possible combinations.
Packit 62fe53
#
Packit 62fe53
proc iterate_target_variants_two { orig_target target variants } {
Packit 62fe53
Packit 62fe53
    if { [llength $variants] == 0 } {
Packit 62fe53
	return [list $target]
Packit 62fe53
    } else {
Packit 62fe53
	if { [llength $variants] > 1 } {
Packit 62fe53
	    set result [iterate_target_variants_two $orig_target $target [lrange $variants 1 end]]
Packit 62fe53
	} else {
Packit 62fe53
	    if { $target != $orig_target } {
Packit 62fe53
		set result [list $target]
Packit 62fe53
	    } else {
Packit 62fe53
		set result {}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	if { [lindex $variants 0] != "" } {
Packit 62fe53
	    append target "/" [lindex $variants 0]
Packit 62fe53
	    return [concat $result [iterate_target_variants_two $orig_target $target [lrange $variants 1 end]]]
Packit 62fe53
	} else {
Packit 62fe53
	    return [concat $result $target]
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
setup_build_hook [get_local_hostname]
Packit 62fe53
Packit 62fe53
if {[info exists host_board]} {
Packit 62fe53
    setup_host_hook $host_board
Packit 62fe53
} else {
Packit 62fe53
    set hb [get_local_hostname]
Packit 62fe53
    if { $hb != "" } {
Packit 62fe53
	setup_host_hook $hb
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# main test execution loop
Packit 62fe53
#
Packit 62fe53
Packit 62fe53
if {[info exists errorInfo]} {
Packit 62fe53
    unset errorInfo
Packit 62fe53
}
Packit 62fe53
# make sure we have only single path delimiters
Packit 62fe53
regsub -all "\(\[^/\]\)//*" $srcdir "\\1/" srcdir
Packit 62fe53
Packit 62fe53
if {![info exists target_list]} {
Packit 62fe53
    # Make sure there is at least one target machine. It's probably a Unix box,
Packit 62fe53
    # but that's just a guess.
Packit 62fe53
    set target_list { "unix" }
Packit 62fe53
} else {
Packit 62fe53
    verbose "target list is $target_list"
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
#
Packit 62fe53
# Iterate through the list of targets.
Packit 62fe53
#
Packit 62fe53
global current_target
Packit 62fe53
Packit 62fe53
set target_list [process_target_variants $target_list]
Packit 62fe53
Packit 62fe53
set target_count [llength $target_list]
Packit 62fe53
Packit 62fe53
clone_output "Schedule of variations:"
Packit 62fe53
foreach current_target $target_list {
Packit 62fe53
    clone_output "    $current_target"
Packit 62fe53
}
Packit 62fe53
clone_output ""
Packit 62fe53
Packit 62fe53
Packit 62fe53
foreach current_target $target_list {
Packit 62fe53
    verbose "target is $current_target"
Packit 62fe53
    set current_target_name $current_target
Packit 62fe53
    set tlist [split $current_target /]
Packit 62fe53
    set current_target [lindex $tlist 0]
Packit 62fe53
    set board_variant_list [lrange $tlist 1 end]
Packit 62fe53
Packit 62fe53
    # Set the counts for this target to 0.
Packit 62fe53
    reset_vars
Packit 62fe53
    clone_output "Running target $current_target_name"
Packit 62fe53
Packit 62fe53
    setup_target_hook $current_target_name $current_target
Packit 62fe53
Packit 62fe53
    # If multiple passes requested, set them up.  Otherwise prepare just one.
Packit 62fe53
    # The format of `MULTIPASS' is a list of elements containing
Packit 62fe53
    # "{ name var1=value1 ... }" where `name' is a generic name for the pass and
Packit 62fe53
    # currently has no other meaning.
Packit 62fe53
Packit 62fe53
    global env
Packit 62fe53
Packit 62fe53
    if { [info exists MULTIPASS] } {
Packit 62fe53
	set multipass $MULTIPASS
Packit 62fe53
    }
Packit 62fe53
    if { $multipass == "" } {
Packit 62fe53
	set multipass { "" }
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    # If PASS is specified, we want to run only the tests specified.
Packit 62fe53
    # Its value should be a number or a list of numbers that specify
Packit 62fe53
    # the passes that we want to run.
Packit 62fe53
    if {[info exists PASS]} {
Packit 62fe53
	set pass $PASS
Packit 62fe53
    } else {
Packit 62fe53
	set pass ""
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    if {$pass != ""} {
Packit 62fe53
	set passes [list]
Packit 62fe53
	foreach p $pass {
Packit 62fe53
	    foreach multipass_elem $multipass {
Packit 62fe53
		set multipass_name [lindex $multipass_elem 0]
Packit 62fe53
		if {$p == $multipass_name} {
Packit 62fe53
		    lappend passes $multipass_elem
Packit 62fe53
		    break
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	set multipass $passes
Packit 62fe53
    }
Packit 62fe53
Packit 62fe53
    foreach pass $multipass {
Packit 62fe53
Packit 62fe53
	# multipass_name is set for `record_test' to use (see framework.exp).
Packit 62fe53
	if { [lindex $pass 0] != "" } {
Packit 62fe53
	    set multipass_name [lindex $pass 0]
Packit 62fe53
	    clone_output "Running pass `$multipass_name' ..."
Packit 62fe53
	} else {
Packit 62fe53
	    set multipass_name ""
Packit 62fe53
	}
Packit 62fe53
	set restore ""
Packit 62fe53
	foreach varval [lrange $pass 1 end] {
Packit 62fe53
	    set tmp [string first "=" $varval]
Packit 62fe53
	    set var [string range $varval 0 [expr {$tmp - 1}]]
Packit 62fe53
	    # Save previous value.
Packit 62fe53
	    if {[info exists $var]} {
Packit 62fe53
		lappend restore "$var [list [eval concat \$$var]]"
Packit 62fe53
	    } else {
Packit 62fe53
		lappend restore "$var"
Packit 62fe53
	    }
Packit 62fe53
	    # Handle "CFLAGS=$CFLAGS foo".
Packit 62fe53
	    eval set $var \[string range \"$varval\" [expr {$tmp + 1}] end\]
Packit 62fe53
	    verbose "$var is now [eval concat \$$var]"
Packit 62fe53
	    unset tmp var
Packit 62fe53
	}
Packit 62fe53
Packit 62fe53
	# look for the top level testsuites. if $tool doesn't
Packit 62fe53
	# exist and there are no subdirectories in $srcdir, then
Packit 62fe53
	# we default to srcdir.
Packit 62fe53
	set test_top_dirs [lsort [getdirs -all ${srcdir} "${tool}*"]]
Packit 62fe53
	if { ${test_top_dirs} == "" } {
Packit 62fe53
	    set test_top_dirs ${srcdir}
Packit 62fe53
	} else {
Packit 62fe53
	    # JYG:
Packit 62fe53
	    # DejaGNU's notion of test tree and test files is very
Packit 62fe53
	    # general:
Packit 62fe53
	    # given ${srcdir} and ${tool}, any subdirectory (at any
Packit 62fe53
	    # level deep) with the "${tool}" prefix starts a test tree
Packit 62fe53
	    # given a test tree, any *.exp file underneath (at any
Packit 62fe53
	    # level deep) is a test file.
Packit 62fe53
	    #
Packit 62fe53
	    # For test tree layouts with ${tool} prefix on
Packit 62fe53
	    # both a parent and a child directory, we need to eliminate
Packit 62fe53
	    # the child directory entry from test_top_dirs list.
Packit 62fe53
	    # e.g. gdb.hp/gdb.base-hp/ would result in two entries
Packit 62fe53
	    # in the list: gdb.hp, gdb.hp/gdb.base-hp.
Packit 62fe53
	    # If the latter not eliminated, test files under
Packit 62fe53
	    # gdb.hp/gdb.base-hp would be run twice (since test files
Packit 62fe53
	    # are gathered from all sub-directories underneath a
Packit 62fe53
	    # directory).
Packit 62fe53
	    #
Packit 62fe53
	    # Since ${tool} may be g++, etc. which could confuse
Packit 62fe53
	    # regexp, we cannot do the simpler test:
Packit 62fe53
	    #     ...
Packit 62fe53
	    #     if [regexp "${srcdir}/.*${tool}.*/.*${tool}.*" ${dir}]
Packit 62fe53
	    #     ...
Packit 62fe53
	    # instead, we rely on the fact that test_top_dirs is
Packit 62fe53
	    # a sorted list of entries, and any entry that contains
Packit 62fe53
	    # the previous valid test top dir entry in its own pathname
Packit 62fe53
	    # must be excluded.
Packit 62fe53
Packit 62fe53
	    set temp_top_dirs ""
Packit 62fe53
	    set prev_dir ""
Packit 62fe53
	    foreach dir "${test_top_dirs}" {
Packit 62fe53
		if { [string length ${prev_dir}] == 0 ||
Packit 62fe53
		     [string first "${prev_dir}/" ${dir}] == -1} {
Packit 62fe53
		    # the first top dir entry, or an entry that
Packit 62fe53
		    # does not share the previous entry's entire
Packit 62fe53
		    # pathname, record it as a valid top dir entry.
Packit 62fe53
		    #
Packit 62fe53
		    lappend temp_top_dirs ${dir}
Packit 62fe53
		    set prev_dir ${dir}
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	    set test_top_dirs ${temp_top_dirs}
Packit 62fe53
	}
Packit 62fe53
	verbose "Top level testsuite dirs are ${test_top_dirs}" 2
Packit 62fe53
	set testlist ""
Packit 62fe53
	if {[array exists all_runtests]} {
Packit 62fe53
	    foreach x [array names all_runtests] {
Packit 62fe53
		verbose "trying to glob ${srcdir}/${x}" 2
Packit 62fe53
		set s [glob -nocomplain ${srcdir}/$x]
Packit 62fe53
		if { $s != "" } {
Packit 62fe53
		    set testlist [concat $testlist $s]
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
	#
Packit 62fe53
	# If we have a list of tests, run all of them.
Packit 62fe53
	#
Packit 62fe53
	if { $testlist != "" } {
Packit 62fe53
	    foreach test_name $testlist {
Packit 62fe53
		if { ${ignoretests} != "" } {
Packit 62fe53
		    if { 0 <= [lsearch ${ignoretests} [file tail ${test_name}]]} {
Packit 62fe53
			continue
Packit 62fe53
		    }
Packit 62fe53
		}
Packit 62fe53
Packit 62fe53
		# set subdir to the tail of the dirname after $srcdir,
Packit 62fe53
		# for the driver files that want it.  XXX this is silly.
Packit 62fe53
		# drivers should get a single var, not "$srcdir/$subdir"
Packit 62fe53
		set subdir [file dirname $test_name]
Packit 62fe53
		set p [expr {[string length $srcdir] - 1}]
Packit 62fe53
		while {0 < $p && [string index $srcdir $p] == "/"} {
Packit 62fe53
		    incr p -1
Packit 62fe53
		}
Packit 62fe53
		if {[string range $subdir 0 $p] == $srcdir} {
Packit 62fe53
		    set subdir [string range $subdir [expr {$p + 1}] end]
Packit 62fe53
		    regsub "^/" $subdir "" subdir
Packit 62fe53
		}
Packit 62fe53
Packit 62fe53
		# XXX not the right thing to do.
Packit 62fe53
		set runtests [list [file tail $test_name] ""]
Packit 62fe53
Packit 62fe53
		runtest $test_name
Packit 62fe53
	    }
Packit 62fe53
	} else {
Packit 62fe53
	    #
Packit 62fe53
	    # Go digging for tests.
Packit 62fe53
	    #
Packit 62fe53
	    foreach dir "${test_top_dirs}" {
Packit 62fe53
		if { ${dir} != ${srcdir} } {
Packit 62fe53
		    # Ignore this directory if is a directory to be
Packit 62fe53
		    # ignored.
Packit 62fe53
		    if {[info exists ignoredirs] && $ignoredirs != ""} {
Packit 62fe53
			set found 0
Packit 62fe53
			foreach directory $ignoredirs {
Packit 62fe53
			    if {[string match "*${directory}*" $dir]} {
Packit 62fe53
				set found 1
Packit 62fe53
				break
Packit 62fe53
			    }
Packit 62fe53
			}
Packit 62fe53
			if { $found } {
Packit 62fe53
			    continue
Packit 62fe53
			}
Packit 62fe53
		    }
Packit 62fe53
Packit 62fe53
		    # Run the test if dir_to_run was specified as a
Packit 62fe53
		    # value (for example in MULTIPASS) and the test
Packit 62fe53
		    # directory matches that directory.
Packit 62fe53
		    if {[info exists dir_to_run] && $dir_to_run != ""} {
Packit 62fe53
			# JYG: dir_to_run might be a space delimited list
Packit 62fe53
			# of directories.  Look for match on each item.
Packit 62fe53
			set found 0
Packit 62fe53
			foreach directory $dir_to_run {
Packit 62fe53
			    if {[string match "*${directory}*" $dir]} {
Packit 62fe53
				set found 1
Packit 62fe53
				break
Packit 62fe53
			    }
Packit 62fe53
			}
Packit 62fe53
			if {!$found} {
Packit 62fe53
			    continue
Packit 62fe53
			}
Packit 62fe53
		    }
Packit 62fe53
Packit 62fe53
		    # Run the test if cmdline_dir_to_run was specified
Packit 62fe53
		    # by the user using --directory and the test
Packit 62fe53
		    # directory matches that directory
Packit 62fe53
		    if {[info exists cmdline_dir_to_run] \
Packit 62fe53
			    && $cmdline_dir_to_run != ""} {
Packit 62fe53
			# JYG: cmdline_dir_to_run might be a space delimited
Packit 62fe53
			# list of directories.  Look for match on each item.
Packit 62fe53
			set found 0
Packit 62fe53
			foreach directory $cmdline_dir_to_run {
Packit 62fe53
			    # Look for a directory that ends with the
Packit 62fe53
			    # provided --directory name.
Packit 62fe53
			    if {[string match "$directory" $dir]
Packit 62fe53
				|| [string match "*/$directory" $dir]} {
Packit 62fe53
				set found 1
Packit 62fe53
				break
Packit 62fe53
			    }
Packit 62fe53
			}
Packit 62fe53
			if {!$found} {
Packit 62fe53
			    continue
Packit 62fe53
			}
Packit 62fe53
		    }
Packit 62fe53
Packit 62fe53
		    foreach test_name [lsort [find ${dir} *.exp]] {
Packit 62fe53
			if { ${test_name} == "" } {
Packit 62fe53
			    continue
Packit 62fe53
			}
Packit 62fe53
			# Ignore this one if asked to.
Packit 62fe53
			if { ${ignoretests} != "" } {
Packit 62fe53
			    if { 0 <= [lsearch ${ignoretests} [file tail ${test_name}]]} {
Packit 62fe53
				continue
Packit 62fe53
			    }
Packit 62fe53
			}
Packit 62fe53
Packit 62fe53
			# Get the path after the $srcdir so we know
Packit 62fe53
			# the subdir we're in.
Packit 62fe53
			set subdir [file dirname $test_name]
Packit 62fe53
			# We used to do
Packit 62fe53
			# regsub $srcdir [file dirname $test_name] "" subdir
Packit 62fe53
			# but what if [file dirname $test_name] contains regexp
Packit 62fe53
			# characters? We lose. Instead...
Packit 62fe53
			set first [string first $srcdir $subdir]
Packit 62fe53
			if { $first >= 0 } {
Packit 62fe53
			    set first [expr {$first + [string length $srcdir]}]
Packit 62fe53
			    set subdir [string range $subdir $first end]
Packit 62fe53
			    regsub "^/" "$subdir" "" subdir
Packit 62fe53
			}
Packit 62fe53
			if { "$srcdir" == "$subdir" || "$srcdir" == "$subdir/" } {
Packit 62fe53
			    set subdir ""
Packit 62fe53
			}
Packit 62fe53
			# Check to see if the range of tests is limited,
Packit 62fe53
			# set `runtests' to a list of two elements: the script name
Packit 62fe53
			# and any arguments ("" if none).
Packit 62fe53
			if {[array exists all_runtests]} {
Packit 62fe53
			    verbose "searching for $test_name in [array names all_runtests]" 2
Packit 62fe53
			    if { 0 > [lsearch [array names all_runtests] [file tail $test_name]]} {
Packit 62fe53
				if { 0 > [lsearch [array names all_runtests] $test_name] } {
Packit 62fe53
				    continue
Packit 62fe53
				}
Packit 62fe53
			    }
Packit 62fe53
			    set runtests [list [file tail $test_name] $all_runtests([file tail $test_name])]
Packit 62fe53
			} else {
Packit 62fe53
			    set runtests [list [file tail $test_name] ""]
Packit 62fe53
			}
Packit 62fe53
			runtest $test_name
Packit 62fe53
		    }
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	    # Restore the variables set by this pass.
Packit 62fe53
	    foreach varval $restore {
Packit 62fe53
		if { [llength $varval] > 1 } {
Packit 62fe53
		    verbose "Restoring [lindex $varval 0] to [lindex $varval 1]" 4
Packit 62fe53
		    set [lindex $varval 0] [lindex $varval 1]
Packit 62fe53
		} else {
Packit 62fe53
		    verbose "Restoring [lindex $varval 0] to `unset'" 4
Packit 62fe53
		    unset -- [lindex $varval 0]
Packit 62fe53
		}
Packit 62fe53
	    }
Packit 62fe53
	}
Packit 62fe53
    }
Packit 62fe53
    cleanup_target_hook $current_target
Packit 62fe53
    if { $target_count > 1 } {
Packit 62fe53
	log_summary
Packit 62fe53
    }
Packit 62fe53
}
Packit 62fe53
Packit 62fe53
log_and_exit