# *******************************************************************
# *	Copyright (c) 1994-1998 Jetico, Inc., Finland
# *	All rights reserved.
# *
# *	File:		driver/Makefile
# *
# *	Description:	makefile
# *
# *	Scope:		BestCrypt pseudo-device driver
# *
# *	Platforms:	Linux
# * 
# *	Author:		Nail R. Kaipov
# *
# *	Created:	10-Nov-1998
# *
# *	Revision:    
# *
# *******************************************************************/

unexport CFLAGS
unexport LDFLAGS

CC = gcc
LD = ld
MAKE = make
GENKSYMS = /sbin/genksyms

CC_VER = $(shell gcc -dumpversion)
CC_KER = $(shell cat /proc/version | sed 's/\(.*\)\(gcc version\ \)\([[:alnum:][:punct:]]*\)\(.*\)/\3/g')

ifeq (,$(findstring $(CC_VER), $(shell cat /proc/version)))
$(warning Warning! your compiler version ($(CC_VER)) does not match kernel compiler version ($(CC_KER)))
endif

#ifneq ($(CC_VER),$(CC_KER))
#$(warning Warning! your compiler version ($(CC_VER)) does not match kernel compiler version ($(CC_KER)))
#endif

CUR_DIR = $(shell pwd)
ARCH = $(shell uname -m | sed -e s/i.86/i386/)

CFLAGS = -c -D__KERNEL__ -DMODULE 

KVER = $(shell uname -r | sed 's/\(.\..\).*/\1/')

OBJS = bc_dev22.o
KEXT = o
#######################################################################
#	Linux 2.2.x 
#######################################################################
ifeq ($(KVER), 2.2)
KERNEL_DIR = /usr/src/linux
SYMSRC = bc_dev22.c
endif

#######################################################################
#	Linux 2.3.x 
#######################################################################
ifeq ($(KVER), 2.3)
KERNEL_DIR = /usr/src/linux
SYMSRC = bc_dev22.c
endif

#######################################################################
#	Linux 2.4.x 
#######################################################################
ifeq ($(KVER), 2.4)
KERNEL_DIR = /lib/modules/$(shell uname -r)/build
OBJS = bc_dev24.o
SYMSRC = bc_dev24.c
CFLAGS += $(shell $(CC) -I$(KERNEL_DIR)/include/ -c test_nice.c -o /dev/null 2>/dev/null && echo "-D_NICE_PRESENT_")
CFLAGS += $(shell $(CC) -I$(KERNEL_DIR)/include/ -c test_gendisk.c -o /dev/null 2>/dev/null && echo "-D_GENDISK_OLD_")
endif

#######################################################################
#	Linux 2.5.x is not supported
#######################################################################
ifeq ($(KVER), 2.5)
$(error Error! BestCrypt for Linux won't work on 2.5.x kernels. Good luck.)
endif

#######################################################################
#	Linux 2.6.x 
#######################################################################
ifeq ($(KVER), 2.6)
KERNEL_TMP = /lib/modules/$(shell uname -r)
ifeq ($(shell [ -e $(KERNEL_TMP)/source ] && echo "123"), 123)
KERNEL_DIR=$(KERNEL_TMP)/source
else
KERNEL_DIR=$(KERNEL_TMP)/build
endif
#KERNEL_DIR = /lib/modules/$(shell uname -r)/build
OBJS = bc_dev26.o
CFLAGS += -I$(KERNEL_DIR)/include/asm/mach-default/ -DKBUILD_BASENAME=BestCrypt
#CFLAGS += $(shell $(CC) -I$(KERNEL_DIR)/include/ -I$(KERNEL_DIR)/include/asm/mach-default/ -c test_blkdev_put.c -o /dev/null 2>/dev/null && echo "-D_BLKDEV_2_")
CFLAGS += $(shell $(CC) -I$(KERNEL_DIR)/include/ -I$(KERNEL_DIR)/include/asm/mach-default/ -c test_this_module.c -o /dev/null 2>/dev/null && echo "-D_NEED_THIS_MODULE")
CFLAGS += $(shell $(CC) -I$(KERNEL_DIR)/include/ -I$(KERNEL_DIR)/include/asm/mach-default/ -c test_regparm.c -o /dev/null 2>/dev/null && echo "-mregparm=3")
KEXT = ko
endif

CFLAGS += -I$(CUR_DIR)/../include/ -I$(KERNEL_DIR)/include/

ifeq ($(ARCH), alpha)
CFLAGS += -O2 -pipe -fno-strict-aliasing -fno-common -mno-fp-regs -ffixed-8 -mcpu=ev5
else
ifeq ($(ARCH), x86_64)
CFLAGS += -O2 -fno-strength-reduce -fno-strict-aliasing -mcmodel=kernel
else
CFLAGS += -O6 -fno-strength-reduce -fno-strict-aliasing 
endif
endif

LDFLAGS = -d -r

SUBDIRS = gost blowfish twofish des bf128 bf448 cast idea 3des rijn
OBJS += bc_mgr.o
TARGET = bc.$(KEXT)

all: $(TARGET) subdirs 

$(TARGET): $(OBJS)
	$(LD) $(LDFLAGS) -o $(TARGET) $(OBJS)
	cp -f $(TARGET) ../bin

subdirs:
	set -e; for i in $(SUBDIRS); do \
	$(MAKE) -C $$i KERNEL_DIR=$(KERNEL_DIR) CFLAGS="$(CFLAGS) -DKBUILD_MODNAME=bc_$$i" TARGET=bc_$$i.$(KEXT) ; \
	done

run_depmod:
	depmod -a; sync

cleansubdirs:
	set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean; done

clean: cleansubdirs
	rm -f *.o *.ko *.ver *~ mkver

mkver: mkver.c
	$(CC) -I$(KERNEL_DIR)/include -o $@ $<

bc_dev.ver: $(SYMSRC) mkver
	touch $@ ;
	$(CC) -I$(KERNEL_DIR)/include/ -E $(SYMSRC) $(shell ./mkver) > $@

# dependencies

bc_cfg.h: Makefile
bc_dev22.o: bc_cfg.h bc_mgr.h bc_dev22.c bc_dev.h bc_dev.ver Makefile
bc_dev24.o: bc_cfg.h bc_mgr.h bc_dev24.c bc_dev.h bc_dev.ver test_nice.c test_gendisk.c Makefile
bc_dev26.o: bc_cfg.h bc_mgr.h bc_dev26.c bc_dev.h Makefile
bc_mgr.o: bc_cfg.h bc_mgr.h Makefile
