TOP		=$(DESTDIR)
PFX		=/usr/local

CCLD		=$(CC)
CP_P		=cp -p
RM_F		=rm -f
MKD_P		=mkdir -p
RMD_F		=rmdir 2>/dev/null
DEPMOD_AE	=depmod -a -e

LIBATM_I	=/usr/include
LIBATM_L	=/usr/lib
LIBUSB_S	=so

LIBUSB_I	=/usr/include
LIBUSB_L	=/usr/lib
LIBUSB_S	=so

KV		=2.4.22-1-686
KARCH		=i686
KDIR		=/usr/src/kernel-linux-$(KV)

K24		=yes
K26		=no

ISBIN		=$(TOP)$(PFX)/sbin
IDATA		=$(TOP)$(PFX)/lib/cxacru
IKMOD		=$(TOP)/lib/modules/$(KV)/kernel/drivers/usb
IKDEP		=$(TOP)/lib/modules/$(KV)/modules.dep

ifeq "$(K24)" "yes"
KO		=o
endif
ifeq "$(K26)" "yes"
KO		=ko
endif

CX_INC		=-Iinclude -I$(KDIR)/include -I$(LIBUSB_I)
# Please never omit the frame pointer.
CX_OPTS		=-O2 -Wstrict-prototypes -pipe -march=$(KARCH) -Wall
CX_DEFS		=-DLINUX
CX_CFLAGS	=$(CX_OPTS) $(CX_DEFS) $(CX_INC)
CX_LIB		=-L$(LIBUSB_L)
CX_LDFLAGS	=$(CX_LIB)
CX_LIBS		=-lusb
CX_LIBD		=$(LIBUSB_L)/libusb.$(LIBUSB_S)

BR_INC		=-Iinclude -I$(KDIR)/include -I$(LIBATM_I)
BR_CFLAGS	=$(CX_OPTS) $(CX_DEFS) $(BR_INC)
BR_LIB		=-L$(LIBATM_D)
BR_LDFLAGS	=$(CX_LDFLAGS)
BR_LIBS		=-latm -lresolv
BR_LIBD		=$(LIBATM_L)/libatm.$(LIBATM_S)

CXLOAD_O	=init/cxload.o
CXIOCTL_O	=init/cxioctl.o

BR2684_O	=bridged/br2684ctl.o

MOD_INC		=-Iinclude -Isarlib -I$(KDIR)/include
MOD_OPTS	=-O2 -pipe \
		 -Wstrict-prototypes -Wno-trigraphs -Wall \
		 -fno-strict-aliasing -fno-common \
		 -mpreferred-stack-boundary=2 -march=$(KARCH)
MOD_DEFS	=-D__KERNEL__ -DLINUX 
MOD_CFLAGS	=$(MOD_OPTS) $(MOD_DEFS) $(MOD_INC)
MOD_LIB		=
MOD_LIBS	=
MOD_LDFLAGS	=-r

MODCXACRU_O	=module/cxacru.o sarlib/sarlib.o

.PHONY:			all install

all:			sbin
all:			sbin/cxload
all:			sbin/cxctl
all:			sbin/br2684ctl

all:			lib
ifeq "$(K24)" "yes"
all:			lib/cxacru.$(KO)
endif
#all:			lib/cxacru2.$(KO)

install:		all

install:		$(ISBIN)
install:		$(ISBIN)/cxload	
install:		$(ISBIN)/cxctl	
install:		$(ISBIN)/br2684ctl

install:		$(IKMOD)
ifeq "$(K24)" "yes"
install:		$(IKMOD)/cxacru.$(KO)
endif
#install:		$(IKMOD)/cxacru2.$(KO)

install:		$(IDATA)
install:		$(IDATA)/cxfirm1.bin
install:		$(IDATA)/cxfirm2.bin
install:		$(IDATA)/cxfirm3.bin
install:		$(IDATA)/cxfirm4.bin
install:		$(IDATA)/cxfirm5.bin

install:		$(IKDEP)

.PHONY:			uninstall uninstall-remove

uninstall:		uninstall-remove
uninstall:		$(IKDEP)

