#/*******************************************************************
# * This file is part of the Emulex Linux Device Driver for         *
# * Enterprise Fibre Channel Host Bus Adapters.                     *
# * Refer to the README file included with this package for         *
# * driver version and adapter support.                             *
# * Copyright (C) 2004 Emulex Corporation.                          *
# * www.emulex.com                                                  *
# *                                                                 *
# * 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; either version 2  *
# * of the License, or (at your option) any later version.          *
# *                                                                 *
# * 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, a copy of which    *
# * can be found in the file COPYING included with this package.    *
# *******************************************************************/

# Change  the value to 20 in the following line if varyio is desired in SLES 8.
SLES_VARYIO = 1

#HARDW = i386;
#HARDW = ia64;
#HARDW = ppc64;
#RH = /usr/src/redhat;
#RH = /usr/src/packages;
#APP = rpm;
#APP = rpmbuild;
OBJ_LOWER = fcscsib.o fcmboxb.o fcmemb.o fcelsb.o fcstratb.o fcxmitb.o fcrpib.o fcclockb.o 

ia64: build
ifeq ($(MAKECMDGOALS),ia64)
HARDW = $(MAKECMDGOALS)
endif

ppc64: build
ifeq ($(MAKECMDGOALS),ppc64)
HARDW = $(MAKECMDGOALS)
endif

i386: build
ifeq ($(MAKECMDGOALS),i386)
HARDW = $(MAKECMDGOALS)
endif

build: clean STenv linkit

modules: clean STenv linkit 

install: STenv
	@$(TC_INSTALL) -d $(MODPATH)/scsi; 
	@$(TC_INSTALL) -c $(LPFCVER) $(MODPATH)/scsi/$(LPFCO).o; 
	@$(TC_INSTALL) -d $(MODPATH)/net; 
	@$(TC_INSTALL) -c $(LPFNVER) $(MODPATH)/net/$(LPFNO).o;  

STenv: find_env STX86 STX64 STP64 

find_env:  
ifeq ($(MAKECMDGOALS),RPM)
OPTRPM = -bb
endif
ifeq ($(MAKECMDGOALS),rpm)
OPTRPM = -bb
endif
ifeq ($(MAKECMDGOALS),src)
OPTRPM = -bs
endif
ifeq ($(MAKECMDGOALS),SRC)
OPTRPM = -bs
endif
ifndef ($(RH))
############ Determine distro
RH := $(shell if [ -e $(TC_RHEL3ROOT)/usr/src/packages ]; then echo $(TC_RHEL3ROOT)/usr/src/packages; \
   else echo $(TC_RHEL3ROOT)/usr/src/redhat; fi)
endif
USE_HIGHMEM_IO = 0
ifeq ($(RH),$(TC_RHEL3ROOT)/usr/src/redhat)
BASERH = redhat
else
BASERH = packages
USE_HIGHMEM_IO = 3
endif
ifeq ($(HARDW),)
############ Determine hardware
HARDT := $(shell $(TC_UNAME) -m)
ifeq ($(HARDT),i686)
HARDW = i386
else
ifeq ($(HARDT),ia64)
HARDW = ia64
else
HARDW = ppc64
endif
endif
endif
ifndef KERNELVERSION
	KERNELVERSION = $(shell $(TC_UNAME) -r)
