Fix ld tests with sysroot=/ and --enable-targets=all and test --print-sysroot

* ld-scripts/sysroot-prefix.exp: Log $ld_sysroot.  Handle sysroot
	== "/" as a separate sysroot-configuration with separable
	test-types.
	(sysroot_prefix_tests): Include all existing sysroot tests in
	sysroot == "/" tests except exclude those where a --sysroot option
	is not specified.
	* lib/ld-lib.exp (check_sysroot_available): Rewrite to use
	--print-sysroot instead of relying on error code from using
	--sysroot=...  Also, set $ld_sysroot.

The reason we exclude not just the failing "full-path =-prefixed
without" but also the passing "plain =-prefixed without but -Lpath"
for sysroot == "/" is that for the latter to succeed, we have to make
assumptions about the system not having a /sysroot directory or
assumptions about its contents etc.

When passing --enable-targets=all --enable-64-bit-bfd (the
latter not required for a "64-bit-host" of course) the ld --help
output got too much to handle for poor tcl (or maybe dejagnu is
to blame) and remote_exec exited with an error, so the
configuration being tested was mishandled as being a
sysroot-less configuration.  Using --version instead of --help
would work too, but the new --print-sysroot option calls for
nominal coverage, so why not use that instead.
This commit is contained in:
Hans-Peter Nilsson 2014-10-17 13:10:18 +02:00
parent c1e29d6622
commit 3f7308212c
3 changed files with 40 additions and 23 deletions

View File

@ -1,3 +1,15 @@
2014-10-17 Hans-Peter Nilsson <hp@axis.com>
* ld-scripts/sysroot-prefix.exp: Log $ld_sysroot. Handle sysroot
== "/" as a separate sysroot-configuration with separable
test-types.
(sysroot_prefix_tests): Include all existing sysroot tests in
sysroot == "/" tests except exclude those where a --sysroot option
is not specified.
* lib/ld-lib.exp (check_sysroot_available): Rewrite to use
--print-sysroot instead of relying on error code from using
--sysroot=... Also, set $ld_sysroot.
2014-10-15 Hans-Peter Nilsson <hp@axis.com>
* ld-scripts/sysroot-prefix.exp, ld-scripts/sysroot-prefix-x.s,

View File

@ -27,14 +27,21 @@
# present or not, with different arguments.
# Find out if the linker supports sysroot; if it was configured
# "--with-sysroot X". We ignore that X can actually be set to
# interfere with the tests, as that's unlikely to be useful, and
# assume that the build-directory (aka. $base_dir) does not contain X.
# "--with-sysroot X" where X is a non-empty string.
set with_sysroot [check_sysroot_available]
verbose -log "Has (non-empty) sysroot support: $with_sysroot"
verbose -log "Has (non-empty) sysroot support: $with_sysroot; \"$ld_sysroot\""
# We also need to know if the sysroot is "/" (a common use) as some of
# the tests prepend sysroot to the current directory and on most
# common systems "//dir/path" is handled as "/dir/path".
if {$ld_sysroot == "/"} {
# Use a modified test-subset for testing.
set with_sysroot 3
}
# Entries in the array-tables:
# 0: Testtype (1: only non-sysroot, 2: only sysroot, 3: either).
# 0: Testtype; an inclusive bitmask indicating that the test should run on a
# build configured for: 1: non-sysroot, 2: sysroot != "/", 4: sysroot == "/".
# 1: Description, forming part of the dejagnu test-name.
# 2: Replacement for @p@.
# 3: Option to pass to linker (usually something with --sysroot).
@ -47,16 +54,16 @@ verbose -log "Has (non-empty) sysroot support: $with_sysroot"
# description contains @cwd@, that will be replaced by "<CWD>".
set sysroot_prefix_tests {
{3 "plain -Lpath" "sysroot/" {} ""}
{3 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"}
{3 "full-path" "@cwd@/sysroot/" {} ""}
{3 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"}
{3 "full-path =-prefixed with empty" "=@cwd@/sysroot/" "--sysroot=" ""}
{3 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""}
{2 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"}
{2 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""}
{2 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""}
{2 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""}
{7 "plain -Lpath" "sysroot/" {} ""}
{7 "root-anchored but -Lpath" "/sysroot/" {} "cannot find"}
{7 "full-path" "@cwd@/sysroot/" {} ""}
{7 "root-anchored =-prefixed -Lpath" "=/sysroot/" {} "cannot find"}
{7 "full-path =-prefixed with empty" "=@cwd@/sysroot/" "--sysroot=" ""}
{7 "plain =-prefixed with empty" "=sysroot/" "--sysroot=" ""}
{6 "root-anchored but script outside sysroot" "/" "--sysroot=@cwd@/sysroot" "cannot find"}
{6 "root-anchored and script inside sysroot" "/sysroot/" "--sysroot=@cwd@" ""}
{6 "root-anchored =-prefixed script outside" "=/" "--sysroot=@cwd@/sysroot" ""}
{6 "root-anchored =-prefixed script inside" "=/sysroot/" "--sysroot=@cwd@" ""}
{2 "plain =-prefixed without but -Lpath" "=sysroot/" {} "cannot find"}
{2 "full-path =-prefixed without" "=@cwd@/sysroot/" {} "cannot find"}
{1 "plain =-prefixed -Lpath" "=sysroot/" {} ""}

View File

@ -1669,16 +1669,14 @@ proc check_plugin_api_available { } {
return $plugin_api_available_saved
}
# Returns true if the target ld supports sysroot.
# Sets ld_sysroot to the current sysroot (empty if not supported) and
# returns true if the target ld supports sysroot.
proc check_sysroot_available { } {
global ld_sysroot_available_saved
global ld
global ld_sysroot_available_saved ld ld_sysroot
if {![info exists ld_sysroot_available_saved]} {
# Check if ld supports --sysroot *other* than empty
# (non-sysroot linkers don't emit errors for --sysroot="").
# The help-text by itself is no indication as it always lists --sysroot.
set status [remote_exec host $ld "--sysroot=ldxyzzy --help >/dev/null"]
if { [lindex $status 0] != 0 } {
# Check if ld supports --sysroot *other* than empty.
set ld_sysroot [string trimright [lindex [remote_exec host $ld "--print-sysroot"] 1]]
if { $ld_sysroot == "" } {
set ld_sysroot_available_saved 0
} else {
set ld_sysroot_available_saved 1