# Makefile for sft
# ----------------

all: error$(ERROR_OK) sft

VERSION ?= debug
OPTFLAGS=-g3 -fopenmp
ifeq "$(VERSION)" "release"
OPTFLAGS=-O2 -DRELEASE -fopenmp
endif
ifeq "$(VERSION)" "compile"
OPTFLAGS=-O0 -fopenmp
endif

OPTIONS += -DV4L2_S2C_BACKTRACES -mcmodel=medium
# -DQOBISCHEME_XFLUSH
# -DV4L2_S2C_JPEG_ERROR_FATAL

# Site configuration
# ------------------
INSTALLDIR  = $(QINSTALLDIR)
ARCHITECTURE_PATH = $(QARCHITECTURE_PATH)
INSTALLLIB  = $(INSTALLDIR)/lib
INSTALLLIBA = $(INSTALLLIB)/$(ARCHITECTURE_PATH)
INSTALLBIN  = $(INSTALLDIR)/bin
INSTALLBINA = $(INSTALLBIN)/$(ARCHITECTURE_PATH)

RELEASE_VERSION = 0.1
RELEASE_FILE = sft-$(RELEASE_VERSION)
TARGET = \
	sft \

OPENCV = `pkg-config --cflags --libs opencv`
OPENCV_I = `pkg-config --cflags opencv` -I${HOME}/darpa-collaboration/include/`architecture-path`/arv

NLOPT_CFLAGS =
NLOPT_LDFLAGS =

ARAVIS_CFLAGS = `pkg-config --cflags gobject-2.0` -DARAVIS
ARAVIS_LDFLAGS = `pkg-config --cflags --libs gobject-2.0` ~/darpa-collaboration/lib/`architecture-path`/arv/libaravis-0.2.so

LD_Q =  -L~/lib/$(QARCHITECTURE_PATH)/ \
	~/lib/$(QARCHITECTURE_PATH)/QobiScheme.a  \
	~/lib/$(QARCHITECTURE_PATH)/scxl.a -lX11 -lXext

FFMPEG_LDFLAGS = -lavutil -lavformat -lavcodec -lavutil -lm -lswscale

#DEBUG = $(OPTFLAGS) -ggdb -gdwarf-2

C_SRC = \
	sftlib-c.c \

CPP_SRC = \
	sftlib-cpp.cpp \

# All of these files must be prefixed with sftlib-
SC_SRC = \
	sftlib-sc.sc \

# removed because they don't compile

OBJ = $(SC_SRC:.sc=.o) $(C_SRC:.c=.o) $(CPP_SRC:.cpp=.o)
SCH = $(SC_SRC:.sc=.sch)
TARGET_SRC = $(TARGET:=.sc)
TARGET_SCH = $(TARGET_SRC:.sc=.sch)
CFILES = $(SC_SRC:.sc=.c)

.SECONDEXPANSION:

${SCH}: $$(basename $$@).sc $$(SC_SRC) | in-port
	sch $(basename $@) $(SC_SRC)
	touch $(basename $@).sch

${TARGET_SCH}: $$(basename $$@).sc | in-port
	sch -main $(basename $@) $(SC_SRC)
	touch $(basename $@).sch

# -Ot -Ob -Og $(OPTFLAGS)
${TARGET}: $$(basename $$@).sc $$(basename $$@).sch $$(SCH) $(OBJ) $$@.o | environment
	scc-color -cc $(CC) $@.o $(SCCFLAGS) $(CFLAGS) $(DEBUG) $(OPTFLAGS) `imlib2-config --cflags` -DGL_GLEXT_PROTOTYPES $(OBJ) -o $@ $(LD_Q) $(ARAVIS_CFLAGS) $(ARAVIS_LDFLAGS) $(OPENCV) $(NLOPT_LDFLAGS) ${EXTRA_LDFLAGS} $(FFMPEG_LDFLAGS) `imlib2-config --libs` -pthread

