#
# These allow for the build to be less verbose
#

ifdef V
  VERBOSE:= $(V)
else
  VERBOSE:= 0
endif

ifeq ($(VERBOSE),1)
define Q
  $(2)
endef
else
ifneq ($(filter s% -s%,$(MAKEFLAGS)),)
define Q
  @$(2)
endef
else
define Q
  @echo "	[$1] $(3)"
  @$(2)
endef
endif
endif

define QTEST
	$(call Q,$1, ./test/run.sh $2, $3)
endef

define cook_aflags
       $(filter-out $(AFLAGS_SKIP_$(1)), $(CPPFLAGS) $(AFLAGS)) $(AFLAGS_$(1))
endef

define cook_cflags
       $(filter-out $(CFLAGS_SKIP_$(1)), $(CPPFLAGS) $(CFLAGS)) $(CFLAGS_$(1))
endef

ifeq ($(C),1)
  ifeq ($(VERBOSE),1)
	cmd_check = $(CHECK) $(CHECKFLAGS) $(filter-out $(CHECK_CFLAGS_SKIP),$(call cook_cflags,$@)) $<
  else
	cmd_check = @$(CHECK) $(CHECKFLAGS) $(filter-out $(CHECK_CFLAGS_SKIP),$(call cook_cflags,$@)) $<
  endif
endif


%.o : %.S include/asm-offsets.h
	$(call Q,AS, $(CC) $(call cook_aflags,$@) -c $< -o $@, $@)

%.s : %.S include/asm-offsets.h
	$(call Q,CC, $(CC) $(call cook_aflags,$@) -E -c $< -o $@, $@)

%.o : %.c
	$(call cmd_check)
	$(call Q,CC, $(CC) $(call cook_cflags,$@) -c $< -o $@, $@)

# Force the use of the C compiler, not C++ for the .C files in libpore
%.o : %.C
	$(call cmd_check)
	$(call Q,CC, $(CC) $(call cook_cflags,$@) -x c -c $< -o $@, $@)

%.s : %.c
	$(call Q,CC, $(CC) $(call cook_cflags,$@) -S -c $< -o $@, $@)

%.i : %.c
	$(call Q,CC, $(CC) $(call cook_cflags,$@) -E -c $< -o $@, $@)

%built-in.a :
	@rm -f $@
	$(call Q,AR, $(AR) rcSTPD $@ $^, $@)

%.lds : %.lds.S
	$(call Q,CC, $(CC) $(CPPFLAGS) -P -E $< -o $@, $@)

%.map: %.elf
	$(call Q,NM, $(NM) --synthetic -n $< | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $@, $@)
