#for cross compilation you can specify the filesystem path of the target board (if NFS config)
#ARCH=armv4
#FSROOT=/home/fsfull-debian_sarge-0.13-tsavo/
#For native compilation the filesystem path is the local filesystem
ARCH?=i386
FSROOT?=""

ifeq ($(strip $(ARCH)),armv4)
                CROSS_COMPILE = arm-openwrt-linux-
		ARMFLAGS= -march=armv4 -mtune=arm9tdmi
else
                CROSS_COMPILE =
                ARMFLAGS=
endif

CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar

VAPI_DIR=../VAPI
VAPI_OBJ_DIR=./vapi_obj
GTL_COMMON_OBJ_DIR=./gtl_common_obj
GTL_CSME_OBJ_DIR=./gtl_csme_obj
GTL_PCI_OBJ_DIR=./gtl_pci_obj

INSTALL_DIR=./bin
LIB_DIR=.

# Install program
INSTALL_PROG=/usr/bin/install -m 0644
INSTALL_LIB_DIR=${FSROOT}/usr/local/lib
INSTALL_INCLUDES_DIR=${FSROOT}/usr/local/include/vapi

# to save build option defines in include files
ENDIANNESS=
VAPI_OPTION_INCLUDE=/common/vapi/vapi_build_option.h


GTL_CSME_INC_DIR= 	-I$(VAPI_DIR)/common/gtl \
					-I$(VAPI_DIR)/linux/gtl_csme

GTL_PCI_INC_DIR=        -I$(VAPI_DIR)/common/gtl \
					-I$(VAPI_DIR)/linux/gtl_pci

VAPI_INC_DIR = 		-I$(VAPI_DIR)/common/vapi \
					-I$(VAPI_DIR)/common/comcerto_headers \
					-I$(VAPI_DIR)/common/ut \
					-I$(VAPI_DIR)/linux/ut \
					-I$(VAPI_DIR)/common/gtl

DEBUG_OPT= -g -UMEMDBG -DVAPI_NODBG
CFLAGS := -c -Wall -O2 -Wstrict-prototypes -Wdeclaration-after-statement $(DEBUG_OPT) -D_LINUX_ $(ARMFLAGS)

ifeq ($(strip $(ENDIANNESS)),BIGENDIAN)
CFLAGS+=-DVAPI_BIGENDIAN
else
CFLAGS+=-UVAPI_BIGENDIAN
endif

VAPI_OBJS = $(VAPI_OBJ_DIR)/misc_itf.o \
			$(VAPI_OBJ_DIR)/device_itf.o \
			$(VAPI_OBJ_DIR)/connection_itf.o \
			$(VAPI_OBJ_DIR)/conference_itf.o \
			$(VAPI_OBJ_DIR)/announcement_itf.o \
			$(VAPI_OBJ_DIR)/video_itf.o \
			$(VAPI_OBJ_DIR)/helper_itf.o \
			$(VAPI_OBJ_DIR)/vcore.o \
			$(VAPI_OBJ_DIR)/mspcmds.o \
			$(VAPI_OBJ_DIR)/voip_defaults.o \
			$(VAPI_OBJ_DIR)/vapi_defaults.o \
			$(VAPI_OBJ_DIR)/misc_fsm.o \
			$(VAPI_OBJ_DIR)/device_fsm.o \
			$(VAPI_OBJ_DIR)/connection_fsm.o \
			$(VAPI_OBJ_DIR)/conference_fsm.o \
			$(VAPI_OBJ_DIR)/announcement_fsm.o \
			$(VAPI_OBJ_DIR)/video_fsm.o \
			$(VAPI_OBJ_DIR)/vapi_config.o \
			$(VAPI_OBJ_DIR)/vapi_device_config.o \
			$(VAPI_OBJ_DIR)/dmgr.o \
			$(VAPI_OBJ_DIR)/resmgr_itf.o \
			$(VAPI_OBJ_DIR)/resmgr.o


GTL_COMMON_OBJS =  $(GTL_COMMON_OBJ_DIR)/ut.o \
			$(GTL_COMMON_OBJ_DIR)/avl.o \
			$(GTL_COMMON_OBJ_DIR)/ut_port.o \
			$(GTL_COMMON_OBJ_DIR)/timer.o \
			$(GTL_COMMON_OBJ_DIR)/tmap_devinfo.o \
			$(GTL_COMMON_OBJ_DIR)/tmap_map.o 


GTL_CSME_OBJS =  $(GTL_CSME_OBJ_DIR)/teth.o

GTL_PCI_OBJS = $(GTL_PCI_OBJ_DIR)/tpci.o

LFLAGS =  -L$(LIB_DIR) -Wall -pedantic -O -pthread


# Define GTL as 'PCI' or 'CSME' to build with specific adapter only.
# Otherwise use 'ALL' (which is default) to build vapi with both
# GTL adapters.

ifeq ($(strip $(GTL)),)
GTL=CSME
vapi: build_option
endif

ifeq ($(strip $(GTL)),PCI)
LIB = -lvapi -lgtlcommon -lgtlpci -lpthread   
GTL_FLAG=-DNOETH -DNOPOS
vapi: mkdirs_vapi $(VAPI_OBJS) gtlpci build_option
	$(AR) r libvapi.a $(VAPI_OBJS)
endif

ifeq ($(strip $(GTL)),CSME)
LIB = -lvapi -lgtlcommon -lgtlcsme -lpthread   
GTL_FLAG=-DNOPCI -DNOPOS
vapi: mkdirs_vapi $(VAPI_OBJS) gtlcsme build_option
	$(AR) r libvapi.a $(VAPI_OBJS)

