Backport "Fix sysroot-tests, adding --print-sysroot" from master
authorHans-Peter Nilsson <hp@bitrange.com>
Fri, 17 Oct 2014 11:26:56 +0000 (13:26 +0200)
committerHans-Peter Nilsson <hp@bitrange.com>
Fri, 17 Oct 2014 11:26:56 +0000 (13:26 +0200)
ld/ChangeLog
ld/ldlex.h
ld/lexsup.c
ld/testsuite/ChangeLog
ld/testsuite/ld-scripts/sysroot-prefix.exp
ld/testsuite/lib/ld-lib.exp

index bf06b64..cae1729 100644 (file)
@@ -1,3 +1,10 @@
+2014-10-17  Hans-Peter Nilsson  <hp@axis.com>
+
+       Backport "implement --print-sysroot in ld" from master
+       * ldlex.h (enum option_values): Add entry OPTION_PRINT_SYSROOT.
+       * lexsup.c (ld_options): Add entry for --print-sysroot.
+       (parse_args) <OPTION_PRINT_SYSROOT>: Print sysroot and exit early.
+
 2014-10-15  Tristan Gingold  <gingold@adacore.com>
 
        * configure: Regenerate.
index 56cd121..e3e9b24 100644 (file)
@@ -136,6 +136,7 @@ enum option_values
 #endif /* ENABLE_PLUGINS */
   OPTION_DEFAULT_SCRIPT,
   OPTION_PRINT_OUTPUT_FORMAT,
+  OPTION_PRINT_SYSROOT,
   OPTION_IGNORE_UNRESOLVED_SYMBOL,
   OPTION_PUSH_STATE,
   OPTION_POP_STATE,
index 3a1ea9e..4812c97 100644 (file)
@@ -379,6 +379,8 @@ static const struct ld_option ld_options[] =
     EXACTLY_TWO_DASHES },
   { {"print-output-format", no_argument, NULL, OPTION_PRINT_OUTPUT_FORMAT},
     '\0', NULL, N_("Print default output format"), TWO_DASHES },
+  { {"print-sysroot", no_argument, NULL, OPTION_PRINT_SYSROOT},
+    '\0', NULL, N_("Print current sysroot"), TWO_DASHES },
   { {"qmagic", no_argument, NULL, OPTION_IGNORE},
     '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH },
   { {"reduce-memory-overheads", no_argument, NULL,
@@ -960,6 +962,11 @@ parse_args (unsigned argc, char **argv)
        case OPTION_OFORMAT:
          lang_add_output_format (optarg, NULL, NULL, 0);
          break;
+       case OPTION_PRINT_SYSROOT:
+         if (*ld_sysroot)
+           puts (ld_sysroot);
+         xexit (0);
+         break;
        case OPTION_PRINT_OUTPUT_FORMAT:
          command_line.print_output_format = TRUE;
          break;
index c01990c..bcba42a 100644 (file)
@@ -1,3 +1,16 @@
+2014-10-17  Hans-Peter Nilsson  <hp@axis.com>
+
+       Backport from master
+       * 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>
 
        Backport "="-ldscript-path-prefix changes from master.
index cf434df..65c9f70 100644 (file)
 # 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/" {} ""}
index ffdf805..7d2df22 100644 (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