#############################################################################
#
# Author: Achim Gaedke
# Created: June 2004
#
#############################################################################


CXX=g++
CXXFLAGS=-g -O0 -W -Wall -Wextra -Wshadow -pedantic
CXXCPPFLAGS= -I. -I.. `pkg-config --cflags glib-2.0`
LDFLAGS=
LIBS=-lexpat -lxerces-c -lm `pkg-config --libs glib-2.0`

EXEEXT = 

MACHINES = \
	dummycore$(EXEEXT) \
	deuteron_backend$(EXEEXT) \
	magnexgrad_backend \
	magnexgrad_backend_dds \
	PFGcore$(EXEEXT) \
	fc2_backend$(EXEEXT) \
	fc2_backend_AD5791$(EXEEXT) \
	fc1neu_backend$(EXEEXT) \
	bg_backend \
	Mobilecore$(EXEEXT) \
	Mobile_wo_sync_backend$(EXEEXT) \
	berta \
	general \
	birgit \
	pulseblaster_only

DRV_SPC_MI40xx    = ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.a
DRV_SPC_M2i40xx   = ../drivers/Spectrum-M2i40xxSeries/Spectrum-M2i40xxSeries.a
DRV_PTS           = ../drivers/PTS-Synthesizer/PTS.o
DRV_DAC20         = ../drivers/Tecmag-DAC20/DAC20.o
DRV_AD5791         = ../drivers/DAC-AD5791/AD5791.o
DRV_PB_24BIT      = ../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.o
DRV_PB_DDSIII     = ../drivers/SpinCore-PulseBlasterDDSIII/SpinCore-PulseBlasterDDSIII.o
DRV_PB            = ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.o
DRV_PB_PROG       = ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.o
DRV_EUROTHERM2000 = ../drivers/Eurotherm-2000Series/Eurotherm-2000Series.o
DRV_TEMPCONT      = ../drivers/tempcont.o


LINK = $(CXX) $(LDFLAGS)
LINK_MACHINE = echo "  Linking    $@" && $(LINK)

.cpp.o:
	@echo "  Compiling  $<"
	@$(CXX) -c $(CXXFLAGS) $(CXXCPPFLAGS) $< -o $@


.PHONY: all clean install

all: $(MACHINES)

../tools/add_endline$(EXEEXT): ../tools/add_endline.cpp
	$(CXX) $< -o $@

ifeq ($(shell uname -o),Cygwin)
../drivers/TiePie-HS3/TiePie-HS3.a:
	$(MAKE) -C ../drivers/TiePie-HS3 TiePie-HS3.a

../drivers/Datel-PCI416/Datel-PCI416.o:
	$(MAKE) -C ../drivers/Datel-PCI416 Datel-PCI416.o


NQRcore$(EXEEXT): NQRcore.o \
		hardware.o \
		../drivers/Datel-PCI416/Datel-PCI416.o \
		$(DRV_PB_DDSIII) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@

NQRcore.o: NQRcore.cpp
	$(CXX) -c $(CXXFLAGS) $^ -o $@

endif

../drivers/SpinCore-PulseBlasterPlus/SpinCore-PulseBlasterPlus.o:
	$(MAKE) -C ../drivers/SpinCore-PulseBlasterPlus SpinCore-PulseBlasterPlus.o

$(DRV_PB_DDSIII):
	$(MAKE) -C ../drivers/SpinCore-PulseBlasterDDSIII SpinCore-PulseBlasterDDSIII.o

$(DRV_PB_24BIT):
	$(MAKE) -C ../drivers/SpinCore-PulseBlaster24Bit SpinCore-PulseBlaster24Bit.o

$(DRV_PTS):
	$(MAKE) -C ../drivers/PTS-Synthesizer PTS.o

$(DRV_DAC20):
	$(MAKE) -C ../drivers/Tecmag-DAC20 DAC20.o

$(DRV_AD5791):
	$(MAKE) -C ../drivers/DAC-AD5791 AD5791.o

$(DRV_SPC_MI40xx):
	$(MAKE) -C ../drivers/Spectrum-MI40xxSeries Spectrum-MI40xxSeries.o
	
$(DRV_SPC_M2i40xx):
	$(MAKE) -C ../drivers/Spectrum-M2i40xxSeries Spectrum-M2i40xxSeries.o

$(DRV_EUROTHERM2000):
	$(MAKE) -C ../drivers/Eurotherm-2000Series Eurotherm-2000Series.o

$(DRV_TEMPCONT):
	$(MAKE) -C ../drivers tempcont.o

../drivers/dummy/dummy.o:
	$(MAKE) -C ../drivers/dummy dummy.o

../core/core.a:
	$(MAKE) -C ../core core.a

hardware.o: hardware.cpp hardware.h