endif

ifeq ($(strip $(GTL)),ALL)
LIB = -lvapi -lgtlcommon -lgtlcsme -lgtlpci -lpthread
GTL_FLAG=-DNOPOS
vapi: mkdirs_vapi $(VAPI_OBJS) gtlcsme gtlpci build_option
	$(AR) r libvapi.a $(VAPI_OBJS)
endif


all: vapi


gtlcommon:$(GTL_COMMON_OBJS)
	$(AR) r libgtlcommon.a $(GTL_COMMON_OBJS)


gtlcsme: gtlcommon $(GTL_CSME_OBJS)
	$(AR) r libgtlcsme.a $(GTL_CSME_OBJS)


gtlpci: gtlcommon $(GTL_PCI_OBJS)	
	$(AR) r libgtlpci.a $(GTL_PCI_OBJS)	

-include default
default: mkdirs_vapi
       
clean: rmdirs_vapi
	rm -f $(LIB_DIR)/libgtlpci.a
	rm -f $(LIB_DIR)/libgtlcsme.a
	rm -f $(LIB_DIR)/libvapi.a
	rm -f $(LIB_DIR)/libgtlcommon.a
	rm -rf $(INSTALL_DIR)

distclean: rmdirs_vapi 
	rm -f $(LIB_DIR)/libgtlpci.a 
	rm -f $(LIB_DIR)/libgtlcsme.a
	rm -f $(LIB_DIR)/libvapi.a
	rm -f $(LIB_DIR)/libgtlcommon.a
	rm -rf $(INSTALL_DIR)

mkdirs_vapi:
	test -d $(VAPI_OBJ_DIR) || mkdir -p $(VAPI_OBJ_DIR)
	test -d $(GTL_COMMON_OBJ_DIR) || mkdir -p $(GTL_COMMON_OBJ_DIR)
	test -d $(GTL_CSME_OBJ_DIR) || mkdir -p $(GTL_CSME_OBJ_DIR)
	test -d $(GTL_PCI_OBJ_DIR) || mkdir -p $(GTL_PCI_OBJ_DIR)      

rmdirs_vapi:
	rm -rf $(VAPI_OBJ_DIR)
	rm -rf $(GTL_COMMON_OBJ_DIR)
	rm -rf $(GTL_CSME_OBJ_DIR)
	rm -rf $(GTL_PCI_OBJ_DIR)
	
install: vapi
	mkdir -m 0755 -p $(INSTALL_INCLUDES_DIR) $(INSTALL_LIB_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/gtl/gtl.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/ut/ut.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/ut/avl.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/linux/ut/ut_port.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/msp.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/vapi.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/vapi_config.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/vapi_profile.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/vapi_device_config.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/vcore_voip.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/vapi/vcore_types.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/common/comcerto_headers/*.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)/linux/gtl_csme/csmencaps/if_csmencaps.h $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) $(VAPI_DIR)$(VAPI_OPTION_INCLUDE) $(INSTALL_INCLUDES_DIR)
	$(INSTALL_PROG) *.a $(INSTALL_LIB_DIR)

# Define build options usable to build the application linked with VAPI
build_option:
	rm -f $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
	touch $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
ifeq ($(strip $(ENDIANNESS)),BIGENDIAN)
	echo "#define VAPI_HOST_BE" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
	echo "#define VAPI_BIGENDIAN" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
else
	echo "#undef VAPI_BIGENDIAN" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
endif
ifeq ($(strip $(GTL)),)
	echo "#define VAPI_GTL_ALL" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
endif
ifeq ($(strip $(GTL)),ALL)
	echo "#define VAPI_GTL_ALL" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
endif
ifeq ($(strip $(GTL)),PCI)
	echo "#define VAPI_GTL_PCI" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
endif
ifeq ($(strip $(GTL)),CSME)
	echo "#define VAPI_GTL_CSME" >> $(VAPI_DIR)$(VAPI_OPTION_INCLUDE)
endif

$(VAPI_OBJ_DIR)/%.o: $(VAPI_DIR)/common/vapi/%.c
	$(CC)  $(CFLAGS) $(UT_CFLAGS) $(VAPI_INC_DIR) $<  -o $@


$(GTL_COMMON_OBJ_DIR)/%.o: $(VAPI_DIR)/common/ut/%.c
	$(CC)  $(CFLAGS) $(CM_CFLAGS) $(GTL_FLAG) $(VAPI_INC_DIR) $<  -o $@
$(GTL_COMMON_OBJ_DIR)/%.o: $(VAPI_DIR)/common/gtl/%.c
	$(CC)  $(CFLAGS) $(CM_CFLAGS) $(GTL_FLAG) $(VAPI_INC_DIR) $<  -o $@


$(GTL_PCI_OBJ_DIR)/%.o: $(VAPI_DIR)/linux/gtl_pci/%.c
	$(CC)  $(CFLAGS) $(CM_FLAGS)  $(GTL_FLAG) $(VAPI_INC_DIR) $(GTL_PCI_INC_DIR)  $<  -o $@ 	


$(GTL_COMMON_OBJ_DIR)/%.o: $(VAPI_DIR)/linux/ut/%.c
	$(CC)  $(CFLAGS) $(CM_CFLAGS) $(GTL_FLAG) $(VAPI_INC_DIR) $<  -o $@

$(GTL_CSME_OBJ_DIR)/%.o: $(VAPI_DIR)/linux/gtl_csme/%.c
	$(CC)  $(CFLAGS) $(CM_CFLAGS) $(GTL_FLAG) $(VAPI_INC_DIR) $(GTL_CSME_INC_DIR) $<  -o $@
