浏览代码

build: Fix dependency loop cause by phony targets

When building proj-deps.mk, it would always be evaluated as
'out-of-date' because the dependency collection relied on
phony targets.

And since make 'reloads' itself after including a file it
generates, it would continuously do so ... at least on some
version of make. make >= 4.2.1 seem to not have this issue.

To solve this, move on to real file 'markers' to indicate
the dependency has been processed. Also make sure it depends
on core.mk so it rebuilds it the core config changes

Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Sylvain Munaut 6 年之前
父节点
当前提交
74fb15fae5
共有 3 个文件被更改,包括 17 次插入16 次删除
  1. 5 7
      build/core-magic.mk
  2. 7 5
      build/core-rules.mk
  3. 5 4
      build/project-rules.mk

+ 5 - 7
build/core-magic.mk

@@ -6,10 +6,8 @@ RTL_SRCS_$(CORE) := $(addprefix $(CORE_$(CORE)_DIR)/,$(RTL_SRCS_$(CORE)))
 TB_SRCS_$(CORE)  := $(addprefix $(CORE_$(CORE)_DIR)/,$(TB_SRCS_$(CORE)))
 
 # Dependency collection target
-deps-core-$(CORE): $(addprefix deps-core-,$(DEPS_$(CORE)))
-	$(eval CORE := $(subst deps-core-,,$@))
-	$(eval DEPS_SOLVE_TMP += $(CORE))
-	$(eval SRCS_SOLVE_TMP += $(RTL_SRCS_$(CORE)))
-	$(eval PREREQ_SOLVE_TMP += $(PREREQ_$(CORE)))
-
-.PHONY: deps-core-$(CORE)
+$(BUILD_TMP)/deps-core-$(CORE): $(CORE_$(CORE)_DIR)/core.mk $(addprefix $(BUILD_TMP)/deps-core-,$(DEPS_$(CORE)))
+	$(eval CORE := $(subst $(BUILD_TMP)/deps-core-,,$@))
+	@echo "DEPS_SOLVE_TMP += $(CORE)" > $@
+	@echo "SRCS_SOLVE_TMP += $(RTL_SRCS_$(CORE))" >> $@
+	@echo "PREREQ_SOLVE_TMP +=  $(PREREQ_$(CORE))" >> $@

+ 7 - 5
build/core-rules.mk

@@ -27,12 +27,14 @@ $(BUILD_TMP):
 $(foreach core_dir, $(wildcard $(ROOT)/cores/*), $(eval include $(core_dir)/core.mk))
 
 # Resolve dependency tree for project and collect sources
-$(BUILD_TMP)/proj-deps.mk: Makefile $(BUILD_TMP) deps-core-$(THIS_CORE)
-	@echo "CORE_ALL_DEPS := $(DEPS_SOLVE_TMP)" > $@
-	@echo "CORE_ALL_SRCS := $(SRCS_SOLVE_TMP)" >> $@
-	@echo "CORE_ALL_PREREQ := $(PREREQ_SOLVE_TMP)" >> $@
+$(BUILD_TMP)/core-deps.mk: Makefile $(BUILD_TMP) $(BUILD_TMP)/deps-core-$(THIS_CORE)
+	@echo "include $(BUILD_TMP)/deps-core-*" > $@
+	@echo "CORE_ALL_DEPS := \$$(DEPS_SOLVE_TMP)" >> $@
+	@echo "CORE_ALL_SRCS := \$$(SRCS_SOLVE_TMP)" >> $@
+	@echo "CORE_ALL_PREREQ := \$$(PREREQ_SOLVE_TMP)" >> $@
+
+include $(BUILD_TMP)/core-deps.mk
 
-include $(BUILD_TMP)/proj-deps.mk
 
 # Simulation
 $(BUILD_TMP)/%_tb: sim/%_tb.v $(ICE40_LIBS) $(CORE_ALL_PREREQ) $(CORE_ALL_SRCS)

+ 5 - 4
build/project-rules.mk

@@ -31,10 +31,11 @@ $(BUILD_TMP):
 $(foreach core_dir, $(wildcard $(ROOT)/cores/*), $(eval include $(core_dir)/core.mk))
 
 # Resolve dependency tree for project and collect sources
-$(BUILD_TMP)/proj-deps.mk: Makefile $(BUILD_TMP) $(addprefix deps-core-,$(PROJ_DEPS))
-	@echo "PROJ_ALL_DEPS := $(DEPS_SOLVE_TMP)" > $@
-	@echo "PROJ_ALL_SRCS := $(SRCS_SOLVE_TMP)" >> $@
-	@echo "PROJ_ALL_PREREQ := $(PREREQ_SOLVE_TMP)" >> $@
+$(BUILD_TMP)/proj-deps.mk: Makefile $(BUILD_TMP) $(addprefix $(BUILD_TMP)/deps-core-,$(PROJ_DEPS))
+	@echo "include $(BUILD_TMP)/deps-core-*" > $@
+	@echo "PROJ_ALL_DEPS := \$$(DEPS_SOLVE_TMP)" >> $@
+	@echo "PROJ_ALL_SRCS := \$$(SRCS_SOLVE_TMP)" >> $@
+	@echo "PROJ_ALL_PREREQ := \$$(PREREQ_SOLVE_TMP)" >> $@
 
 include $(BUILD_TMP)/proj-deps.mk