diff --git a/Makefile.in b/Makefile.in index 28118abd5fa6..c05d733a5102 100644 --- a/Makefile.in +++ b/Makefile.in @@ -96,37 +96,11 @@ ifndef TEST_MOZBUILD .PHONY: backend backend: $(BUILD_BACKEND_FILES) -# A traditional rule would look like this: -# backend.%: -# @echo do stuff -# -# But with -j, and multiple items in BUILD_BACKEND_FILES, the command would -# run multiple times in parallel. -# -# "Fortunately", make has some weird semantics for pattern rules: if there are -# multiple targets in a pattern rule and each of them is matched at most once, -# the command will only run once. So: -# backend%RecursiveMakeBackend backend%FasterMakeBackend: -# @echo do stuff -# backend: backend.RecursiveMakeBackend backend.FasterMakeBackend -# would only execute the command once. -# -# Credit where due: http://stackoverflow.com/questions/2973445/gnu-makefile-rule-generating-a-few-targets-from-a-single-source-file/3077254#3077254 -$(subst .,%,$(BUILD_BACKEND_FILES)): - @echo 'Build configuration changed. Regenerating backend.' - $(PYTHON) config.status +include $(topsrcdir)/build/rebuild-backend.mk Makefile: $(BUILD_BACKEND_FILES) @$(TOUCH) $@ -define build_backend_rule -$(1)_files := $$(shell cat $(1).in) -$(1): $$($(1)_files) -$$($(1)_files): - -endef -$(foreach file,$(BUILD_BACKEND_FILES),$(eval $(call build_backend_rule,$(file)))) - default:: $(BUILD_BACKEND_FILES) endif diff --git a/build/rebuild-backend.mk b/build/rebuild-backend.mk new file mode 100644 index 000000000000..c93e422a31d6 --- /dev/null +++ b/build/rebuild-backend.mk @@ -0,0 +1,33 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +BACKEND_GENERATION_SCRIPT ?= config.status + +# A traditional rule would look like this: +# backend.%: +# @echo do stuff +# +# But with -j, and multiple items in BUILD_BACKEND_FILES, the command would +# run multiple times in parallel. +# +# "Fortunately", make has some weird semantics for pattern rules: if there are +# multiple targets in a pattern rule and each of them is matched at most once, +# the command will only run once. So: +# backend%RecursiveMakeBackend backend%FasterMakeBackend: +# @echo do stuff +# backend: backend.RecursiveMakeBackend backend.FasterMakeBackend +# would only execute the command once. +# +# Credit where due: http://stackoverflow.com/questions/2973445/gnu-makefile-rule-generating-a-few-targets-from-a-single-source-file/3077254#3077254 +$(subst .,%,$(BUILD_BACKEND_FILES)): + @echo 'Build configuration changed. Regenerating backend.' + $(PYTHON) $(BACKEND_GENERATION_SCRIPT) + +define build_backend_rule +$(1)_files := $$(shell cat $(1).in) +$(1): $$($(1)_files) +$$($(1)_files): + +endef +$(foreach file,$(BUILD_BACKEND_FILES),$(eval $(call build_backend_rule,$(file))))