Browse Source

- store the used compiler plus flags in the .%.dep files too and
use this info to decide whether or not to rebuild something (if e.g. the
filestamp of the prereq did not change but the cc or CFLAGS did).

For files that we did not yet build we have no flags on record, so those
did change inherently and we rebuild.

Shouldn't be much slower than before.

Bernhard Reutner-Fischer 16 years ago
parent
commit
6f53879929
1 changed files with 49 additions and 23 deletions
  1. 49 23
      Makerules

+ 49 - 23
Makerules

@@ -60,6 +60,8 @@ endif
 show_objs = $(subst ../,,$@)
 
 pur_disp_compile.c = echo "  "CC $(show_objs)
+pur_disp_compile.i = echo "  "CPP $(show_objs)
+pur_disp_compile.s = echo "  "CC-S $(show_objs)
 pur_disp_compile.u = echo "  "CC $(show_objs)
 pur_disp_compile.S = echo "  "AS $(show_objs)
 pur_disp_compile.m = $(pur_disp_compile.c)
@@ -70,6 +72,8 @@ pur_disp_ar        = echo "  "AR $(ARFLAGS) $@
 pur_disp_ld        = echo "  "LD $(1)
 
 sil_disp_compile.c = true
+sil_disp_compile.i = true
+sil_disp_compile.s = true
 sil_disp_compile.u = true
 sil_disp_compile.S = true
 sil_disp_compile.m = true
@@ -80,6 +84,8 @@ sil_disp_ar        = true
 sil_disp_ld        = true
 
 ver_disp_compile.c = echo $(cmd_compile.c)
+ver_disp_compile.i = echo $(cmd_compile.i)
+ver_disp_compile.s = echo $(cmd_compile.s)
 ver_disp_compile.u = echo $(cmd_compile.u)
 ver_disp_compile.S = echo $(cmd_compile.S)
 ver_disp_compile.m = echo $(cmd_compile.m)
@@ -90,6 +96,8 @@ ver_disp_ar        = echo $(cmd_ar)
 ver_disp_ld        =
 
 disp_compile.c = $($(DISP)_disp_compile.c)
+disp_compile.i = $($(DISP)_disp_compile.i)
+disp_compile.s = $($(DISP)_disp_compile.s)
 disp_compile.u = $($(DISP)_disp_compile.u)
 disp_compile.S = $($(DISP)_disp_compile.S)
 disp_compile.m = $($(DISP)_disp_compile.m)
@@ -99,22 +107,38 @@ disp_t_strip   = $($(DISP)_disp_t_strip)
 disp_ar        = $($(DISP)_disp_ar)
 disp_ld        = $($(DISP)_disp_ld)
 
-cmd_gen.dep = -MT $@ -MD -MF $(dir $@).$(notdir $@).dep
-
-cmd_compile.c = $(CC) -c $< -o $@ $(CFLAGS) $(ARCH_CFLAGS) $(CFLAGS-$(suffix $@)) $(filter-out $(CFLAGS-OMIT-$(notdir $<)),$(CFLAGS-$(notdir $(^D)))) $(CFLAGS-$(subst $(top_srcdir),,$(dir $<))) $(CFLAGS-$(notdir $<)) $(CFLAGS-$(notdir $@))  $(cmd_gen.dep)
-cmd_compile.u = $(CC) $^ $(DEPS-$(notdir $@)) -o $@ $(CFLAGS) $(CFLAGS-$(notdir $(^D))) $(CFLAGS-$(notdir $@)) $(cmd_gen.dep)
+CFLAGS_gen.dep = -MT $@ -MD -MF $(dir $@).$(notdir $@).dep
+
+# True if not identical. Neither order nor whitespace nor identical flags
+# matter.
+compare_flags = $(strip $(filter-out $(cmd_$(1)), $(cmd_$(@))) \
+			$(filter-out $(cmd_$(@)), $(cmd_$(1))))
+
+# Rebuild if the used CC or flags changed.
+# Previously used flags are stored in the corresponding .%.dep files
+maybe_exec = $(if $(strip $(compare_flags)), \
+		@set -e; \
+		$(disp_$(1)); \
+		$(cmd_$(1)); \
+		echo 'cmd_$@ := $(cmd_$1)' >> $(dir $@).$(notdir $@).dep)
+
+cmd_compile.c = $(CC) -c $< -o $@ $(CFLAGS) $(ARCH_CFLAGS) $(CFLAGS-$(suffix $@)) $(filter-out $(CFLAGS-OMIT-$(notdir $<)),$(CFLAGS-$(notdir $(^D)))) $(CFLAGS-$(subst $(top_srcdir),,$(dir $<))) $(CFLAGS-$(notdir $<)) $(CFLAGS-$(notdir $@))  $(CFLAGS_gen.dep)
+cmd_compile.i = $(cmd_compile.c:-c=-E -dD)
+cmd_compile.s = $(cmd_compile.c:-c=-S)
+cmd_compile.u = $(CC) $^ $(DEPS-$(notdir $@)) -o $@ $(CFLAGS) $(CFLAGS-$(notdir $(^D))) $(CFLAGS-$(notdir $@)) $(CFLAGS_gen.dep)
 cmd_compile.S = $(filter-out -std=gnu99, $(cmd_compile.c)) -D__ASSEMBLER__ $(ASFLAGS) $(ARCH_ASFLAGS) $(ASFLAGS-$(suffix $@)) $(ASFLAGS-$(notdir $<)) $(ASFLAGS-$(notdir $@))
 cmd_compile.m = $(cmd_compile.c) -DL_$(patsubst %$(suffix $(notdir $@)),%,$(notdir $@))
