%.variables: %.tools %.subprojects @ \ target=$(basename $(basename $*)); \ operation=$(subst .,,$(suffix $(basename $*))); \ type=$(subst -,_,$(subst .,,$(suffix $*))); \ echo Making $$operation for $$type $$target...; \ $(MAKE) -f $(MAKEFILE_NAME) --no-print-directory --no-keep-going \ internal-$${type}-$$operation \ INTERNAL_$${type}_NAME=$$target \ TARGET=$$target \ _SUBPROJECTS="$($(basename $(basename $*))_SUBPROJECTS)" \ ...This rule matches all targets ending in .variables. First of all, the rule depends on the corresponding %.tools and %.subprojects rules. This is because before processing the target itself, gnustep-make needs to process the related subprojects and (only for frameworks) the framework tools. We ignore this complication of subprojects and framework tools for now; if you look at the %.subprojects and %.tools rules you see that they do nothing if you are not actually using subprojects or framework tools in your makefile.