%.o: %.sc %.sch toollib-c-macros.sch | environment
	scc-color -cc $(CC) -sch 500 -scmh 800 $(SCCFLAGS) $(DEBUG) -I. -I ~/include $< -c $(CFLAGS) $(ARAVIS_CFLAGS) $(OPTFLAGS) `imlib2-config --cflags` $(OPENCV_I) -pthread

%.o: %.c | environment
	$(CC) $(DEBUG) $(CFLAGS) -DGL_GLEXT_PROTOTYPES -I ~/lib/$(ARCHITECTURE_PATH) -I. $(ARAVIS_CFLAGS) -std=gnu99 -c $< $(OPTFLAGS) `imlib2-config --cflags` $(OPENCV_I) -pthread

%.o: %.cpp | environment
	g++ $(DEBUG) $(CFLAGS) -DGL_GLEXT_PROTOTYPES -I. -c $< $(OPTFLAGS) `imlib2-config --cflags` $(ARAVIS_CFLAGS) $(OPENCV_I) -pthread

environment:
	@if [ -z "${MATLAB}" ]; then \
		echo "Environment variables not set, prefix george-wrap to command"; \
		false; \
	fi;

in-port:
	@if [ sft = `basename \`pwd\`` ]; then \
		echo "You cannot build sft in the base directory, you must run make port and cd into the resulting directory first"; \
		false; \
	fi;

tags: $(SC_SRC) $(C_SRC)
	etags -l c *.c -l scheme *.sc

# To add a new architecture, add architecture specific lines.
# The line prefix should be '#`architecture-path` ', see examples below.
port:
	-rm -rf $(ARCHITECTURE_PATH)
	mkdir $(ARCHITECTURE_PATH)
	-cd $(ARCHITECTURE_PATH); csh -cf "ln -s ../*.{sc,c,cpp,h,S,sch} ."
	$(MAKE) port-makefile

port-makefile:
	echo "# This file was generated automatically.  Do not edit." >\
		$(ARCHITECTURE_PATH)/makefile
	echo "# ----------------------------------------------------" >>\
		$(ARCHITECTURE_PATH)/makefile
	echo ARCHITECTURE_PATH = $(ARCHITECTURE_PATH) >>\
		$(ARCHITECTURE_PATH)/makefile
	echo ERROR_OK = _no_error >> $(ARCHITECTURE_PATH)/makefile
	grep "^#$(ARCHITECTURE_PATH)" makefile | \
		sed "s/#$(ARCHITECTURE_PATH) //" >>\
			$(ARCHITECTURE_PATH)/makefile
	echo include ../makefile >> $(ARCHITECTURE_PATH)/makefile

error:
	@echo "Do 'make port' to create an architecture specific directory."
	@exit 1

error_no_error:

# Architecture specific variables
# -------------------------------
#x86_64-Linux-2.6.34.7-56.fc13.x86_64 CC = gcc
#x86_64-Linux-2.6.34.7-56.fc13.x86_64 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#x86_64-Linux-2.6.34.7-56.fc13.x86_64 SCCFLAGS = -O2

#x86_64-Gentoo-2.0.3 CC = clang
#x86_64-Gentoo-2.0.3 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#x86_64-Gentoo-2.0.3 SCCFLAGS = -O2

#i686-Linux-2.6.32-5-686 CC = gcc
#i686-Linux-2.6.32-5-686 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#i686-Linux-2.6.32-5-686 SCCFLAGS = -O2

#i686-Debian-5.0.3 CC = gcc
#i686-Debian-5.0.3 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#i686-Debian-5.0.3 SCCFLAGS = -O2

#x86_64-Debian-5.0.6 CC = gcc
#x86_64-Debian-5.0.6 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#x86_64-Debian-5.0.6 SCCFLAGS = -O2

#x86_64-Debian-6.0.2 CC = gcc
#x86_64-Debian-6.0.2 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#x86_64-Debian-6.0.2 SCCFLAGS = -O2

#x86_64-Debian CC = gcc
#x86_64-Debian CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#x86_64-Debian SCCFLAGS = -O2