+
 cmd_compile-m = $(CC) $^ -c -o $@ $(CFLAGS) $(ARCH_CFLAGS) $(CFLAGS-$(suffix $@)) $(CFLAGS-$(notdir $(@D))) $(CFLAGS-$(notdir $@))
 cmd_strip     = $(STRIPTOOL) $(STRIP_FLAGS) $^
 cmd_t_strip   = $(STRIPTOOL) $(STRIP_FLAGS) $@
 cmd_ar        = $(AR) $(ARFLAGS) $@ $^
 
-compile.c = @$(disp_compile.c) ; $(cmd_compile.c)
-compile.i = $(cmd_compile.c:-c=-E -dD)
-compile.s = $(cmd_compile.c:-c=-S)
-compile.S = @$(disp_compile.S) ; $(cmd_compile.S)
-compile.m = @$(disp_compile.m) ; $(cmd_compile.m)
+compile.c = @$(call maybe_exec,compile.c)
+compile.i =  $(call maybe_exec,compile.i)
+compile.s =  $(call maybe_exec,compile.s)
+compile.S = @$(call maybe_exec,compile.S)
+compile.m = @$(call maybe_exec,compile.m)
 compile-m = @$(disp_compile-m) ; $(cmd_compile-m)
 do_strip  = @$(disp_strip)     ; $(cmd_strip)
 do_t_strip= @$(disp_t_strip)   ; $(cmd_t_strip)
@@ -180,19 +204,19 @@ endef
 CFLAGS-.os+=$(PICFLAG)
 CFLAGS-.oS+=$(PICFLAG) -DSHARED
 
-%.o:  %.c ; $(compile.c)
-%.os: %.c ; $(compile.c)
-%.oS: %.c ; $(compile.c)
-%.o:  %.S ; $(compile.S)
-%.os: %.S ; $(compile.S)
-%.oS: %.S ; $(compile.S)
-%.o:  %.s ; $(compile.S)
-%.os: %.s ; $(compile.S)
-%.oS: %.s ; $(compile.S)
-%.i:  %.c ; $(compile.i)
-%.i:  %.S ; $(compile.i)
-%.s:  %.c ; $(compile.s)
-%.s:  %.S ; $(compile.s)
+%.o:  %.c FORCE ; $(compile.c)
+%.os: %.c FORCE ; $(compile.c)
+%.oS: %.c FORCE ; $(compile.c)
+%.o:  %.S FORCE ; $(compile.S)
+%.os: %.S FORCE ; $(compile.S)
+%.oS: %.S FORCE ; $(compile.S)
+%.o:  %.s FORCE ; $(compile.S)
+%.os: %.s FORCE ; $(compile.S)
+%.oS: %.s FORCE ; $(compile.S)
+%.i:  %.c FORCE ; $(compile.i)
+%.i:  %.S FORCE ; $(compile.i)
+%.s:  %.c FORCE ; $(compile.s)
+%.s:  %.S FORCE ; $(compile.s)
 
 $(top_builddir)lib/interp.c: | $(sub_headers)
 	$(Q)$(INSTALL) -d $(dir $@)
@@ -306,7 +330,9 @@ ifdef .depends.dep
 -include $(.depends.dep)
 endif
 
-.PHONY: dummy create
+.PHONY: dummy FORCE
+FORCE:
+
 clean: objclean-y headers_clean-y
 realclean: clean
 	$(Q)$(RM) $(.depends.dep)