# Makefrag for most user libraries
# They must set LIBNAME, then include this fragment
# e.g.  LIBNAME = parlib

ARCH ?= none	# catch bugs
SRCDIR ?=
INCDIR ?= $(SRCDIR)include
OBJDIR ?= $(SRCDIR)obj
CFLAGS_USER += $(CFLAGS_USER_LIBS)
# DEPLIBS passed in from the top-level Makefile
DEPLIBS := $(DEPLIBS)
DEPLIBAS = $(patsubst %, $(XCC_TARGET_LIB)/lib%.a, $(DEPLIBS))

INCS = -I$(INCDIR)
FINALLIB = $(OBJDIR)/lib$(LIBNAME).a
FINALLIB-INSTALL = $(XCC_TARGET_LIB)/lib$(LIBNAME).a

uc = $(shell echo $(1) | tr a-z A-Z)

LIBUCNAME := $(call uc, $(LIBNAME))
HEADERS := $(shell find $(INCDIR) -name "*.h")
CFILES  := $(wildcard $(SRCDIR)*.c)
CFILES  += $(wildcard $(SRCDIR)$(ARCH)/*.c)
SFILES  := $(wildcard $(SRCDIR)$(ARCH)/*.S)
OBJS    := $(patsubst %.c, $(OBJDIR)/%.o, $(CFILES)) \
           $(patsubst %.S, $(OBJDIR)/%.o, $(SFILES))

all: $(FINALLIB)
	@:

$(OBJDIR)/$(ARCH)/%.o: $(SRCDIR)$(ARCH)/%.S $(HEADERS) $(DEPLIBAS)
	@echo + as [$(LIBUCNAME)] $<
	@mkdir -p $(@D)
	$(Q)$(CC) $(CFLAGS_USER) $(INCS) -o $@ -c $<

$(OBJDIR)/%.o: $(SRCDIR)%.c $(HEADERS) $(DEPLIBAS)
	@echo + cc [$(LIBUCNAME)] $<
	@mkdir -p $(@D)
	$(Q)$(CC) $(CFLAGS_USER) $(INCS) -o $@ -c $<

$(FINALLIB): $(OBJS)
	@echo + ar [$(LIBUCNAME)] $@
	@mkdir -p $(@D)
	$(Q)$(AR) rc $@ $(OBJS)

# Allow two different patterns for installing include files
$(FINALLIB-INSTALL): $(FINALLIB)
	@cp $(FINALLIB) $@
	@if [ -d "$(INCDIR)/$(LIBNAME)" ]; then \
		rm -rf $(XCC_TARGET_INCLUDE)/$(LIBNAME) ; \
		cp -r $(INCDIR)/$(LIBNAME) $(XCC_TARGET_INCLUDE)/ ; \
	else \
		cp -r $(INCDIR)/*.h $(XCC_TARGET_INCLUDE)/ ; \
	fi;

install: $(FINALLIB-INSTALL)
	@echo > /dev/null

clean:
	@echo + clean [$(LIBUCNAME)]
	$(Q)rm -rf $(FINALLIB)
	$(Q)rm -rf $(OBJDIR)
