-# Syntax: $(call omk_pass_template,<pass name>,<build dir>,[<local make flags>],[<local condition>])
-define omk_pass_template
-.PHNOY: $(1) $(1)-local
-$(1):
- +@$(foreach dir,$(SUBDIRS),$(call mkdir_def,$(2)/$(dir)); \
- $(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(dir) $(NO_PRINT_DIRECTORY) \
- RELATIVE_DIR=$(RELATIVE_PREFIX)$(dir) -C $(2)/$(dir) \
- -f $(SOURCES_DIR)/$(dir)/Makefile $$@ || exit 1 ;) true
-ifneq ($(4),)
- @echo "make[omk]: $$@ in $(RELATIVE_DIR)"; \
- $(call mkdir_def,$(2)); \
- $(MAKE) $(NO_PRINT_DIRECTORY) SOURCES_DIR=$(SOURCES_DIR) RELATIVE_DIR=$(RELATIVE_DIR) -C $(2) \
- -f $(SOURCES_DIR)/Makefile $(3) $$(@:%=%-local)
+ifeq ($(USE_LEAF_MAKEFILES),n)
+export USE_LEAF_MAKEFILES
+SUBDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+SOURCESDIR_MAKEFILE=$(MAKERULES_DIR)/Makefile.rules
+else
+SUBDIR_MAKEFILE=$(SOURCES_DIR)/$(3)/Makefile
+SOURCESDIR_MAKEFILE=$(SOURCES_DIR)/Makefile
+endif
+
+BUILD_DIR_NAME = _build
+COMPILED_DIR_NAME = _compiled
+
+BUILD_OMK_DIR := $(OUTPUT_DIR)/$(BUILD_DIR_NAME)/omk
+OMK_WORK_DIR := $(BUILD_OMK_DIR)$(RELATIVE_DIR:%=/%)
+
+check-dir::
+ @$(call mkdir_def,$(BUILD_OMK_DIR))
+
+pass = $(strip $(1))
+
+# Call a pass in a subdirectory
+# Usage: $(call omk_pass_subdir_template,<pass name>,<subdir>)
+define omk_pass_subdir_template
+.PHONY: $(pass)-$(2)-subdir
+$(pass)-subdirs: $(pass)-$(2)-subdir
+$(pass)-$(2)-subdir:
+ @$(call mkdir_def,$(OMK_WORK_DIR)/$(2))
+ +@$(MAKE) SOURCES_DIR=$(SOURCES_DIR)/$(2) $(NO_PRINT_DIRECTORY) \
+ RELATIVE_DIR=$(RELATIVE_PREFIX)$(2) -C $(2) \
+ -f $(SUBDIR_MAKEFILE) $(pass)
+endef
+
+ifdef OMK_TESTSROOT
+check-target = $(1:%=%-check)