BAL and Maple Release 2.2

Signed-off-by: Shad Ansari <developer@Carbon.local>
diff --git a/bal_release/mk/Makefile.rules b/bal_release/mk/Makefile.rules
new file mode 100644
index 0000000..886b22f
--- /dev/null
+++ b/bal_release/mk/Makefile.rules
@@ -0,0 +1,494 @@
+# Common Makefile rules
+#
+
+# For linux_lib we don't build anything. Object files are just added
+# when compiling modules depending on the libs
+
+ifeq  ("$(MOD_TYPE)", "linux_lib")
+	# Skip libraries that might have crept in dependencies
+    SKIP_LIB_MODULES = y
+    export SKIP_LIB_MODULES
+endif    
+
+ifeq  ("$(MOD_TYPE)", "linux_module")
+	# Skip libraries that might have crept in dependencies
+    SKIP_LIB_MODULES = y
+    export SKIP_LIB_MODULES
+endif    
+
+ifeq ("$(MOD_TYPE)", "lib")
+    MODULE_IS_A_LIBRARY = y
+else ifeq ("$(MOD_TYPE)", "shared_lib")
+    MODULE_IS_A_LIBRARY = y
+else
+    MODULE_IS_A_LIBRARY = n
+endif
+
+# Include module's own auto-generated Makefile.config.$(MODULE) file if any
+# It in turn includes all dependencies
+ifeq (x"$(V)", x"2")
+    $(info !!!MOD_NAME=$(MOD_NAME) MOD_TYPE=$(MOD_TYPE) MOD_TARGET=$(MOD_TARGET))
+    $(info !!!Including own dependency file: $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME))
+endif
+-include $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"2")
+    $(info !!!After include of $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME))
+endif
+
+ifeq (x"$(V)", x"2")
+    $(info !!! Building $(MOD_TYPE) module $(MOD_NAME): depends on $(MOD_DEPS_FILES) SKIP_LIBS=$(SKIP_LIB_MODULES))
+endif
+
+# Skip default rules for custom module
+ifneq  ("$(MOD_CUSTOM)", "y")
+ 
+# Default lib rule
+ifeq  ("$(MOD_TYPE)", "lib")
+
+ifeq ("$(SKIP_LIB_MODULES)", "y")
+
+$(MOD_TARGET): 
+
+# of ifneq  ("$(SKIP_LIB_MODULES)", "y")
+else
+
+# Create library if there are any objects 
+$(MOD_TARGET): $(OBJS)
+ifneq ("$(OBJS)", "")
+	$(SILENT_BUILD)$(BLD_AR) $(ARFLAGS) $@ $(OBJS)
+ifeq ("$(MOD_POST_BUILD)", "")
+	@$(BOLD_PRINT) "done: $@"
+endif	
+endif
+ifneq ("$(MOD_POST_BUILD)", "")
+	$(SILENT_BUILD)$(MOD_POST_BUILD)
+	@$(BOLD_PRINT) "done: $@"
+endif	
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+
+# end of ifeq ("$(SKIP_LIB_MODULES)", "y")
+endif
+
+# end of ifeq  ("$(MOD_TYPE)", "lib")
+endif
+ 
+# Default shared_lib rule
+ifeq  ("$(MOD_TYPE)", "shared_lib")
+
+EXTRA_CFLAGS += -fPIC
+
+# Create library if there are any objects 
+$(MOD_TARGET): $(OBJS)
+ifneq ("$(OBJS)", "")
+	$(SILENT_BUILD)$(BLD_CC) -shared -o $@ $(OBJS) $(LFLAGS)
+	$(SILENT_BUILD)mkdir -p $(SHARED_LIB_DIR)
+	$(SILENT_BUILD)cp $@ $(SHARED_LIB_DIR)/
+ifeq ("$(MOD_POST_BUILD)", "")
+	@$(BOLD_PRINT) "done: $@"
+endif	
+endif
+ifneq ("$(MOD_POST_BUILD)", "")
+	$(SILENT_BUILD)$(MOD_POST_BUILD)
+	@$(BOLD_PRINT) "done: $@"
+endif	
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+
+# end of ifeq  ("$(MOD_TYPE)", "shared_lib")
+endif
+
+# Default app rule
+ifeq  ("$(MOD_TYPE)", "app")
+
+$(MOD_TARGET): $(OBJS) $(MOD_DEPS_FILES)
+	$(SILENT_BUILD)$(BLD_CC) -o $@ $(OBJS) $(LFLAGS) $(EXTRA_LIBS_PATH) $(EXTRA_LIBS_NOREC_BEFORE) $(LIBS_START_MARKER) $(EXTRA_LIBS) $(LIBS_END_MARKER) $(EXTRA_LIBS_NOREC_AFTER) $(LIBS)
+ifneq ("$(MOD_POST_BUILD)", "")
+	$(SILENT_BUILD)$(MOD_POST_BUILD)
+endif	
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+	@$(BOLD_PRINT) "done: $(OUT_DIR)/$(MOD_NAME)"
+
+# endif of ifeq  ("$(MOD_TYPE)", "app")
+endif
+
+# For linux_lib we don't build anything. Object files are just added
+# when compiling modules depending on the libs
+ifeq  ("$(MOD_TYPE)", "linux_lib")
+    LINUX_LIB_OBJECTS := $(srcs:%.c=$(SRC_DIR)/%.o)
+
+$(MOD_TARGET): $(SRCS) $(GEN_SRCS) $(MOD_DEPS_FILES)
+	$(SILENT_BUILD)touch $(MOD_TARGET)
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+
+endif
+
+# Default linux_module$(srcs:%=$(SRC_DIR)/%)
+ifeq  ("$(MOD_TYPE)", "linux_module")
+    obj-m    += $(MOD_NAME).o
+    $(MOD_NAME)-objs := $(srcs:%.c=%.o)
+    LIB_OBJS_REL_PATH = $(foreach oo,$(ALL_LIB_OBJS),$(shell python -c "import os.path; print os.path.relpath('$(oo)', '$(SRC_DIR)')"))
+
+    _KERNEL_MAKEPARMS = -C $(KERNELDIR) M=$(SRC_DIR) KBUILD_EXTRA_SYMBOLS="$(KBUILD_EXTRA_SYMBOLS)" \
+    	O=$(KERNEL_OUTDIR) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(CROSS_COMPILE) V=$(V) EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
+    	obj-m=$(obj-m) $(MOD_NAME)-objs="$($(MOD_NAME)-objs) $(LIB_OBJS_REL_PATH)"
+    KERNEL_MAKEPARMS = $(_KERNEL_MAKEPARMS:%os_abstraction/posix=%os_abstraction/linux)
+
+	# Prevent parallel build    
+.NOTPARALLEL:
+
+    # Only build linux module if not already being built by another make thread.
+    # Otherwise, linux build system get confused
+    # Also, remove -s flag using MAKEFLAGS. Otherwise, linux build system will not print names of the files
+    # being compiled
+$(MOD_TARGET): $(SRCS) $(MOD_DEPS_FILES)
+ifneq  ("$(SRC_DIR)", "$(TOP_DIR)/$(MOD_DIR)")
+	@cp -f $(TOP_DIR)/$(MOD_DIR)/Makefile $(SRC_DIR)
+endif
+	$(SILENT_BUILD)if [ ! -f $(SRC_DIR)/.$(MOD_NAME)_in_progress ]; then \
+		touch $(SRC_DIR)/.$(MOD_NAME)_in_progress; \
+		MAKEFLAGS= $(MAKE) $(KERNEL_MAKEPARMS) ;\
+		if [[ "$$?" != "0" ]]; then \
+			rm -f $(SRC_DIR)/.$(MOD_NAME)_in_progress;\
+			exit -2;\
+		fi; \
+		mkdir -p $(OUT_DIR_BASE)/linux_modules ;\
+		touch -c $(MOD_TARGET) ;\
+		cp $(SRC_DIR)/$(MOD_NAME).ko $(OUT_DIR_BASE)/linux_modules/ ;\
+		touch $(OUT_DIR_BASE)/.$(MOD_NAME) ;\
+		$(BOLD_PRINT) "done: $(MOD_TARGET)" ;\
+		rm -f $(SRC_DIR)/.$(MOD_NAME)_in_progress ;\
+	fi
+
+# Take care of compiling generated code for linux kernel
+ifneq  ("$(SRC_DIR)", "$(TOP_DIR)/$(MOD_DIR)")
+
+$(SRC_DIR)/%.c : $(CODEGEN_OUTPUT_DIR)/../%.c
+	$(SILENT_BUILD)cp -f $(CODEGEN_OUTPUT_DIR)/../*.[c,h] $(SRC_DIR)/
+
+$(SRC_DIR)/%.h : $(CODEGEN_OUTPUT_DIR)/../%.h
+	$(SILENT_BUILD)cp -f $(CODEGEN_OUTPUT_DIR)/../*.[c,h] $(SRC_DIR)/
+
+endif
+
+# End of MOD_TYPE==linux_module
+endif
+
+# else of ifneq  ("$(MOD_CUSTOM)", "y")
+else
+
+# only for MOD_CUSTOM include Module Makefile second time for propagate  
+# custom rules, first time included in Makefile.config for all modules 
+include $(SRC_DIR)/Makefile
+
+# End of ifneq ($(MOD_CUSTOM), y)
+endif
+
+$(OUT_DIR)/%.o: $(SRC_DIR)/%.c $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "CC $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_CC) $(CFLAGS) -D__BASENAME__=`basename $<` -c -o $@ $<
+ifeq (x"$(USE_LINT)", x"yes")
+ifeq (x"$(V)", x"0")
+	@echo "LINT $<"
+endif
+	$(SILENT_BUILD)FORCE_LINT=$(FORCE_LINT) $(MAKE_DEVICE_DIR)/lint.sh $(LINT_FLAGS) $(filter -I% -D%, $(CFLAGS)) $< || { rm $@; false; }
+endif
+ifeq (x"$(USE_CLANG)", x"y")
+ifeq (x"$(V)", x"0")
+	_fn=`basename "$<" .c` ;\
+	eval "_disable_fn_set=\$${DISABLE_CLANG_$$_fn}"; \
+	if test "$$_disable_fn_set" != "y" ; then echo "CLANG $<"; else echo "CLANG $< ... skipped"; fi
+endif
+	_fn=`basename "$<" .c` ;\
+	eval "_disable_fn_set=\$${DISABLE_CLANG_$$_fn}"; \
+	if test "$$_disable_fn_set" != "y" ; then  $(CLANG) $(CLANG_FLAGS) -c $< -o $@.clang && rm -f $@.clang; fi
+# end of ifeq (x"$(USE_CLANG)", x"y")	
+endif	
+
+$(OUT_DIR)/%.o: $(SRC_DIR)/%.s $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "AS $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_AS) $(asFLAGS) -o $@ $<
+
+$(OUT_DIR)/%.o: $(SRC_DIR)/%.S $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "AS $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_CC) $(ASFLAGS) -o $@ $<
+
+
+$(OUT_DIR)/%.d: $(SRC_DIR)/%.c $(SRC_DIR)/Makefile
+ifneq ("$(BUILD_DEPS_IN_CC)", "y")
+ifeq (x"$(V)", x"0")
+	@echo "DP $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_DEP) -MM -MT $(@:.d=.o) $(DEP_FLAGS) $<  > $@ && sed 's,\($*\.o\)[ :]*,\1 $@ : ,g' -i $@
+endif
+
+$(CODEGEN_OUTPUT_DIR)/%.o: $(CODEGEN_OUTPUT_DIR)/%.c $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+ifeq (x"$(V)", x"0")
+	@echo "CC $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_CC) $(CFLAGS) -D__BASENAME__=`basename $<` -c -o $@ $<
+
+$(CODEGEN_OUTPUT_DIR)/%.d: $(CODEGEN_OUTPUT_DIR)/%.c $(SRC_DIR)/Makefile
+ifneq ("$(BUILD_DEPS_IN_CC)", "y")
+ifeq (x"$(V)", x"0")
+	@echo "DP $<"
+endif
+	$(SILENT_BUILD)mkdir -p $(dir $@)
+	$(SILENT_BUILD)$(BLD_DEP) -MM -MT $(@:.d=.o) $(DEP_FLAGS) $<  > $@ && sed 's,\($*\.o\)[ :]*,\1 $@ : ,g' -i $@
+endif
+
+ifneq ("$(SKIP_DEPS)", "yes")
+ifneq  ("$(MOD_TYPE)", "linux_module")
+ifneq  ("$(MOD_TYPE)", "linux_lib")
+-include $(OBJS:.o=.d)
+endif
+endif
+endif
+
+BUILD_UNITEST = $(UNITEST)
+ifeq  ("$(OBJS)", "")
+    BUILD_UNITEST = n
+endif    
+
+# Only build unitest if library objects are included
+ifeq  ("$(BUILD_UNITEST)", "y")
+
+unitest: $(OUT_DIR)/unitest
+
+$(OUT_DIR)/unitest: $(OUT_DIR)/unitest.o $(TARGET_LIB_FNAME) $(MOD_DEPS_FILES)
+	$(SILENT_BUILD)$(BLD_CC) -o $@ $(OUT_DIR)/unitest.o $(LFLAGS) $(EXTRA_LIBS_PATH) $(LIBS_START_MARKER) $(EXTRA_LIBS) $(LIBS_END_MARKER) $(LIBS)
+	$(SILENT_BUILD)touch $(OUT_DIR_BASE)/.$(MOD_NAME)
+	@$(BOLD_PRINT) "done: $@"
+
+# else of ifneq  ("$(BUILD_UNITEST)", "y")
+else 
+
+unitest: $(TARGET_LIB_FNAME) $(MOD_DEPS_FILES)
+	
+# endif of ifneq  ("$(BUILD_UNITEST)", "y")
+endif
+
+# Generate sources if necessary
+ifneq  ("$(GEN_SRCS)$(GEN_HDRS)$(GEN_OMCI_SRCS)$(GEN_OMCI_HDRS)$(GEN_OMCI_STACK_SRCS)$(GEN_OMCI_STACK_HDRS)", "")
+
+$(GEN_BAL_SRCS) $(GEN_BAL_HDRS): $(OUT_DIR)/.$(MOD_NAME)_generated_bal
+$(GEN_OMCI_SRCS) $(GEN_OMCI_HDRS): $(OUT_DIR)/.$(MOD_NAME)_generated_omci
+$(GEN_OMCI_STACK_SRCS) $(GEN_OMCI_STACK_HDRS): $(OUT_DIR)/.$(MOD_NAME)_generated_omci_stack
+
+$(OUT_DIR)/.$(MOD_NAME)_generated_bal: $(BAL_MODEL_FILE) $(wildcard $(CODEGEN_DIR)/*) $(wildcard $(CODEGEN_INPUT_DIR)/*)
+	$(call gen_cmd,$(GEN_BAL_SRCS),$(GEN_BAL_HDRS),$(BAL_MODEL_FILE),"bcmbal")
+
+$(OUT_DIR)/.$(MOD_NAME)_generated_omci: $(OMCI_MODEL_FILE) $(wildcard $(CODEGEN_DIR)/*) $(wildcard $(CODEGEN_INPUT_DIR)/*)
+	$(call gen_cmd,$(GEN_OMCI_SRCS),$(GEN_OMCI_HDRS),$(OMCI_MODEL_FILE),"bcmomci")
+
+$(OMCI_STACK_CODEGEN_EXE): $(OMCI_STACK_CODEGEN_INPUT_DIR)/omci_me_codegen.c
+	mkdir -p $(OUT_DIR)
+	$(BLD_CC_HOST) $(EXTRA_CFLAGS) -gdwarf-3 -o $@ $< -I$(TOP_DIR)/src/common/os_abstraction -I$(TOP_DIR)/src/common/os_abstraction/posix -I$(TOP_DIR)/src/common/config -I$(TOP_DIR)/src/core/platform -I$(TOP_DIR)/src/common/include
+
+$(OUT_DIR)/.$(MOD_NAME)_generated_omci_stack: $(OMCI_STACK_MODEL_FILE) $(wildcard $(CODEGEN_DIR)/*) $(wildcard $(CODEGEN_INPUT_DIR)/*) $(OMCI_STACK_CODEGEN_EXE)
+	$(call gen_omci_stack_cmd,$(GEN_OMCI_STACK_SRCS),$(GEN_OMCI_STACK_HDRS),$(OMCI_STACK_MODEL_FILE),"bcm_omci")
+
+define gen_cmd
+	mkdir -p $(CODEGEN_OUTPUT_DIR)
+	echo "Generating code from model: $(notdir $1 $2)"
+	$(MONO_PATH) $(CODEGEN_EXE) --genobjmodel -objset="$3" -style=bal -prefix=$4 \
+   	-templatedir="$(CODEGEN_INPUT_DIR)" -outdir="$(CODEGEN_OUTPUT_DIR)"
+	touch $@ 
+	echo "Code generation complete!"
+endef
+
+define gen_omci_stack_cmd
+	echo "Generating code from model: $(notdir $1 $2)"
+    $(OMCI_STACK_CODEGEN_EXE) $4 $(OUT_DIR) $3 $(addprefix $(OMCI_STACK_CODEGEN_INPUT_DIR)/, $(addsuffix .tmpl, $(notdir $1 $2)))
+    for file in $(GEN_OMCI_STACK_HDRS) $(GEN_OMCI_STACK_SRCS); do \
+        $(TOP_DIR)/tools/copyright_tools/insert_copyright.pl -t c -l $(TOP_DIR)/COPYRIGHT $$file > $$file.tmp; \
+        mv $$file.tmp $$file; \
+    done
+	touch $@ 
+	echo "Code generation complete!"
+endef
+
+# end of ifneq  ("$(GEN_SRCS)$(GEN_HDRS)$(GEN_OMCI_SRCS)$(GEN_OMCI_HDRS)$(GEN_OMCI_STACK_SRCS)$(GEN_OMCI_STACK_HDRS)", "")
+endif
+
+#
+# Dependency rules generation: --> Makefile.config.$(MOD_NAME)
+# 
+
+MOD_CONFIG_FILE = $(OUT_DIR_BASE)/Makefile.config.$(MOD_NAME)
+MOD_CONFIG_DEF  = $(MOD_NAME)_DEP_DEFINED
+ifneq ("$(MOD_INC_DIRS)", "")
+    # Make sure that each directory is an absolute path
+    MOD_INCS = $(addprefix -I, $(abspath $(subst -I,,$(subst $(TOP_DIR)/,,$(MOD_INC_DIRS)))))
+else
+	MOD_INCS = -I$(SRC_DIR)
+    ifneq ("$(GEN_HDRS)", "")
+        MOD_INCS += -I$(CODEGEN_OUTPUT_DIR)
+	endif
+endif
+
+# 
+# Generate Makefile.config.$(MODULE) capable of re-creating the module
+#
+moddep: $(GEN_SRCS) $(GEN_HDRS)
+ifeq (x"$(V)", x"3")
+	@echo "!!!!!  moddep for  MOD_NAME=$(MOD_NAME) MOD_TYPE=$(MOD_TYPE) MOD_CUSTOM=$(MOD_CUSTOM)!!!"
+endif
+	$(SILENT_BUILD)mkdir -p $(OUT_DIR_BASE)
+	@rm -fr $(MOD_CONFIG_FILE)
+	@rm -fr $(OBJS:.o=.d)
+
+	@echo "ifeq (x\"$$""(V)\", x\"2\")"  >> $(MOD_CONFIG_FILE)
+	@echo "    $$""(info !!! MODULE=$$""(MOD_NAME) --> $(MOD_CONFIG_FILE): $(MOD_CONFIG_DEF)=$$""($(MOD_CONFIG_DEF)), DEPS=$(MOD_DEPS))" >> $(MOD_CONFIG_FILE)
+	@echo "endif"  >> $(MOD_CONFIG_FILE)
+
+    # Prevent double inclusion 
+	@echo "ifneq (\"$$""($(MOD_CONFIG_DEF))\", \"y\")" >> $(MOD_CONFIG_FILE)
+	@echo "" >> $(MOD_CONFIG_FILE)
+	@echo "$(MOD_CONFIG_DEF) := y" >> $(MOD_CONFIG_FILE)
+	@echo "export $(MOD_NAME)_DIR := $(SRC_DIR)" >> $(MOD_CONFIG_FILE)
+	@echo "export $(MOD_NAME)_OUT_DIR := $(OUT_DIR)" >> $(MOD_CONFIG_FILE)
+
+    ifeq  ("$(MODULE_IS_A_LIBRARY)", "y")
+		@echo "_skip_it := y" >> $(MOD_CONFIG_FILE)
+    else
+		@echo "_skip_it := n" >> $(MOD_CONFIG_FILE)
+    endif
+	@echo "ifneq (\"$$""(SKIP_LIB_MODULES)\", \"y\")" >> $(MOD_CONFIG_FILE)
+	@echo "    _skip_it := n" >> $(MOD_CONFIG_FILE)
+	@echo "endif" >> $(MOD_CONFIG_FILE)
+
+	@echo "ifneq (\"$$""(_skip_it)\", \"y\")"  >> $(MOD_CONFIG_FILE)
+
+    ifeq  ("$(MODULE_IS_A_LIBRARY)", "y")
+        ifneq ("$(OBJS)", "")
+			@echo "EXTRA_LIBS += $(LIBS_MARKER)$(TARGET_LIB)" >> $(MOD_CONFIG_FILE)
+			@echo "EXTRA_LIBS_PATH += $(LIBS_PATH_MARKER)$(OUT_DIR)" >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_LIBS)", "")
+			@echo "EXTRA_LIBS += $(MOD_LIBS)" >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_LIBS_NOREC_BEFORE)", "")
+			@echo "EXTRA_LIBS_NOREC_BEFORE += $(MOD_LIBS_NOREC_BEFORE)" >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_LIBS_NOREC_AFTER)", "")
+			@echo "EXTRA_LIBS_NOREC_AFTER += $(MOD_LIBS_NOREC_AFTER)" >> $(MOD_CONFIG_FILE)
+        endif
+		@echo "ifneq (x\"$$""(MOD_NAME)\", x\"$(MOD_NAME)\")"  >> $(MOD_CONFIG_FILE)
+		@echo "   MOD_DEPS_FILES += $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+    ifeq  ("$(MOD_TYPE)", "linux_lib")
+        ifneq ("$(OBJS)", "")
+			@echo "ALL_LIB_OBJS += $(LINUX_LIB_OBJECTS)"  >> $(MOD_CONFIG_FILE)
+        endif
+		@echo "ifneq (x\"$$""(MOD_NAME)\", x\"$(MOD_NAME)\")"  >> $(MOD_CONFIG_FILE)
+		@echo "   MOD_DEPS_FILES += $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+    ifeq  ("$(MOD_TYPE)", "linux_module")
+		@echo "ifneq (x\"$$""(MOD_NAME)\", x\"$(MOD_NAME)\")"  >> $(MOD_CONFIG_FILE)
+			@echo "   KBUILD_EXTRA_SYMBOLS += $(SRC_DIR)/Module.symvers" >> $(MOD_CONFIG_FILE)
+			@echo "   MOD_DEPS_FILES += $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+    # Module creation rules
+	@echo "$(MOD_NAME)_$(SUBSYSTEM): $(OUT_DIR_BASE)/.$(MOD_NAME)"  >> $(MOD_CONFIG_FILE)
+	@echo ""  >> $(MOD_CONFIG_FILE)
+	@echo "$(OUT_DIR_BASE)/.$(MOD_NAME): .FORCE"   >> $(MOD_CONFIG_FILE)
+    ifeq  ("$(MOD_CUSTOM)", "y")
+		@echo "		$$""(MAKE) MOD_DIR=$(MOD_DIR) -f $(MAKE_DIR)/Makefile.template $(MOD_TARGET)" >> $(MOD_CONFIG_FILE)
+    else
+    ifneq  ("$(OBJS)", "")
+		@echo "		$$""(MAKE) MOD_DIR=$(MOD_DIR) -f $(MAKE_DIR)/Makefile.template $(MOD_TARGET)" >> $(MOD_CONFIG_FILE)
+    endif
+    ifeq  ("$(OBJS)", "")
+		@echo "		if [ ! -f $(OUT_DIR_BASE)/.$(MOD_NAME) ]; then touch $(OUT_DIR_BASE)/.$(MOD_NAME); fi" >> $(MOD_CONFIG_FILE)
+    endif
+    endif
+	@echo ""  >> $(MOD_CONFIG_FILE)
+	@echo ".FORCE:"   >> $(MOD_CONFIG_FILE)
+	@echo ""  >> $(MOD_CONFIG_FILE)
+
+    ifneq ("$(MOD_DEFS)", "")
+		@echo "EXTRA_CFLAGS += $(MOD_DEFS)" >> $(MOD_CONFIG_FILE)
+    endif
+	
+	@echo "endif"  >> $(MOD_CONFIG_FILE)
+
+    # If it is a library and this file is included as someone's dependency - extend MOD_DEP_FULL_NAMES
+    # and generate a rule to rebuilt the library
+    ifneq ("$(MOD_DEPS)$(MOD_DEPS_OPT)", "")
+		@echo "ifeq (x\"$$""(V)\", x\"2\")"  >> $(MOD_CONFIG_FILE)
+		@echo "   $$""(info !!! Now include dependencies $(MOD_DEPS) $(MOD_DEPS_OPT)" >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+        ifneq ("$(MOD_DEPS)", "")
+		@echo "$(MOD_NAME)_MOD_DEPS = $(MOD_DEPS)" >> $(MOD_CONFIG_FILE)
+		@echo "ifneq (x\"$$""(SKIP_DEPS)\", x\"yes\")"  >> $(MOD_CONFIG_FILE)
+		@echo "include $$""($(MOD_NAME)_MOD_DEPS:%=$(OUT_DIR_BASE)/Makefile.config.%)" >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+        endif
+        ifneq ("$(MOD_DEPS_OPT)", "")
+		@echo "$(MOD_NAME)_MOD_DEPS_OPT = $(MOD_DEPS_OPT)" >> $(MOD_CONFIG_FILE)
+		@echo "ifneq (x\"$$""(SKIP_DEPS)\", x\"yes\")"  >> $(MOD_CONFIG_FILE)
+		@echo "-include $$""($(MOD_NAME)_MOD_DEPS_OPT:%=$(OUT_DIR_BASE)/Makefile.config.%)" >> $(MOD_CONFIG_FILE)
+		@echo "endif"  >> $(MOD_CONFIG_FILE)
+        endif
+	@echo "ifeq (x\"$$""(V)\", x\"2\")"  >> $(MOD_CONFIG_FILE)
+	@echo "   $$""(info !!! $(MOD_NAME) finished including dependencies)" >> $(MOD_CONFIG_FILE)
+	@echo "endif"  >> $(MOD_CONFIG_FILE)
+    endif
+
+	@echo "EXTRA_CFLAGS += $(MOD_INCS)" >> $(MOD_CONFIG_FILE)
+	@echo "" >> $(MOD_CONFIG_FILE)
+	@echo "endif" >> $(MOD_CONFIG_FILE)
+# 
+# end of moddep: target
+#
+
+clean_module::
+ifeq  ("$(MOD_TYPE)", "linux_module")
+	$(SILENT_BUILD)-test -f $(SRC_DIR)/Makefile && $(MAKE) $(KERNEL_MAKEPARMS) clean
+	$(SILENT_BUILD)cd $(SRC_DIR) && rm -fr $($(MOD_NAME)-objs) $($(MOD_NAME)-objs:../%=../.%.cmd)
+	$(SILENT_BUILD)rm -fr $(OUT_DIR_BASE)/linux_modules/$(MOD_NAME).ko
+endif
+ifeq  ("$(MOD_TYPE)", "linux_lib")
+	$(SILENT_BUILD)rm -fr $(LINUX_LIB_OBJECTS)
+endif	
+	$(SILENT_BUILD)cd $(SRC_DIR) && rm -fr $(patsubst %.c,.%.o.cmd,$(srcs))
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '*.[o,d,a]' -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '*~'        -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '*.ko'      -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)[ ! -d $(OUT_DIR) ] || find $(OUT_DIR) -name '.*.cmd'    -print0 | xargs -0 rm -rf
+	$(SILENT_BUILD)rm -fr $(SRC_DIR)/*.mod.c $(SRC_DIR)/modules.order $(SRC_DIR)/Module.symvers $(SRC_DIR)/.tmp_versions
+	$(SILENT_BUILD)rm -fr $(MOD_TARGET) $(OUT_DIR)/$(TARGET) $(OUT_DIR)/unitest $(TARGET_LIB_FNAME)
+	$(SILENT_BUILD)rm -fr $(ALL_LIB_OBJS)
+	$(SILENT_BUILD)rm -fr $(GEN_SRCS) $(GEN_HDRS) $(OUT_DIR)/.$(MOD_NAME)_generated_*
+ifneq ("$(MOD_NAME)", "")
+	$(SILENT_BUILD)rm -fr $(OUT_DIR_BASE)/.$(MOD_NAME)
+	$(SILENT_BUILD)rm -fr $(SRC_DIR)/.$(MOD_NAME)_in_progress
+endif	
+    
+clobber: clean_module
+	$(SILENT_BUILD)rm -fr $(OUT_DIR)
+
+# Optional subsystem-specific rules
+-include mk/$(SUBSYSTEM)/Makefile.$(SUBSYSTEM).rules
+
+# Generate board-specific environment if any
+board_env: $(BOARD_ENV_RULE)
+
+module_name:
+	$(info $(MOD_NAME))