Browse Source

[build] Speed up rebuilding on header file changes

Split src_template into deps_template (which handles the definition of
foo_DEPS) and rules_template (which handles the rules referencing
foo_DEPS).  The rules_template is not affected by any included header
files and so does not need to be reprocessed following a change to an
included header file.

This reduces the time required to rebuild the Makefile rules following
a change to stdint.h by around 45%, at a cost of increasing the time
required to rebuild after a "make veryclean" by around 3%.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
tags/v1.20.1
Michael Brown 14 years ago
parent
commit
770317a57d
1 changed files with 62 additions and 43 deletions
  1. 62
    43
      src/Makefile.housekeeping

+ 62
- 43
src/Makefile.housekeeping View File

455
 # using the following set of templates.  It would be cleaner to use
455
 # using the following set of templates.  It would be cleaner to use
456
 # $(eval ...), but this function exists only in GNU make >= 3.80.
456
 # $(eval ...), but this function exists only in GNU make >= 3.80.
457
 
457
 
458
-# src_template : generate Makefile rules for a given source file
458
+# deps_template : generate dependency list for a given source file
459
 #
459
 #
460
 # $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c")
460
 # $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c")
461
-# $(2) is the full path to the .d file (e.g. "bin/deps/drivers/net/rtl8139.d")
462
-# $(3) is the source type (e.g. "c")
463
-# $(4) is the source base name (e.g. "rtl8139")
461
+# $(2) is the source type (e.g. "c")
462
+# $(3) is the source base name (e.g. "rtl8139")
464
 #
463
 #
465
-define src_template
466
-
464
+define deps_template
467
 	@$(ECHO) "  [DEPS] $(1)"
465
 	@$(ECHO) "  [DEPS] $(1)"
468
-	@$(MKDIR) -p $(dir $(2))
469
-	@$(CPP) $(CFLAGS) $(CFLAGS_$(3)) $(CFLAGS_$(4)) -DOBJECT=$(4) \
466
+	@$(MKDIR) -p $(BIN)/deps/$(dir $(1))
467
+	@$(CPP) $(CFLAGS) $(CFLAGS_$(2)) $(CFLAGS_$(3)) -DOBJECT=$(3) \
470
 		-Wno-error -M $(1) -MG -MP | \
468
 		-Wno-error -M $(1) -MG -MP | \
471
-		sed 's/\.o\s*:/_DEPS =/' > $(2)
472
-	@$(ECHO_E) '\n$$(BIN)/$(4).o :' \
473
-		 '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(4)_DEPS)' \
469
+		sed 's/\.o\s*:/_DEPS =/' > $(BIN)/deps/$(1).d
470
+endef
471
+
472
+# rules_template : generate rules for a given source file
473
+#
474
+# $(1) is the full path to the source file (e.g. "drivers/net/rtl8139.c")
475
+# $(2) is the source type (e.g. "c")
476
+# $(3) is the source base name (e.g. "rtl8139")
477
+#
478
+define rules_template
479
+	@$(ECHO) "  [RULES] $(1)"
480
+	@$(MKDIR) -p $(BIN)/rules/$(dir $(1))
481
+	@$(ECHO_E) '\n$$(BIN)/$(3).o :' \
482
+		 '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)' \
474
 		 '\n\t$$(QM)$(ECHO) "  [BUILD] $$@"' \
483
 		 '\n\t$$(QM)$(ECHO) "  [BUILD] $$@"' \
475
-		 '\n\t$$(RULE_$(3))\n' \
476
-		 '\nBOBJS += $$(BIN)/$(4).o\n' \
484
+		 '\n\t$$(RULE_$(2))\n' \
485
+		 '\nBOBJS += $$(BIN)/$(3).o\n' \
477
 		 $(foreach TGT,$(DEBUG_TARGETS), \
486
 		 $(foreach TGT,$(DEBUG_TARGETS), \
478
-		    $(if $(RULE_$(3)_to_$(TGT)), \
479
-		    '\n$$(BIN)/$(4).$(TGT) :' \
480
-		    '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(4)_DEPS)' \
487
+		    $(if $(RULE_$(2)_to_$(TGT)), \
488
+		    '\n$$(BIN)/$(3).$(TGT) :' \
489
+		    '$(1) $$(MAKEDEPS) $$(POST_O_DEPS) $$($(3)_DEPS)' \
481
 		    '\n\t$$(QM)$(ECHO) "  [BUILD] $$@"' \
490
 		    '\n\t$$(QM)$(ECHO) "  [BUILD] $$@"' \
482
-		    '\n\t$$(RULE_$(3)_to_$(TGT))\n' \
483
-		    '\n$(TGT)_OBJS += $$(BIN)/$(4).$(TGT)\n' ) ) \
484
-		 '\n$(2) : $$($(4)_DEPS)\n' \
485
-		 '\nTAGS : $$($(4)_DEPS)\n' \
486
-		>> $(2)
487
-	@$(PERL) $(PARSEROM) $(1) >> $(2)
488
-
491
+		    '\n\t$$(RULE_$(2)_to_$(TGT))\n' \
492
+		    '\n$(TGT)_OBJS += $$(BIN)/$(3).$(TGT)\n' ) ) \
493
+		 '\n$(BIN)/deps/$(1).d : $$($(3)_DEPS)\n' \
494
+		 '\nTAGS : $$($(3)_DEPS)\n' > $(BIN)/rules/$(1).r
495
+	@$(PERL) $(PARSEROM) $(1) >> $(BIN)/rules/$(1).r
489
 endef
496
 endef
490
 
497
 
