# Makefile
# Copyright (C) 2011, 2012 Peter Belkner <pbelkner@snafu.de>
# 
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
# 
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
# 
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA  02110-1301  USA
#
include config.mak
#include $(SRCDIR)/version.mak
include $(SRCDIR)/source.mak
vpath % $(SRCDIR)

CC:=gcc

ifeq (mingw,$(OS))
SO:=dll
SODIR:=$(BINDIR)
else
SO:=so
SODIR:=$(LIBDIR)
CFLAGS+=-fPIC
endif

CPPFLAGS+=-DVERSION=\"$(VERSION)\"
CPPFLAGS+=-I$(SRCDIR)
CFLAGS+=-O2
#CFLAGS+=-msse2
#CFLAGS+=-mfpmath=sse

LDLIBS+=-lm
LIB1770=lib1770.a

INCLS+=$(filter %.h,$(LIB1770_SRCS))
SOURCES+=$(filter %.c,$(LIB1770_SRCS))

SOURCES+=bs1770_ctx_add_samples_i_i16.c
SOURCES+=bs1770_ctx_add_samples_i_i32.c
SOURCES+=bs1770_ctx_add_samples_i_f32.c
SOURCES+=bs1770_ctx_add_samples_i_f64.c
SOURCES+=bs1770_ctx_add_samples_p_i16.c
SOURCES+=bs1770_ctx_add_samples_p_i32.c
SOURCES+=bs1770_ctx_add_samples_p_f32.c
SOURCES+=bs1770_ctx_add_samples_p_f64.c
SOURCES+=bs1770_ctx_add_sample_i16.c
SOURCES+=bs1770_ctx_add_sample_i32.c
SOURCES+=bs1770_ctx_add_sample_f32.c
SOURCES+=bs1770_ctx_add_sample_f64.c

SOURCES+=bs1770_nd_add_samples_i_i16.c
SOURCES+=bs1770_nd_add_samples_i_i32.c
SOURCES+=bs1770_nd_add_samples_i_f32.c
SOURCES+=bs1770_nd_add_samples_i_f64.c
SOURCES+=bs1770_nd_add_samples_p_i16.c
SOURCES+=bs1770_nd_add_samples_p_i32.c
SOURCES+=bs1770_nd_add_samples_p_f32.c
SOURCES+=bs1770_nd_add_samples_p_f64.c
SOURCES+=bs1770_nd_add_sample_i16.c
SOURCES+=bs1770_nd_add_sample_i32.c
SOURCES+=bs1770_nd_add_sample_f32.c
SOURCES+=bs1770_nd_add_sample_f64.c

SOURCES+=bs1770_add_samples_p_i16.c
SOURCES+=bs1770_add_samples_p_i32.c
SOURCES+=bs1770_add_samples_p_f32.c
SOURCES+=bs1770_add_samples_p_f64.c
SOURCES+=bs1770_add_samples_i_i16.c
SOURCES+=bs1770_add_samples_i_i32.c
SOURCES+=bs1770_add_samples_i_f32.c
SOURCES+=bs1770_add_samples_i_f64.c
SOURCES+=bs1770_add_sample_i16.c
SOURCES+=bs1770_add_sample_i32.c
SOURCES+=bs1770_add_sample_f32.c
SOURCES+=bs1770_add_sample_f64.c

OBJS:=$(patsubst %.c,$(LIB1770)(%.o),$(SOURCES))

#LIB1770INCLS+=bs1770_ctx.h
#LIB1770INCLS+=bs1770.h
#LIB1770INCLS+=bs1770_types.h
#LIB1770INCLS+=biquad.h

.PHONY: all
all: $(LIB1770)
all: lib1770.$(SO)
ifeq (mingw,$(OS))
all: lib1770.$(SO).a
endif
all: example1 example2

.PHONY: msvc_src
msvc_src: all
msvc_src: msvc/COPYING
msvc_src: msvc/example1.c
msvc_src: msvc/example2.c
msvc_src: $(patsubst %,msvc/%,$(INCLS) $(SOURCES))
msvc_src: msvc/lib1770.def
msvc_src: msvc/Makefile

.PHONY: install
ifeq (yes,$(ENABLE_STATIC)) # {
install: $(LIBDIR)/$(LIB1770)
endif # }
ifeq (yes,$(ENABLE_SHARED)) # {
install: $(SODIR)/lib1770.$(SO)
ifeq (mingw,$(OS)) # {
install: $(LIBDIR)/lib1770.$(SO).a
install: $(LIBDIR)/lib1770.def
endif # }
endif # }
install: $(patsubst %.h,$(INCLUDEDIR)/%.h,$(INCLS))

.PHONY: clean
CLEAN:=
ifeq (mingw,$(OS))
CLEAN+=example1.exe
CLEAN+=example2.exe
else
CLEAN+=example1
CLEAN+=example2
endif
CLEAN+=*.$(SO)
CLEAN+=*.a
CLEAN+=*.o
CLEAN+=work
clean:
	rm -f $(CLEAN)

example1: example1.o $(LIB1770)
example2: example2.o $(LIB1770)
example1.o example2.o $(OBJS): $(INCLS)
$(LIB1770): $(OBJS)

