#
#  SCSI target mid-level makefile
#
#  Copyright (C) 2015 - 2018 Vladislav Bolkhovitin <vst@vlnb.net>
#  Copyright (C) 2004 - 2005 Leonid Stoljar
#  Copyright (C) 2007 - 2018 Western Digital Corporation
#
#  This program is free software; you can redistribute it and/or
#  modify it under the terms of the GNU General Public License
#  as published by the Free Software Foundation, version 2
#  of the License.
#
#  This program is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#  GNU General Public License for more details.
#
#
# Main targets:
#    all (the default) : make all
#    clean             : clean files
#    extraclean        : clean + clean dependencies
#    install           : install
#    uninstall         : uninstall
#
# Notes :
#    - install and uninstall must be made as root
#

ifndef PREFIX
        PREFIX=/usr/local
endif

SHELL=/bin/bash

DEV_HANDLERS_DIR = dev_handlers

ifeq ($(KVER),)
  ifeq ($(KDIR),)
    KVER := $(shell uname -r)
    KDIR := /lib/modules/$(KVER)/build
  else
    KVER := $(strip $(shell						\
	cat $(KDIR)/include/config/kernel.release 2>/dev/null ||	\
	make -s -C $(KDIR) kernelversion))
  endif
else
  ifeq ($(KDIR),)
    KDIR := /lib/modules/$(KVER)/build
  endif
endif

ifeq ($(INSTALL_MOD_PATH),)
  export INSTALL_MOD_PATH := $(DESTDIR)
endif

ifeq ($(SCST_INC_DIR),)
SCST_INC_DIR := ../include
endif

SCST_INTF_VER_FILE := $(SCST_INC_DIR)/scst_itf_ver.h

$(SCST_INTF_VER_FILE): $(SCST_INC_DIR)/scst.h $(SCST_INC_DIR)/scst_const.h $(SCST_INC_DIR)/scst_user.h
	echo "/* Autogenerated, don't edit */" >$(SCST_INTF_VER_FILE)
	echo "" >>$(SCST_INTF_VER_FILE)
	echo -n "#define SCST_INTF_VER " >>$(SCST_INTF_VER_FILE)
	echo "\"`sha1sum $(SCST_INC_DIR)/scst.h|awk '{printf $$1}'`\"" >>$(SCST_INTF_VER_FILE)
	echo -n "#define SCST_CONST_INTF_VER " >>$(SCST_INTF_VER_FILE)
	echo "\"`sha1sum $(SCST_INC_DIR)/scst_const.h|awk '{printf $$1}'`\"" >>$(SCST_INTF_VER_FILE)
	echo -n "#define DEV_USER_INTF_VER " >>$(SCST_INTF_VER_FILE)
	echo "\"`sha1sum $(SCST_INC_DIR)/scst_user.h|awk '{printf $$1}'`\"" >>$(SCST_INTF_VER_FILE)

all: $(SCST_INTF_VER_FILE)
	$(MAKE) -C certs KDIR=$(KDIR)					\
	  $(shell [ -n "$(PASS_CC_TO_MAKE)" ] && echo CC="$(CC)")
	$(MAKE) -C $(KDIR) M=$(shell pwd)				\
	  $(shell [ -n "$(PASS_CC_TO_MAKE)" ] && echo CC="$(CC)")
	$(MAKE) -C $(KDIR) M=$(shell pwd)/dev_handlers			\
	  $(shell [ -n "$(PASS_CC_TO_MAKE)" ] && echo CC="$(CC)")

scst:
	$(MAKE) -C $(KDIR) M=$(shell pwd)				\
	  $(shell [ -n "$(PASS_CC_TO_MAKE)" ] && echo CC="$(CC)")

install: all
	@if [ -z "$(DESTDIR)" ] && \
        { rpm -q scst || rpm -q scst-devel; } >/dev/null 2>&1; then \
	echo Error: the scst and/or scst-devel RPMs must be uninstalled first; \
	false; fi
	-rm -f $(INSTALL_DIR)/scsi_tgt.ko
	KDIR=$(KDIR) ../../scripts/sign-modules
	$(MAKE) -C $(KDIR) M=$(shell pwd)/dev_handlers			\
	  $(shell [ -n "$(PASS_CC_TO_MAKE)" ] && echo CC="$(CC)")	\
	  INSTALL_MOD_DIR=extra/dev_handlers				\
	  $$([ -n "$(DEPMOD)" ] && echo "DEPMOD=$(DEPMOD)")		\
	  CONFIG_MODULE_SIG_ALL= modules_install
	$(MAKE) -C $(KDIR) M=$(shell pwd)				\
	  $(shell [ -n "$(PASS_CC_TO_MAKE)" ] && echo CC="$(CC)")	\
	  $$([ -n "$(DEPMOD)" ] && echo "DEPMOD=$(DEPMOD)")		\
	  CONFIG_MODULE_SIG_ALL= modules_install
	install -d $(INSTALL_DIR_H)
	header_files="backport.h build_mode.h scst.h scst_const.h	\
		      scst_debug.h scst_itf_ver.h scst_sgv.h		\
		      scst_user.h";					\
	for h in $${header_files}; do					\
	    install -m 644 ../include/$$h $(INSTALL_DIR_H);		\
	done
	rm -f $(INSTALL_DIR_H)/Module.symvers
	install -m 644 Module.symvers $(INSTALL_DIR_H)
	mkdir -p $(DESTDIR)/var/lib/scst/pr
	mkdir -p $(DESTDIR)/var/lib/scst/dif_tags
	mkdir -p $(DESTDIR)/var/lib/scst/vdev_mode_pages
	@echo "****************************************************************"
	@echo "*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*"
	@echo "*!!                                                          !!*"
	@echo "*!!  Now don't forget to rebuild and reinstall all your      !!*"
	@echo "*!!  target drivers, custom dev handlers and necessary user  !!*"
	@echo "*!!  space applications. Otherwise, because of the versions  !!*"
	@echo "*!!  mismatch, you could have many problems and crashes.     !!*"
	@echo "*!!  See IMPORTANT note in the \"Installation\" section of     !!*"
	@echo "*!!  SCST's README file for more info.                       !!*"
	@echo "*!!                                                          !!*"
	@echo "*!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*"
	@echo "****************************************************************"

uninstall:
	cd $(DEV_HANDLERS_DIR) && $(MAKE) $@
	rm -f $(INSTALL_DIR)/scst.ko
	-rmdir $(INSTALL_DIR) 2>/dev/null
	-/sbin/depmod -b $(INSTALL_MOD_PATH)/ -a $(KVER)
	rm -rf $(INSTALL_DIR_H)

INSTALL_DIR := $(INSTALL_MOD_PATH)/lib/modules/$(KVER)/extra
INSTALL_DIR_H := $(DESTDIR)$(PREFIX)/include/scst

clean:
	rm -f $(SCST_INTF_VER_FILE)
	$(MAKE) -C $(KDIR) M=$(shell pwd) $@
	$(MAKE) -C $(DEV_HANDLERS_DIR) $@

extraclean: clean
	rm -f $(SCST_INTF_VER_FILE)
	cd $(DEV_HANDLERS_DIR) && $(MAKE) $@
	rm -f *.orig *.rej

.PHONY: all install uninstall clean extraclean