491
-# Rule to generate the Makefile rules files to be included
498
+# Rule to generate the dependency list file
492
 #
499
 #
493
-$(BIN)/deps/%.d : % $(MAKEDEPS) $(PARSEROM)
494
-	$(if $(filter $(AUTO_SRCS),$<),$(call src_template,$<,$@,$(subst .,,$(suffix $<)),$(basename $(notdir $<))),@$(ECHO) 'ERROR: $< is not an AUTO_SRC' ; exit 1)
500
+$(BIN)/deps/%.d : % $(MAKEDEPS)
501
+	$(call deps_template,$<,$(subst .,,$(suffix $<)),$(basename $(notdir $<)))
495
 
502
 
496
-# Calculate and include the list of Makefile rules files
503
+# Calculate and include the list of dependency list files
497
 #
504
 #
498
 AUTO_DEPS	= $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS))
505
 AUTO_DEPS	= $(patsubst %,$(BIN)/deps/%.d,$(AUTO_SRCS))
499
 ifdef NEED_DEPS
506
 ifdef NEED_DEPS
505
 	@$(ECHO) $(AUTO_DEPS)
512
 	@$(ECHO) $(AUTO_DEPS)
506
 VERYCLEANUP	+= $(BIN)/deps
513
 VERYCLEANUP	+= $(BIN)/deps
507
 
514
 
508
-# The following variables are created by the Makefile rules files
515
+# Rule to generate the rules file
516
+#
517
+$(BIN)/rules/%.r : % $(MAKEDEPS) $(PARSEROM)
518
+	$(call rules_template,$<,$(subst .,,$(suffix $<)),$(basename $(notdir $<)))
519
+
520
+# Calculate and include the list of rules files
521
+#
522
+AUTO_RULES	= $(patsubst %,$(BIN)/rules/%.r,$(AUTO_SRCS))
523
+ifdef NEED_DEPS
524
+ifneq ($(AUTO_RULES),)
525
+-include $(AUTO_RULES)
526
+endif
527
+endif
528
+autorules :
529
+	@$(ECHO) $(AUTO_RULES)
530
+VERYCLEANUP	+= $(BIN)/rules
531
+
532
+# The following variables are created by the rules files
509
 #
533
 #
510
 bobjs :
534
 bobjs :
511
 	@$(ECHO) $(BOBJS)
535
 	@$(ECHO) $(BOBJS)
807
 # media_template : create Makefile rules for specified media
831
 # media_template : create Makefile rules for specified media
808
 #
832
 #
809
 # $(1) is the media name (e.g. "rom")
833
 # $(1) is the media name (e.g. "rom")
810
-# $(2) is the full path to the .d file (e.g. "bin/deps/rom.media.d")
811
 #
834
 #
812
 define media_template
835
 define media_template
813
-
814
-	@$(ECHO) "  [MEDIADEPS] $(1)"
815
-	@$(MKDIR) -p $(dir $(2))
836
+	@$(ECHO) "  [MEDIARULES] $(1)"
837
+	@$(MKDIR) -p $(BIN)/rules/$(dir $(1))
816
 	@$(ECHO_E) '$$(BIN)/%.$(1) : $$(BIN)/%.$(1).zbin' \
838
 	@$(ECHO_E) '$$(BIN)/%.$(1) : $$(BIN)/%.$(1).zbin' \
817
 		  '\n\t$$(QM)$(ECHO) "  [FINISH] $$@"' \
839
 		  '\n\t$$(QM)$(ECHO) "  [FINISH] $$@"' \
818
 		  '\n\t$$(Q)$$(CP) $$< $$@' \
840
 		  '\n\t$$(Q)$$(CP) $$< $$@' \
819
 		  '\n\t$$(Q)$$(PAD_$(1))' \
841
 		  '\n\t$$(Q)$$(PAD_$(1))' \
820
 		  '\n\t$$(Q)$$(FINALISE_$(1))' \
842
 		  '\n\t$$(Q)$$(FINALISE_$(1))' \
821
-		> $(2)
822
-
843
+		> $(BIN)/rules/$(1).media.r
823
 endef
844
 endef
824
 
845
 
825
 # Rule to generate the Makefile rules to be included
846
 # Rule to generate the Makefile rules to be included
826
 #
847
 #
827
-$(BIN)/deps/%.media.d : $(MAKEDEPS)
828
-	$(if $(filter $(AUTO_MEDIA),$*), \
829
-		$(call media_template,$*,$@), \
830
-		@$(ECHO) 'ERROR: $* is not an AUTO_MEDIA' ; exit 1)
848
+$(BIN)/rules/%.media.r : $(MAKEDEPS)
849
+	$(call media_template,$*)
831
 
850
 
832
 # Calculate and include the list of Makefile rules files
851
 # Calculate and include the list of Makefile rules files
833
 #
852
 #
834
-MEDIA_DEPS		= $(patsubst %,$(BIN)/deps/%.media.d,$(AUTO_MEDIA))
835
-mediadeps :
836
-	@$(ECHO) $(MEDIA_DEPS)
853
+MEDIA_RULES		= $(patsubst %,$(BIN)/rules/%.media.r,$(AUTO_MEDIA))
854
+mediarules :
855
+	@$(ECHO) $(MEDIA_RULES)
837
 ifdef NEED_DEPS
856
 ifdef NEED_DEPS
838
-ifneq ($(MEDIA_DEPS),)
839
--include $(MEDIA_DEPS)
857
+ifneq ($(MEDIA_RULES),)
858
+-include $(MEDIA_RULES)
840
 endif
859
 endif
841
 endif
860
 endif
842
 
861
 

Loading…
Cancel
Save