[v3,0/7] Fix some libm static issues
[platform/upstream/glibc.git] / scripts / sysd-rules.awk
1 # This is a GAWK script to generate the sysd-rules file.
2 # It does not read any input, but it requires that several variables
3 # be set on its command line (using -v) to their makefile counterparts:
4 #       all_object_suffixes     $(all-object-suffixes)
5 #       inhibit_sysdep_asm      $(inhibit-sysdep-asm)
6 #       config_sysdirs          $(config_sysdirs)
7 #       sysd_rules_patterns     $(sysd-rules-patterns)
8
9 BEGIN {
10   print "sysd-rules-sysdirs :=", config_sysdirs;
11
12   nsuffixes = split(all_object_suffixes, suffixes);
13   ninhibit_asm = split(inhibit_sysdep_asm, inhibit_asm);
14   nsysdirs = split(config_sysdirs, sysdirs);
15   npatterns = split(sysd_rules_patterns, patterns);
16
17   # Each element of $(sysd-rules-patterns) is a pair TARGET:DEP.
18   # They are no in particular order.  We need to sort them so that
19   # the longest TARGET is first, and, among elements with the same
20   # TARGET, the longest DEP is first.
21   for (i = 1; i <= npatterns; ++i) {
22     if (split(patterns[i], td, ":") != 2) {
23       msg = "bad sysd-rules-patterns element '" patterns[i] "'";
24       print msg > "/dev/stderr";
25       exit 2;
26     }
27     target_order = sprintf("%09d", npatterns + 1 - length(td[1]));
28     dep_order = sprintf("%09d", npatterns - length(td[2]));
29     sort_patterns[target_order SUBSEP dep_order] = patterns[i];
30   }
31   asorti(sort_patterns, map_patterns);
32   for (i in map_patterns) {
33     patterns[i] = sort_patterns[map_patterns[i]];
34   }
35
36   for (sysdir_idx = 1; sysdir_idx <= nsysdirs; ++sysdir_idx) {
37     dir = sysdirs[sysdir_idx];
38     if (dir !~ /^\//) dir = "$(..)" dir;
39     asm_rules = 1;
40     for (i = 1; i <= ninhibit_asm; ++i) {
41       if (dir ~ ("^.*sysdeps/" inhibit_asm[i] "$")) {
42         asm_rules = 0;
43         break;
44       }
45     }
46     for (suffix_idx = 1; suffix_idx <= nsuffixes; ++suffix_idx) {
47       o = suffixes[suffix_idx];
48       for (pattern_idx = 1; pattern_idx <= npatterns; ++pattern_idx) {
49         pattern = patterns[pattern_idx];
50         split(pattern, td, ":");
51         target_pattern = td[1];
52         dep_pattern = td[2];
53         # rtld objects are always PIC.
54         if (target_pattern ~ /^rtld/ && o != ".os") {
55             continue;
56         }
57         if (target_pattern == "%") {
58           command_suffix = "";
59         } else {
60           prefix = gensub(/%/, "", 1, target_pattern);
61           command_suffix = " $(" prefix  "CPPFLAGS)" " $(" prefix  "CFLAGS)";
62         }
63         target = "$(objpfx)" target_pattern o ":";
64         if (asm_rules) {
65           dep = dir "/" dep_pattern ".S";
66           print target, dep, "$(before-compile)";
67           print "\t$(compile-command.S)" command_suffix;
68         }
69         dep = dir "/" dep_pattern ".c";
70         print target, dep, "$(before-compile)";
71         print "\t$(compile-command.c)" command_suffix;
72       }
73     }
74     print "$(inst_includedir)/%.h:", dir "/%.h", "$(+force)";
75     print "\t$(do-install)";
76   }
77
78   print "sysd-rules-done := t";
79   exit 0;
80 }