summaryrefslogtreecommitdiff
path: root/mk/top.mk
diff options
context:
space:
mode:
authorAlejandro Soto <alejandro@34project.org>2024-02-12 16:18:03 -0600
committerAlejandro Soto <alejandro@34project.org>2024-02-20 11:11:18 -0600
commitbf5cece51a20eb4773d196ec650fb3af574afa17 (patch)
tree8abd33c815b38a3dee673ea345f106d4ddcae9ab /mk/top.mk
parent691a441bfeb90642840d2869cb04ec146e274a1e (diff)
mk: initial commit
This is a complete overhaul of the build system. This new implementations upports many new features and is very extensible.
Diffstat (limited to 'mk/top.mk')
-rw-r--r--mk/top.mk78
1 files changed, 78 insertions, 0 deletions
diff --git a/mk/top.mk b/mk/top.mk
new file mode 100644
index 0000000..6db6abb
--- /dev/null
+++ b/mk/top.mk
@@ -0,0 +1,78 @@
+.PHONY: .force .no_default
+
+.no_target:
+ $(error no default target defined in top Makefile)
+
+.force:
+
+empty :=
+space := $(empty) $(empty)
+comma := ,
+
+# Both empty lines are required
+define newline
+
+
+endef
+
+newline := $(newline)
+
+defer = $(1) = $$(eval $(2))$$($(1))
+
+ifeq (,$(top))
+ $(error $$(top) is not defined)
+endif
+
+$(foreach flag,$(subst $(comma),$(space),$(enable)),$(eval override enable_$(flag) := 1))
+$(foreach flag,$(subst $(comma),$(space),$(disable)),$(eval override enable_$(flag) :=))
+
+include mk/build.mk
+include mk/cocotb.mk
+include mk/cores.mk
+include mk/cov.mk
+include mk/output.mk
+include mk/target.mk
+include mk/tools.mk
+include mk/verilator.mk
+
+$(eval $(check_target))
+$(eval $(find_tools_lazy))
+
+ifneq (,$(target))
+ $(eval $(target/$(target)/prepare))
+endif
+
+$(foreach top_dir,$(core_dirs), \
+ $(eval $(call add_core_subdir,$(top_dir))))
+
+top_path := $(core_info/$(top)/path)
+
+ifeq (,$(top_path))
+ $(call unknown_core,$(top))
+endif
+
+$(eval $(setup_dep_tree))
+
+define build_target_top
+ ifeq (,$$(obj/$(if $(2),$(2),$(target))/$(1)))
+ $$(eval $$(call enter_build,$(1),$(2)))
+ $$(eval $$(call build_vars,rule_target rule_top core_info/$$(rule_top)/build))
+
+ $$(eval $$(target/$$(rule_target)/setup))
+
+ $$(eval $$(setup_obj))
+ $$(eval $$(setup_stamp_rules))
+
+ $$(eval $$(target/$$(rule_target)/rules))
+
+ obj/$$(rule_target)/$$(rule_top) := $$(obj)
+ $$(eval $$(exit_build))
+ endif
+endef
+
+ifneq (,$(target))
+ $(eval $(call build_target_top,$(top)))
+endif
+
+$(eval $(setup_submake_rules))
+$(eval $(finish_stamp_rules))