# Windows/Cygwin support
ifdef windir
    WINDOWS := 1
    CYGWIN  := 0
else
    ifdef WINDIR
        WINDOWS := 1
        CYGWIN  := 1
    else
        WINDOWS := 0
    endif
endif
ifeq ($(WINDOWS),1)
    EXEEXT := .exe
    DLLEXT := .dll
    DEVNUL := nul
    ifeq ($(CYGWIN),1)
        PATHSEP := /
    else
        PATHSEP := $(strip \ )
    endif
else
    EXEEXT :=
    DLLEXT := .so
    DEVNUL := /dev/null
    PATHSEP := /
endif

CFG ?= Debug
ifeq ($(CFG),Debug)
    all: debug
else
    all: release
endif

OLDGCC ?= N

DEBUG   := DebugDir
RELEASE := ReleaseDir

$(DEBUG)/%.o: %.c
	$(CC) $(CFLAGS) $(CPPFLAGS) $(DBGFLAGS) $(TARGET_ARCH) -c -o $@ $<

$(RELEASE)/%.o: %.c
	$(CC) $(CFLAGS) $(CPPFLAGS) $(RELFLAGS) $(TARGET_ARCH) -c -o $@ $<

$(DEBUG)/%.o: %.cpp
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(DBGFLAGS) $(TARGET_ARCH) -c -o $@ $<

$(RELEASE)/%.o: %.cpp
	$(CXX) $(CXXFLAGS) $(CPPFLAGS) $(RELFLAGS) $(TARGET_ARCH) -c -o $@ $<

ifeq ($(OLDGCC),N)

$(DEBUG)/%.dep: %.c
	$(CC) -MM -MT $(patsubst %.dep,%.o,$@) $(CFLAGS) $(CPPFLAGS) $(DBGFLAGS) $(TARGET_ARCH) -o $@ $<

$(RELEASE)/%.dep: %.c
	$(CC) -MM -MT $(patsubst %.dep,%.o,$@) $(CFLAGS) $(CPPFLAGS) $(RELFLAGS) $(TARGET_ARCH) -o $@ $<

$(DEBUG)/%.dep: %.cpp
	$(CXX) -MM -MT $(patsubst %.dep,%.o,$@) $(CXXFLAGS) $(CPPFLAGS) $(DBGFLAGS) $(TARGET_ARCH) -o $@ $<

$(RELEASE)/%.dep: %.cpp
	$(CXX) -MM -MT $(patsubst %.dep,%.o,$@) $(CXXFLAGS) $(CPPFLAGS) $(RELFLAGS) $(TARGET_ARCH) -o $@ $<

else

$(DEBUG)/%.dep: %.c
	$(CC) -MM $(CFLAGS) $(CPPFLAGS) $(DBGFLAGS) $(TARGET_ARCH) $< | sed "s!^!$(DEBUG)/!" > $@

$(RELEASE)/%.dep: %.c
	$(CC) -MM $(CFLAGS) $(CPPFLAGS) $(RELFLAGS) $(TARGET_ARCH) $< | sed "s!^!$(RELEASE)/!" > $@

$(DEBUG)/%.dep: %.cpp
	$(CXX) -MM $(CXXFLAGS) $(CPPFLAGS) $(DBGFLAGS) $(TARGET_ARCH) $< | sed "s!^!$(DEBUG)/!" > $@

$(RELEASE)/%.dep: %.cpp
	$(CXX) -MM $(CXXFLAGS) $(CPPFLAGS) $(RELFLAGS) $(TARGET_ARCH) $< | sed "s!^!$(RELEASE)/!" > $@

endif

CC  = gcc
CXX = g++
AR  = ar
LD  = $(CXX) $(CXXFLAGS) $(TARGET_ARCH)

INCLUDE  = -I. $(patsubst %,-I%,$(VPATH))
CFLAGS   = -W -Wall $(INCLUDE)
CXXFLAGS = $(CFLAGS)
DBGFLAGS = -D_DEBUG -g
RELFLAGS = -DNDEBUG -O2
CPPFLAGS =

ifeq ($(OLDGCC),N)
    CFLAGS += -fmessage-length=0
endif

HFILES   = $(wildcard $(patsubst -I%,%/*.h,$(INCLUDE)))
OBJFILES = $(CFILES:.c=.o) $(CXXFILES:.cpp=.o)

DEBUG_OBJS   = $(patsubst %.o,$(DEBUG)/%.o,$(OBJFILES))
RELEASE_OBJS = $(patsubst %.o,$(RELEASE)/%.o,$(OBJFILES))

DEBUG_DEPS   = $(patsubst %.o,%.dep,$(DEBUG_OBJS))
RELEASE_DEPS = $(patsubst %.o,%.dep,$(RELEASE_OBJS))

CFILES   := linebreak.c linebreakdata.c linebreakdef.c
CXXFILES :=

LIBS :=

TARGET         = liblinebreak.a
DEBUG_TARGET   = $(patsubst %,$(DEBUG)/%,$(TARGET))
RELEASE_TARGET = $(patsubst %,$(RELEASE)/%,$(TARGET))

debug:   $(DEBUG) $(DEBUG_TARGET)

release: $(RELEASE) $(RELEASE_TARGET)



$(DEBUG):
	mkdir $(DEBUG)

$(RELEASE):
	mkdir $(RELEASE)

$(DEBUG_TARGET): $(DEBUG_DEPS) $(DEBUG_OBJS)
	$(AR) -r $(DEBUG_TARGET) $(DEBUG_OBJS)

$(RELEASE_TARGET): $(RELEASE_DEPS) $(RELEASE_OBJS)
	$(AR) -r $(RELEASE_TARGET) $(RELEASE_OBJS)

doc:
	doxygen

linebreakdata: filter_dup$(EXEEXT) LineBreak.txt
	sed -n -f LineBreak1.sed LineBreak.txt > tmp.txt
	sed -f LineBreak2.sed tmp.txt | .$(PATHSEP)filter_dup > tmp.c
	head -2 LineBreak.txt > tmp.txt
	cat linebreakdata1.tmpl tmp.txt linebreakdata2.tmpl tmp.c linebreakdata3.tmpl > linebreakdata.c
	$(RM) tmp.txt tmp.c

filter_dup$(EXEEXT): filter_dup.c
	gcc -O2 -o filter_dup$(EXEEXT) $<

LineBreak.txt:
	wget http://unicode.org/Public/UNIDATA/LineBreak.txt

.PHONY: all debug release clean distclean doc linebreakdata

clean:
	$(RM) $(DEBUG)/*.o $(DEBUG)/*.dep $(DEBUG_TARGET)
	$(RM) $(RELEASE)/*.o $(RELEASE)/*.dep $(RELEASE_TARGET)

distclean: clean
	$(RM) $(DEBUG)/* $(RELEASE)/* filter_dup$(EXEEXT) tags LineBreak.txt
	-rmdir $(DEBUG) 2> $(DEVNUL)
	-rmdir $(RELEASE) 2> $(DEVNUL)

-include $(wildcard $(DEBUG)/*.dep) $(wildcard $(RELEASE)/*.dep)
