.PHONY: all clean

.DEFAULT_GOAL = all

ASM_SOURCES = $(shell find . -name "*.asm")
C_SOURCES   = $(shell find . -name "*.c")
CC_SOURCES  = $(shell find . -name "*.cc")

VERBOSE = @
OBJDIR = ./build
DEPDIR = ./dep
CXX = g++
CC = gcc
ASM = nasm
AR = ar

ASMFLAGS =  -f elf64
WARNFLAGS = -Wall -Wextra
OPTFLAGS = -O3
#OPTFLAGS = -Og -g
CXXFLAGS = -I. -Iinclude $(OPTFLAGS) $(WARNFLAGS)
CCFLAGS = -I. -Iinclude $(OPTFLAGS) $(WARNFLAGS)

VPATH = $(sort $(dir $(ASM_SOURCES) $(C_SOURCES) $(CC_SOURCES)))

OBJECTS = $(notdir $(CC_SOURCES:.cc=.o)) $(notdir $(C_SOURCES:.c=.o)) $(notdir $(ASM_SOURCES:.asm=.o))
DEP_FILES = $(patsubst %.o,$(DEPDIR)/%.d,$(OBJECTS))
OBJPRE = $(addprefix $(OBJDIR)/,$(OBJECTS))
MAKEFILE_LIST = Makefile

all: $(OBJDIR)/lwt.a

$(OBJDIR)/lwt.a: $(OBJPRE)
	@echo "AR		$@"
	$(VERBOSE) $(AR) rcs $@ $^

$(DEPDIR)/%.d : %.c $(MAKEFILE_LIST)
	@echo "DEP		$@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) $(CXX) $(CXXFLAGS) -MM -MT $(OBJDIR)/$*.o -MF $@ $<

$(DEPDIR)/%.d : %.cc $(MAKEFILE_LIST)
	@echo "DEP		$@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) $(CXX) $(CXXFLAGS) -MM -MT $(OBJDIR)/$*.o -MF $@ $<

$(OBJDIR)/%.o : %.asm $(MAKEFILE_LIST)
	@echo "ASM		$@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) $(ASM) $(ASMFLAGS) -o $@ $<

$(OBJDIR)/%.o : %.c $(MAKEFILE_LIST)
	@echo "CC		$@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) $(CC) -c $(CCFLAGS) -o $@ $<

$(OBJDIR)/%.o : %.cc $(MAKEFILE_LIST)
	@echo "CXX		$@"
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) $(CXX) -c $(CXXFLAGS) -o $@ $<

clean:	
	@echo "RM		$(OBJDIR)"
	$(VERBOSE) rm -rf $(OBJDIR)
	@echo "RM		$(DEPDIR)"
	$(VERBOSE) rm -rf $(DEPDIR)

ifneq ($(MAKECMDGOALS),clean)
-include $(DEP_FILES)
endif
