diff options
Diffstat (limited to 'scripts/gen-sorted.awk')
-rwxr-xr-x | scripts/gen-sorted.awk | 113 |
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" } |