
#
# All software are Copyright 2010 by ACTi Corporation. ALL RIGHTS RESERVED.
# Redistribution and use in source and binary forms, with or without modification,
# are strictly prohibited.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESS
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
# IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

include Rules.make

SHELL = /bin/bash

TOP :=$(shell pwd)
UTIL := $(TOP)/ShareLibs/Util
CONFIGLIB := $(TOP)/ShareLibs/ConfigLib
HTTP := $(TOP)/ShareLibs/HttpServer
NET := $(TOP)/ShareLibs/Network
CRYPTO := $(TOP)/ShareLibs/Crypto
WANDAEMON_API := $(TOP)/Daemons/Wand_API
WANDAEMON := $(TOP)/Daemons/Wand
DATETIMEDAEMON := $(TOP)/Daemons/DateTime
FTP := $(TOP)/ShareLibs/FtpLib
LOG := $(TOP)/ShareLibs/LibLog
SMTP := $(TOP)/ShareLibs/Smtp
GLIB := $(TOP)/ShareLibs/Smtp/glib
UPNP := $(TOP)/ShareLibs/UPnP
RTSP := $(TOP)/ShareLibs/RTSP
SQLITE := $(TOP)/ShareLibs/sqlite
SNMP := $(TOP)/Daemons/Snmpd
GSOAP := $(TOP)/ShareLibs/Gsoap
ICONV := $(TOP)/ShareLibs/libiconv-1.13.1
SSL := $(TOP)/ShareLibs/OpenSSL
DBM := $(TOP)/ShareLibs/qdbm-1.8.77
CONFIG := $(TOP)/Config
PACKAGES := $(TOP)/Packages
ETH_SPEED := $(TOP)/Tools/eth_speed
ACTI_LOGGER := $(TOP)/Tools/acti_logger
SD := $(TOP)/Tools/SDDelegate
ALIVE_CHECK := $(TOP)/Tools/alive_check
BSPATCH	:= $(TOP)/Tools/bspatch
XSUPPLICANT := $(TOP)/Daemons/xsupplicant
ISP := $(TOP)/A1_ISP/isp
A1_SENSOR := $(TOP)/A1_ISP/a1_sensor
ISP_CTRL := $(TOP)/A1_ISP/isp-ctrl
P2P := $(NET)/P2P

# compiler switches
CFLAGS  = $(OPTIONS) -Wall -Wstrict-aliasing=0 -D_GNU_SOURCE -D_REENTRANT -D_THREAD_SAFE

# Runtime config CFLAGS. COPY_RES: 1) resolution independent 0) S2 depends on S1
COPY_RES=0
ifeq ($(COPY_RES) ,1)
CFLAGS += -DCOPY_RES
endif
A1DEBUG=1
ifeq ($(A1DEBUG), 1)
CFLAGS += -DMODULE=FW
endif

# the path where to find header files
CFLAGS += -I$(BUILD_TOPDIR)/usr/runtime/hx8290/inc -I$(BUILD_TOPDIR)/usr/runtime/hx8290/src/core/h264 \
           -I$(BUILD_TOPDIR)/usr/runtime/hx8290/src/core/common -I$(BUILD_TOPDIR)/usr/runtime/hx8290/src/camstab \
           -I$(BUILD_TOPDIR)/usr/runtime/hx8290/src/debug_trace \
		   -I$(BUILD_TOPDIR)/usr/runtime/h264-md -I$(BUILD_TOPDIR)/usr/runtime/a1-vcap \
		   -I$(BUILD_TOPDIR)/output/dummy/include -I$(BUILD_TOPDIR)/usr/runtime/hx8290/src/core/jpeg \
		   -I$(BUILD_TOPDIR)/usr/runtime/pcm-lib

