# -*- Mode: makefile

ifeq ($(STAGING_PREFIX),)
STAGING_PREFIX=$(HOME)/staging
endif

ifeq ($(KERNELDIR),)                            
KERNELDIR := /lib/modules/uname -r/build
endif

ifeq (${LUAVER},V5.1)
LUALIB=$(STAGING_PREFIX)/usr/lib/lua-5.1.4/liblua.a
LUAINC=$(STAGING_PREFIX)/usr/include/lua-5.1.4
LUADEF=-DLUAVER=51
else 
ifeq (${LUAVER},V2.0JIT)
LUALIB=$(STAGING_PREFIX)/usr/lib/libluajit-5.1.a
LUAINC=$(STAGING_PREFIX)/usr/include/luajit-2.0
LUADEF=-DLUAVER=20
else # 5.0
LUALIB=$(STAGING_PREFIX)/usr/lib/lua-5.0/liblua.a $(STAGING_PREFIX)/usr/lib/lua-5.0/liblualib.a
LUAINC=$(STAGING_PREFIX)/usr/include/lua-5.0
LUADEF=-DLUAVER=50
endif
endif

TBGEN=$(STAGING_PREFIX)/usr/bin/tbgen
CNVGEN=$(STAGING_PREFIX)/usr/bin/cnvgen
TOUCH = touch
INSTALL = install

ifeq ($(OBJDIR),)
OBJDIR=$(CC)
endif

DEPFLAGS=-Wp,-MD,.deps/$(*F).d
CFLAGS+=-Wall -g $(CINC) $(DEPFLAGS) $(LUADEF)

CSRC=$(wildcard *.c)
CPPSRC=$(wildcard *.cpp)
LEXSRC=$(wildcard *.lex)
TBGENSRC=$(wildcard *.tb)
CNVGENSRC=$(wildcard *.cnv)
OBJS+=$(CSRC:.c=.o) $(CPPSRC:.cpp=.o) $(LEXSRC:.lex=.o) $(TBGENSRC:.tb=.o) $(CNVGENSRC:.cnv=.o)
OBJSWITHDIR=$(patsubst %,$(OBJDIR)/%,$(OBJS))

DEPS=$(wildcard .deps/*.d)
TARGETWITHDIR=$(patsubst %,$(OBJDIR)/%,$(TARGET))
TARGET2WITHDIR=$(patsubst %,$(OBJDIR)/%,$(TARGET2))

MYPATH=$(shell pwd)

all: subdirs $(TARGETWITHDIR) $(EXTRA_DEPENDANCY)

subdirs:
	@for i in $(EXTRADIRS); do \
	    make -C $$i $(MAKECMDGOALS) || exit -1; \
	done

$(OBJSWITHDIR): .deps .depstime

$(OBJDIR): 
	mkdir $(OBJDIR)

.deps:
	mkdir -p .deps

.depstime: .deps
	@$(TOUCH) -r .deps .depstime

$(OBJDIR)/%.c:%.cnv
	$(CNVGEN) $< $@ $(CFLAGS) $(CINC)
	$(CC) $(CFLAGS) -o $(@:.c=.o) -c $(MYPATH)/$@ -MT '$@'
	@$(TOUCH) -r .depstime .deps

$(OBJDIR)/%.c:%.tb
	$(TBGEN) -T$< -C$@ -L$(@:.c=.ls)
	$(CC) $(CFLAGS) -o $(@:.c=.o) -c $(MYPATH)/$@ -MT '$@'
	@$(TOUCH) -r .depstime .deps

$(OBJDIR)/%.c:%.lex
	flex -o $@ $<
	$(CC) $(CFLAGS) -o $(@:.c=.o) -c $(MYPATH)/$@ -MT '$@'
	@$(TOUCH) -r .depstime .deps

$(OBJDIR)/%.o:%.c
	$(CC) $(CFLAGS) -o $@ -c $(MYPATH)/$< -MT '$@' -MT '$@'
	@$(TOUCH) -r .depstime .deps

$(OBJDIR)/%.o:%.cpp
	$(CC) $(CFLAGS) -o $@ -c $(MYPATH)/$< -MT '$@' -MT '$@'
	@$(TOUCH) -r .depstime .deps

$(TARGETWITHDIR): $(OBJDIR) $(OBJSWITHDIR) $(EXTRADEPS)
	@if [ -z "$(findstring .a,$(TARGETWITHDIR))" ] ; then \
	     echo $(CC) -o $@ $(OBJSWITHDIR) $(LIBS) $(LUALIB) $(LFLAGS) ;\
	     $(CC) -o $@ $(OBJSWITHDIR) $(LIBS) $(LUALIB) $(LFLAGS) || exit -1 ;\
	else \
	     echo $(AR) r $@ $(OBJSWITHDIR) ;\
	     $(AR) r $@ $(OBJSWITHDIR) || exit -1 ;\
	fi

clean: subdirs
	$(RM) -rf $(OBJDIR) $(DEPS)

install: subdirs
	@if [ ! -z "$(TARGETDIR)" ] ; then \
	    mkdir -p $(TARGETDIR);\
	    echo "$(INSTALL) $(INSTALLFLAGS) $(TARGETWITHDIR) $(TARGETDIR)";\
	    $(INSTALL) $(INSTALLFLAGS) $(TARGETWITHDIR) $(TARGETDIR);\
	    if [ ! -z "$(TARGET2WITHDIR)" ] ; then \
            	    echo "$(INSTALL) $(INSTALLFLAGS) $(TARGET2WITHDIR) $(TARGETDIR)";\
            	    $(INSTALL) $(INSTALLFLAGS) $(TARGET2WITHDIR) $(TARGETDIR);\
            fi ;\
	    if [ ! -z "$(TARGETINCLUDEDIR)" ] ; then \
	        echo $(INSTALL) -d $(TARGETINCLUDEDIR) ;\
	    	$(INSTALL) -d $(TARGETINCLUDEDIR) ;\
	    fi ;\
	    if [ ! -z "$(TARGETINCLUDEFILES)" ] ; then \
	        echo $(INSTALL)  $(INSTALLFLAGS) $(TARGETINCLUDEFILES) $(TARGETINCLUDEDIR) ;\
		$(INSTALL)  $(INSTALLFLAGS) $(TARGETINCLUDEFILES) $(TARGETINCLUDEDIR) ;\
	    fi ;\
	fi ;\

ifneq "$(DEPS)" ""
include $(DEPS)
endif