#x86_64-Linux-2.6.32-5-amd64 CC = gcc
#x86_64-Linux-2.6.32-5-amd64 CFLAGS = -Wall -O3 -DLINUX $(OPTIONS)
#x86_64-Linux-2.6.32-5-amd64 SCCFLAGS = -O3

#x86_64-Linux-3.2.0-4-amd64 OPTIONS += -DARAVIS
#x86_64-Linux-3.2.0-4-amd64 CC = gcc
#x86_64-Linux-3.2.0-4-amd64 CFLAGS = -Wall -O3 -march=native -DLINUX $(OPTIONS)
#x86_64-Linux-3.2.0-4-amd64 SCCFLAGS = -O3
#x86_64-Linux-3.2.0-4-amd64 EXTRA_LDFLAGS = -lblas /usr/lib/libtbb.so.2

#x86_64-Linux-3.16.0-4-amd64 OPTIONS += -DARAVIS
#x86_64-Linux-3.16.0-4-amd64 CC = gcc
#x86_64-Linux-3.16.0-4-amd64 CFLAGS = -Wall -O3 -march=native -DLINUX $(OPTIONS)
#x86_64-Linux-3.16.0-4-amd64 SCCFLAGS = -O3
#x86_64-Linux-3.16.0-4-amd64 EXTRA_LDFLAGS = -lblas

#x86_64-Linux-3.5.0-17-generic OPTIONS += -DARAVIS -DHOG
#x86_64-Linux-3.5.0-17-generic CC = gcc
#x86_64-Linux-3.5.0-17-generic CFLAGS = -Wall -O3 -march=native -DLINUX $(OPTIONS)
#x86_64-Linux-3.5.0-17-generic SCCFLAGS = -O3
#x86_64-Linux-3.5.0-17-generic EXTRA_LDFLAGS =

#x86_64-Gentoo-2.1-bgc CC = clang
#x86_64-Gentoo-2.1-bgc CFLAGS = -Wall -O0 -DLINUX $(OPTIONS) $(OPTFLAGS) -ggdb -gdwarf-2
#x86_64-Gentoo-2.1-bgc SCCFLAGS = -O0

#x86_64-Gentoo-2.1-thread CC = clang
#x86_64-Gentoo-2.1-thread CFLAGS = -Wall -O2 -DLINUX $(OPTIONS) -Wno-unused-function $(OPTFLAGS) -ggdb -gdwarf-2
#x86_64-Gentoo-2.1-thread SCCFLAGS = -O2

#x86_64-Gentoo-2.2 CC = gcc
#x86_64-Gentoo-2.2 CFLAGS = -Wall -Ofast -march=native -DLINUX $(OPTIONS)
#x86_64-Gentoo-2.2 SCCFLAGS = -Ofast

#x86_64-Gentoo-2.2-thread OPTIONS += -DARAVIS
#x86_64-Gentoo-2.2-thread CC = gcc
#x86_64-Gentoo-2.2-thread CFLAGS = -Wall -O1 -march=native -DLINUX $(OPTIONS)
#x86_64-Gentoo-2.2-thread SCCFLAGS = -O1

#i686-Ubuntu-9.10 CC = gcc
#i686-Ubuntu-9.10 CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#i686-Ubuntu-9.10 SCCFLAGS = -O2

#x86_64-Arch_Linux CC = gcc
#x86_64-Arch_Linux CFLAGS = -Wall -O2 -DLINUX $(OPTIONS)
#x86_64-Arch_Linux SCCFLAGS = -O2
#x86_64-Arch_Linux EXTRA_LDFLAGS = -L/lib64/ -lstdc++ -lrt -lgslcblas

install: all
	cp $(TARGET) $(INSTALLBINA)/.

uninstall:
	cd $(INSTALLBINA); rm -rf $(TARGET)

.PHONY: clean real-clean environment
clean:
	-rm -f $(OBJ) $(TARGET_SRC:.sc=.c) $(TARGET_SRC:.sc=.o) \
	$(TARGET_SCH) core $(CFILES) $(SCH)

real-clean: clean
	-rm -r -f $(TARGET_SRC:.sc=)

# Automatic dependencies, don't modify them
