#!/usr/bin/make -f
#******************************************************************************#
#                                        _____           _                     #
#   Makefile                            |_   _|__  _   _| |__   ___ _   _      #
#   | Project : OMGCLOCK                  | |/ _ \| | | | '_ \ / _ \ | | |     #
#                                         | | (_) | |_| | | | |  __/ |_| |     #
#   By: thomas <thomas@touhey.fr>         |_|\___/ \__,_|_| |_|\___|\__, |.fr  #
#   Last updated: 2016/05/25 18:21:54                               |___/      #
#                                                                              #
#******************************************************************************#
# INCLUDE CONFIGURATION AND VARS
include $(CURDIR)/Makefile.cfg
include $(CURDIR)/Makefile.vars

# RULES
## Make everything means make the project (default)
all: $(NAME).g1a

## Make a local lib
$(LIBDIR)/lib%.a: $(LIBDIR)/%
	cd $(LIBDIR)/$* && ./configure
	$(MAKE) $(LIBDIR)/$*
	$(CP) $(LIBDIR)/$*/lib$*.a $@

## Make the object directory
$(OBJDIR):
	$(MD) $@

## Make an object file out of a ASM source file
$(OBJDIR)/%.o: $(SRCDIR)/%.s | $(OBJDIR)
	$(AS) -c -o $@ $<

## Make an object file out of a C source file
$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
	$(CC) -c -o $@ $< $(CFLAGS)

## Make the ELF file
$(NAME).elf: $(LLIB:%=$(LIBDIR)/lib%.a) $(SRC:%=$(OBJDIR)/%.o)
	$(LD) -o $@ $(SRC:%=$(OBJDIR)/%.o) $(LDFLAGS)

## Make the BIN file
$(NAME).bin: $(NAME).elf
	$(OBJCOPY) -R .comment -R .bss -R '$$iop' -O binary $< $@

## Make the project
$(NAME).g1a: $(NAME).bin
	$(WRAPPER) $< -o $@ \
		-n $(NAME) --internal="$(INTNAME)" --version="$(VERSION)" \
		-i $(ICON) --date="$(LASTUPDT)"

## Clean a library
define make-cleanlib-rule
clean-lib$1:
	$(MAKE) $(LIBDIR)/$1 fclean
	$(RM) $(LIBDIR)/lib$1.a
endef
$(foreach lib,$(LLIB), \
$(eval $(call make-cleanlib-rule,$(lib))))

## Clean the object files
clean: $(LLIB:%=clean-lib%)
	$(RM) $(SRC:%=$(OBJDIR)/%.o)
	$(RM) $(NAME).elf $(NAME).bin

## Clean the object files and the binary
fclean: clean
	$(RM) $(NAME).g1a

## Remake the project
re: fclean all

## Transfer to calculator
send:
	@if [ ! -f $(NAME).g1a ]; then \
		echo "Please make before transferring." >&2; \
		false; \
	fi
	@if ! $(TRANSF) SEND $(NAME).g1a $(NAME).g1a fls0 1>/dev/null; then \
		echo "$(TRANSF): calculator not plugged/in receive mode" >&2; \
		false; \
	fi

## Doz rulz are phunny
.PHONY: all clean $(LLIB:%=clean-lib%) fclean re send

# END OF FILE
