##############################################################################
# Copyright 2001 by NeTraverse, Inc.
# This software is distributed under the terms of the GPL
# which is supplied in the LICENSE file with this distribution
##############################################################################
# $Id: Makefile,v 1.9 2002/03/07 19:56:05 rlawrence Exp $
##############################################################################
# This file will live inside or outside of the kernel tree, and should 
# "do the right thing" in either case. 
##############################################################################

ifneq ($(TOPDIR),)  # we are in the kernel tree

MKI_OBJ_DIR=

#if called from the kernel, use the TOPDIR as KERN_SRC
KERN_SRC=$(TOPDIR)

faketarget: 

# required targets to live in the kernel tree:
modules: mki-adapter.o
	rm -f $(TOPDIR)/modules/mki-adapter.o
	@ln -sf ../arch/i386/mki-adapter/mki-adapter.o $(KERN_SRC)/modules/. || echo "no symlink for 2.4"

fastdep: 
	@echo "no deps needed"

VERSION=$(shell grep '^VERSION' $(TOPDIR)/Makefile|\
	sed -e's/VERSION *= *//g'|sed -e's/ //g')
PATCHLEVEL=$(shell grep '^PATCHLEVEL' $(TOPDIR)/Makefile|\
	sed -e's/PATCHLEVEL *= *//g'|sed -e's/ //g')

else # we are not called from the kernel tree, so set everything up.
############################################################################
# OVERRIDE THIS HERE OR ON THE MAKE COMMAND LINE TO GET THE RIGHT KERNEL 
# SOURCES FOR YOUR NETRAVERSE KERNEL. if the patch is applied to a kernel tree
# then this default should work
############################################################################
ifeq ($(KERN_SRC),)
KERN_SRC=../../..
endif

CC=gcc
LD=ld

.PHONY: mki-all
mki-all: all-mki-targets

export KERN_SRC
	
Makefile.kernel: makefile-made
	sed -e 's:^include :include \$$\(TOPDIR\)/:'<$(KERN_SRC)/Makefile | \
	sed -e "s:^TOPDIR.*:TOPDIR=$(KERN_SRC):" | \
	sed -e "s/^clean:/old-clean:/" >Makefile.kernel

makefile-made:
	touch makefile-made

# ok, get the config included, we don't really care about deps. what we are after
# is just the CFLAGS here
ifeq ($(KERN_SRC)/.config, $(wildcard $(KERN_SRC)/.config))
include $(KERN_SRC)/.config
endif

include Makefile.kernel # rule to create it is above...

MKI_OBJ_DIR=$(KERNELRELEASE)/

endif # end of set up based on kernel/non-kernel location

prefix=
STD_INC=/usr/include

KERNVER=$(VERSION)$(PATCHLEVEL)

ifeq ($(KERN_INC),)
KERN_INC=$(KERN_SRC)/include
endif

# Test for "new" version 3 mki
MKI=$(shell if ! grep -q "MKI_HOOK_TABLE_EXISTS" $(KERN_INC)/asm*/mki.h ; then echo mki ; fi)
# if so, then use the mkinn.c instead of the mkimki.c version
ifeq ($(MKI),mki)
	MKIMOD=mki$(MKI)
else
	MKIMOD=mki$(KERNVER)
endif

REGCFLAGS=-I. -I$(KERN_INC) -I$(STD_INC) -Wall -Wno-format -O2 -pipe -fno-strength-reduce -malign-loops=2 -malign-jumps=2 -m486

MKICFLAGS = -I. -I$(KERN_INC)
# get rid of strict prototypes, because it is a problem for the network structures
MKICFLAGS += $(shell echo $(CFLAGS)|sed -e's/-Wstrict-prototypes//g')
ifdef CONFIG_SMP
MKICFLAGS += -D__SMP__
endif
TARGETS=$(MKI_OBJ_DIR)mki-adapter.o rmmakefile

MOD_OBJS=$(MKI_OBJ_DIR)mki-main.o \
	$(MKI_OBJ_DIR)mkivnet.o \
	$(MKI_OBJ_DIR)timer.o \
	$(MKI_OBJ_DIR)mki.o 

.PHONY: all-mki-targets
all-mki-targets: check-version $(TARGETS)

force: $(TARGETS)

$(MKI_OBJ_DIR)mki-adapter.o: $(MKI_OBJ_DIR) $(MOD_OBJS)
	$(LD) -r $(LDFLAGS) -o $@ $(MOD_OBJS)

.PHONY: rmmakefile
rmmakefile:
	rm -f makefile-made

modules_install:
	mkdir -p $(MODLIB)/kernel/arch/i386/mki-adapter
	cp mki-adapter.o $(MODLIB)/kernel/arch/i386/mki-adapter/mki-adapter.o

local_modules_install:
	mkdir -p $(MODLIB)/kernel/arch/i386/mki-adapter
	cp $(MKI_OBJ_DIR)mki-adapter.o $(MODLIB)/kernel/arch/i386/mki-adapter/mki-adapter.o

$(MKI_OBJ_DIR):
	mkdir -p $(MKI_OBJ_DIR)

