all: error$(ERROR_OK) presenter

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

OPTIONS=-DV4L2_S2C_BACKTRACES
# -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 = presenter-$(RELEASE_VERSION)
TARGET = \
	presenter \

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

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

#DEBUG = $(OPTFLAGS) -ggdb

C_SRC = \
	presenterlib-c.c \

CPP_SRC = \
	presenterlib-cpp.cpp \

# All of these files must be prefixed with presenterlib-
SC_SRC = \

# 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
	scc -cc $(CC) $@.o $(SCCFLAGS) $(CFLAGS) $(DEBUG) $(OPTFLAGS) `imlib2-config --cflags` -DGL_GLEXT_PROTOTYPES $(OBJ) -o $@ $(LD_Q) ${EXTRA_LDFLAGS} $(FFMPEG_LDFLAGS) `imlib2-config --libs` `pkg-config --cflags --libs xi`

%.o: %.sc %.sch presenterlib-c-macros.sch
	scc -cc $(CC) -sch 500 -scmh 800 $(SCCFLAGS) $(DEBUG) -I. -I ~/include $< -c $(CFLAGS) $(OPTFLAGS) `imlib2-config --cflags`

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

%.o: %.cpp
	g++ $(DEBUG) $(CFLAGS) -DGL_GLEXT_PROTOTYPES -I. -I /usr/include/speech_tools -c $< $(OPTFLAGS) `imlib2-config --cflags`

in-port:
	@if [ presenter = `basename \`pwd\`` ]; then \
		echo "You cannot build presenter 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

# allow non-POSIX wildcards {a,b}
SHELL=bash

# 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) && ln -s ../*.{sc,c,cpp,h,sch} .
	$(MAKE) port-makefile

port-makefile:
	(echo "# This file was generated automatically.  Do not edit.";	\
	 echo "# ----------------------------------------------------";	\
	 echo ARCHITECTURE_PATH = $(ARCHITECTURE_PATH);			\
	 echo ERROR_OK = _no_error;					\
	 grep "^#$(ARCHITECTURE_PATH)" makefile |			\
		sed "s/#$(ARCHITECTURE_PATH) //";			\
	 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 = -O2 -DLINUX $(OPTIONS)
#x86_64-Linux-2.6.34.7-56.fc13.x86_64 SCCFLAGS = -O2

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

#i686-Linux-2.6.26-2-686 CC = gcc
#i686-Linux-2.6.26-2-686 CFLAGS = -O2 -DLINUX $(OPTIONS)
#i686-Linux-2.6.26-2-686 SCCFLAGS = -O2

#i686-Linux-2.6.32-5-686 CC = gcc
#i686-Linux-2.6.32-5-686 CFLAGS = -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 = -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 = -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 = -O2 -DLINUX $(OPTIONS)
#x86_64-Debian-6.0.2 SCCFLAGS = -O2

#x86_64-Debian CC = gcc
#x86_64-Debian CFLAGS = -O2 -I/usr/lib/scheme2c -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 = -O3 -DLINUX $(OPTIONS)
#x86_64-Linux-2.6.32-5-amd64 SCCFLAGS = -O3

#x86_64-Linux-3.2.0-3-amd64 CC = gcc
#x86_64-Linux-3.2.0-3-amd64 CFLAGS = -O3 -march=native -DLINUX $(OPTIONS)
#x86_64-Linux-3.2.0-3-amd64 SCCFLAGS = -O3
#x86_64-Linux-3.2.0-3-amd64 EXTRA_LDFLAGS = -lblas

#x86_64-Linux-3.2.0-4-amd64 CC = gcc
#x86_64-Linux-3.2.0-4-amd64 CFLAGS = -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

#x86_64-Linux-3.16.0-4-amd64 CC = gcc
#x86_64-Linux-3.16.0-4-amd64 CFLAGS = -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-4.9.0-3-amd64 CC = gcc
#x86_64-Linux-4.9.0-3-amd64 CFLAGS = -O3 -march=native -DLINUX $(OPTIONS)
#x86_64-Linux-4.9.0-3-amd64 SCCFLAGS = -O3
#x86_64-Linux-4.9.0-3-amd64 EXTRA_LDFLAGS = -lblas

#x86_64-Linux-3.5.0-17-generic CC = gcc
#x86_64-Linux-3.5.0-17-generic CFLAGS = -Ofast -march=native -DLINUX $(OPTIONS)
#x86_64-Linux-3.5.0-17-generic SCCFLAGS = -Ofast
#x86_64-Linux-3.5.0-17-generic EXTRA_LDFLAGS =

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

#x86_64-Gentoo-2.2-thread CC = gcc -Wall -Wno-deprecated-declarations -Wno-unused-function $(OPTFLAGS) -ggdb
#x86_64-Gentoo-2.2-thread CFLAGS = -O2 -DLINUX $(OPTIONS)
#x86_64-Gentoo-2.2-thread SCCFLAGS = -O2

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

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

#x86_64-Arch_Linux CC = gcc
#x86_64-Arch_Linux CFLAGS = -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
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
