summaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-scripts/sysroot-prefix.exp
diff options
context:
space:
mode:
Diffstat (limited to 'ld/testsuite/ld-scripts/sysroot-prefix.exp')
-rw-r--r--ld/testsuite/ld-scripts/sysroot-prefix.exp190
1 files changed, 190 insertions, 0 deletions
diff --git a/ld/testsuite/ld-scripts/sysroot-prefix.exp b/ld/testsuite/ld-scripts/sysroot-prefix.exp
new file mode 100644
index 0000000..65c9f70
--- /dev/null
+++ b/ld/testsuite/ld-scripts/sysroot-prefix.exp
@@ -0,0 +1,190 @@
+# Copyright (C) 2014 Free Software Foundation, Inc.
+#
+# This file is part of the GNU Binutils.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
+# MA 02110-1301, USA.
+
+# Check that scripts using the "=" sysroot-prefix work, for both
+# toolchains with and without --sysroot support.
+
+# We test this by emitting archives into a subdirectory and expect
+# constructs such as GROUP and AS_NEEDED (the only two constructs
+# actually tested) to find them (or not); both quoted and unquoted
+# paths, with different prefixes on the path and with --sysroot
+# present or not, with different arguments.
+
+# Find out if the linker supports sysroot; if it was configured
+# "--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; \"$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; 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).
+# 4: Message substring; a substring to match against the error message
+# if an error is expected, or empty if no error is expected.
+#
+# If the replacement or option contains @cwd@, that'll be replaced by
+# "$base_dir/tmpdir", the full path to the location of the script
+# (with the actual files in the "sysroot" subdirectory). If the
+# description contains @cwd@, that will be replaced by "<CWD>".
+
+set sysroot_prefix_tests {
+ {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/" {} ""}
+ {1 "full-path =-prefixed without" "=@cwd@/sysroot/" {} ""}
+}
+
+# May have to provide a target-specific assembler option for some targets.
+set gasopt ""
+
+# Intentionally similar to the ubiquitous glibc libc.so script.
+set template "GROUP ( @q@@p@tmp/ldtest-xyzzy/libx.a@q@ AS_NEEDED ( @q@@p@tmp/ldtest-xyzzy/liby.a@q@ ) )"
+
+# Set up everything from the variables above.
+proc sysroot_prefix_test_setup { } {
+ global as gasopt srcdir subdir ar
+
+ if {![ld_assemble_flags $as $gasopt $srcdir/$subdir/pr14962a.s tmpdir/main.o]} {
+ error "Error assembling a trivial file for sysroot-prefix tests framework"
+ return 0
+ }
+
+ # We need somewhere under tmpdir to point the sysroot, a subdirectory
+ # that is benevolent if it escapes into "/".
+ remote_exec host "mkdir -p tmpdir/sysroot/tmp/ldtest-xyzzy"
+
+ # 0: a "main" object that needs a symbol (x) (most portably by
+ # using a pre-existing file). 1: a library with an object that
+ # provides that symbol and needs another one (y). 2: another
+ # library with a third object providing that other symbol.
+ set sysroot_prefix_tests_framework_objects {
+ {"pr14962a.s" "main" ""}
+ {"sysroot-prefix-x.s" "x" "x"}
+ {"sysroot-prefix-y.s" "y" "y"}
+ }
+
+ foreach test_object $sysroot_prefix_tests_framework_objects {
+ set sname [lindex $test_object 0]
+ set onamebase [lindex $test_object 1]
+ set oname "tmpdir/$onamebase.o"
+ set libnamebase [lindex $test_object 2]
+
+ if ![ld_assemble_flags $as $gasopt $srcdir/$subdir/$sname $oname] {
+ error "Error assembling trivial file $sname for sysroot-prefix tests framework"
+ return 0
+ }
+
+ if { [string length $libnamebase] != 0 &&
+ ![ar_simple_create $ar "" tmpdir/sysroot/tmp/ldtest-xyzzy/lib$libnamebase.a $oname] } {
+ error "Error creating archive $libnamebase for sysroot-prefix tests framework"
+ return 0
+ }
+ }
+
+ return 1
+}
+
+# Run a single linker test.
+proc single_sysroot_prefix_test { type xtestname finalscript ldopt errstr } {
+ global ld exec_output with_sysroot
+ set scriptname "tmpdir/libsysroottest.a"
+ set testname "sysroot-prefix $xtestname"
+
+ if { ($type & ($with_sysroot + 1)) == 0 } {
+ unsupported $testname
+ return
+ }
+
+ if [catch { set ofd [open $scriptname w] } x] {
+ perror "$x"
+ unresolved $testname
+ return
+ }
+
+ puts $ofd "$finalscript"
+ close $ofd
+ verbose -log "script: $finalscript"
+
+ set res [ld_simple_link $ld tmpdir/output "$ldopt tmpdir/main.o -Ltmpdir -lsysroottest"]
+ set ld_output "$exec_output"
+ set expect_success [expr [string length $errstr] == 0]
+
+ if { $res == $expect_success &&
+ ($expect_success || [regexp "$errstr" $ld_output]) } {
+ pass $testname
+ catch "exec rm -f $scriptname"
+ } {
+ fail $testname
+ }
+}
+
+# Run all interesting variants from an option-and-path combination.
+proc run_sysroot_prefix_test { type name templ p ldopt errstr } {
+ global base_dir
+ set qlist { { "quoted" "\"" } { "unquoted" {} } }
+
+ regsub -all "@p@" $templ $p templ
+ regsub -all "@cwd@" $templ "$base_dir/tmpdir" templ
+ regsub -all "@cwd@" $ldopt "$base_dir/tmpdir" ldopt
+ regsub -all "@cwd@" $name "<CWD>" name
+
+ foreach qitems $qlist {
+ regsub -all "@q@" $templ [lindex $qitems 1] finalscript
+ single_sysroot_prefix_test $type "$name, [lindex $qitems 0]" \
+ $finalscript $ldopt $errstr
+ }
+}
+
+# Run a list of option-and-path test-combinations.
+proc run_sysroot_prefix_tests { descr templ items } {
+ foreach item $items {
+ set type [lindex $item 0]
+ set name [lindex $item 1]
+ set p [lindex $item 2]
+ set ldopt [lindex $item 3]
+ set errstr [lindex $item 4]
+ run_sysroot_prefix_test $type "$descr $name" $templ "$p" "$ldopt" "$errstr"
+ }
+}
+
+if ![sysroot_prefix_test_setup] {
+ return
+}
+
+run_sysroot_prefix_tests "common" $template $sysroot_prefix_tests