CFLAGS += -DA1 -DHAVE_OPENSSL -DHAVE_ONVIF_DEBUG #-DHAVE_ONVIF
CFLAGS += -I$(TOP)
CFLAGS += -I$(CONFIGLIB)
CFLAGS += -I$(HTTP) -I$(HTTP)/include
CFLAGS += -I$(UTIL)
CFLAGS += -I$(TOP)/include
CFLAGS += -I$(WANDAEMON_API)
CFLAGS += -I$(FTP)
CFLAGS += -I$(SMTP)/include
CFLAGS += -I$(NET)
CFLAGS += -I$(TOP)/ShareLibs/include
CFLAGS += -I$(UPNP)/include
CFLAGS += -I$(LOG)
CFLAGS += -I$(GLIB) #`$(TOOLCHAIN)/bin/glib-config --cflags`
CFLAGS += -I$(RTSP)
CFLAGS += -I$(SQLITE)
CFLAGS += -I$(SNMP)
CFLAGS += -I$(GSOAP)/apps -I$(GSOAP)/include
CFLAGS += -I$(ICONV)/include
CFLAGS += -I$(SSL)/include
CFLAGS += -I$(DBM)
CFLAGS += -I$(CONFIG)/include
CFLAGS += -I$(TARGET_DIR)/usr/include
CFLAGS += -I$(SSL)/include/openssl -I$(SSL)/api
CFLAGS += -I$(LINUX_DIR)/drivers/char
CFLAGS += -I$(XSUPPLICANT)/sspo_api/include
CFLAGS += -IUrlToUart/
#CFLAGS += -I$(LIBPTZCTRL)/include -I$(LIBPTZCTRL)/UartAccess

LDFLAGS += -lm -lrt -ldl -LShareLibs
LDFLAGS += -L$(RTSP) -lrtsp
LDFLAGS += -L$(SQLITE)/.libs -lsqlite3
LDFLAGS += -L$(CONFIGLIB) -lConfigLib
LDFLAGS += -L$(NET) -lnet
LDFLAGS += -L$(HTTP) -lhttp
LDFLAGS += -L$(UPNP)/lib -lupnp
LDFLAGS += -L$(UTIL) -lUtil
LDFLAGS += -L$(CRYPTO) -lcrypt
LDFLAGS += -L$(LOG) -llog
LDFLAGS += -L$(FTP) -lftp
LDFLAGS += -L$(SMTP)/smtp -lsmtp -L$(SMTP)/mime -lsmtp_mime
#LDFLAGS += `$(TOOLCHAIN)/bin/glib-config --libs`
LDFLAGS += -L$(GSOAP) -lsoap
#LDFLAGS += -L$(ICONV)/preload/.libs -liconv
LDFLAGS += -L$(SSL) -lcrypto -lssl
LDFLAGS += -L$(SSL)/api -lcertgen
LDFLAGS += -L$(DBM) -lqdbm
#LDFLAGS += -L$(CONFIG) -lconfig
LDFLAGS += -L$(A1_SENSOR) -lHcmd
LDFLAGS += -L$(XSUPPLICANT)/sspo_api -l8021x_api

LIB_PATH = -L$(TARGET_DIR)/usr/lib


# list of used sourcefiles
SRCS  = main.c Msg.c ring.c Convert.c Audio.c vcap.c coders.c RtspAPI.c streaming.c http.c AutoSave.c Ctrl.c tcp2.c osg.c OsdPM.c
SRCS +=	MdPmRegion.c DevCap.c Discovery.c CgiLib.c url_misc.c SysCgi.c MacDevCgi.c UpdateCgi.c GodCgi.c EncCgi.c TestCgi.c 
#SRCS += $(WANDAEMON)/wan_daemon_api.c $(WANDAEMON)/msgQ.c MiscFuncs.c GetJiffies.c $(SNMP)/SnmpAPIs.c
SRCS += MiscFuncs.c GetJiffies.c $(SNMP)/SnmpAPIs.c ClockTicks.c
SRCS += Event.c Isp.c gpio.c g711.c url_camera_page.c eventHandler.c dbm.c ptz.c 
SRCS += ShareLibs/Gsoap/apps/OnvifAPIs.c ShareLibs/Gsoap/apps/OnvifIF.c ShareLibs/Gsoap/apps/OnvifUrl.c
SRCS += visca.c ptzfunc.c pelcod.c pelcop.c PelcoAPI.c UARTLib.c rs485.c
SRCS += UrlToUart/pelcod.c UrlToUart/pelcop.c UrlToUart/UrlToUart.c
#SRCS += $(LIBPTZCTRL)/HexToPtz/visca.c $(LIBPTZCTRL)/HexToPtz/func.c $(LIBPTZCTRL)/HexToPtz/pelcod.c $(LIBPTZCTRL)/HexToPtz/pelcop.c $(LIBPTZCTRL)/HexToPtz/PelcoAPI.c $(LIBPTZCTRL)/UartAccess/uart_api.c $(LIBPTZCTRL)/UartAccess/UARTLib.c