uninstall-remove:
	$(RM_F) $(ISBIN)/cxload
	$(RM_F) $(ISBIN)/cxctl
	$(RM_F) $(ISBIN)/br2684ctl
	$(RMD_F) $(ISBIN)
	$(RM_F) $(IKMOD)/cxacru.$(KO)
	$(RM_F) $(IKMOD)/cxacru2.$(KO)
	$(RMD_F) $(IKMOD)
	$(RM_F) $(IDATA)/cxfirm1.bin
	$(RM_F) $(IDATA)/cxfirm2.bin
	$(RM_F) $(IDATA)/cxfirm3.bin
	$(RM_F) $(IDATA)/cxfirm4.bin
	$(RM_F) $(IDATA)/cxfirm5.bin
	$(RMD_F) $(IDATA)

sbin:
	$(MKD_P) $@

sbin/cxload:		$(CXLOAD_O)
	$(CCLD) $(CX_LDFLAGS) $(CXLOAD_O) $(CX_LIBS) -o $@

sbin/cxctl:		$(CXIOCTL_O)
	$(CCLD) $(CX_LDFLAGS) $(CXIOCTL_O) $(CX_LIBS) -o $@

sbin/br2684ctl:		$(BR2684_O)
	$(CCLD) $(BR_LDFLAGS) $(BR2684_O) $(BR_LIBS) -o $@

init/cxload.o:		$(LIBUSB_I)/usb.h
init/cxload.o:		include/usbi.h
init/cxload.o:		include/cxacru.h
init/cxload.o:		init/cxload.c
	$(CC) $(CX_CFLAGS) -c init/cxload.c -o $@

init/cxioctl.o:		$(LIBUSB_I)/usb.h
init/cxioctl.o:		include/usbi.h
init/cxioctl.o:		include/cxacru.h
init/cxioctl.o:		init/cxioctl.c
	$(CC) $(CX_CFLAGS) -c init/cxioctl.c -o $@

bridged/br2684ctl.o:	$(LIBATM_I)/atm.h
bridged/br2684ctl.o:	bridged/br2684ctl.c
	$(CC) $(BR_CFLAGS) -c bridged/br2684ctl.c -o $@

sarlib/sarlib.o:	sarlib/sarlib.h
sarlib/sarlib.o:	sarlib/sarlib.c
	$(CC) $(MOD_CFLAGS) -c sarlib/sarlib.c -o $@

lib:
	$(MKD_P) $@

lib/cxacru.$(KO):		$(MODCXACRU_O)
	$(CCLD) $(MOD_LDFLAGS) $(MODCXACRU_O) $(MOD_LIBS) -o $@

module/cxacru.o:	include/cxacru.h
module/cxacru.o:	module/cxacru.c
	$(CC) $(MOD_CFLAGS) -c module/cxacru.c -o $@

lib/cxacru2.$(KO):	module2/cxacru.$(KO)
	$(CP_P) module2/cxacru.$(KO) $@

module2/cxacru.$(KO):
	cd module2 && $(MAKE) -C $(KDIR) -$(MAKEFLAGS) SUBDIRS=.

$(ISBIN):		;			$(MKD_P) $@
$(ISBIN)/%:		sbin/%;			$(CP_P) $? $@

$(IKMOD):		;			$(MKD_P) $@
$(IKMOD)/%.$(KO):	lib/%.$(KO);		$(CP_P) $? $@

$(IDATA):		;			$(MKD_P) $@
$(IDATA)/%.bin:		firmware/%.bin;		$(CP_P) $? $@

ifeq "$(K24)" "yes"
$(IKDEP):		$(IKMOD)/cxacru.$(KO)
endif
ifeq "$(K26)" "yes"
#$(IKDEP):		$(IKMOD)/cxacru2.$(KO)
endif
$(IKDEP):
	-$(DEPMOD_AE) -b $(TOP)

.PHONY:			clean realclean

clean:
	$(RM_F) $(CXLOAD_O)
	$(RM_F) $(CXIOCTL_O)
	$(RM_F) $(BR2684_O)
	$(RM_F) $(MODCXACRU_O)

realclean:		clean
	$(RM_F) sbin/cxctl
	$(RM_F) sbin/cxload
	$(RM_F) sbin/br2684ctl
	$(RMD_F) sbin
	$(RM_F) lib/cxacru.$(KO)
	$(RM_F) lib/cxacru2.$(KO)
	$(RMD_F) lib
