###############################################################################
## FUNCTIONS
###############################################################################

###############################################################################
## Colored output
###############################################################################

# Enable colored output
ifeq ($(SONIC_CONFIG_ENABLE_COLORS),y)
ifeq ($(MAKE_TERMOUT),)
RED=\033[1;31m
PURPLE=\033[1;35m
CYAN=\033[1;36m
GREEN=\033[1;32m
GRAY=\033[0m
endif
endif

# Print red colored output
# call:
#       log_red message
log_red = echo -e "$(RED)$(1)$(GRAY)"

# Print purple colored output
# call:
#       log_purple message
log_purple = echo -e "$(PURPLE)$(1)$(GRAY)"

# Print blue colored output
# call:
#       log_blue message
log_blue = echo -e "$(CYAN)$(1)$(GRAY)"

# Print green colored output
# call:
#       log_green message
log_green = echo -e "$(GREEN)$(1)$(GRAY)"

###############################################################################
## Logging
###############################################################################

FLUSH_LOG = rm -f $@.log

LOG = &>> $(PROJECT_ROOT)/$@.log || { [ $$? -eq 0 ] || pushd $(PROJECT_ROOT) > /dev/null ; ./update_screen.sh -e $@ ; popd > /dev/null ; false ; }

###############################################################################
## Header and footer for each target
###############################################################################

# Dump targets taht current depends on
ifeq ($(SONIC_CONFIG_PRINT_DEPENDENCIES),y)
PRINT_DEPENDENCIES = echo Dependencies for $@ are $^ $(LOG)
endif

# header for each rule
define HEADER
@
$(PRINT_DEPENDENCIES)
$(FLUSH_LOG)
./update_screen.sh -a $@
endef

# footer for each rule
define FOOTER
./update_screen.sh -d $@
endef

###############################################################################
## Definition of derived target
###############################################################################

# call:
#     add_derived_package some_deb.deb, some_derived_deb
define add_derived_package
$(2)_DEPENDS += $(1)
$(2)_RDEPENDS += $($(1)_RDEPENDS)
$(2)_MAIN_DEB = $(1)
$(1)_DERIVED_DEBS += $(2)
$(2)_URL = $($(1)_URL)
$(2)_SRC_PATH = $($(1)_SRC_PATH)
SONIC_DERIVED_DEBS += $(2)
endef

# call:
#     add_extra_package some_deb.deb, some_extra_deb
define add_extra_package
$(2)_MAIN_DEB = $(1)
$(1)_EXTRA_DEBS += $(2)
SONIC_EXTRA_DEBS += $(2)
endef

###############################################################################
## Utility functions
###############################################################################

expand = $(foreach d,$(1),$(call expand,$($(d)_$(2)),$(2))) $(1)