# Makefile
# David Rowe
# 22/4/01
#
# Makefile for VPB driver library

CXX = g++

KERNEL_RUNNING := $(shell uname -r)
KERNEL_LOCATION ?= /lib/modules/$(KERNEL_RUNNING)/build
KERNEL_VERSION := $(shell grep UTS_RELEASE $(KERNEL_LOCATION)/include/linux/version.h | cut -f 2 -d \" )
MODULE_PATH := /lib/modules/$(KERNEL_VERSION)/kernel/drivers/telephony
KERNEL_OLD := $(shell if [ -f $(KERNEL_LOCATION)/Rules.make ]; then echo 1; else echo 0; fi)

#AST_TIMING := $(shell [ -f /usr/include/linux/zaptel.h ] && echo " -DVPB_ASTERISK_TIMING -I/usr/include/linux/")

ifeq ($(OS),FreeBSD)
LIB_CPPFLAGS = -g -D_DEBUG -Wall $(GPROF)
else
LIB_CPPFLAGS = -g -D_DEBUG -DLINUX -Wall $(GPROF)
endif
 
OBJ =	adpcm.o		\
	alaw.o		\
	apifunc.o	\
	call.o		\
	cid.o		\
	cidg.o		\
	cid_jp.o	\
	coff.o 		\
	comm.o 		\
	comp.o		\
	config.o	\
	digbuf.o	\
	digits.o	\
	dspfifo.o	\
	envtone.o	\
	fifo.o		\
	hip.o 		\
	ioports.o	\
	loopmon.o	\
	mapdev.o	\
	mess.o		\
	mulaw.o		\
	objtrack.o	\
	osc.o		\
	pci.o		\
	pip.o		\
	playrec.o	\
	portlinux.o	\
	portuser.o	\
	timer.o 	\
	toneg.o		\
	transevt.o	\
	translate.o	\
        v4logagc.o      \
	verbose.o	\
	vpbagc.o	\
	vpbapi.o	\
	vpbdial.o	\
	vpbhandle.o	\
	vpbreg.o 	\
	vpbtimer.o	\
	vpbtoned.o	\
	vpbvox.o	\
	wave.o		\
	wobbly.o	

OBJHD =	hdaport.o	\
	hostdsp.o	

# detect up 'OSTYPE=linux' env variable from top level make file if Linux
os=linux

ifeq ($(OS),FreeBSD)
	GENOBJ = genericfreebsd.o
else
	GENOBJ = $(OBJHD) genericlinux.o
endif

%.o: %.cpp
	$(CXX) $(LIB_CPPFLAGS) $< -o $@ -c

ifeq ($(OS),FreeBSD)
all:	libvpb.a
else
ifeq ($(KERNEL_OLD), 1)
all:	libvpb.a vpb.o vpbhp.o libvpb.so
else
all:	libvpb.a vpb-driver
endif
endif

clean:
	rm -f *.o *.a core*

# OpenSwitch12 host processing firmware not supported by FreeBSD (just yet)

ifeq ($(OS),FreeBSD)
libvpb.a: $(OBJ) $(GENOBJ) dummyfirmware.o
	ar r libvpb.a $(OBJ) $(GENOBJ) dummyfirmware.o
else
libvpb.a: $(OBJ) $(GENOBJ)
	ar r libvpb.a $(OBJ) $(GENOBJ) ../firmware/firmware 
endif

ifneq ($(OS),FreeBSD)
libvpb.so: $(OBJ) $(GENOBJ)
	g++ -o libvpb.so -shared $(OBJ) $(GENOBJ) ../firmware/firmware -lc -lm \
			-lpthread
endif

ifeq ($(OS),FreeBSD)
# do nothing......
else
# We can compile Linux kernel mode driver here, but FreeBSD kernel mode
# component must be compiled into the kernel.
ifeq ($(KERNEL_OLD), 1)
# OpenLine4/OpenLog4 kernel mode driver

vpb.o: vpb.c iic.c
	cc -O6 -mcpu=i486 -c vpb.c -o vpb-tmp.o -I/usr/src/linux/include -Wall
	ld -r vpb-tmp.o -o vpb.o

# OpenSwitch12 kernel mode driver

vpbhp.o: fifoc.o hda.o khook.o kring.o kldrop.o float_dotprod_3dnow.o echo.o iic.c
	ld -r hda.o fifoc.o khook.o kring.o kldrop.o echo.o float_dotprod_3dnow.o -o vpbhp.o

fifoc.o: fifoc.c
	cc -c fifoc.c -Wall

khook.o: khook.c
	cc -c khook.c -Wall

kring.o: kring.c
	cc -c kring.c -Wall

kldrop.o: kldrop.c
	cc -c kldrop.c -Wall -I/usr/src/linux/include

hda.o: hda.c 
	cc hda.c -c -mcpu=i486 -O6 -Wall -I/usr/src/linux/include $(AST_TIMING);

echo.o: echo.c
	cc -c echo.c -O3 -march=pentium3 -mcpu=pentium3


else

KERNEL_RUNNING := $(shell uname -r)
KERNEL_LOCATION ?= /lib/modules/$(KERNEL_RUNNING)/build
KERNEL_VERSION := $(shell grep UTS_RELEASE $(KERNEL_LOCATION)/include/linux/version.h | cut -f 2 -d \" )
MODULE_PATH := /lib/modules/$(KERNEL_VERSION)/kernel/drivers/telephony
KERNEL_OLD := $(shell if [ -f $(KERNEL_LOCATION)/Rules.make ]; then echo 1; else echo 0; fi)
OPENLINE_MODULE_NAME := vpb
OPENSWITCH_MODULE_NAME := vpbhp
OPENSWITCH_DIST_OBJECTS := 
#OPENSWITCH_DIST_OBJECTS := ../firmware/echo.o
OPENSWITCH_SRC_OBJECTS := fifoc.o hda.o khook.o kring.o kldrop.o float_dotprod_3dnow.o echo.o #echo.o_shipped
OPENSWITCH_KERNEL_GLUE_NAME := $(OPENSWITCH_MODULE_NAME)-glue.o
OPENSWITCH_KERNEL_GLUE_OBJS := $(OPENSWITCH_SRC_OBJECTS) $(OPENSWITCH_MODULE_NAME).mod.o
OPENLINE_SRC_OBJECTS := 
EXTRA_CFLAGS := -mhard-float
#EXTRA_CFLAGS += $(shell [ -f /usr/include/linux/zaptel.h ] && echo " -DVPB_ASTERISK_TIMING")
EXTRA_LDFLAGS := -d 
obj-m := vpbhp.o vpb.o
vpbhp-objs := $(OPENSWITCH_DIST_OBJECTS) $(OPENSWITCH_SRC_OBJECTS)
vpb-objs := $(OPENLINE_SRC_OBJECTS)
                                                                                                                            
$(obj)/$(OPENSWITCH_DIST_OBJECTS):
	cp $(src)/$(OPENSWITCH_DIST_OBJECTS) $(obj)/$(OPENSWITCH_DIST_OBJECTS)
                                                                                                                            
$(OPENSWITCH_KERNEL_GLUE_NAME): module
	$(LD) $(OPENSWITCH_EXTRA_LDFLAGS) -r -o $(OPENSWITCH_KERNEL_GLUE_NAME) $(OPENSWITCH_KERNEL_GLUE_OBJS)
                                                                                                                            
vpb-driver:
	make -C $(KERNEL_LOCATION) M=$(PWD) modules
                                                                                                                            
vpb-driver-install: vpb-driver
	if [ ! -d $(MODULE_PATH) ]; then mkdir -p $(MODULE_PATH); fi
	cp $(OPENSWITCH_MODULE_NAME)$(MODULE_EXT) $(MODULE_PATH)
	cp $(OPENLINE_MODULE_NAME)$(MODULE_EXT) $(MODULE_PATH)
	depmod
                                                                                                                            
ifeq ($(KERNEL_OLD), 1)
include $(KERNEL_LOCATION)/Rules.make
MODULE_EXT := .o
else
MODULE_EXT := .ko
endif
                                                                                                                            
endif
endif







