APP_NAME    := mtalk
APP_BIN     := exe/$(APP_NAME).bin
APP_VERSION := 1.0
APP_ROOT    := .
APP_CFG     := $(APP_NAME).cfg
APP_SCRIPT  := exe/$(APP_NAME).run
APP_DUMP    := exe/$(APP_NAME).dump
APP_DOC_DEV := $(APP_NAME)-dev-guide
APP_DOC_USR := $(APP_NAME)-usr-guide


# Filesystem path
FSROOT      ?= /home/nfs

# Cross Compiler prefix
CC          := arm-openwrt-linux-gcc

# Path to the root folder of the PJSIP stack
PJSIP_ROOT := /home/alain/300/l26.7.4/pjsip-1.5.5-arm

# it's possible to set up headers, libs and destination bin locations via
# FSROOT or PREFIX, difference is that to PREFIX we append include, lib and
# bin target dirs only, to FSROOT we append usr/local/include, usr/local/lib 
# and usr/local/bin (bacward-compatible approach)
ifeq ($(PREFIX)$(FSROOT),)
        # if nothing is set use /usr/local/ - backward compatibility
        PREFIX := /usr/local/
endif
ifneq ($(FSROOT),)
        # fake PREFIX by appending usr/local
        PREFIX := $(FSROOT)/usr/local
endif


# Find application files
APP_FILES := $(shell find $(APP_ROOT)/src -path '*/.svn' -prune -o -print)
APP_SRC   := $(filter %.c %.cc %.cpp, $(APP_FILES))
APP_OBJ   := $(addsuffix .o, $(basename $(APP_SRC)))

# Find filesystem includes
FS_INC    := $(PREFIX)/include

# Find VAPI include folders (find them in the filesystem, not in the VAPI project (sub)folders)
VAPI_INC  := $(PREFIX)/include/vapi

PJSIP_INC  := $(shell find $(PJSIP_ROOT) -name include -print)

# Make a list of -I flags
APP_INC   := $(filter %.h %.hpp %.hh, $(APP_FILES))
INC_DIRS  := $(sort $(dir $(APP_INC))) $(FS_INC) $(VAPI_INC) $(PJSIP_INC) 
INC_FLAGS := $(foreach DIR,$(INC_DIRS),-I$(DIR))

# Make a list of -L flags (find all libraries in the filesystem, not in VAPI or PJSIP folders)
LIB_FLAGS  := -L $(PREFIX)/lib

# Make a list of object files
ALL_SRC := $(APP_SRC)
ALL_OBJ := $(addsuffix .o, $(basename $(ALL_SRC)))

# Set the default build related flags/options
WARN_FLAGS := -Wall -O2
MACRO_DEFS :=
LIB_FLAGS  += -lvapi -lpthread -lgtlcommon -lgtlcsme -llegerity

LIB_FLAGS += -lpjsua-arm-openwrt-linux-gnu \
	-lpjsip-ua-arm-openwrt-linux-gnu \
	-lpjsip-simple-arm-openwrt-linux-gnu \
	-lpjsip-arm-openwrt-linux-gnu \
	-lpjmedia-codec-arm-openwrt-linux-gnu \
	-lpjmedia-arm-openwrt-linux-gnu \
	-lpjmedia-audiodev-arm-openwrt-linux-gnu \
	-lpjnath-arm-openwrt-linux-gnu \
	-lpjlib-util-arm-openwrt-linux-gnu \
	-lresample-arm-openwrt-linux-gnu \
	-lmilenage-arm-openwrt-linux-gnu \
	-lsrtp-arm-openwrt-linux-gnu \
	-lgsmcodec-arm-openwrt-linux-gnu \
	-lspeex-arm-openwrt-linux-gnu \
	-lilbccodec-arm-openwrt-linux-gnu \
	-lg7221codec-arm-openwrt-linux-gnu \
	-lportaudio-arm-openwrt-linux-gnu \
	-lpj-arm-openwrt-linux-gnu \
	-lm \
	-lnsl \
	-lrt

# Set the compile and link flags/options
CFLAGS += $(WARN_FLAGS) $(MACRO_DEFS) $(INC_FLAGS)
LDFLAGS += $(LIB_FLAGS)


