#tegel by Martijn van Iersel (amarillion@yahoo.com)
#
# This has the target platform defined, this is modified by fix.bat or fix.sh
include target.os

# BUILD=DEBUG
BUILD=RELEASE

# Suggested by GNU Coding Stardards
SHELL = /bin/sh

LIBS = -lmasking -lalfont
EDITLIBS = -lmasking -lalfont
CFLAGS = -Iinclude -W -Wall
EDITCFLAGS = -Iedit/include

ifeq ($(BUILD),RELEASE)
	CFLAGS += -O3 -s
endif
ifeq ($(BUILD),DEBUG)
	CFLAGS += -g -DDEBUG
endif

# platform specific stuff:

# ------------------
# MingW32
# ------------------
ifeq ($(TARGET),MINGW32)

PLATFORMDIR=mingw
GCC = gcc
GPP = g++
CFLAGS += -D__GTHREAD_HIDE_WIN32API
LFLAGS = -Wl,--subsystem,windows
BINSUF = .exe
ifeq ($(BUILD),RELEASE)
	LIBS += -lalleg
endif
ifeq ($(BUILD),DEBUG)
	LIBS += -lalld
endif
LIB_INSTALL_PATH = $(MINGDIR)/lib
INCLUDE_INSTALL_PATH = $(MINGDIR)/include

endif

# ------------------
# Linux
# ------------------
ifeq ($(TARGET),LINUX)

PLATFORMDIR=linux
GCC = gcc
GPP = g++
BINSUF =
ifeq ($(BUILD),RELEASE)
	LIBS += `allegro-config --libs`
endif
ifeq ($(BUILD),DEBUG)
	LIBS += `allegro-config --libs debug`
endif
LIB_INSTALL_PATH = /usr/local/lib
INCLUDE_INSTALL_PATH = /usr/local/include

endif

#below is platform non-specific
OBJDIR = obj/$(PLATFORMDIR)
LIBDIR = lib/$(PLATFORMDIR)
LIB = $(LIBDIR)/libtegel.a

LIBSRC = $(wildcard src/*.c)
LIBOBJ = $(addprefix $(OBJDIR)/,$(addsuffix .o, $(basename $(notdir $(LIBSRC)))))
LIBDEP = $(addprefix $(OBJDIR)/,$(addsuffix .d, $(basename $(notdir $(LIBSRC)))))
EXSRC = $(wildcard examples/*.c)
EXOBJ = $(addprefix $(OBJDIR)/,$(addsuffix .o, $(basename $(notdir $(EXSRC)))))
EXDEP = $(addprefix $(OBJDIR)/,$(addsuffix .d, $(basename $(notdir $(EXSRC)))))
EXBIN = $(addprefix examples/,$(addsuffix $(BINSUF), $(basename $(notdir $(EXSRC)))))
EDITSRC = $(wildcard edit/src/*.cpp)
EDITOBJ = $(addprefix $(OBJDIR)/,$(addsuffix .o, $(basename $(notdir $(EDITSRC)))))
EDITDEP = $(addprefix $(OBJDIR)/,$(addsuffix .d, $(basename $(notdir $(EDITSRC)))))
EDITBIN = tegel-edit$(BINSUF)
EDITICON =

all: $(LIB) $(EXBIN) $(EDITBIN)
examples : $(EXBIN)
edit : $(EDITBIN)
lib : $(LIB)

ifeq ($(TARGET),MINGW32)

EDITICON = $(OBJDIR)/icon.o
$(EDITICON) : icon.rc icon.ico
	windres -I rc -O coff -i icon.rc -o $(EDITICON)

endif

RMOBJ = $(LIB) $(LIBOBJ) $(LIBDEP) $(EXBIN) $(EXOBJ) $(EXDEP) $(EDITBIN) $(EDITOBJ) $(EDITDEP) $(EDITICON)
RMOBJ_D = $(subst /,\,$(RMOBJ))
LIB_D = $(subst /,\,$(LIB))
LIB_INSTALL_PATH_D = $(subst /,\,$(LIB_INSTALL_PATH))
INCLUDE_INSTALL_PATH_D = $(subst /,\,$(INCLUDE_INSTALL_PATH))

$(LIB): $(LIBOBJ)
	-ar src $(LIB) $(LIBOBJ)

$(LIBOBJ) : $(OBJDIR)/%.o : src/%.c
	$(GCC) $(CFLAGS) -MMD -c $< -o $@

$(EXBIN) : examples/%$(BINSUF) : $(OBJDIR)/%.o $(LIB)
	$(GCC) $^ -o $@ $(LIBS) $(LFLAGS)

$(EXOBJ) : $(OBJDIR)/%.o : examples/%.c
	$(GCC) $(CFLAGS) -MMD -c $< -o $@

$(EDITBIN) : $(EDITOBJ) $(LIB) $(EDITICON)
	$(GPP) $^ -o $@ $(LIBS) $(LFLAGS) $(EDITLFLAGS)

$(EDITOBJ) : $(OBJDIR)/%.o : edit/src/%.cpp
	$(GPP) $(CFLAGS) $(EDITCFLAGS) -MMD -c $< -o $@

# include the .d files
# they contain extra rules about how .o files depend on headers
-include $(LIBDEP) $(EXDEP) $(EDITDEP)

.PHONY: clean
clean: 
ifeq ($(TARGET),MINGW32)
	del /q $(RMOBJ_D)
else
	rm -rf $(RMOBJ)
endif

.PHONY: install
install: $(LIB)
ifeq ($(TARGET),MINGW32)
	copy /y $(LIB_D) $(LIB_INSTALL_PATH_D)
	copy /y include\teg*.h $(INCLUDE_INSTALL_PATH_D)
else
	cp $(LIB) $(LIB_INSTALL_PATH)
	cp include/teg*.h $(INCLUDE_INSTALL_PATH)
endif

ifeq ($(TARGET),LINUX)

.PHONY: docs
docs: doc/tegel.txt

doc/tegel.txt: doc/tegel.html
	lynx -dump -width=60 -nolist doc/tegel.html > doc/tegel.txt

endif