OBJS = $(SRCS:.c=.o)

# name of the control code library
LIB = $(BUILD_TOPDIR)/usr/runtime/hx8290/lib8290enc.a
# wan_daemon api
LIB += -L$(WANDAEMON_API) -lWD

# name of the output executable
TARGET = aistreamer


all: lib daemon package tools isp p2p vst

.PHONY: vst
vst: TARGETENV = vst
vst: CROSS_COMPILE = arm-none-linux-gnueabi-
vst: OPTIONS = -g -Os
vst: LIB += -lpthread $(LDFLAGS)
vst: 
#	@rm -f $(TARGET) /tftpboot/$(TARGET) /nfs/$(TARGET)
#	$(CC) -o $(TARGET) $(OBJS) $(LIB_PATH) $(LIB) -la1-vcap -lh264md
	@cp $(TARGET) $(TARGET)_unstripped
	$(STRIP) $(TARGET)
	@cp $(TARGET) ~/public_html

a1: lib vst
	@cp $(TARGET) /nfs/

lib:	
	#patch SMTP library files
	if [ ! -f $(GLIB)/libglib.la ]; then \
		cp $(TOP)/ShareLibs/glib-libtool $(GLIB)/libtool; \
    fi
	@if [ ! -f $(SMTP)/.Smtp.patch ]; then \
		cd $(SMTP); patch -N -p0 < ../Smtp.patch $(quiet); \
		cp ../Smtp.patch .Smtp.patch; \
	else \
		diff $(SMTP)/../Smtp.patch $(SMTP)/.Smtp.patch > /dev/null; \
		if [ $$? -eq 1 ]; then \
			for d in `svn stat $(SMTP) |awk '/M /{print $$2}'` ; do \
				svn revert $$d; \
			done; \
			cd $(SMTP); patch -N -p0 < ../Smtp.patch $(quiet); \
			cp ../Smtp.patch .Smtp.patch; \
		fi \
	fi
	@if [ ! -f $(GSOAP)/.Gsoap.patch ]; then \
		cd $(GSOAP); patch -N -p0 < ../Gsoap.patch $(quiet) ;\
		cp ../Gsoap.patch .Gsoap.patch ;\
	else \
		diff $(GSOAP)/../Gsoap.patch $(GSOAP)/.Gsoap.patch > /dev/null; \
		if [ $$? -eq 1 ]; then \
			for d in `svn stat $(GSOAP) |awk '/M /{print $$2}'` ; do \
				svn revert $$d; \
			done; \
			cd $(GSOAP); patch -N -p0 < ../Gsoap.patch $(quiet) ;\
			cp ../Gsoap.patch .Gsoap.patch ;\
		fi \
	fi
	#OpenSSL
	if [ ! -f $(SSL)/libcrypto.so -o ! -f $(SSL)/libssl.so ]; then \
		make -C $(SSL) CROSS=$(CROSS); \
	fi
	cp -a $(SSL)/libcrypto.so.0.9.7 $(TARGET_DIR)/lib/libcrypto.so.0.9.7; \
	cp -a $(SSL)/libssl.so.0.9.7 $(TARGET_DIR)/lib/libssl.so.0.9.7; \
	#DBM
	make -C $(DBM) CC=$(CC) AR=$(AR); 
	if [ ! -f $(SQLITE)/Makefile ]; then \
        pushd $(SQLITE); \
        ./configure --build=arm-linux --target=arm target_alias=arm --host=i386 host_alias=i386 CC=arm-none-linux-gnueabi-gcc; \
        popd; \
    fi
	#Compiler ShareLibs
	make -C ShareLibs all #CROSS=$(CROSS)

lib-clean:
	make -C ShareLibs clean CROSS=$(CROSS)

