X-Git-Url: https://mattmccutchen.net/mgear/mgear.git/blobdiff_plain/eeabaff8ca99bdbd0f3a9ce0e99cbea114c2af16..0382f3351db8ba1e76ce006859783b7d49622892:/mgear.mk diff --git a/mgear.mk b/mgear.mk index 7eb2877..cccdbc2 100644 --- a/mgear.mk +++ b/mgear.mk @@ -10,11 +10,16 @@ mg-orig-default-goal:=$(.DEFAULT_GOAL) # instead of trying to anticipate which prerequisites it will need in advance. .SECONDEXPANSION: +# Deletion of intermediate files messes everything up. +# TODO: See if we can relax this requirement. +.SECONDARY: + # TEXT UTILITIES empty:= bs:=\$(empty) hash:=\# +comma:=, pct:=% define nl @@ -25,6 +30,9 @@ sq='$(subst ','\'',$1)' # Make-quote: a$\nb => a$$$(nl)b # This is enough to assign the value, *but not to use it as an argument!* mqas=$(subst $(hash),$$(hash),$(subst $(nl),$$(nl),$(subst $$,$$$$,$1))) +# Make the value safe to use as an argument without doubling $. +# *The implementation is incomplete*; I will improve it as needed. +msarg=$(subst $(comma),$$(comma),$1) # Return nonempty if the strings are equal, empty otherwise. # If the strings have only nice characters, you can do $(filter x$1,x$2). streq=$(findstring x$1,$(findstring x$2,x$1)) @@ -171,8 +179,8 @@ $(mg-scout-oid)@opr:= $(mg-scout-oid)@ocmd:= # Mgear-ized automatic variables. -# $@: needs no translation -# NOTE: $(mg@) is *eventual* target. Commands must write to temp file, $t . +# For now, if you really want the eventual target, write $$(@). +mg@ = $@.tmp # $%: haven't thought about it much, but probably needs no translation mg< = $(firstword $(mg^)) mg? = $(filter-out $(opfx)%,$($@@gq)) @@ -181,11 +189,11 @@ mg+ = $(filter-out MG-% $(opfx)%,$+) # $|: needs no translation # $*: needs no translation -# $(call mg-translate-cmd,cat $$< >$$t) +# $(call mg-translate-cmd,cat $$< >$$@) # Replaces references to automatic variables with references to their mgear-ized # counterparts. There might be false matches, e.g., $$@ => $$(mg@) ; # to prevent that, write $$$(empty)@ instead. (c.f. autoconf empty quadrigraph) -mg-translate-cmd=$(subst $$t,$$@.tmp,$(subst $$?,$$(mg?),$(subst $$<,$$(mg<),$(subst $$^,$$(mg^),$(subst $$+,$$(mg+),$1))))) +mg-translate-cmd=$(subst $$@,$$(mg@),$(subst $$?,$$(mg?),$(subst $$<,$$(mg<),$(subst $$^,$$(mg^),$(subst $$+,$$(mg+),$1))))) # $(call mg-prereq-predict,target,prerequisites) # Expands to code that does the following at second-expansion time: @@ -204,9 +212,10 @@ mg-prereq-predict=$$$$(call mg-set-gdeps,$$$$+ $(if $(findstring /,$1),$$$$(subs MG-FORCE: .PHONY: MG-FORCE -# $(call mg-define-rule,target,prerequisites,cmd) -# Defines a rule. cmd is expanded again when it is run, at which time -# Mgear-ized automatic variables are available. +# $(call mg-define-rule,target,prerequisites,cmdvar) +# Defines a rule. cmdvar is *the name of a variable* containing the command. +# The variable is read immediately with $(value) and then expanded in the scope +# of mgear-ized automatic variables each time the rule is run. # # I eradicated the target-specific variables because they fail when there are # multiple implicit rules with the same target pattern. @@ -216,7 +225,7 @@ MG-FORCE: # $(bar@gq). define mg-define-rule $(eval $1: $(call mg-prereq-predict,$1,$2) $2 MG-FORCE $(mg-genfile-oid)$(aname)$$$$@.g - $$(call mg-rule-cmd,$(call mg-translate-cmd,$3))) + $$(call mg-rule-cmd,$(call msarg,$(call mg-translate-cmd,$(value $3))))) endef # TODO Provide a way to define static pattern rules.