ifndef KERNEL_SRC
SYSTEM_KERNEL_VER := $(shell uname -r| cut -c1-3)
ifeq ($(SYSTEM_KERNEL_VER), 2.6)
KERNEL_SRC      = /usr/src/linux-2.6
else
KERNEL_SRC      = /usr/src/linux-2.4
endif
endif

KERNEL_VER := $(shell cat $(KERNEL_SRC)/include/linux/version.h | grep UTS_RELEASE | cut -c22-24 | head -n 1)

ARCH := $(shell uname -m)

# Object files to compile
CORE_OBJS       := mvSata.o mvStorageDev.o mvLog.o
IAL_OBJS        := mvLinuxIalLib.o mvLinuxIalHt.o mvLinuxIalOs.o mvIALCommon.o mvIALCommonUtils.o mvLinuxIalSmart.o
SAL_OBJS        := mvScsiAtaLayer.o
PWD             := $(shell pwd)
INCLUDE_DIRS    := -I$(KERNEL_SRC)/drivers/scsi


ifeq ($(KERNEL_VER), 2.6)
EXTRA_CFLAGS += -DLINUX -D__LINUX__ $(INCLUDE_DIRS) $(EXTERNAL_CFLAGS)
clean-files := *.o
obj-m := mv_sata.o
mv_sata-objs := $(IAL_OBJS) $(CORE_OBJS) $(SAL_OBJS)

all: link_files
	$(MAKE) -C $(KERNEL_SRC) M=$(PWD) SUBDIRS=$(PWD)

copy:   all
	@cp mv_sata.ko $(DEST_DIR)
	@echo mv_sata.ko copied to $(DEST_DIR)
else
TARGET          := mv_sata.o
CC              = $(CROSS_COMPILE)gcc
LD              = $(CROSS_COMPILE)ld
EXTERNAL_CFLAGS =

# Standard flags for building modules
CFLAGS          = -DLINUX -D__KERNEL__ -DMODULE -O2 -pipe -Wall
CFLAGS          += -I- -I$(KERNEL_SRC)/include -I$(KERNEL_SRC)/drivers/scsi -I.
CFLAGS          += $(shell [ -f $(KERNEL_SRC)/include/linux/modversions.h ] && \
                        echo "-DMODVERSIONS -DEXPORT_SYMTAB -include \
                        $(KERNEL_SRC)/include/linux/modversions.h")
CFLAGS          += $(EXTERNAL_CFLAGS)


ifeq ($(ARCH), x86_64)
CFLAGS += -mcmodel=kernel
endif

all: link_files
	@$(MAKE) $(TARGET)

.c.o:
	$(CC) $(CFLAGS) -c $*.c -o $*.o

$(TARGET): $(CORE_OBJS) $(IAL_OBJS) $(SAL_OBJS)
	$(LD) -r $^ -o $@

copy:   all
	@cp mv_sata.o $(DEST_DIR)
	@echo mv_sata.o copied to $(DEST_DIR)

endif

help:
	@echo extra options for make:
	@echo \"CFLAGS_EXTRA=-DMV_LOG_DEBUG\": for full debug
	@echo \"CFLAGS_EXTRA=-DMV_LOG_ERROR\": for debug on error
	@echo copy \"DEST_DIR=your_dir\": to copy the driver binary to "your_dir" directory
	
link_files:
	@rm -f $(PWD)/mvOs.h $(PWD)/mvLog.h $(PWD)/mvLog.c $(PWD)/mvSata.h $(PWD)/mvSata.c $(PWD)/mvRegs.h
	@rm -f $(PWD)/mvStorageDev.h $(PWD)/mvStorageDev.c
	@rm -f $(PWD)/mvIALCommon.h $(PWD)/mvIALCommon.c $(PWD)/mvIALCommonUtils.h $(PWD)/mvIALCommonUtils.c
	@rm -f $(PWD)/mvScsiAtaLayer.h $(PWD)/mvScsiAtaLayer.c
	@ln -s $(PWD)/mvOsLinux.h $(PWD)/mvOs.h
	@ln -s $(PWD)/../CoreDriver/mvRegs.h $(PWD)/mvRegs.h
	@ln -s $(PWD)/../CoreDriver/mvLog.h $(PWD)/mvLog.h
	@ln -s $(PWD)/../CoreDriver/mvLog.c $(PWD)/mvLog.c
	@ln -s $(PWD)/../CoreDriver/mvSata.h $(PWD)/mvSata.h
	@ln -s $(PWD)/../CoreDriver/mvSata.c $(PWD)/mvSata.c
	@ln -s $(PWD)/../CoreDriver/mvStorageDev.h $(PWD)/mvStorageDev.h
	@ln -s $(PWD)/../CoreDriver/mvStorageDev.c $(PWD)/mvStorageDev.c
	@ln -s $(PWD)/../IALCommon/mvIALCommon.h $(PWD)/mvIALCommon.h
	@ln -s $(PWD)/../IALCommon/mvIALCommon.c $(PWD)/mvIALCommon.c
	@ln -s $(PWD)/../IALCommon/mvIALCommonUtils.h $(PWD)/mvIALCommonUtils.h
	@ln -s $(PWD)/../IALCommon/mvIALCommonUtils.c $(PWD)/mvIALCommonUtils.c
	@ln -s $(PWD)/../ScsiAtaLayer/mvScsiAtaLayer.h $(PWD)/mvScsiAtaLayer.h
	@ln -s $(PWD)/../ScsiAtaLayer/mvScsiAtaLayer.c $(PWD)/mvScsiAtaLayer.c

rm_files:
	@rm -f $(PWD)/mvOs.h $(PWD)/mvLog.h $(PWD)/mvLog.c $(PWD)/mvSata.h $(PWD)/mvSata.c $(PWD)/mvRegs.h
	@rm -f $(PWD)/mvStorageDev.h $(PWD)/mvStorageDev.c
	@rm -f $(PWD)/mvIALCommon.h $(PWD)/mvIALCommon.c $(PWD)/mvIALCommonUtils.h $(PWD)/mvIALCommonUtils.c
	@rm -f $(PWD)/mvScsiAtaLayer.h $(PWD)/mvScsiAtaLayer.c
clean:   rm_files
	@rm -f *.o *.ko .*.cmd .*.o.flags *.mod.c
