2003-03-02 Roland McGrath <roland@redhat.com>
[kopensolaris-gnu/glibc.git] / scripts / versions.awk
index 086a963..7e33387 100644 (file)
@@ -1,6 +1,5 @@
-# Combine version map fragments into version files for the generated
-# shared object.
-# (C) Copyright 1998, 1999 Free Software Foundation, Inc.
+# Combine version map fragments into version scripts for our shared objects.
+# Copyright (C) 1998,99,2000,02 Free Software Foundation, Inc.
 # Written by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
 # This script expects the following variables to be defined:
@@ -16,8 +15,9 @@ BEGIN {
       libs[$1] = 1;
       curlib = $1;
       while (getline < defsfile && ! /^}/) {
-        if ($2 == "=")
-         renamed[$1] = $3;
+      if ($2 == "=") {
+         renamed[curlib "::" $1] = $3;
+      }
        else
          versions[$1] = 1;
       }
@@ -26,7 +26,10 @@ BEGIN {
   close(defsfile);
 
   tmpfile = buildroot "Versions.tmp";
-  sort = "sort -n > " tmpfile;
+  # Note this sorting presumes only single digits between dots for proper
+  # numeric ordering.  sort -n doesn't do quite the right thing either,
+  # and in some non-GNU sort implementations does not sort at all.
+  sort = "sort > " tmpfile;
 }
 
 # Remove comment lines.
@@ -36,7 +39,6 @@ BEGIN {
 
 # This matches the beginning of the version information for a new library.
 /^[a-zA-Z0-9_.]+/ {
-  delete renamed;
   actlib = $1;
   if (!libs[$1]) {
     printf("no versions defined for %s\n", $1) > "/dev/stderr";
@@ -47,10 +49,10 @@ BEGIN {
 
 # This matches the beginning of a new version for the current library.
 /^  [A-Za-z_]/ {
-  if (renamed[$1])
-    actver = renamed[$1];
+  if (renamed[actlib "::" $1])
+    actver = renamed[actlib "::" $1];
   else if (!versions[$1]) {
-    printf("version %s not defined\n", $1) > "/dev/stderr";
+    printf("version %s not defined for %s\n", $1, actlib) > "/dev/stderr";
     exit 1;
   }
   else
@@ -62,7 +64,10 @@ BEGIN {
 # current library.  This is the only place where we print something to
 # the intermediate file.
 /^   / {
-  printf("%s %s %s\n", actlib, actver, $0) | sort;
+  sortver=actver
+  # Ensure GLIBC_ versions come always first
+  sub(/^GLIBC_/," GLIBC_",sortver)
+  printf("%s %s %s\n", actlib, sortver, $0) | sort;
 }
 
 
@@ -71,7 +76,13 @@ function closeversion(name, oldname) {
     printf("  local:\n    *;\n") > outfile;
     firstinfile = 0;
   }
-  printf("}%s;\n", oldname) > outfile;
+  # This version inherits from the last one only if they
+  # have the same nonnumeric prefix, i.e. GLIBC_x.y and GLIBC_x.z
+  # or FOO_x and FOO_y but not GLIBC_x and FOO_y.
+  pfx = oldname;
+  sub(/[0-9.]+/,".+",pfx);
+  if (oldname == "" || name !~ pfx) print "};" > outfile;
+  else printf("} %s;\n", oldname) > outfile;
 }
 
 function close_and_move(name, real_name) {
@@ -85,7 +96,7 @@ END {
   oldlib = "";
   oldver = "";
   printf("version-maps =");
-  while(getline < tmpfile) {
+  while (getline < tmpfile) {
     if ($1 != oldlib) {
       if (oldlib != "") {
        closeversion(oldver, veryoldver);