#
# Generic kbuild routines
#

# The temporary file to save gcc -MD generated dependencies must not
# contain a comma
depfile = $(subst $(comma),_,$(@D)/.$(@F).d)


ifneq ($(KBUILD_NOCMDDEP),1)
# Check if both arguments has same arguments. Result in empty string if equal
# User may override this check using make KBUILD_NOCMDDEP=1
arg-check = $(strip $(filter-out $(1), $(2)) $(filter-out $(2), $(1)) )

endif

# If quiet is set, only print short version of command
cmd = @$(if $($(quiet)cmd_$(1)),\
      echo '  $(subst ','\'',$($(quiet)cmd_$(1)))' &&) $(cmd_$(1))


# echo command. Short version is $(quiet) equals quiet, otherwise full command
echo-cmd = $(if $($(quiet)cmd_$(1)), \
	echo '  $(subst ','\'',$($(quiet)cmd_$(1)))';)

# function to only execute the passed command if necessary
# >'< substitution is for echo to work,
# >$< substitution to preserve $ when reloading .cmd file
# note: when using inline perl scripts [perl -e '...$$t=1;...'] in
#       $(cmd_xxx) double $$ your perl vars
# 
if_changed = $(if $(strip $? $(call arg-check, $(cmd_$(1)), $(cmd_$@)) ), \
	@set -e; \
	$(echo-cmd) \
	$(cmd_$(1)); \
	echo 'cmd_$@ := $(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' \
	  > $(@D)/.$(@F).cmd)


# execute the command and also postprocess generated .d dependencies
# file
if_changed_dep = $(if $(strip $? $(filter-out FORCE $(wildcard $^),$^) \
	$(call arg-check, $(cmd_$(1)), $(cmd_$@)) ),                   \
	@set -e; \
	$(echo-cmd) \
	$(cmd_$(1)); \
	scripts/basic/fixdep $(depfile) $@ \
	  '$(subst $$,$$$$,$(subst ','\'',$(cmd_$(1))))' > $(@D)/.$(@F).tmp; \
	rm -f $(depfile); \
	mv -f $(@D)/.$(@F).tmp $(@D)/.$(@F).cmd)


