diff --git a/Make.rules b/Make.rules
index e6db2804f370f0c7623ce5dc291f8400eb24eefa..3bdf2670e1f8f7e22be48a791d8246334e08536e 100644
--- a/Make.rules
+++ b/Make.rules
@@ -47,6 +47,8 @@ export srctree objtree
 ##
 # Consult SCM for better version string.
 
+TAGPREFIX	?= v
+
 GIT_REV := $(shell test -d .git && git describe || echo exported)
 ifneq ($(GIT_REV), exported)
 FULL_VERSION	:= $(patsubst $(TAGPREFIX)%,%,$(GIT_REV))
@@ -152,7 +154,8 @@ escsq = $(subst $(squote),'\$(squote)',$1)
 
 # Find any prerequisites that is newer than target or that does not exist.
 # PHONY targets skipped in both cases.
-any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^)
+local-target-prereqs = %
+any-prereq = $(filter $(local-target-prereqs), $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^), $^))
 
 # Execute command if command has changed or prerequisite(s) are updated.
 #
@@ -188,6 +191,8 @@ define rule_cc_o_c
 	rm $(depfile)
 endef
 
+$(obj)/%.o: override local-target-prereqs=%
+
 $(obj)/%.o: $(src)/%.c FORCE
 	$(call if_changed_rule,cc_o_c)
 
@@ -204,6 +209,8 @@ quiet_cmd_ld	= LD      $@
 			  $(addprefix $(obj)/,$($(@F)-objs)) \
 			  $(LIBS) $(LIBS_$(@F))
 
+$(__progs): override local-target-prereqs=$(addprefix $(obj)/,$($(*F)-objs))
+
 $(__progs): $(obj)/%: $(cobjs) FORCE
 	$(call if_changed,ld)