endif
CRVERS := $(shell `echo `$(TC_GREP) LPFC_DRIVER_VERSION ./lpfcLINUXfcp.c | $(TC_GREP) define | $(TC_SED) "s/.*VERSION .//" | $(TC_SED) s/\"//``)

############ Determine context
ifeq ($(CONFIG_SCSI_LPFC_2XX),m)
 CONTX = KM
else
 ifeq ($(CONFIG_SCSI_LPFC_2XX),y)
  CONTX = KB
 else
 CONTX = MO
 endif
endif

ifeq ($(CONTX),MO)
############ Determine includes 
LIBPATH := /lib/modules/$(KERNELVERSION)
MODPATH := $(LIBPATH)/kernel/drivers
BASEINCLUDE := $(shell if [ -e $(LIBPATH)/build ]; then \
             echo $(LIBPATH)/build; \
             else if [ -e /usr/src/linux-2.4 ]; then \
             echo /usr/src/linux-2.4; else echo /usr/src/linux; fi fi)
else
LIBPATH := $(shell if [ -e $(MODLIB) ]; then \
             echo $(MODLIB); \
             else echo /lib/modules/$(KERNELVERSION); fi)
BASEINCLUDE := $(TOPDIR)
MODPATH = $(LIBPATH)/kernel/drivers
endif

ifeq ($(HARDW),ppc64)
ifndef ($(CROSS_COMPILE))
CROSS_COMPILE := $(shell if [ -e /usr/local/ppc64-current3.0/bin/powerpc64-linux-gcc ]; then \
    echo /usr/local/ppc64-current3.0/bin/powerpc64-linux-; \
    else if [ -e /opt/cross/bin/powerpc64-linux-gcc ]; then \
    echo /opt/cross/bin/powerpc64-linux- ; fi fi)
endif
endif
MODINC = -DMODULE -DMODVERSIONS -include $(BASEINCLUDE)/include/linux/modversions.h 

# The following variable controls VARYIO support:
# If
# VARYIO=1, the system will attempt to configure VARYIO support automatically
# VARYIO=20, we set ".can_do_vary = 1" in the Scsi_Host_Template (Ex: SLES, AS2.1/IA64)
# VARYIO=21, we use SCSI_HOST_VARYIO macro (Ex: AS2.1/x86)
# VARYIO=3, we set ".vary_io = 1" in the Scsi_Host_Template (Ex: AS3.0)
# any other value of VARYIO will disable VARYIO support (Ex: RH 9.0)

VARYIO = $(SLES_VARYIO)
ifeq ($(VARYIO),1)
  VARYIO = 0 
  ifeq ($(findstring release 2,$(shell $(TC_CAT) $(TC_RHEL3ROOT)/etc/redhat-release  2>/dev/null)),release 2)
     ifeq ($(HARDT),i686)
             VARYIO = 21
             USE_HIGHMEM_IO = 2
     else
             USE_HIGHMEM_IO = 3
             VARYIO = 20
     endif
  else
    ifeq ($(findstring release 3,$(shell $(TC_CAT) $(TC_RHEL3ROOT)/etc/redhat-release  2>/dev/null)),release 3)
       VARYIO = 3
       USE_HIGHMEM_IO = 3
    endif
  endif
endif

ENV += -DVARYIO=$(VARYIO)
ENV += -DUSE_HIGHMEM_IO=$(USE_HIGHMEM_IO)

LPFCO   = lpfcdd_2xx
LPFNO   = lpfndd_2xx
ifeq ($(CONTX),MO)
LPFCVER = $(LPFCO).o
LPFNVER = $(LPFNO).o
else
LPFCVER = ../$(LPFCO).o
LPFNVER = $(LPFNO).o
endif
OBJ_CORE_L = lpfc_core.o core.o prod_linux.o
OBJ_PROD_L = lpfcLINUXfcp.o 
OBJ_PROD_U = lpfcLINUXlan.o 


obj_lower: 
	$(CC) $(CDEFS) -D__KERNEL__ $(CFLAGS) $(ENV) $(INCLUDEDIR) -c lpfc_core.c
	$(CC) $(CDEFS) -D__KERNEL__ $(CFLAGS) $(ENV) $(INCLUDEDIR) -c core.c
	$(CC) $(CDEFS) -D__KERNEL__ $(CFLAGS) $(ENV) $(INCLUDEDIR) -c prod_linux.c
	$(CC) $(CDEFS) -D__KERNEL__ $(CFLAGS) $(ENV) $(INCLUDEDIR) -c lpfcLINUXfcp.c 
	$(CC) $(CDEFS) -D__KERNEL__ $(CFLAGS) $(ENV) $(INCLUDEDIR) -c lpfcLINUXlan.c
linkit: obj_lower
ifeq ($(CONTX),KB)
	$(LD) -m $(ELF) -r -o $(LPFCVER) $(OBJ_CORE_L) $(OBJ_PROD_L) $(OBJ_PROD_U)
else
	$(LD) -m $(ELF) -r -o $(LPFCVER) $(OBJ_CORE_L) $(OBJ_PROD_L)  
	$(LD) -m $(ELF) -r -o $(LPFNVER) $(OBJ_PROD_U) 
endif
fastdep: clean

clean:
	@$(TC_RM) -fr $(LPFCVER)
	@$(TC_RM) -fr *.o

modules_install: STenv
	@$(TC_MKDIR) -p $(MODPATH)/net; 
	@$(TC_CP) $(LPFNO).o $(MODPATH)/net/; 
	@$(TC_MKDIR) -p $(MODPATH)/scsi; 
	@$(TC_CP) ../$(LPFCO).o $(MODPATH)/scsi/; 

STX86:

ifeq ($(HARDW),i386)
CDEFS = -Wall -O2 -fomit-frame-pointer
INCDIR = -I$(BASEINCLUDE)/include -I$(BASEINCLUDE)/drivers/scsi -I$(BASEINCLUDE)/include/scsi
ELF = elf_i386 
ifeq ($(CONTX),KB)
INCLUDEDIR = $(INCDIR) 
else
INCLUDEDIR = $(INCDIR) $(MODINC) 
endif
endif

STX64:
ifeq ($(HARDW),ia64)
INCDIR = -I$(BASEINCLUDE)/include -I$(BASEINCLUDE)/drivers/scsi -I$(BASEINCLUDE)/include/scsi 
INCLUDEDIR = $(MODINC) $(INCDIR)
ELF =  elf64_ia64
ifeq ($(CONTX),MO)
CDEFS = -Wall -O2 -fomit-frame-pointer
CFLAGS = -Wstrict-prototypes -fno-strict-aliasing -pipe \
       -Wa,-x -ffixed-r13 -mfixed-range=f10-f15,f32-f127 -funwind-tables  \
       -falign-functions=32 -mb-step
else
ifeq ($(CONTX),KB)
INCLUDEDIR = $(INCDIR) 
endif
endif
endif

STP64:
ifeq ($(HARDW),ppc64)
INCDIR = -I$(BASEINCLUDE)/include -I$(BASEINCLUDE)/drivers/scsi -I$(BASEINCLUDE)/include/scsi 
ELF = elf64ppc
ifeq ($(CONTX),MO)
ifeq ($(BASERH),redhat)
CDEFS = -m64 -Wall -O2 
else
CDEFS = -Wall -O2 
endif
CFLAGS = -Wstrict-prototypes -Wno-trigraphs \
         -fno-strict-aliasing -fno-common  -Wno-unused \
         -fomit-frame-pointer -fsigned-char -msoft-float \
         -pipe -Wno-uninitialized -mminimal-toc -fno-builtin 
INCLUDEDIR = $(MODINC) $(INCDIR) 
else
ifeq ($(CONTX),KB)
INCLUDEDIR = $(INCDIR) 
else
ifeq ($(CONTX),KM)
INCDIR = -I$(BASEINCLUDE)/include/scsi -I$(BASEINCLUDE)/drivers/scsi -I$(BASEINCLUDE)/include 
INCLUDEDIR = $(MODINC) $(INCDIR) 
endif
endif
endif
endif

src: SRC
SRC: BRPM

rpm: RPM
RPM: BRPM 

BRPM:	clean find_env
	$(TC_RM) -rf /tmp/lpfcdriver-$(CRVERS); $(TC_MKDIR) -p /tmp/lpfcdriver-$(CRVERS); $(TC_CP) * /tmp/lpfcdriver-$(CRVERS) 
	cd /tmp; $(TC_TAR) -cf $(RH)/SOURCES/lpfc-rpm.tar lpfcdriver-$(CRVERS)
	$(TC_RM) -rf /tmp/lpfcdriver-$(CRVERS)
ifeq ($(BASERH),packages)
	@$(TC_CAT)  ./lpfc.spec | $(TC_SED) s/LPFC_DRIVER_VERSION/$(CRVERS)/ | $(TC_SED) s/redhat/packages/ >  $(RH)/SPECS/lpfc.spec
else
	@$(TC_CAT)  ./lpfc.spec | $(TC_SED) s/LPFC_DRIVER_VERSION/$(CRVERS)/ >  $(RH)/SPECS/lpfc.spec
endif
	$(TC_RPMBUILD) $(OPTRPM) $(RH)/SPECS/lpfc.spec

