[roland/Versions.def] Get rid of Versions.def source file

Message ID 20140325182216.960597445E@topped-with-meat.com
State Committed
Headers

Commit Message

Roland McGrath March 25, 2014, 6:22 p.m. UTC
  This was the quickest fix that seems like it works, but it's a kludge (also
on branch roland/Versions.def-sort).  Please test it for the mips case.  I
think the really proper approach is to preserve the order sets appeared in
Versions files.  I'll look into implementing that now.


Thanks,
Roland


2014-03-25  Roland McGrath  <roland@hack.frob.com>

	* scripts/versionlist.awk: Partition the version sets and emit all
	GLIBC_* (sorted) before all others (sorted).
  

Comments

Joseph Myers March 25, 2014, 9:55 p.m. UTC | #1
On Tue, 25 Mar 2014, Roland McGrath wrote:

> This was the quickest fix that seems like it works, but it's a kludge (also
> on branch roland/Versions.def-sort).  Please test it for the mips case.  I
> think the really proper approach is to preserve the order sets appeared in
> Versions files.  I'll look into implementing that now.

Together with my addition of GLIBC_2.2.5 to elf/Versions (which I've now 
committed), this fixes the ABI tests for MIPS (tested for all three ABIs).
  
Roland McGrath March 25, 2014, 9:58 p.m. UTC | #2
> On Tue, 25 Mar 2014, Roland McGrath wrote:
> 
> > This was the quickest fix that seems like it works, but it's a kludge (also
> > on branch roland/Versions.def-sort).  Please test it for the mips case.  I
> > think the really proper approach is to preserve the order sets appeared in
> > Versions files.  I'll look into implementing that now.
> 
> Together with my addition of GLIBC_2.2.5 to elf/Versions (which I've now 
> committed), this fixes the ABI tests for MIPS (tested for all three ABIs).

Ok, I'll put this in now.  I'm not going to implement something better
today.


Thanks,
Roland
  

Patch

--- a/scripts/versionlist.awk
+++ b/scripts/versionlist.awk
@@ -3,14 +3,25 @@ 
 
 BEGIN { in_lib = ""; in_version = 0 }
 
-!in_lib && NF == 2 && $2 == "{" { in_lib = $1; next }
+!in_lib && NF == 2 && $2 == "{" {
+  in_lib = $1;
+  all_libs[in_lib] = 1;
+  next
+}
 !in_lib { next }
 
 NF == 2 && $2 == "{" {
   in_version = 1;
-  libs[in_lib] = libs[in_lib] "  " $1 "\n";
   lib_versions[in_lib, $1] = 1;
-  all_versions[$1] = 1;
+  # Partition the version sets into GLIBC_* and others.
+  if ($1 ~ /GLIBC_/) {
+    libs[in_lib] = libs[in_lib] "  " $1 "\n";
+    all_versions[$1] = 1;
+  }
+  else {
+    others_libs[in_lib] = others_libs[in_lib] "  " $1 "\n";
+    others_all_versions[$1] = 1;
+  }
   next
 }
 
@@ -20,20 +31,37 @@  in_version { next }
 $1 == "}" { in_lib = ""; next }
 
 END {
-  nlibs = asorti(libs, libs_order);
+  nlibs = asorti(all_libs, libs_order);
   for (i = 1; i <= nlibs; ++i) {
     lib = libs_order[i];
 
     for (v in all_versions) {
-      if (!((in_lib, v) in lib_versions)) {
+      if (!((lib, v) in lib_versions)) {
         libs[lib] = libs[lib] "  " v "\n";
       }
     }
 
+    for (v in others_all_versions) {
+      if (!((lib, v) in lib_versions)) {
+        others_libs[lib] = others_libs[lib] "  " v "\n";
+      }
+    }
+
     print lib, "{";
+
+    # Sort and print all the GLIBC_* sets first, then all the others.
+    # This is not really generically right, but it suffices
+    # for the cases we have so far.  e.g. GCC_3.0 is "later than"
+    # all GLIBC_* sets that matter for purposes of Versions files.
+
     sort = "sort -u -t. -k 1,1 -k 2n,2n -k 3";
     printf "%s", libs[lib] | sort;
     close(sort);
+
+    sort = "sort -u -t. -k 1,1 -k 2n,2n -k 3";
+    printf "%s", others_libs[lib] | sort;
+    close(sort);
+
     print "}";
   }
 }