# build a dynamic library for juce
prefix = /usr/local
libdir = $(prefix)/lib
includedir = $(prefix)/include

SONAME=0.0.0
SHORTSONAME=0

# (this disables dependency generation if multiple architectures are set)
DEPFLAGS := $(if $(word 2, $(TARGET_ARCH)), , -MMD)

empty=

JUCE_PATH=../..
MODULES_PATH=$(JUCE_PATH)/modules
DEMO_PATH       = $(JUCE_PATH)/examples/Demo/Builds/Linux/
PROJUCER_PATH = $(JUCE_PATH)/extras/Projucer/Builds/LinuxMakefile/

SOURCES=juce_audio_basics.cpp \
	juce_audio_devices.cpp \
	juce_audio_formats.cpp \
	juce_audio_processors.cpp \
	juce_audio_utils.cpp \
	juce_box2d.cpp \
	juce_core.cpp \
	juce_cryptography.cpp \
	juce_data_structures.cpp \
	juce_events.cpp \
	juce_graphics.cpp \
	juce_gui_basics.cpp \
	juce_gui_extra.cpp \
	juce_opengl.cpp \
	juce_osc.cpp \
	juce_video.cpp \
	$(empty)

VPATH=$(OUTDIR)

JUCELIBS_CPPFLAGS :=
JUCELIBS_CFLAGS   :=
JUCELIBS_LIBS     :=

JUCELIBS := $(JUCELIBS) flac
JUCELIBS_CPPFLAGS := $(JUCELIBS_CPPFLAGS) -DJUCE_INCLUDE_FLAC_CODE=0
JUCELIBS := $(JUCELIBS) libjpeg
JUCELIBS_CPPFLAGS := $(JUCELIBS_CPPFLAGS) -DJUCE_INCLUDE_JPEGLIB_CODE=0
JUCELIBS := $(JUCELIBS) libpng
JUCELIBS_CPPFLAGS := $(JUCELIBS_CPPFLAGS) -DJUCE_INCLUDE_PNGLIB_CODE=0 -DPNG_SKIP_SETJMP_CHECK
JUCELIBS := $(JUCELIBS) ogg vorbis vorbisfile vorbisenc
JUCELIBS_CPPFLAGS := $(JUCELIBS_CPPFLAGS) -DJUCE_INCLUDE_OGGVORBIS_CODE=0
## Debian's libbox2d-dev is incompatible with JUCE's
#JUCELIBS := $(JUCELIBS) box2d
#JUCELIBS_CPPFLAGS := $(JUCELIBS_CPPFLAGS) -DJUCE_INCLUDE_BOX2D_CODE=0
JUCELIBS := $(JUCELIBS) zlib
JUCELIBS_CPPFLAGS := $(JUCELIBS_CPPFLAGS) -DJUCE_INCLUDE_ZLIB_CODE=0
JUCELIBS := $(JUCELIBS) freetype2
JUCELIBS := $(JUCELIBS) gl
JUCELIBS := $(JUCELIBS) x11 xext xinerama
JUCELIBS := $(JUCELIBS) alsa
JUCELIBS := $(JUCELIBS) libcurl


JUCELIBS_CFLAGS := $(JUCELIBS_CFLAGS) $(shell pkg-config --cflags $(JUCELIBS))
JUCELIBS_LIBS   := $(JUCELIBS_LIBS)   $(shell pkg-config --libs   $(JUCELIBS))

OUTDIR := build

OBJDIR_DEBUG := $(OUTDIR)/intermediate/Debug
TARGET_DEBUG := libjuce_d.so
JUCE_CFLAGS_DEBUG = -D "DEBUG=1" -D "_DEBUG=1" -g -ggdb -O0
JUCE_LDLAGS_DEBUG =

OBJDIR_RELEASE := $(OUTDIR)/intermediate/Release
TARGET_RELEASE := libjuce.so
JUCE_CFLAGS_RELEASE = -D "NDEBUG=1" -D "DEBUG=0" -O3
JUCE_LDLAGS_RELEASE = -fvisibility=hidden

ifeq ($(CONFIG),Debug)
TARGET := $(OUTDIR)/$(TARGET_DEBUG)
endif

ifeq ($(CONFIG),Release)
TARGET := $(OUTDIR)/$(TARGET_RELEASE)
endif

ifndef CONFIG
  TARGET := $(OUTDIR)/$(TARGET_DEBUG) $(OUTDIR)/$(TARGET_RELEASE)
endif

JUCE_CPPFLAGS := $(DEPFLAGS) $(JUCE_CPPFLAGS) \
	-D "LINUX=1" \
	-D "JUCE_DLL_BUILD=1" \
	-D 'JUCE_APP_CONFIG_HEADER="AppConfig.h"' \
	$(JUCELIBS_CPPFLAGS) \
	-I. -I$(OUTDIR) -I$(MODULES_PATH) \
	$(empty)

JUCE_CFLAGS += \
	$(TARGET_ARCH) \
	-fPIC \
	-fpermissive \
	$(JUCELIBS_CFLAGS)
JUCE_CXXFLAGS += -std=c++11
JUCE_LDFLAGS += \
	-rdynamic -shared \
	$(TARGET_ARCH) \
	-fPIC \
	$(JUCELIBS_LIBS) \
	-ldl \
	-lpthread \
	-lrt \
	$(empty)

OBJECTS_RELEASE=$(SOURCES:%.cpp=$(OBJDIR_RELEASE)/%.o)
OBJECTS_DEBUG=$(SOURCES:%.cpp=$(OBJDIR_DEBUG)/%.o)

