
ifeq ($(OS),Windows_NT)
	OSTAG = WIN
	EXT = .exe
	CMAKE_GENERATOR = "MinGW Makefiles"
else
	UNAME_S := $(shell uname -s)
    ifeq ($(UNAME_S),Linux)
    	OSTAG = LIN
        EXT =
		CMAKE_GENERATOR = "Unix Makefiles"
    else ifeq ($(UNAME_S),Darwin)
    	$(error OSX isn't supported)
        OSNAME = osx
    endif
endif

AR  = ar$(EXT)
CC  = gcc$(EXT)
CXX = g++$(EXT)

SRCDIR = src
OBJDIR = obj
OUTDIR = out

CFILES = $(wildcard $(SRCDIR)/*.c)
HFILES = $(wildcard $(SRCDIR)/*.h)
OFILES = $(patsubst $(SRCDIR)/%.c, $(OBJDIR)/%.o, $(CFILES))

CFLAGS_WIN = 
CFLAGS_LIN = -pthread -fsanitize=address,undefined
CFLAGS = -Wall -Wextra -g $(CFLAGS_$(OSTAG)) -DTCP_DEBUG #-DMICROTCP_DEBUG

LIBFILE = $(OUTDIR)/libmicrotcp.a

TAP_AFILES = $(OUTDIR)/libtuntap.a
TAP_HFILES = $(OUTDIR)/tuntap.h $(OUTDIR)/tuntap-export.h

EXAMPLE_0 = $(OUTDIR)/http$(EXT)
EXAMPLE_1 = $(OUTDIR)/echo$(EXT)

EXAMPLE_CFILES_0 = $(wildcard examples/http/*.c)
EXAMPLE_HFILES_0 = $(wildcard examples/http/*.h)

EXAMPLE_CFILES_1 = examples/echo.c
EXAMPLE_HFILES_1 = 

EXAMPLE_LFLAGS_WIN = -lws2_32
EXAMPLE_LFLAGS_LIN = 
EXAMPLE_LFLAGS = -lmicrotcp -ltuntap $(EXAMPLE_LFLAGS_$(OSTAG))

.PHONY: all exm lib clean

all: lib exm

exm: $(EXAMPLE_0) $(EXAMPLE_1)

lib: $(LIBFILE) $(TAP_HFILES) $(TAP_AFILES)
	cp $(SRCDIR)/microtcp.h $(OUTDIR)/microtcp.h

$(OBJDIR)/%.o: $(SRCDIR)/%.c $(HFILES) $(TAP_HFILES)
	$(CC) -c -o $@ $< $(CFLAGS) -I$(OUTDIR)

$(LIBFILE): $(OFILES)
	$(AR) rcs $@ $^

$(TAP_AFILES) $(TAP_HFILES):
	cd 3p/libtuntap/ && \
	mkdir -p build   && \
	cd build         && \
	cmake .. -G $(CMAKE_GENERATOR) -DBUILD_TESTING=OFF -DCMAKE_C_COMPILER=$(CC) -DCMAKE_CXX_COMPILER=$(CXX) -DCMAKE_BUILD_TYPE=Debug && \
	make
	cp 3p/libtuntap/build/lib/libtuntap.a $(OUTDIR)/libtuntap.a
	cp 3p/libtuntap/tuntap.h $(OUTDIR)/tuntap.h
	cp 3p/libtuntap/build/tuntap-export.h $(OUTDIR)/tuntap-export.h

$(EXAMPLE_0): lib $(EXAMPLE_CFILES_0) $(EXAMPLE_HFILES_0)
	$(CC) -o $@ $(EXAMPLE_CFILES_0) $(CFLAGS) $(EXAMPLE_LFLAGS) -I$(OUTDIR) -L$(OUTDIR)

$(EXAMPLE_1): lib $(EXAMPLE_CFILES_1) $(EXAMPLE_HFILES_1)
	$(CC) -o $@ $(EXAMPLE_CFILES_1) $(CFLAGS) $(EXAMPLE_LFLAGS) -I$(OUTDIR) -L$(OUTDIR)

clean:
	rm -fr $(OBJDIR) $(OUTDIR) 3p/libtuntap/build
	mkdir obj out