lib-distclean: lib-clean
	#Network patch recovery
	@if [ -f $(NET)/.Network.patch ]; then \
        cd $(NET); patch -R -p0 < ./.Network.patch $(quiet) ;\
        rm .Network.patch ;\
    fi
	#Rtsp patch recovery
	@if [ -f $(RTSP)/.RTSP.patch ]; then \
		cd $(RTSP); patch -R -p0 < .RTSP.patch $(quiet) ;\
		rm .RTSP.patch; \
	fi
	#Util patch recovery
	@if [ -f $(UTIL)/.Util.patch ]; then \
        cd $(UTIL); patch -R -p0 < .Util.patch $(quiet); \
        rm .Util.patch; \
    fi
	#Http patch recovery
	@if [ -f $(HTTP)/.HttpServer.patch ]; then \
        cd $(HTTP); patch -R -p0 < .HttpServer.patch $(quiet); \
        rm .HttpServer.patch; \
    fi
	#LibLog patch recovery
	@if [ -f $(LOG)/.LibLog.patch ]; then \
		cd $(LOG); patch -R -p0 < .LibLog.patch $(quiet); \
		rm .LibLog.patch; \
	fi
daemon:
	#build WanDaemon_API
	if [ ! -f $(WANDAEMON_API)/libWD.so ]; then \
		make CROSS=$(CROSS) -C $(WANDAEMON_API) clean all; \
	fi
	#make CROSS=$(CROSS) -C $(WANDAEMON_API) install
	cp $(WANDAEMON_API)/libWD.so $(EXEC_BINDIR)/../lib
	#build WanDaemon
	if [ ! -f $(WANDAEMON)/wan_daemon ]; then \
		make CROSS=$(CROSS) -C $(WANDAEMON) clean all; \
		$(STRIP) $(WANDAEMON)/wan_daemon; \
	fi
	cp $(WANDAEMON)/wan_daemon $(EXEC_BINDIR)
	#build DateTime Daemon
	install -s --strip-program=$(STRIP) $(DATETIMEDAEMON)/DateTimeDaemon $(EXEC_BINDIR)
	install -s --strip-program=$(STRIP) $(DATETIMEDAEMON)/DateTimeMsgSend $(EXEC_BINDIR)
	#build Snmp Daemon
	@if [ ! -f $(SNMP)/.Snmpd.patch ]; then \
		cd $(SNMP); patch -N -p0 < ../Snmpd.patch $(quiet); \
		cp ../Snmpd.patch .Snmpd.patch; \
	else \
		diff $(SNMP)/../Snmpd.patch $(SNMP)/.Snmpd.patch > /dev/null; \
		if [ $$? -eq 1 ]; then \
			for d in `svn stat $(SNMP) |awk '/M /{print $$2}'` ; do \
				svn revert $$d; \
			done; \
			cd $(SNMP); patch -N -p0 < ../Snmpd.patch $(quiet); \
			cp ../Snmpd.patch .Snmpd.patch; \
		fi \
	fi
	@if [ ! -f $(SNMP)/Makefile ]; then \
		pushd $(SNMP); \
		./configure --prefix=/ --datadir=/var/share --build=arm-linux --host=arm-none-linux-gnueabi --target=arm-linux --with-cc=arm-none-linux-gnueabi-gcc --enable-mini-agent --disable-ipv6 --with-endianness=little --with-default-snmp-version=3 --with-sys-contact='' --with-sys-location='' --disable-manuals --disable-ucd-snmp-compatibility --disable-embedded-perl --without-perl-modules --disable-snmptrapd-subagent --disable-applications --disable-scripts --enable-mib-config-checking --with-out-transports=Callback,TCP,UDPIPv6,TCPIPv6,AAL5PVC,IPX,Unix --enable-shared=no --enable-static --with-mib-modules=mibII/ip,mibII/tcp,mibII/udp,mibII/snmp_mib,mibII/icmp --with-out-mib-modules=mibII/sysORTable,mibII/vacm_context,mibII/vacm_vars,agent_mips,agentx,notification,utilities,target --with-defaults --without-kmem-usage --without-rpm --without-dmalloc --disable-debugging --disable-mib-loading --with-dummy-values; \
		popd; \
	fi
	make -C $(SNMP) 
	install -s --strip-program=$(STRIP) $(SNMP)/agent/snmpd $(EXEC_BINDIR)
	
	#build 8021x/xsupplicant
	@if [ ! -f $(XSUPPLICANT)/.xsupplicant.patch ]; then \
        cd $(XSUPPLICANT); patch -N -p0 < ../xsupplicant.patch $(quiet); \
        cp ../xsupplicant.patch .xsupplicant.patch; \
    else \
        diff $(XSUPPLICANT)/../xsupplicant.patch $(XSUPPLICANT)/.xsupplicant.patch > /dev/null; \
        if [ $$? -eq 1 ]; then \
            for d in `svn stat $(XSUPPLICANT) |awk '/M /{print $$2}'` ; do \
                svn revert $$d; \
            done; \
            cd $(XSUPPLICANT); patch -N -p0 < ../xsupplicant.patch $(quiet); \
            cp ../xsupplicant.patch .xsupplicant.patch; \
        fi \
    fi
	@if [ ! -f $(XSUPPLICANT)/src/xsupplicant ]; then \
		pushd $(XSUPPLICANT); \
			./xsupp_build.sh OP_MODE=build CROSS=$(CROSS) OPENSSL_DIR=$(SSL) MOREDEFS= ; \
		popd; \
	fi
	install -s --strip-program=$(STRIP) $(XSUPPLICANT)/src/xsupplicant $(EXEC_BINDIR)