.PHONY: all clean install install-lib-release install-lib-debug install-headers install-pkgconfig projucer

all: $(TARGET) projucer

$(OBJDIR_RELEASE)/dir_stamp $(OBJDIR_DEBUG)/dir_stamp:
	@mkdir -p $(dir $@)
	@touch $@

$(OUTDIR)/$(TARGET_RELEASE): $(OBJECTS_RELEASE) $(RESOURCES)
	@echo Linking $(TARGET_RELEASE)
	$(CXX) -o $@ $^ -Wl,-soname,$(TARGET_RELEASE).$(SHORTSONAME) $(JUCE_LDFLAGS) $(JUCE_LDFLAGS_RELEASE) $(LDFLAGS) $(TARGET_ARCH)
	ln -s $(TARGET_RELEASE) $(OUTDIR)/$(TARGET_RELEASE).$(SHORTSONAME)
$(OUTDIR)/$(TARGET_DEBUG): $(OBJECTS_DEBUG) $(RESOURCES)
	@echo Linking $(TARGET_DEBUG)
	$(CXX) -o $@ $^ -Wl,-soname,$(TARGET_DEBUG).$(SHORTSONAME) $(JUCE_LDFLAGS) $(JUCE_LDFLAGS_DEBUG) $(LDFLAGS) $(TARGET_ARCH)
	ln -s $(TARGET_DEBUG) $(OUTDIR)/$(TARGET_DEBUG).$(SHORTSONAME)

$(OBJDIR_DEBUG)/%.o: $(OUTDIR)/%.cpp $(OUTDIR)/libjuce_builddate.h $(OBJDIR_DEBUG)/dir_stamp
	$(CXX) $(JUCE_CPPFLAGS) $(JUCE_CFLAGS_DEBUG) $(JUCE_CFLAGS) $(JUCE_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<
$(OBJDIR_RELEASE)/%.o: $(OUTDIR)/%.cpp $(OUTDIR)/libjuce_builddate.h $(OBJDIR_RELEASE)/dir_stamp
	$(CXX) $(JUCE_CPPFLAGS) $(JUCE_CFLAGS_RELEASE) $(JUCE_CFLAGS) $(JUCE_CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS) -o $@ -c $<

$(OUTDIR)/libjuce_builddate.h:
	@mkdir $(OUTDIR)
	touch $@

clean:
	@echo Cleaning JUCE
	rm -rf build
	$(MAKE) -C $(PROJUCER_PATH) clean

install-lib-release: $(OUTDIR)/$(TARGET_RELEASE)
	@echo Installing $(TARGET_RELEASE)
	install -d $(DESTDIR)$(libdir)
	install -m664 $^ $(DESTDIR)$(libdir)/$(notdir $^).$(SONAME)
	ln -s  $(notdir $^).$(SONAME) $(DESTDIR)$(libdir)/$(notdir $^)
	ln -s  $(notdir $^).$(SONAME) $(DESTDIR)$(libdir)/$(notdir $^).$(SHORTSONAME)
install-lib-debug: $(OUTDIR)/$(TARGET_DEBUG)
	@echo Installing $(TARGET_DEBUG)
	install -d $(DESTDIR)$(libdir)
	install -m664 $^ $(DESTDIR)$(libdir)/$(notdir $^).$(SONAME)
	ln -s  $(notdir $^).$(SONAME) $(DESTDIR)$(libdir)/$(notdir $^)
	ln -s  $(notdir $^).$(SONAME) $(DESTDIR)$(libdir)/$(notdir $^).$(SHORTSONAME)

install-pkgconfig: juce-dbg.pc juce.pc
	@echo Installing $^
	sed -e 's|^\(Libs: -ljuce\)|\1_d|' -i $<
	install -d $(DESTDIR)$(libdir)/pkgconfig
	install -m664 $^ $(DESTDIR)$(libdir)/pkgconfig/
install-headers:
	@echo Installing JUCE headers
	install -d $(DESTDIR)$(includedir)/juce
	cd $(JUCE_PATH) && find modules/ -type f -name "juce_*.h" -exec cp --parent {} $(DESTDIR)$(includedir)/juce \;
	cd $(JUCE_PATH) && find modules/juce_box2d/box2d/ -type f -name "*.h" -exec cp --parent {} $(DESTDIR)$(includedir)/juce \;

install: install-headers install-lib-release install-lib-debug install-pkgconfig

-include $(OBJECTS:%.o=%.d)

projucer: $(OUTDIR)/$(TARGET_RELEASE)
	$(MAKE) -C $(PROJUCER_PATH) CONFIG=Release CPPFLAGS="$(CPPFLAGS)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"

$(OUTDIR)/juce-dbg.pc $(OUTDIR)/juce.pc: juce.pc.in
	sed \
		-e 's|@prefix@|$(prefix)|g' \
		-e 's|@libdir@|$(libdir)|g' \
		-e 's|@includedir@|$(includedir)|g' \
		-e 's|@PACKAGE_VERSION@|$(SONAME)|g' \
		-e 's|@REQUIRED_PKG@|$(JUCELIBS)|g' \
		-e 's|@REQUIRED_LIBS@|$(JUCELIBS_LIBS)|g' \
		$^ > $@

%.cpp:
	echo '#include "$(MODULES_PATH)/$(basename $(notdir $@))/$(notdir $@)"' > $(OUTDIR)/$(notdir $@)
