3 # Copyright (C) 2018, 2021 Free Software Foundation, Inc.
5 # This file is part of DejaGnu.
7 # DejaGnu is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 3 of the License, or
10 # (at your option) any later version.
12 # DejaGnu is distributed in the hope that it will be useful, but
13 # WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 # General Public License for more details.
17 # You should have received a copy of the GNU General Public License
18 # along with DejaGnu; if not, write to the Free Software Foundation,
19 # Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
21 # Portions from runtest Copyright (C) 1992-2016 Free Software Foundation, Inc.
23 # This script was written by Jacob Bachmeyer. Portions of this script are
24 # adapted from the existing runtest script originally written by Rob Savoye.
26 # This script finds an implementation for the command given, finds the
27 # proper interpreter, and then dispatches the command. This script can
28 # either be run with a command name as the first (few) argument(s), via a
29 # link from the command name, or some combination of those.
31 # shellcheck disable=SC2003
32 # The shellcheck tool complains about use of expr and recommends using
33 # newer shell features instead. Solaris 10 /bin/sh does not support the
34 # newer features, so we must use expr in this script.
36 # shellcheck disable=SC2006
37 # The shellcheck tool complains about the old style backtick command
38 # substitution. Solaris 10 /bin/sh does not support the new style $()
39 # command substitution and the usage of command substitution in this script
40 # is simple enough to work. Most notably, nesting backtick command
41 # substitution is tricky, but we do not do that.
43 # shellcheck disable=SC2209
44 # The shellcheck tool complains about assigning certain constant strings to
45 # variables. In this script, the intended meaning is obvious in context.
48 # #Usage: dejagnu COMMAND [ --help | OPTIONS... ]
49 # #Usage: dejagnu --help
50 # #Usage: dejagnu --version
51 # # --help Print help text
52 # # --version Print DejaGnu version
55 # list of extensions supported for commands in priority order
56 Variants
='gawk awk tcl exp bash sh'
61 # For testing and development
63 if test x
"$1" = x--DGTimpl
; then
73 --help) want_help
=true
;;
74 -v|
--v|
-verbose|
--verbose) verbose
=`expr $verbose + 1` ;;
75 -V|
--V|
-version|
--version) want_version
=true
;;
79 if expr "$verbose" \
> 0 > /dev
/null
; then
80 echo Verbose level is
"$verbose"
83 ## Get the file name of this script and deduce @bindir@.
85 bindir
=`echo "$0" | sed -e 's@/[^/]*$@@'`
86 if expr "$verbose" \
> 0 > /dev
/null
; then
87 echo Running launcher from
"$bindir"
92 # If running from source tree, they are in ./commands/ relative to this script.
93 # If installed, they are in @datadir@/dejagnu/commands/ on the system.
95 # This makes the same assumption as in runtest that one of these holds:
97 # @datadir@ == @bindir@/../share
98 # @datadir@ == @bindir@/../../share
99 # @datadir@ == /usr/share
100 # @datadir@ == /usr/local/share
102 if test -n "$DEJAGNULIBS" ; then
103 commdir
="${DEJAGNULIBS}/commands"
104 datadir
="${DEJAGNULIBS}"
105 elif test -d "${bindir}/commands" && test -f "${bindir}/runtest.exp" ; then
106 if expr "$verbose" \
> 1 > /dev
/null
; then
107 echo Running from
source directory
109 commdir
="${bindir}/commands"
113 bindir1up_check
=`echo "$bindir" | sed -e 's@/[^/]*$@/share/dejagnu@'`
114 bindir2up_check
=`echo "$bindir" | sed -e 's@/[^/]*/[^/]*$@/share/dejagnu@'`
116 "${bindir1up_check}" "${bindir2up_check}" \
117 /usr
/share
/dejagnu
/usr
/local
/share
/dejagnu
119 if expr "$verbose" \
> 1 > /dev
/null
; then
120 echo Probing directory
"$i"/commands
122 if test -d "$i"/commands
; then
123 commdir
="$i"/commands
130 if test -z "${commdir}" ; then
131 echo ERROR
: could not
find command directory.
135 if expr "$verbose" \
> 0 > /dev
/null
; then
136 echo Looking
for commands
in "$commdir"
139 ## Get the name of the requested command.
141 # Are we just looking for version information?
142 if $want_version ; then
143 frame_version
=`grep '^set frame_version' "${datadir}/runtest.exp" \
144 | sed 's/^[^0-9]*//'`
145 echo 'dejagnu auxiliary launcher (DejaGnu)' "$frame_version"
149 # Remove any leading autoconf platform prefix and the "dejagnu" prefix.
150 # command=`basename "$0" | sed -e 's/^.*-\?dejagnu-\?//'`
151 # The above simple solution is not portable, so we use Awk:
152 command=`echo "$0" | awk 'BEGIN { FS = "/" }
155 for (i = 1; i <= NF; i++) if ($i ~ /dejagnu/) break;
156 for (j = 1; j <= (NF - i); j++) $j = $(j+i);
159 # Initially splitting on "/", then assigning the last field to the record
160 # performs the role of basename. Splitting on "-" and searching for a
161 # field matching /dejagnu/ identifies the other prefixes, and the second
162 # loop removes the "dejagnu" prefix and everything before it. The record
163 # is then truncated, printed, and thereby returned to the shell.
165 while expr $# \
> 0 > /dev
/null
167 if test -z "${command}" ; then
168 case $1 in -*) break;; esac
172 if expr "$verbose" \
> 2 > /dev
/null
; then
173 echo Looking
for "${commdir}/${command}.*"
175 for ext
in ${Variants}
177 if test -f "${commdir}/${command}.$ext" ; then
181 case $1 in -*) break;; esac
182 if test -n "$1" ; then
183 command="${command}-$1"
191 for ext
in ${Variants}
193 if test -f "${commdir}/${command}.$ext" ; then
194 commext
="$commext $ext"
198 if test -z "$commext" && test -n "$command" ; then
199 echo ERROR
: could not resolve
command "$command"
203 if expr "$verbose" \
> 0 > /dev
/null
; then
204 if test -n "$command"; then
205 if expr "$verbose" \
> 1 > /dev
/null
; then
206 echo Found subcommand
"$command" with variants
: "$commext"
208 echo Found subcommand
"$command"
211 echo Running nothing.
215 ## Find interpreters.
218 if test -n "$AWK" ; then
220 elif test -x "${bindir}/awk" ; then
221 awkbin
="${bindir}/awk"
225 if test -n "$GAWK" ; then
227 elif test -x "${bindir}/gawk" ; then
228 gawkbin
="${bindir}/gawk"
232 if command -v "$awkbin" > /dev
/null
2>&1 ; then
237 if command -v "$gawkbin" > /dev
/null
2>&1 ; then
242 # substitute GNU awk for awk if needed
244 if $have_awk ; then : ; else
249 # is "awk" actually GNU Awk?
251 case `"$awkbin" --version 2>&1 | sed 1q` in
252 *'GNU Awk'*) have_gawk_as_awk
=true
;;
253 *) have_gawk_as_awk
=false
;;
256 if expr "$verbose" \
> 2 > /dev
/null
; then
258 echo Awk interpreter is
"$awkbin"
260 echo Awk interpreter was not found
263 echo GNU Awk interpreter is
"$gawkbin"
265 echo GNU Awk interpreter was not found
271 if test -n "$BASH" ; then
273 elif test -x "${bindir}/bash" ; then
274 bashbin
="${bindir}/bash"
275 elif test -x /bin
/bash
; then
280 if command -v "$bashbin" > /dev
/null
2>&1 ; then
285 if expr "$verbose" \
> 2 > /dev
/null
; then
287 echo Bash interpreter is
"$bashbin"
289 echo Bash interpreter was not found
294 # This script is running, therefore we have a Bourne shell.
298 # DejaGnu configure bails out if Expect is not available, but this script
299 # can be run from the source directory without first running configure.
300 if test -n "$EXPECT" ; then
302 elif test -x "${bindir}/expect" ; then
303 expectbin
="${bindir}/expect"
307 if command -v "$expectbin" > /dev
/null
2>&1 ; then
312 if expr "$verbose" \
> 2 > /dev
/null
; then
313 if $have_expect ; then
314 echo Expect interpreter is
"$expectbin"
316 echo Expect interpreter was not found
321 if test -n "$TCLSH" ; then
323 elif test -x "${bindir}/tclsh" ; then
324 tclbin
="${bindir}/tclsh"
328 # substitute expect if needed
329 if command -v "$tclbin" > /dev
/null
2>&1 ; then :
330 elif command -v "$expectbin" > /dev
/null
2>&1 ; then tclbin
="$expectbin"
332 if command -v "$tclbin" > /dev
/null
2>&1 ; then
337 if expr "$verbose" \
> 2 > /dev
/null
; then
339 echo Tcl interpreter is
"$tclbin"
341 echo Tcl interpreter was not found
347 if test -n "$override_ext" ; then
348 selected_ext
="$override_ext"
367 if $have_expect ; then
389 echo ERROR
: '(select-variant)' unrecognized variant
"$v"
393 if test -z "$selected_ext" && test -n "$command" ; then
394 echo ERROR
: no variant of
"$command" was selected
399 if test -n "$command" && expr "$verbose" \
> 0 > /dev
/null
; then
400 if test -n "$override_ext" ; then
401 echo Selected variant
"$selected_ext" by override
403 echo Selected variant
"$selected_ext"
407 ## Dispatch to the selected command.
409 # Are we just looking for a usage message?
411 if test -z "$command" ; then
412 # want help on the launcher itself
415 help_file
="${commdir}/${command}.${selected_ext}"
417 if test ! -r "$help_file" ; then
418 echo ERROR
: file "'$help_file'" is not readable
421 if grep -q '#help' "$help_file" \
422 && grep -q '#end' "$help_file"; then : ; else
423 echo ERROR
: file "'$help_file'" does not contain a
help message
426 help_prefix_pat
=`grep '#help' "$help_file" \
427 | sed -e 's/#help.*$//' -e '1q' | tr '[:print:][:blank:]' .`
428 if expr "$verbose" \
> 1 > /dev
/null
; then
429 echo Extracting
help from
"'$help_file'" with prefix
"'$help_prefix_pat'"
431 sed -n < "$help_file" \
433 -e '/^'"$help_prefix_pat"'#end/q' \
434 -e 's/^'"$help_prefix_pat"'//;p'
438 if test -z "$command" ; then
439 if test -n "$override_ext" ; then
440 case $selected_ext in
441 awk) if $have_awk; then exit 0; else exit 1; fi ;;
442 bash
) if $have_bash; then exit 0; else exit 1; fi ;;
443 exp
) if $have_expect; then exit 0; else exit 1; fi ;;
444 gawk
) if $have_gawk; then exit 0; else exit 1; fi ;;
445 tcl
) if $have_tcl; then exit 0; else exit 1; fi ;;
446 sh
) if $have_sh; then exit 0; else exit 1; fi ;;
450 echo ERROR
: no
command given
455 case $selected_ext in
457 if $have_gawk_as_awk ; then
458 exec "$awkbin" --posix -f "${commdir}/${command}.awk" -- ${1+"$@"}
460 exec "$awkbin" -f "${commdir}/${command}.awk" -- ${1+"$@"}
463 bash
) exec "$bashbin" -- "${commdir}/${command}.bash" ${1+"$@"} ;;
464 exp) exec "$expectbin" -- "${commdir}/${command}.exp" ${1+"$@"} ;;
465 gawk
) exec "$gawkbin" -f "${commdir}/${command}.gawk" -- ${1+"$@"} ;;
466 tcl) exec "$tclbin" "${commdir}/${command}.tcl" ${1+"$@"} ;;
467 sh
) exec /bin
/sh
"${commdir}/${command}.sh" ${1+"$@"} ;;
469 echo command: "${command}"
474 echo ERROR: '(run-variant)' unrecognized variant "$selected_ext"