all: $(APP_BIN)

$(APP_BIN): $(APP_OBJ)
	mkdir -p exe
	@echo Linking $(APP_BIN)...
#	@echo $(CC) -o $(APP_BIN) $(APP_OBJ) -o app $(LDFLAGS)
	@$(CC) -o $(APP_BIN) $(APP_OBJ) $(LDFLAGS)

install: $(APP_BIN) $(APP_CFG)
	mkdir -p $(PREFIX)/bin $(PREFIX)/etc
	cp $(APP_CFG) $(PREFIX)/etc
# 	--- backup of the current config file first
	cp $(PREFIX)/etc/$(APP_CFG) $(PREFIX)/etc/$(APP_CFG).bak
	cp $(APP_BIN) $(APP_SCRIPT) $(APP_DUMP) $(PREFIX)/bin

clean:
	@echo "Deleting object (*.o) and dependency (*.d) files..."
	@rm -f $(APP_OBJ) $(APP_BIN) $(addsuffix .d, $(basename $(APP_SRC)))

doc_clean:
	@echo "Deleting doc/$(APP_DOC_DEV)/ ..."
	@rm -fr doc/$(APP_DOC_DEV)/*
	@echo "Deleting doc/$(APP_DOC_USR)/ ..."
	@rm -fr doc/$(APP_DOC_USR)/*

doc_dev:
	@echo "Deleting doc/$(APP_DOC_DEV)/ ..."
	@rm -fr doc/$(APP_DOC_DEV)/*
	@echo "Generating $(APP_DOC_DEV)..."
# creating mtalk html header based on mspd_header + version extract from src/mtalk.h
	cp ./doc/mspd_header.html ./doc/mtalk_header.html
	grep  MTALK_VERSION src/mtalk.h | cut -d " " -f3 >> ./doc/mtalk_header.html
	echo "</span></big></big></big></td></tr></tbody></table><br>" >> ./doc/mtalk_header.html
	doxygen doc/doxyfile.$(APP_DOC_DEV) doc/$(APP_DOC_DEV)
	cp ../../vapi_docs/mspdlogo.gif ./doc/$(APP_DOC_DEV)/html
#	make -C doc/$(APP_DOC_DEV)/latex pdf
#	cp doc/$(APP_DOC_DEV)/latex/refman.pdf doc/$(APP_DOC_DEV)/(APP_DOC_DEV).pdf
	cp doc/$(APP_DOC_DEV)/rtf/refman.rtf doc/$(APP_DOC_DEV)/$(APP_DOC_DEV).rtf

doc_usr:
	@echo "Deleting doc/$(APP_DOC_USR)/ ..."
	@rm -fr doc/$(APP_DOC_USR)/*
	@echo "Generating $(APP_DOC_USR)..."
# creating mtalk html header based on mspd_header + version extract from src/mtalk.h
	cp ./doc/mspd_header.html ./doc/mtalk_header.html
	grep  MTALK_VERSION src/mtalk.h | cut -d " " -f3 >> ./doc/mtalk_header.html
	echo "</span></big></big></big></td></tr></tbody></table><br>" >> ./doc/mtalk_header.html
	doxygen doc/doxyfile.$(APP_DOC_USR) doc/$(APP_DOC_USR)
	cp ../../vapi_docs/mspdlogo.gif ./doc/$(APP_DOC_USR)/html
#	make -C doc/$(APP_DOC_USR)/latex pdf
#	cp doc/$(APP_DOC_USR)/latex/refman.pdf doc/$(APP_DOC_USR)/$(APP_DOC_USR).pdf
	cp doc/$(APP_DOC_USR)/rtf/refman.rtf doc/$(APP_DOC_USR)/$(APP_DOC_USR).rtf

doc: doc_dev doc_usr

%.o: %.c
	@echo Compiling $<...
#	@echo $(CC) -c $(CFLAGS) $< -o $@
	@$(CC) -c $(CFLAGS) $< -o $@

%.d: %.c
	@echo Finding dependencies for $<...
	@set -e; rm -f $@; \
	$(CC) -MM $(CFLAGS) $< > $@.$$$$; \
	sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$

include $(addsuffix .d, $(basename $(ALL_SRC)))
