From 346d65b33a3958c72faab6f675314cbef7963ace Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Mon, 17 Jun 2013 09:55:21 -0700 Subject: [PATCH] Rewrite sysd-rules generation using an awk script. --- ChangeLog | 8 +++++++ Makerules | 43 ++++++++------------------------- scripts/sysd-rules.awk | 60 ++++++++++++++++++++++++++++++++++++++++++++++ sysdeps/mach/hurd/Makefile | 2 +- 4 files changed, 79 insertions(+), 34 deletions(-) create mode 100644 scripts/sysd-rules.awk diff --git a/ChangeLog b/ChangeLog index e7291a6..e552050 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-06-17 Roland McGrath + + * Makerules [inhibit-sysdep-asm] (check-inhibit-asm): Variable removed. + ($(common-objpfx)sysd-rules): Replace shell logic with running ... + * scripts/sysd-rules.awk: ... this new script. + * sysdeps/mach/hurd/Makefile (inhibit-sysdep-asm): Use a regexp rather + than a glob-style pattern. + 2013-06-17 Joseph Myers * math/test-misc.c (main): Do not treat incorrectly rounded diff --git a/Makerules b/Makerules index 2c25233..03eafb0 100644 --- a/Makerules +++ b/Makerules @@ -217,14 +217,9 @@ endif # later directory would be chosen over a .c file in an earlier directory, # which does not preserve the desired sysdeps ordering behavior. -# System-dependent makefiles can put in `inhibit-sysdep-asm' wildcard -# patterns matching sysdep directories whose assembly source files should -# be suppressed. -ifdef inhibit-sysdep-asm -define check-inhibit-asm -case $$sysdir in $(subst $(empty) ,|,$(inhibit-sysdep-asm))) asm= ;; esac; -endef -endif +# System-dependent makefiles can put in `inhibit-sysdep-asm' regexps +# matching sysdep directories whose assembly source files should be +# suppressed. -include $(common-objpfx)sysd-rules ifneq ($(sysd-rules-sysdirs),$(config-sysdirs)) @@ -233,34 +228,16 @@ ifneq ($(sysd-rules-sysdirs),$(config-sysdirs)) sysd-rules-force = FORCE FORCE: endif -$(common-objpfx)sysd-rules: $(common-objpfx)config.make $(..)Makerules \ +$(common-objpfx)sysd-rules: $(..)scripts/sysd-rules.awk \ + $(common-objpfx)config.make $(..)Makerules \ $(sysdep-makefiles) $(sysdep-makeconfigs) \ $(sysd-rules-force) -@rm -f $@T - (echo 'sysd-rules-sysdirs := $(config-sysdirs)'; \ - for dir in $(config-sysdirs); do \ - case "$$dir" in \ - /*) ;; \ - *) dir="\$$(..)$$dir" ;; \ - esac; \ - asm='.S'; \ - $(check-inhibit-asm) \ - for o in $(all-object-suffixes); do \ - set $(subst :, ,$(sysd-rules-patterns)); \ - while [ $$# -ge 2 ]; do \ - t=$$1; shift; \ - d=$$1; shift; \ - v=$${t%%%}; [ x"$$v" = x ] || v="\$$($${v}CPPFLAGS)"; \ - for s in $$asm .c; do \ - echo "\$$(objpfx)$$t$$o: $$dir/$$d$$s \$$(before-compile)"; \ - echo " \$$(compile-command$$s) $$v"; \ - done; \ - done; \ - done; \ - echo "\$$(inst_includedir)/%.h: $$dir/%.h \$$(+force)"; \ - echo " \$$(do-install)"; \ - done; \ - echo 'sysd-rules-done = t') > $@T + LC_ALL=C $(AWK) -f $< > $@T \ + -v all_object_suffixes='$(all-object-suffixes)' \ + -v inhibit_sysdep_asm='$(inhibit-sysdep-asm)' \ + -v sysd_rules_patterns='$(sysd-rules-patterns)' \ + -v config_sysdirs='$(config-sysdirs)' mv -f $@T $@ ifndef sysd-rules-done diff --git a/scripts/sysd-rules.awk b/scripts/sysd-rules.awk new file mode 100644 index 0000000..2fb044e --- /dev/null +++ b/scripts/sysd-rules.awk @@ -0,0 +1,60 @@ +# This is a GAWK script to generate the sysd-rules file. +# It does not read any input, but it requires that several variables +# be set on its command line (using -v) to their makefile counterparts: +# all_object_suffixes $(all-object-suffixes) +# inhibit_sysdep_asm $(inhibit-sysdep-asm) +# config_sysdirs $(config_sysdirs) +# sysd_rules_patterns $(sysd-rules-patterns) + +BEGIN { + print "sysd-rules-sysdirs :=", config_sysdirs; + + nsuffixes = split(all_object_suffixes, suffixes); + ninhibit_asm = split(inhibit_sysdep_asm, inhibit_asm); + nsysdirs = split(config_sysdirs, sysdirs); + npatterns = split(sysd_rules_patterns, patterns); + + for (sysdir_idx = 1; sysdir_idx <= nsysdirs; ++sysdir_idx) { + dir = sysdirs[sysdir_idx]; + if (dir !~ /^\//) dir = "$(..)" dir; + asm_rules = 1; + for (i = 1; i <= ninhibit_asm; ++i) { + if (dir ~ ("^.*sysdeps/" inhibit_asm[i] "$")) { + asm_rules = 0; + break; + } + } + for (suffix_idx = 1; suffix_idx <= nsuffixes; ++suffix_idx) { + o = suffixes[suffix_idx]; + for (pattern_idx = 1; pattern_idx <= npatterns; ++pattern_idx) { + pattern = patterns[pattern_idx]; + if (split(pattern, td, ":") != 2) { + print "bad sysd-rules-patterns element '" pattern "'" > "/dev/stderr"; + exit 2; + } + target_pattern = td[1]; + dep_pattern = td[2]; + if (target_pattern == "%") { + command_suffix = ""; + } else { + prefix = gensub(/%/, "", "", target_pattern); + command_suffix = " $(" prefix "CPPFLAGS)"; + } + target = "$(objpfx)" target_pattern o ":"; + if (asm_rules) { + dep = dir "/" dep_pattern ".S"; + print target, dep, "$(before-compile)"; + print "\t$(compile-command.S)" command_suffix; + } + dep = dir "/" dep_pattern ".c"; + print target, dep, "$(before-compile)"; + print "\t$(compile-command.c)" command_suffix; + } + } + print "$(inst_includedir)/%.h:", dir "/%.h", "$(+force)"; + print "\t$(do-install)"; + } + + print "sysd-rules-done := t"; + exit 0; +} diff --git a/sysdeps/mach/hurd/Makefile b/sysdeps/mach/hurd/Makefile index 68aedb6..7ff9a92 100644 --- a/sysdeps/mach/hurd/Makefile +++ b/sysdeps/mach/hurd/Makefile @@ -28,7 +28,7 @@ includes += -I$(..)hurd -I$(common-objpfx)hurd/ # Do not use any assembly code from sysdeps/unix (and subdirectories). # This bypasses all the system call stubs and uses any existing posix or # generic C files instead. -inhibit-sysdep-asm += unix* +inhibit-sysdep-asm += unix.* inhibit-unix-syscalls = yes # Don't try to generate anything from the installed Unix system and its -- 2.7.4