123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #!/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-2019 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;
- this_srcdir = srcpfx thisdir
- if (system("test -d " this_srcdir) != 0) {
- print FILENAME ":" FNR ":", "cannot find", this_srcdir > "/dev/stderr";
- exit 2
- }
- 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"
- }
|