daemon-clean:
	make -C $(WANDAEMON_API) clean
	make -C $(WANDAEMON) clean
	make -C $(SNMP) clean
	@if [ -f $(XSUPPLICANT)/src/xsupplicant ]; then \
		pushd $(XSUPPLICANT); \
			./xsupp_build.sh OP_MODE=clean ; \
		popd; \
	fi

daemon-distclean: daemon-clean
	#WanDaemon patch recovery
	@if [ -f $(WANDAEMON)/.Wand.patch ]; then \
		cd $(WANDAEMON); patch -R -p0 < .Wand.patch $(quiet); \
		rm $(WANDAEMON)/.Wand.patch; \
	fi
	@if [ -f $(WANDAEMON_API)/.Wand_API.patch ]; then \
        cd $(WANDAEMON_API); patch -R -p0 < .Wand_API.patch $(quiet); \
        rm $(WANDAEMON_API)/.Wand_API.patch; \
    fi
	
package:
	$(MAKE) -C $(PACKAGES) all 

package-clean:
	$(MAKE) -C $(PACKAGES) clean

tools:
	$(MAKE) -C $(ETH_SPEED) install CROSS=$(CROSS)
	$(MAKE) -C $(ACTI_LOGGER) install CROSS=$(CROSS) 
	$(MAKE) -C $(SD) CFLAGS="$(CFLAGS) -I$(TOP) " CC=$(CC) AR=$(AR) STRIP=$(STRIP)  
	$(MAKE) -C $(ALIVE_CHECK) install CROSS=$(CROSS) 
	$(MAKE) -C $(BSPATCH) all install CROSS=$(CROSS)

isp:
	#patch A1_ISP driver Makefile
	$(MAKE) -C $(ISP) install KERNEL_SRC=$(LINUX_DIR) BUILD_TOPDIR=$(BUILD_TOPDIR) MODULE_DIR=$(TOP)/A1_ISP 
	$(MAKE) -C $(A1_SENSOR) BUILD_TOPDIR=$(BUILD_TOPDIR) CROSS_COMPILE=$(CROSS)

isp-clean:
	$(MAKE) -C $(ISP) clean BUILD_TOPDIR=$(BUILD_TOPDIR)
	$(MAKE) -C $(A1_SENSOR) clean
	$(MAKE) -C $(ISP_CTRL) clean

isp-distclean: isp-clean
	svn stat $(ISP) | grep '?' | awk '{print $2}' |xargs rm -rf

p2p:
	cp $(P2P)/TUTK/source/libIOTCAPIs.so $(TARGET_DIR)/lib/
	cp $(P2P)/TUTK/source/libRDTAPIs.so $(TARGET_DIR)/lib/

install:
	@printf "Installing %s\n" $(TARGET)
	@mkdir -p $(EXEC_BINDIR)
	install $(TARGET) $(EXEC_BINDIR)
	@printf "%s installed\n" $(TARGET)

.PHONY: clean testaudio
clean: 
	$(RM) *.o 

test:
	$(CC) -o mytest test.c 
