about summary refs log tree commit diff
path: root/scripts/gen-sorted.awk
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/gen-sorted.awk')
-rwxr-xr-xscripts/gen-sorted.awk113
1 files changed, 100 insertions, 13 deletions
diff --git a/scripts/gen-sorted.awk b/scripts/gen-sorted.awk
index a943df6d2f..0092fe61d1 100755
--- a/scripts/gen-sorted.awk
+++ b/scripts/gen-sorted.awk
@@ -5,23 +5,101 @@
 # Written by Ulrich Drepper <drepper@cygnus.com>, 1998.
 
 BEGIN {
-  cnt = 0
+  cnt = split(subdirs, all) + 1
   dnt = 0
 }
+
+# Let input files have comments.
+{ sub(/[ 	]*#.*$/, "") }
+NF == 0 { next }
+
 {
-  if ($1 ~ /depend/) {
-    from[dnt] = $2
-    to[dnt] = $3
-    ++dnt
-  } else {
-    all[cnt++] = $1
+  subdir = type = FILENAME;
+  sub(/^.*\//, "", type);
+  sub(/\/[^/]+$/, "", subdir);
+  sub(/^.*\//, "", subdir);
+  thisdir = "";
+}
+
+type == "Depend" && NF == 1 {
+  from[dnt] = subdir;
+  to[dnt] = $1;
+  ++dnt;
+  next
+}
+
+type == "Subdirs" && NF == 1 { thisdir = $1 }
+
+type == "Subdirs" && NF == 2 && $1 == "first" {
+  thisdir = $2;
+  # Make the first dir in the list depend on this one.
+  from[dnt] = all[1];
+  to[dnt] = thisdir;
+  ++dnt;
+}
+
+type == "Subdirs" && NF == 2 && $1 == "inhibit" {
+  inhibit[$2] = subdir;
+  next
+}
+
+type == "Subdirs" && thisdir {
+  all[cnt++] = thisdir;
+
+  if (FILENAME ~ (srcpfx ? /^\.\.\/sysdeps\// : /^sysdeps\//) \
+      || system("test -d " srcpfx thisdir) == 0) {
+    # This Subdirs file is in the main source tree,
+    # or this subdirectory exists in the main source tree.
+    this_srcdir = srcpfx thisdir
+  }
+  else {
+    # The Subdirs file comes from an add-on that should have the subdirectory.
+    dir = FILENAME;
+    do
+      sub(/\/[^/]+$/, "", dir);
+    while (dir !~ /\/sysdeps$/);
+    sub(/\/sysdeps$/, "", dir);
+    if (system("test -d " dir "/" thisdir) == 0)
+      dir = dir "/" thisdir;
+    else {
+      sub(/\/[^/]+$/, "", dir);
+      if (system("test -d " dir "/" thisdir) == 0)
+        dir = dir "/" thisdir;
+      else {
+	print FILENAME ":" FNR ":", "cannot find", thisdir > "/dev/stderr";
+	exit 2
+      }
+    }
+    file = dir "/Depend";
+    if (srcpfx)
+      sub(/^\.\.\//, "", dir);
+    if (dir !~ /^\/.*$/)
+      dir = "$(..)" dir;
+    print thisdir "-srcdir", ":=", dir;
+  }
+  file = this_srcdir "/Depend";
+  if (system("test -f " file) == 0) {
+    ARGV[ARGC++] = file;
+    # Emit a dependency on the implicitly-read file.
+    if (srcpfx)
+      sub(/^\.\.\//, "", file);
+    if (file !~ /^\/.*$/)
+      file = "$(..)" file;
+    print "$(common-objpfx)sysd-sorted:", "$(wildcard", file ")";
   }
+  next
 }
+
+{
+  print FILENAME ":" FNR ":", "what type of file is this?" > "/dev/stderr";
+  exit 2
+}
+
 END {
   do {
     moved = 0
     for (i = 0; i < dnt; ++i) {
-      for (j = 0; j < cnt; ++j) {
+      for (j = 1; j < cnt; ++j) {
 	if (all[j] == from[i]) {
 	  for (k = j + 1; k < cnt; ++k) {
 	    if (all[k] == to[i]) {
@@ -42,11 +120,20 @@ END {
 	break
       }
     }
-  } while (moved)
+  } while (moved);
 
-  printf "sorted-subdirs = "
-  for (i = 0; i < cnt; ++i) {
-    printf "%s ", all[i];
+  # Make sure we list "elf" last.
+  saw_elf = 0;
+  printf "sorted-subdirs :=";
+  for (i = 1; i < cnt; ++i) {
+    if (all[i] in inhibit)
+      continue;
+    if (all[i] == "elf")
+      saw_elf = 1;
+    else
+      printf " %s", all[i];
   }
-  printf "\n"
+  printf "%s\n", saw_elf ? " elf" : "";
+
+  print "sysd-sorted-done := t"
 }