diff options
Diffstat (limited to 'REORG.TODO/scripts/gen-sorted.awk')
-rwxr-xr-x | REORG.TODO/scripts/gen-sorted.awk | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/REORG.TODO/scripts/gen-sorted.awk b/REORG.TODO/scripts/gen-sorted.awk new file mode 100755 index 0000000000..922eafcc2d --- /dev/null +++ b/REORG.TODO/scripts/gen-sorted.awk @@ -0,0 +1,139 @@ +#!/usr/bin/awk -f +# Generate sorted list of directories. The sorting is stable but with +# dependencies between directories resolved by moving dependees in front. +# Copyright (C) 1998-2017 Free Software Foundation, Inc. +# Written by Ulrich Drepper <drepper@cygnus.com>, 1998. + +BEGIN { + cnt = split(subdirs, all) + 1 + dnt = 0 +} + +# Let input files have comments. +{ sub(/[ ]*#.*$/, "") } +NF == 0 { next } + +{ + 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 = 1; j < cnt; ++j) { + if (all[j] == from[i]) { + for (k = j + 1; k < cnt; ++k) { + if (all[k] == to[i]) { + break; + } + } + if (k < cnt) { + for (l = k - 1; l >= j; --l) { + all[l + 1] = all[l] + } + all[j] = to[i] + break; + } + } + } + if (j < cnt) { + moved = 1 + break + } + } + } while (moved); + + # 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 "%s\n", saw_elf ? " elf" : ""; + + print "sysd-sorted-done := t" +} |