--- /dev/null
+define Build/Prepare
+endef
+
+define Build/Configure
+endef
+
+define Build/Compile
+endef
+
+include $(INCLUDE_DIR)/target.mk
+
+# derive custo variables from packagename
+# CONFIG_CUSTO-* / CONFIG_CUSTO_MAPPINGS-*
+PKG_CUSTO_CONFIG_VAR?=$(patsubst mappings-%,CONFIG_CUSTO_MAPPINGS-%,$(patsubst conf-%,CONFIG_CUSTO-%,$(patsubst webui-%,CONFIG_CUSTO_WEBUI-%,$(patsubst cli-%,CONFIG_CUSTO_CLI-%,$(patsubst mib-%,CONFIG_CUSTO_MIB-%,$(PKG_NAME))))))
+# debug
+$(warning PKG_CUSTO_CONFIG_VAR = $(PKG_CUSTO_CONFIG_VAR))
+
+ifeq ($(strip $(PKG_CUSTO_CONFIG_VAR)),$(strip $(PKG_NAME)))
+ $(error PKG_CUSTO_CONFIG_VAR not explicitly set or PKG_NAME is not of the form conf-*, mappings-*, webui-*, cli-* or mib-*)
+endif
+
+ifeq ($($(PKG_CUSTO_CONFIG_VAR)),)
+ #only check when actually building
+ ifneq ($(strip $(BUILDNAME)),)
+ $(error $(PKG_CUSTO_CONFIG_VAR) not set. Run repowrt menuconfig to correct)
+ endif
+endif
+
+# if CONFIG_CUSTO-* / CONFIG_CUSTO_MAPPINGS-* is empty, replace by generic
+ifneq ($($(PKG_CUSTO_CONFIG_VAR)),"")
+ PKG_CUSTO_CONFIG_VALUE=$(patsubst "%",%,$($(PKG_CUSTO_CONFIG_VAR)))
+else
+ PKG_CUSTO_CONFIG_VALUE=generic
+endif
+
+# ensure PKG_CUSTO_FILE_PREFIXES is not empty
+ifeq ($(strip $(PKG_CUSTO_FILE_PREFIXES)),)
+ $(error PKG_CUSTO_FILE_PREFIXES not set)
+endif
+
+# ensure the CONFIG_CUSTO-* / CONFIG_CUSTO_MAPPINGS-* value is taken into account in the
+# decision to rebuild
+STAMP_PREPARED:=$(STAMP_PREPARED)_$(patsubst "%",%,$(PKG_CUSTO_CONFIG_VALUE))
+# debug
+$(warning STAMP_PREPARED = $(STAMP_PREPARED))
+
+# create config section
+# CUSTO- (for config)
+PKG_CUSTO_VAR?=$(patsubst conf-%,CUSTO-%,$(patsubst mappings-%,CUSTO_MAPPINGS-%,$(patsubst webui-%,CUSTO_WEBUI-%,$(patsubst cli-%,CUSTO_CLI-%,$(patsubst mib-%,CUSTO_MIB-%,$(PKG_NAME))))))
+#debug
+$(warning PKG_CUSTO_VAR = $(PKG_CUSTO_VAR))
+
+ifeq ($(strip $(PKG_CUSTO_VAR)),$(strip $(PKG_NAME)))
+ $(error PKG_CUSTO_VAR not explicitly set or PKG_NAME is not of the form conf-*, mappings-*, webui-*, cli-* or mib-*)
+endif
+
+define create_config
+ define Package/$(1)/config
+ config $(2)
+ depends on PACKAGE_$(1)
+ string "Name of the custo to use."
+ default "generic"
+ $$(Package/$(1)/additionalconfig)
+ endef
+endef
+
+$(eval $(call create_config,$(PKG_NAME),$(PKG_CUSTO_VAR)))
+
+# create list of CUSTO sources
+# $1 = PREFIX, $2 = PKG_CUSTO_CONFIG_VALUE , $3 = BOARDNAME
+define find_custos
+ $(1)_CUSTOS_$(3):=$(shell find -L . -regex './files/$(shell echo "$(3)" | tr '[:upper:]' '[:lower:]')/$(1)-$(2)' 2> /dev/null)
+ $(1)_CUSTOS_$(3)+=$(shell find -L . -regex './files/common/$(1)-$(2)' 2> /dev/null)
+ $(1)_CUSTOS_$(3)+=$(shell find -L . -regex './files/$(shell echo "$(3)" | tr '[:upper:]' '[:lower:]')/$(1)-generic' 2> /dev/null)
+ $(1)_CUSTOS_$(3)+=$(shell find -L . -regex './files/common/$(1)-generic' 2> /dev/null)
+endef
+
+#select first available CUSTO source from list
+define select_custo
+ $(1)_CUSTO_SELECTED_$(2):=$(firstword $($(1)_CUSTOS_$(2)))
+endef
+
+# if $(1)_CUSTO_SELECTED is a symlink to .remove, clear $(1)_CUSTO_SELECTED
+define remove_custo
+ $(1)_CUSTO_SELECTED_$(2):=$(if $($(1)_CUSTO_SELECTED_$(2)),$(if $(findstring .remove,$(shell readlink -f $($(1)_CUSTO_SELECTED_$(2)) 2> /dev/null)),,$($(1)_CUSTO_SELECTED_$(2))))
+endef
+
+define select_global_custo
+ $(1)_CUSTO_SELECTED:=$($(1)_CUSTO_SELECTED_$(2))
+endef
+
+# get current board family members, TARGET_FAMILY_MEMBERS looks like VDNT-O:PT VDNT-3:PA ..., strip the :xx to get VDNT-O VDNT-3
+FAMILY_MEMBERS:=$(if $(firstword $(TARGET_FAMILY_MEMBERS)),$(foreach MEMBER,$(TARGET_FAMILY_MEMBERS),$(shell echo "$(MEMBER)" | cut -d ':' -f 1)),$(BOARDNAME))
+# identify all possible "board" custo names
+POSSIBLE_CUSTO_NAMES:=$(sort $(FAMILY_MEMBERS) $(BOARDNAME))
+# find custo files for each member of the board family
+$(foreach CUSTO_NAME,$(POSSIBLE_CUSTO_NAMES),$(foreach PREFIX,$(PKG_CUSTO_FILE_PREFIXES),$(eval $(call find_custos,$(PREFIX),$(PKG_CUSTO_CONFIG_VALUE),$(CUSTO_NAME)))))
+# select correct custo from the retieved custo files for each member of the board family
+$(foreach CUSTO_NAME,$(POSSIBLE_CUSTO_NAMES),$(foreach PREFIX,$(PKG_CUSTO_FILE_PREFIXES),$(eval $(call select_custo,$(PREFIX),$(CUSTO_NAME)))))
+# handle .remove for the selected custo for each member of the board family
+$(foreach CUSTO_NAME,$(POSSIBLE_CUSTO_NAMES),$(foreach PREFIX,$(PKG_CUSTO_FILE_PREFIXES),$(eval $(call remove_custo,$(PREFIX),$(CUSTO_NAME)))))
+# select the custo applicable for the current BOARDNAME (for backwards compatibility)
+$(foreach PREFIX,$(PKG_CUSTO_FILE_PREFIXES),$(eval $(call select_global_custo,$(PREFIX),$(BOARDNAME))))
+
+# family installation
+# $(1) dst root path $(2) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_DIR
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(INSTALL_DIR) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(2)));),$(INSTALL_DIR) $(1)/$(patsubst /%,%,$(2));)
+endef
+
+# family installation
+# $(1) dst root path $(2) = PREFIX $(3) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_DATA
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(INSTALL_DATA) $($(2)_CUSTO_SELECTED_$(MEMBER)) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(3)));),$(INSTALL_DATA) $($(2)_CUSTO_SELECTED) $(1)/$(patsubst /%,%,$(3));)
+endef
+
+# family installation
+# $(1) dst root path $(2) = PREFIX $(3) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_BIN
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(INSTALL_BIN) $($(2)_CUSTO_SELECTED_$(MEMBER)) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(3)));),$(INSTALL_BIN) $($(2)_CUSTO_SELECTED) $(1)/$(patsubst /%,%,$(3));)
+endef
+
+# family installation, only proceed if source file exists
+# $(1) dst root path $(2) = PREFIX $(3) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_DATA_IF_EXISTS
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(if $($(2)_CUSTO_SELECTED_$(MEMBER)),$(INSTALL_DATA) $($(2)_CUSTO_SELECTED_$(MEMBER)) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(3)));)),$(INSTALL_DATA) $($(2)_CUSTO_SELECTED) $(1)/$(patsubst /%,%,$(3));)
+endef
+
+# family installation, only proceed if source file exists
+# $(1) dst root path $(2) = PREFIX $(3) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_BIN_IF_EXISTS
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(if $($(2)_CUSTO_SELECTED_$(MEMBER)),$(INSTALL_BIN) $($(2)_CUSTO_SELECTED_$(MEMBER)) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(3)));)),$(if $($(2)_CUSTO_SELECTED),$(INSTALL_BIN) $($(2)_CUSTO_SELECTED) $(1)/$(patsubst /%,%,$(3));))
+endef
+
+# conditional family installation, only install the dir if the file pointed to by CHECK_PREFIX contains the specified regexp
+# $(1) dst root path $(2) = CHECK_PREFIX $(3) regexp $(4) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_DIR_CONDITIONAL
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(if $(firstword $(shell grep "$(3)" "$($(2)_CUSTO_SELECTED_$(MEMBER))" 2> /dev/null)),$(INSTALL_DIR) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(4)));)),$(if $(firstword $(shell grep "$(3)" "$($(2)_CUSTO_SELECTED)" 2> /dev/null)),$(INSTALL_DIR) $(1)/$(patsubst /%,%,$(4));))
+endef
+
+# conditional family installation, only install the file referenced by INSTALL_PREFIX if the file pointed to by CHECK_PREFIX contains the specified regexp and file pointed to by INSTALL_PREFIX exists
+# $(1) dst root path $(2) = CHECK_PREFIX $(3) regexp $(4) INSTALL_PREFIX $(5) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_DATA_CONDITIONAL
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(if $(firstword $(shell grep "$(3)" "$($(2)_CUSTO_SELECTED_$(MEMBER))" 2> /dev/null)),$(if $($(4)_CUSTO_SELECTED_$(MEMBER)),$(INSTALL_DATA) $($(4)_CUSTO_SELECTED_$(MEMBER)) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(5)));))),$(if $(firstword $(shell grep "$(3)" "$($(2)_CUSTO_SELECTED)" 2> /dev/null)),$(if $($(4)_CUSTO_SELECTED),$(INSTALL_DATA) $($(4)_CUSTO_SELECTED) $(1)/$(patsubst /%,%,$(5));)))
+endef
+
+# conditional family installation, only install the file referenced by INSTALL_PREFIX if the file pointed to by CHECK_PREFIX contains the specified regexp and file pointed to by INSTALL_PREFIX exists
+# $(1) dst root path $(2) = CHECK_PREFIX $(3) regexp $(4) INSTALL_PREFIX $(5) = dst subdir
+# if destination is /etc/custo/... then change to /etc/... if there is more than one family member
+define FAMILY_INSTALL_BIN_CONDITIONAL
+$(if $(filter-out $(BOARDNAME),$(FAMILY_MEMBERS)),$(foreach MEMBER,$(FAMILY_MEMBERS),$(if $(firstword $(shell grep "$(3)" "$($(2)_CUSTO_SELECTED_$(MEMBER))" 2> /dev/null)),$(if $($(4)_CUSTO_SELECTED_$(MEMBER)),$(INSTALL_BIN) $($(4)_CUSTO_SELECTED_$(MEMBER)) $(1)/etc/boards/$(MEMBER)/config/$(patsubst /%,%,$(patsubst /etc/custo/%,/etc/%,$(5)));))),$(if $(firstword $(shell grep "$(3)" "$($(2)_CUSTO_SELECTED)" 2> /dev/null)),$(if $($(4)_CUSTO_SELECTED),$(INSTALL_BIN) $($(4)_CUSTO_SELECTED) $(1)/$(patsubst /%,%,$(5));)))
+endef
+
+# reporting
+define report_custo_per_board
+$(shell echo "$(PKG_NAME): $(1)_CUSTOS_$(2) = $($(1)_CUSTOS_$(2)) $(1)_CUSTO_SELECTED_$(2) = $($(1)_CUSTO_SELECTED_$(2))" >> $(TMP_DIR)/.custo_$(PKG_NAME))
+endef
+
+define report_custo_global
+$(shell echo "$(PKG_NAME): BOARDNAME = $(BOARDNAME) $(1)_CUSTO_SELECTED = $($(1)_CUSTO_SELECTED)" >> $(TMP_DIR)/.custo_$(PKG_NAME))
+endef
+
+# remove existing report
+$(shell rm -f $(TMP_DIR)/.custo_$(PKG_NAME))
+
+# generate new report
+$(foreach MEMBER,$(FAMILY_MEMBERS),$(foreach PREFIX,$(PKG_CUSTO_FILE_PREFIXES),$(eval $(call report_custo_per_board,$(PREFIX),$(MEMBER)))))
+$(foreach PREFIX,$(PKG_CUSTO_FILE_PREFIXES),$(eval $(call report_custo_global,$(PREFIX))))
+