ifeq (mingw,$(OS))
lib1770.$(SO) lib1770.$(SO).a lib1770.def: lib1770.a
else
lib1770.$(SO): lib1770.a
endif
	@rm -rf work
	@mkdir work
	@cd work; ar x ../$<
ifeq (mingw,$(OS))
	$(CC) -shared -Wl,--out-implib,lib1770.$(SO).a -Wl,--output-def,lib1770.def -o $@ work/*.o
else
	$(CC) -shared -o $@ work/*.o
endif
	@rm -rf work

bs1770_ctx_add_samples_i_%.o: bs1770_ctx_add_samples.c
	$(CC) -o $@ -c -DINTERLEAVED -D$* $(CFLAGS) $(CPPFLAGS) $<
bs1770_ctx_add_samples_p_%.o: bs1770_ctx_add_samples.c
	$(CC) -o $@ -c -DPLANAR -D$* $(CFLAGS) $(CPPFLAGS) $<
bs1770_ctx_add_sample_%.o: bs1770_ctx_add_samples.c
	$(CC) -o $@ -c -D$* $(CFLAGS) $(CPPFLAGS) $<

bs1770_nd_add_samples_i_%.o: bs1770_nd_add_samples.c
	$(CC) -o $@ -c -DINTERLEAVED -D$* $(CFLAGS) $(CPPFLAGS) $<
bs1770_nd_add_samples_p_%.o: bs1770_nd_add_samples.c
	$(CC) -o $@ -c -DPLANAR -D$* $(CFLAGS) $(CPPFLAGS) $<
bs1770_nd_add_sample_%.o: bs1770_nd_add_samples.c
	$(CC) -o $@ -c -D$* $(CFLAGS) $(CPPFLAGS) $<

bs1770_add_samples_i_%.o: bs1770_add_samples.c
	$(CC) -o $@ -c -DINTERLEAVED -D$* $(CFLAGS) $(CPPFLAGS) $<
bs1770_add_samples_p_%.o: bs1770_add_samples.c
	$(CC) -o $@ -c -DPLANAR -D$* $(CFLAGS) $(CPPFLAGS) $<
bs1770_add_sample_%.o: bs1770_add_samples.c
	$(CC) -o $@ -c -D$* $(CFLAGS) $(CPPFLAGS) $<

$(BINDIR)/% $(LIBDIR)/% $(INCLUDEDIR)/%: %
	@mkdir -p $(@D)
	cp -p $< $(@D)

msvc/Makefile: template/nmake.mak
	@mkdir -p $(@D)
	@echo "# Makefile to be used with \"nmake\"." > $@
	@echo "INCLS=$(strip $(INCLS))" >> $@
	@echo "OBJS=$(patsubst %.c,%.obj,$(SOURCES))" >> $@
	cat $< >> $@

msvc/bs1770_version.c: bs1770_version.c
	@mkdir -p $(@D)
	@echo "#define VERSION \"$(VERSION)\"" > $@
	cat $< >> $@
msvc/bs1770_ctx_add_samples_i_%.c: bs1770_ctx_add_samples.c
	@mkdir -p $(@D)
	@echo "#define INTERLEAVED" > $@
	@echo "#define $*" >> $@
	cat $< >> $@
msvc/bs1770_ctx_add_samples_p_%.c: bs1770_ctx_add_samples.c
	@mkdir -p $(@D)
	@echo "#define PLANAR" > $@
	@echo "#define $*" >> $@
	cat $< >> $@
msvc/bs1770_ctx_add_sample_%.c: bs1770_ctx_add_samples.c
	@mkdir -p $(@D)
	@echo "#define $*" >> $@
	cat $< >> $@

msvc/bs1770_nd_add_samples_i_%.c: bs1770_nd_add_samples.c
	@mkdir -p $(@D)
	@echo "#define INTERLEAVED" > $@
	@echo "#define $*" >> $@
	cat $< >> $@
msvc/bs1770_nd_add_samples_p_%.c: bs1770_nd_add_samples.c
	@mkdir -p $(@D)
	@echo "#define PLANAR" > $@
	@echo "#define $*" >> $@
	cat $< >> $@
msvc/bs1770_nd_add_sample_%.c: bs1770_nd_add_samples.c
	@mkdir -p $(@D)
	@echo "#define $*" >> $@
	cat $< >> $@

msvc/bs1770_add_samples_i_%.c: bs1770_add_samples.c
	@mkdir -p $(@D)
	@echo "#define INTERLEAVED" > $@
	@echo "#define $*" >> $@
	cat $< >> $@
msvc/bs1770_add_samples_p_%.c: bs1770_add_samples.c
	@mkdir -p $(@D)
	@echo "#define PLANAR" > $@
	@echo "#define $*" >> $@
	cat $< >> $@
msvc/bs1770_add_sample_%.c: bs1770_add_samples.c
	@mkdir -p $(@D)
	@echo "#define $*" >> $@
	cat $< >> $@

msvc/%: %
	@mkdir -p $(@D)
	cp -p $< $@
