hjl / source-git / glibc

Forked from source-git/glibc 3 years ago
Clone

Blame scripts/sysd-rules.awk

Packit 6c4009
# This is a GAWK script to generate the sysd-rules file.
Packit 6c4009
# It does not read any input, but it requires that several variables
Packit 6c4009
# be set on its command line (using -v) to their makefile counterparts:
Packit 6c4009
#	all_object_suffixes	$(all-object-suffixes)
Packit 6c4009
#	inhibit_sysdep_asm	$(inhibit-sysdep-asm)
Packit 6c4009
#	config_sysdirs		$(config_sysdirs)
Packit 6c4009
#	sysd_rules_patterns	$(sysd-rules-patterns)
Packit 6c4009
Packit 6c4009
BEGIN {
Packit 6c4009
  print "sysd-rules-sysdirs :=", config_sysdirs;
Packit 6c4009
Packit 6c4009
  nsuffixes = split(all_object_suffixes, suffixes);
Packit 6c4009
  ninhibit_asm = split(inhibit_sysdep_asm, inhibit_asm);
Packit 6c4009
  nsysdirs = split(config_sysdirs, sysdirs);
Packit 6c4009
  npatterns = split(sysd_rules_patterns, patterns);
Packit 6c4009
Packit 6c4009
  # Each element of $(sysd-rules-patterns) is a pair TARGET:DEP.
Packit 6c4009
  # They are no in particular order.  We need to sort them so that
Packit 6c4009
  # the longest TARGET is first, and, among elements with the same
Packit 6c4009
  # TARGET, the longest DEP is first.
Packit 6c4009
  for (i = 1; i <= npatterns; ++i) {
Packit 6c4009
    if (split(patterns[i], td, ":") != 2) {
Packit 6c4009
      msg = "bad sysd-rules-patterns element '" patterns[i] "'";
Packit 6c4009
      print msg > "/dev/stderr";
Packit 6c4009
      exit 2;
Packit 6c4009
    }
Packit 6c4009
    target_order = sprintf("%09d", npatterns + 1 - length(td[1]));
Packit 6c4009
    dep_order = sprintf("%09d", npatterns - length(td[2]));
Packit 6c4009
    sort_patterns[target_order SUBSEP dep_order] = patterns[i];
Packit 6c4009
  }
Packit 6c4009
  asorti(sort_patterns, map_patterns);
Packit 6c4009
  for (i in map_patterns) {
Packit 6c4009
    patterns[i] = sort_patterns[map_patterns[i]];
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
  for (sysdir_idx = 1; sysdir_idx <= nsysdirs; ++sysdir_idx) {
Packit 6c4009
    dir = sysdirs[sysdir_idx];
Packit 6c4009
    if (dir !~ /^\//) dir = "$(..)" dir;
Packit 6c4009
    asm_rules = 1;
Packit 6c4009
    for (i = 1; i <= ninhibit_asm; ++i) {
Packit 6c4009
      if (dir ~ ("^.*sysdeps/" inhibit_asm[i] "$")) {
Packit 6c4009
        asm_rules = 0;
Packit 6c4009
        break;
Packit 6c4009
      }
Packit 6c4009
    }
Packit 6c4009
    for (suffix_idx = 1; suffix_idx <= nsuffixes; ++suffix_idx) {
Packit 6c4009
      o = suffixes[suffix_idx];
Packit 6c4009
      for (pattern_idx = 1; pattern_idx <= npatterns; ++pattern_idx) {
Packit 6c4009
        pattern = patterns[pattern_idx];
Packit 6c4009
        split(pattern, td, ":");
Packit 6c4009
        target_pattern = td[1];
Packit 6c4009
        dep_pattern = td[2];
Packit 6c4009
        # rtld objects are always PIC.
Packit 6c4009
        if (target_pattern ~ /^rtld/ && o != ".os") {
Packit 6c4009
            continue;
Packit 6c4009
        }
Packit 6c4009
        if (target_pattern == "%") {
Packit 6c4009
          command_suffix = "";
Packit 6c4009
        } else {
Packit 6c4009
          prefix = gensub(/%/, "", 1, target_pattern);
Packit 6c4009
          command_suffix = " $(" prefix  "CPPFLAGS)" " $(" prefix  "CFLAGS)";
Packit 6c4009
        }
Packit 6c4009
        target = "$(objpfx)" target_pattern o ":";
Packit 6c4009
        if (asm_rules) {
Packit 6c4009
          dep = dir "/" dep_pattern ".S";
Packit 6c4009
          print target, dep, "$(before-compile)";
Packit 6c4009
          print "\t$(compile-command.S)" command_suffix;
Packit 6c4009
        }
Packit 6c4009
        dep = dir "/" dep_pattern ".c";
Packit 6c4009
        print target, dep, "$(before-compile)";
Packit 6c4009
        print "\t$(compile-command.c)" command_suffix;
Packit 6c4009
      }
Packit 6c4009
    }
Packit 6c4009
    print "$(inst_includedir)/%.h:", dir "/%.h", "$(+force)";
Packit 6c4009
    print "\t$(do-install)";
Packit 6c4009
  }
Packit 6c4009
Packit 6c4009
  print "sysd-rules-done := t";
Packit 6c4009
  exit 0;
Packit 6c4009
}