# BlinkenLib
# Copyright 2004-2016 Stefan Schuermans <stefan@schuermans.info>
# Copyleft GNU public license - http://www.gnu.org/copyleft/gpl.html
# a blinkenarea.org project

CC:=gcc
CFLAGS:=-Wall -Wextra -Werror -fPIC -O2 -I..
LIB_LDFLAGS:=
LIB_LDLIBS:=
BIN_LDFLAGS:=-L.
BIN_LDLIBS:=
AR:=ar
RANLIB:=ranlib

-include ../version.mk
-include ../config/config.mk

LIB_OBJS:=BlinkenColorizer.o BlinkenFrame.o BlinkenMovie.o \
          BlinkenProto.o Tools.o

ifeq ($(BLINKENLIB_CFG_MNG),1)
LIB_OBJS+=BlinkenMng.o
LIB_LDLIBS+=-lmng -lz
endif

ifeq ($(BLINKENLIB_CFG_GIF),1)
LIB_OBJS+=BlinkenGif.o
LIB_LDLIBS+=-lgif
endif

ifeq ($(BLINKENLIB_CFG_WIN),1)
SHLIBEXT:=dll
LIB_LDLIBS+=-lws2_32
BIN_LDLIBS+=-lws2_32
else
ifeq ($(BLINKENLIB_CFG_OSX),1)
CFLAGS+=-I/sw/include
SHLIBEXT:=dylib
LIB_LDFLAGS+=-L/sw/lib
BIN_LDFLAGS+=-L/sw/lib -Wl,-rpath,'$$ORIGIN'
else
SHLIBEXT:=so
LIB_LDFLAGS+=-Wl,-soname,libBlinkenLib.$(SHLIBEXT).$(VERSION_MAJOR)
BIN_LDFLAGS+=-Wl,-rpath,'$$ORIGIN'
endif
endif

.PHONY: all clean
.SUFFIXES:
SUFFIXES:=
.SECONDARY:

all: libBlinkenLib.a \
     libBlinkenLib.$(SHLIBEXT).$(VERSION_MAJOR) \
     libBlinkenLib.$(SHLIBEXT).$(VERSION) libBlinkenLib.$(SHLIBEXT)

all: BlinkenConv BlinkenSend BlinkenRecv

ifeq ($(BLINKENLIB_CFG_WIN),0)
all: BlinkenOutput BlinkenDeviceOutput
endif

config.h: ../config/config.h
	cp $< $@

BlinkenColorizer.o: BlinkenColorizer.c BlinkenColorizer.h Tools.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenProto.o: BlinkenProto.c BlinkenProto.h BlinkenProtoIntern.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenFrame.o: BlinkenFrame.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenProto.h BlinkenProtoIntern.h Tools.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenGif.o: BlinkenGif.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenProto.h BlinkenMovie.h Tools.h config.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenMovie.o: BlinkenMovie.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenProto.h BlinkenMovie.h BlinkenGif.h BlinkenMng.h Tools.h config.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenMng.o: BlinkenMng.c BlinkenConstants.h BlinkenColorizer.h BlinkenFrame.h BlinkenProto.h BlinkenMovie.h Tools.h config.h
	$(CC) $(CFLAGS) -c -o $@ $<

Tools.o: Tools.c Tools.h
	$(CC) $(CFLAGS) -c -o $@ $<

libBlinkenLib.a: $(LIB_OBJS)
	$(AR) cr $@ $+
	$(RANLIB) $@

libBlinkenLib.$(SHLIBEXT).$(VERSION): $(LIB_OBJS)
	$(CC) -shared $(LIB_LDFLAGS) -o $@ $+ $(LIB_LDLIBS)

libBlinkenLib.$(SHLIBEXT).$(VERSION_MAJOR): libBlinkenLib.$(SHLIBEXT).$(VERSION)
	rm -f $@
	ln -s $< $@

libBlinkenLib.$(SHLIBEXT): libBlinkenLib.$(SHLIBEXT).$(VERSION_MAJOR)
	rm -f $@
	ln -s $< $@

Tools2.o: Tools2.c Tools2.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenConv.o: BlinkenConv.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenProto.h BlinkenFrame.h BlinkenMovie.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenConv: BlinkenConv.o libBlinkenLib.$(SHLIBEXT)
	$(CC) $(BIN_LDFLAGS) -o $@ $< -lBlinkenLib $(BIN_LDLIBS)

BlinkenSend.o: BlinkenSend.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenProto.h BlinkenFrame.h BlinkenMovie.h Tools2.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenSend: BlinkenSend.o Tools2.o libBlinkenLib.$(SHLIBEXT)
	$(CC) $(BIN_LDFLAGS) -o $@ $(filter %.o,$^) -lBlinkenLib $(BIN_LDLIBS)

BlinkenRecv.o: BlinkenRecv.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenProto.h BlinkenFrame.h BlinkenMovie.h Tools2.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenRecv: BlinkenRecv.o Tools2.o libBlinkenLib.$(SHLIBEXT)
	$(CC) $(BIN_LDFLAGS) -o $@ $(filter %.o,$^) -lBlinkenLib $(BIN_LDLIBS)

BlinkenOutput.o: BlinkenOutput.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenProto.h BlinkenFrame.h BlinkenMovie.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenOutput: BlinkenOutput.o libBlinkenLib.$(SHLIBEXT)
	$(CC) $(BIN_LDFLAGS) -o $@ $< -lBlinkenLib $(BIN_LDLIBS)

BlinkenDeviceOutput.o: BlinkenDeviceOutput.c BlinkenLib.h config.h BlinkenColorizer.h BlinkenProto.h BlinkenFrame.h BlinkenMovie.h
	$(CC) $(CFLAGS) -c -o $@ $<

BlinkenDeviceOutput: BlinkenDeviceOutput.o libBlinkenLib.$(SHLIBEXT)
	$(CC) $(BIN_LDFLAGS) -o $@ $< -lBlinkenLib $(BIN_LDLIBS)

clean:
	rm -f BlinkenConv BlinkenSend BlinkenRecv BlinkenOutput BlinkenDeviceOutput libBlinkenLib.$(SHLIBEXT)* libBlinkenLib.a *.o config.h