$(MKI_OBJ_DIR)mki-main.o: mki-main.c mki-adapter.h mkifunc.h
	$(CC) $(MKICFLAGS) $(MODFLAGS) -c mki-main.c -o $@

$(MKI_OBJ_DIR)mki.o: $(MKIMOD).c mkifunc.h mki-adapter.h $(KERN_INC)/asm-i386/mki.h
	$(CC) $(MKICFLAGS) $(MODFLAGS) -c $(MKIMOD).c -o $@

$(MKI_OBJ_DIR)timer.o: timer.c mkifunc.h mki-adapter.h
	$(CC) $(MKICFLAGS) $(MODFLAGS) -c timer.c -o $@

$(MKI_OBJ_DIR)mkivnet.o: mkivnet.c mkifunc.h mki-adapter.h vnetint-pub.h vneteth.h
	$(CC) $(MKICFLAGS) $(MODFLAGS) -c mkivnet.c -o $@

get-version: get-version.c
	$(CC) $(REGCFLAGS) -g -o $@ get-version.c

check-version: version.header version.running
	@cmp version.header version.running >/dev/null 2>&1 ; \
	if [ $$? -ne 0 ] ; then \
	  echo ; \
	  echo "WARNING - The kernel version you are running:" ; \
	  echo `cat version.running` ; \
	  echo "does not match the version of the headers you are using:" ; \
	  echo `cat version.header` ; \
	  echo ; \
	  echo "If you are sure you know what you are doing, just run \"make force\" "; \
	  echo "but you probably want to use KERN_INC=/path/to/linux/include "; \
	  echo "after your make target (i.e. make install KERN_INC=/usr/src/linux/include )"; \
	  echo ; \
	  rm -f version.header version.running ; \
	  exit 1 ;\
	fi
	rm -f version.header version.running

version.header: get-version
	@echo `./get-version` > version.header

version.running:
	@uname -r > version.running


clean:
	rm -f $(TARGETS) $(MOD_OBJS) get-version *.o *~ core ID tags TAGS *.tar.gz version.* Makefile.kernel makefile-made

install_mki: mki-adapter.o get-version
	mkdir -p $(prefix)/lib/modules/`./get-version`/kernel/arch/i386/kernel
	mkdir -p $(prefix)/lib/modules/`./get-version`/misc
	install -m 555 mki-adapter.o $(prefix)/lib/modules/`./get-version`/kernel/arch/i386/kernel
	ln -s ../kernel/arch/i386/kernel/mki-adapter.o $(prefix)/lib/modules/`./get-version`/misc/.
	ln -s ./`./get-version`/kernel/arch/i386/kernel/mki-adapter.o $(prefix)/lib/modules/.

install_headers: 
	mkdir -p $(prefix)/usr/include/mki-adapter
	install -m 666 mkifunc.h $(prefix)/usr/include/mki-adapter/mkifunc.h
	install -m 666 mki-adapter.h $(prefix)/usr/include/mki-adapter/mki-adapter.h
	install -m 666 vnetint-pub.h $(prefix)/usr/include/mki-adapter/vnetint-pub.h
	install -m 666 vneteth.h $(prefix)/usr/include/mki-adapter/vneteth.h

#
# these rules will create a patch file for a particular kernel tree that 
# already has an mki version 2 or greater patch applied to it.
#

DIFFDIR=$(HOME)/tmp

DISTFILES=README LICENSE get-version.c vneteth.h vnetint-pub.h Makefile mkifunc.h mkivnet.c timer.c mki-adapter.h mki-main.c mki22.c mki24.c mkimki.c

patch:
	mkdir -p $(DIFFDIR)/kernelold/arch/i386
	mkdir -p $(DIFFDIR)/kernelnew/arch/i386/mki-adapter
	@if grep '^MOD_SUB_DIRS += arch/i386/mki-adapter' \
		$(KERN_SRC)/arch/i386/Makefile >/dev/null 2>&1 ; \
	then \
		echo "" ; \
		echo "The mki-adapter is already in this kernel tree" ; \
		echo "Please point to a kernel tree that does not" ; \
		echo "contain the adapter to generate a patchfile" ; \
		echo "" ; \
		exit 1 ; \
	else \
		cp $(KERN_SRC)/arch/i386/Makefile \
			$(DIFFDIR)/kernelold/arch/i386 ;\
		echo "# Added by mki-adapter patch:" \
			>$(DIFFDIR)/kernelnew/arch/i386/Makefile ; \
		echo "SUBDIRS += arch/i386/mki-adapter" \
			>>$(DIFFDIR)/kernelnew/arch/i386/Makefile ; \
		echo "MOD_SUB_DIRS += arch/i386/mki-adapter" \
			>>$(DIFFDIR)/kernelnew/arch/i386/Makefile ; \
		cat $(KERN_SRC)/arch/i386/Makefile \
		>> $(DIFFDIR)/kernelnew/arch/i386/Makefile ; \
	fi
	cp -R $(DISTFILES) $(DIFFDIR)/kernelnew/arch/i386/mki-adapter/.
	@(cd $(DIFFDIR);diff -ruN kernelold kernelnew) >mki-adapter.patch \
		|| echo "mki-adapter.patch created"
	rm -fr $(DIFFDIR)/kernelold $(DIFFDIR)/kernelnew