clean: ../tools/add_endline$(EXEEXT)
	for f in *.cpp *.h; do ../tools/add_endline$(EXEEXT) $$f;done
	rm -f $(MACHINES)
	rm -f *~ *.o *.exe *.stackdump
	rm -f ../tools/add_endline$(EXEEXT)

install: $(MACHINES)
	install $(MACHINES) $(PREFIX)


Mobilecore$(EXEEXT): Mobilecore.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

birgit: birgit.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

birgit.o: birgit.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

Mobilecore.o: Mobilecore.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h ../drivers/Spectrum-M2i40xxSeries/Spectrum-M2i40xxSeries.h

Mobile_wo_sync_backend$(EXEEXT): Mobile_wo_sync_backend.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

Mobile_wo_sync_backend.o: Mobile_wo_sync_backend.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h ../drivers/Spectrum-M2i40xxSeries/Spectrum-M2i40xxSeries.h


bg_backend: bg_backend.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		$(DRV_EUROTHERM2000) $(DRV_TEMPCONT) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

bg_backend.o: bg_backend.cpp  ../drivers/PTS-Synthesizer/PTS.h \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h \
../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h 


magnexgrad_backend_dds: magnexgrad_backend_dds.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_DDSIII) $(DRV_PB) $(DRV_PB_PROG) \
		$(DRV_EUROTHERM2000) $(DRV_TEMPCONT) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

magnexgrad_backend_dds.o: magnexgrad_backend_dds.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h \
../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h 


magnexgrad_backend: magnexgrad_backend.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		$(DRV_EUROTHERM2000) $(DRV_TEMPCONT) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

magnexgrad_backend.o: magnexgrad_backend.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h \
../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h 

deuteron_backend.o: deuteron_backend.cpp \
../drivers/SpinCore-PulseBlasterDDSIII/SpinCore-PulseBlasterDDSIII.h \
../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

deuteron_backend$(EXEEXT): deuteron_backend.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_DDSIII) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

dummycore.o: dummycore.cpp ../drivers/dummy/dummy.o

dummycore$(EXEEXT): dummycore.o \
		hardware.o \
		../drivers/dummy/dummy.o \
		$(DRV_TEMPCONT) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread


PFGcore$(EXEEXT): PFGcore.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_DAC20) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

PFGcore.o: PFGcore.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h ../drivers/Tecmag-DAC20/DAC20.h\
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

fc2_backend$(EXEEXT): fc2_backend.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_DAC20) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

fc2_backend.o: fc2_backend.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h ../drivers/Tecmag-DAC20/DAC20.h\
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

# fc2 with AD5791 

fc2_backend_AD5791$(EXEEXT): fc2_backend_AD5791.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_AD5791) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

fc2_backend_AD5791.o: fc2_backend_AD5791.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h ../drivers/DAC-AD5791/AD5791.h\
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

berta: berta.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

berta.o: berta.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

fc1neu_backend$(EXEEXT): fc1neu_backend.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_DAC20) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread

fc1neu_backend.o: fc1neu_backend.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h ../drivers/Tecmag-DAC20/DAC20.h\
../core/stopwatch.h ../drivers/Spectrum-MI40xxSeries/Spectrum-MI40xxSeries.h

fc1_vierkanal_backend$(EXEEXT): fc1_vierkanal_backend.o \
		hardware.o \
		$(DRV_SPC_M2i40xx) \
		$(DRV_PTS) \
		$(DRV_DAC20) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread -lspcm_linux

fc1_vierkanal_backend.o: fc1_vierkanal_backend.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h \
../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h \
../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \
../drivers/Tecmag-DAC20/DAC20.h \
../core/stopwatch.h \
../drivers/Spectrum-M2i40xxSeries/Spectrum-M2i40xxSeries.h

general: general.o \
		hardware.o \
		$(DRV_SPC_MI40xx) \
		$(DRV_PTS) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread 

general.o: general.cpp \
../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \

pb_radio_processor_g_backend: pb_radio_processor_g_backend.o \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread 

pb_radio_processor_g_backend.o: pb_radio_processor_g_backend.cpp \
	pb_radio_processor_g_backend.h  


pulseblaster_only$(EXEEXT): pulseblaster_only.o \
		hardware.o \
				../drivers/dummy/dummy.o \
		$(DRV_PTS) \
		$(DRV_TEMPCONT) \
        $(DRV_DAC20) \
		$(DRV_PB_24BIT) $(DRV_PB) $(DRV_PB_PROG) \
		../core/core.a
	@$(LINK_MACHINE) $^ $(LIBS) -o $@ -lpthread


pulseblaster_only.o: pulseblaster_only.cpp \
    ../drivers/SpinCore-PulseBlaster24Bit/SpinCore-PulseBlaster24Bit.h \
    ../drivers/SpinCore-PulseBlaster/SpinCore-PulseBlaster.h \
    ../drivers/SpinCore-PulseBlaster/PulseBlasterProgram.h \
    ../drivers/Tecmag-DAC20/DAC20.h \
    ../core/stopwatch.h