BUNDLE=dexed.lv2
TARGET=dexed.so

DEBUG=1
#FILETRACE=1

INSTALL_DIR=/zynthian/zynthian-plugins/lv2
INSTALL_MYPLUGINS_DIR=/zynthian/zynthian-my-data/presets/lv2

OBJ=fm_core.o env.o lfo.o dx7note.o sin.o pitchenv.o fm_op_kernel.o freqlut.o exp2.o EngineMkI.o EngineOpl.o PluginFx.o trace.o porta.o

CXXFLAGS_LVTK=$(shell pkg-config --cflags lvtk-plugin-2)
CXXFLAGS+=-fPIC -DPIC -std=c++11 -I. $(CXXFLAGS_LVTK) -DLVTK_DEBUG=false
LDFLAGS_LVTK=$(shell pkg-config --libs lvtk-plugin-2)
LDFLAGS+=-shared $(LDFLAGS_LVTK)

machine = $(shell sh -c 'uname -m 2>/dev/null || echo unknown')
# Intel-PC
ifneq (,$(findstring x86,$(machine)))
  CPU = 
  FPU = 
  CXXFLAGS += -ffast-math -fprefetch-loop-arrays -funroll-loops -funsafe-loop-optimizations
endif

# Raspberry Pi B+, Zero, etc
ifneq (,$(findstring armv6l,$(machine)))
  CPU = -mcpu=arm1176jzf-s
  FPU = -mfpu=vfp
endif

# Raspberry Pi 2 and 3
ifneq (,$(findstring armv7l,$(machine)))
  model = $(shell sh -c 'cat /sys/firmware/devicetree/base/model 2>/dev/null || echo unknown')
ifneq (,$(findstring 3,$(model)))
  CPU = -mcpu=cortex-a53
  FPU = -mfpu=neon-fp-armv8
else
  CPU = -mcpu=cortex-a7 -mthumb
  FPU = -mfpu=neon-vfpv4
endif
  FPU += -mneon-for-64bits
endif

# ARM A64
ifneq (,$(findstring aarch64,$(machine)))
  CPU = -mcpu=cortex-a53
  PLATFORM += -mabi=lp64 -mcmodel=tiny
endif

# MOD-Duo
ifeq ($(MOD),1)
  CPU = 
  PLATFORM = 
endif

CXXFLAGS += $(CPU) $(FPU) $(PLATFORM)

ifeq ($(DEBUG), 1)
   ifeq ($(FILETRACE), 1)
      CXXFLAGS += -DDEBUG -DFILETRACE 
   else
      CXXFLAGS += -DDEBUG
   endif
else
   CXXFLAGS += -O3
endif

all: $(BUNDLE) Makefile

clean: Makefile
	rm -f *.o *~ *.bak *.gch *.so *.gch msfa/*.gch
	rm -rf $(BUNDLE)

install: $(BUNDLE)
	mkdir -p $(INSTALL_DIR)
	mkdir -p $(INSTALL_MYPLUGINS_DIR)
	rm -rf $(INSTALL_DIR)/$(BUNDLE)
	rm -rf ${HOME}/.lv2/$(BUNDLE)
	cp -R $(BUNDLE) $(INSTALL_DIR)
	cp -R user-presets/* $(INSTALL_MYPLUGINS_DIR)

$(BUNDLE): manifest.ttl Dexed.ttl modgui.ttl presets.ttl dexed.so
	rm -rf $(BUNDLE)
	mkdir $(BUNDLE)
	cp $^ $(BUNDLE)
	cp -R modgui $(BUNDLE)

dexed.so: $(OBJ) dexed.o
	$(CXX) dexed.o $(OBJ) $(LDFLAGS) -o dexed.so

dexed.o: Makefile dexed.cpp dexed.h dexed_ttl.h msfa/controllers.h
	$(CXX) $(CXXFLAGS) -Wall -c dexed.cpp

trace.o: Makefile trace.c trace.h
	$(CXX) $(CXXFLAGS) -Wall -c trace.c

fm_core.o: Makefile msfa/fm_core.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/fm_core.cc
 
env.o: Makefile msfa/env.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/env.cc

lfo.o: Makefile msfa/lfo.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/lfo.cc

dx7note.o: Makefile msfa/dx7note.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/dx7note.cc

sin.o: Makefile msfa/sin.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/sin.cc

pitchenv.o: Makefile msfa/pitchenv.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/pitchenv.cc

fm_op_kernel.o: Makefile msfa/fm_op_kernel.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/fm_op_kernel.cc

freqlut.o: Makefile msfa/freqlut.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/freqlut.cc

exp2.o: Makefile msfa/exp2.cc
	$(CXX) $(CXXFLAGS) -Wall -c msfa/exp2.cc

EngineMkI.o: Makefile EngineMkI.cpp
	$(CXX) $(CXXFLAGS) -Wall -c EngineMkI.cpp

EngineOpl.o: Makefile EngineOpl.cpp
	$(CXX) $(CXXFLAGS) -Wall -c EngineOpl.cpp

PluginFx.o: Makefile PluginFx.cpp
	$(CXX) $(CXXFLAGS) -Wall -c PluginFx.cpp

porta.o: Makefile porta.cpp
	$(CXX) $(CXXFLAGS) -Wall -c porta.cpp
dexed_ttl.h: Dexed.ttl
	ttl2c Dexed.ttl dexed_ttl.h
