Blame scripts/gen-sorted.awk

Packit 6c4009
#!/usr/bin/awk -f
Packit 6c4009
# Generate sorted list of directories.  The sorting is stable but with
Packit 6c4009
# dependencies between directories resolved by moving dependees in front.
Packit 6c4009
# Copyright (C) 1998-2018 Free Software Foundation, Inc.
Packit 6c4009
# Written by Ulrich Drepper <drepper@cygnus.com>, 1998.
Packit 6c4009
Packit 6c4009
BEGIN {
Packit 6c4009
  cnt = split(subdirs, all) + 1
Packit 6c4009
  dnt = 0
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
# Let input files have comments.
Packit 6c4009
{ sub(/[ 	]*#.*$/, "") }
Packit 6c4009
NF == 0 { next }
Packit 6c4009
Packit 6c4009
{
Packit 6c4009
  subdir = type = FILENAME;
Packit 6c4009
  sub(/^.*\//, "", type);
Packit 6c4009
  sub(/\/[^/]+$/, "", subdir);
Packit 6c4009
  sub(/^.*\//, "", subdir);
Packit 6c4009
  thisdir = "";
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
type == "Depend" && NF == 1 {
Packit 6c4009
  from[dnt] = subdir;
Packit 6c4009
  to[dnt] = $1;
Packit 6c4009
  ++dnt;
Packit 6c4009
  next
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
type == "Subdirs" && NF == 1 { thisdir = $1 }
Packit 6c4009
Packit 6c4009
type == "Subdirs" && NF == 2 && $1 == "first" {
Packit 6c4009
  thisdir = $2;
Packit 6c4009
  # Make the first dir in the list depend on this one.
Packit 6c4009
  from[dnt] = all[1];
Packit 6c4009
  to[dnt] = thisdir;
Packit 6c4009
  ++dnt;
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
type == "Subdirs" && NF == 2 && $1 == "inhibit" {
Packit 6c4009
  inhibit[$2] = subdir;
Packit 6c4009
  next
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
type == "Subdirs" && thisdir {
Packit 6c4009
  all[cnt++] = thisdir;
Packit 6c4009
Packit 6c4009
  this_srcdir = srcpfx thisdir
Packit 6c4009
  if (system("test -d " this_srcdir) != 0) {
Packit 6c4009
    print FILENAME ":" FNR ":", "cannot find", this_srcdir > "/dev/stderr";
Packit 6c4009
    exit 2
Packit 6c4009
  }
Packit 6c4009
  file = this_srcdir "/Depend";
Packit 6c4009
  if (system("test -f " file) == 0) {
Packit 6c4009
    ARGV[ARGC++] = file;
Packit 6c4009
    # Emit a dependency on the implicitly-read file.
Packit 6c4009
    if (srcpfx)
Packit 6c4009
      sub(/^\.\.\//, "", file);
Packit 6c4009
    if (file !~ /^\/.*$/)
Packit 6c4009
      file = "$(..)" file;
Packit 6c4009
    print "$(common-objpfx)sysd-sorted:", "$(wildcard", file ")";
Packit 6c4009
  }
Packit 6c4009
  next
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
{
Packit 6c4009
  print FILENAME ":" FNR ":", "what type of file is this?" > "/dev/stderr";
Packit 6c4009
  exit 2
Packit 6c4009
}
Packit 6c4009
Packit 6c4009
END {
Packit 6c4009
  do {
Packit 6c4009
    moved = 0
Packit 6c4009
    for (i = 0; i < dnt; ++i) {
Packit 6c4009
      for (j = 1; j < cnt; ++j) {
Packit 6c4009
	if (all[j] == from[i]) {
Packit 6c4009
	  for (k = j + 1; k < cnt; ++k) {
Packit 6c4009
	    if (all[k] == to[i]) {
Packit 6c4009
	      break;
Packit 6c4009
	    }
Packit 6c4009
	  }
Packit 6c4009
	  if (k < cnt) {
Packit 6c4009
	    for (l = k - 1; l >= j; --l) {
Packit 6c4009
	      all[l + 1] = all[l]
Packit 6c4009
	    }
Packit 6c4009
	    all[j] = to[i]
Packit 6c4009
	    break;
Packit 6c4009
	  }
Packit 6c4009
	}
Packit 6c4009
      }
Packit 6c4009
      if (j < cnt) {
Packit 6c4009
	moved = 1
Packit 6c4009
	break
Packit 6c4009
      }
Packit 6c4009
    }
Packit 6c4009
  } while (moved);
Packit 6c4009
Packit 6c4009
  # Make sure we list "elf" last.
Packit 6c4009
  saw_elf = 0;
Packit 6c4009
  printf "sorted-subdirs :=";
Packit 6c4009
  for (i = 1; i < cnt; ++i) {
Packit 6c4009
    if (all[i] in inhibit)
Packit 6c4009
      continue;
Packit 6c4009
    if (all[i] == "elf")
Packit 6c4009
      saw_elf = 1;
Packit 6c4009
    else
Packit 6c4009
      printf " %s", all[i];
Packit 6c4009
  }
Packit 6c4009
  printf "%s\n", saw_elf ? " elf" : "";
Packit 6c4009
Packit 6c4009
  print "sysd-sorted-done := t"
Packit 6c4009
}