#==================================================
# Copyright IBM 2000
#==================================================

# makefile for stand-alone build of Linux interface for GPFS.

# Build instructions
#  1) Create the build configuration file. This may be done manually or
#     by autoconfig.
#     - Manual Method:
#        cd config
#        cp env.mk.sample env.mk
#        (edit env.mk file as desired, eg, architecture and compiler flags)
#        cd ..
#     - Autoconfig Method:
#        make Autoconfig
#  2) make World
#
# Install Instructions
#  1) make InstallImages
#
# If you want to recreate the env.mk configuration file (e.g. build for new
# kernel), you may either edit manually or remove it prior to invoking auto-
# configuration via the 'make Autoconfig' rule. The env.mk file may be
# manually removed from $SHARKCLONEROOT/config or by invoking the
# 'make CleanConfig' rule.
#

SHELL          := /bin/bash
SHARKCLONEROOT = $(shell echo $$(pwd))
LPPBIN         := $(SHARKCLONEROOT)/../bin
DESTDIR        := $(SHARKCLONEROOT)
GPLDIR         := $(SHARKCLONEROOT)/gpl-linux
RPMSPECDIR     := $(SHARKCLONEROOT)/config
RPMSPECNAME    := gpfs.gplbin.spec
RPMTMPDIR      := /tmp/rpm
DEBIANDIR      := $(SHARKCLONEROOT)/config/debian
DEBTMPDIR      := /tmp/deb
MODPATH        := /$(GPLDIR)/gpl_kernel.tmp.ver
CONFIGDIR      := $(SHARKCLONEROOT)/config
export         SHARKCLONEROOT
export         LPPBIN
export         CONFIGDIR
export         LINUX_DISTIBUTION

CPP            := /usr/bin/cpp
MAKE           := /usr/bin/make
MAKEDASH       := -


all: World
World::
	@if [ "$(SHARKCLONEROOT)" = "" ]; then \
	echo "Error: SHARKCLONEROOT is not set!"; exit 1; fi
World:: VerifyBuildTools
World:: Clean
World:: Headers
World:: Modules
World:: Install

###################################################

SUBDIRS = ibm-kxi ibm-linux gpl-linux
# old directories from previous releases (used for clean up)
OLDSUBDIRS = patches

Clean::
	@if [ "$(SHARKCLONEROOT)" = "" ]; then \
	echo "Error: SHARKCLONEROOT is not set!"; exit 1; fi
Clean:: clean
UninstallClean:: clean
clean::
	rm -rf $(DESTDIR)/include $(DESTDIR)/bin $(DESTDIR)/lib
	mkdir $(DESTDIR)/include $(DESTDIR)/bin $(DESTDIR)/lib
	rm -f $(MODPATH)

VerifyBuildTools::
	@echo "Verifying that tools to build the portability layer exist....";
	@which cpp > /dev/null 2>&1; if [ $$? -eq 0 ]; then \
	echo "cpp present"; \
	else \
	echo "cpp missing! Verify that it is installed."; exit 1; \
	fi
	@which gcc > /dev/null 2>&1; if [ $$? -eq 0 ]; then \
	echo "gcc present"; \
	else \
	echo "gcc missing! Verify that it is installed."; exit 1; \
	fi
	@which g++ > /dev/null 2>&1; if [ $$? -eq 0 ]; then \
	echo "g++ present"; \
	else \
	echo "g++ missing! Verify that it is installed."; exit 1; \
	fi
	@which ld > /dev/null 2>&1; if [ $$? -eq 0 ]; then \
	echo "ld present"; \
	else \
	echo "ld missing! Verify that it is installed."; exit 1; \
	fi

Autoconfig:
	cd $(CONFIGDIR); ./configure --genenvonly


###################################################

Install::
	for i in $(SUBDIRS); do \
	(cd $$i; echo  "installing" "(`pwd`)"; \
	$(MAKE) DESTDIR=$(DESTDIR)  install; \
	exit $$?) || exit 1; \
	done

Clean::
	@if [ -f $(CONFIGDIR)/env.mk ]; then \
	for i in $(SUBDIRS) $(EXTRASUBDIRS); do \
	(cd $$i; echo  "cleaning" "(`pwd`)"; \
	$(MAKE) DESTDIR=$(DESTDIR)  Clean; \
	exit $$?) || exit 1; \
	done; \
	fi;

CleanConfig::
	rm -f config/env.mk

# Ensures old directories (from previous release) are cleaned out
UninstallClean::
	@(case '$(MAKEFLAGS)' in *[ik]*) set +e;; esac; \
	for i in $(SUBDIRS) $(EXTRASUBDIRS) $(OLDSUBDIRS); do \
	if [ -f $$i/makefile ]; then \
	(cd $$i; echo  "cleaning" "(`pwd`)"; \
	$(MAKE) $(MAKEDASH)$(MAKEFLAGS) $(MAKEEXTRA) DESTDIR=$(DESTDIR)  Clean; \
	exit $$?) || exit 1; \
	fi; \
	done)

Headers::
	for i in $(SUBDIRS) $(EXTRASUBDIRS); do \
	(cd $$i; echo  "installing header files" "(`pwd`)"; \
	$(MAKE) DESTDIR=$(DESTDIR)  Headers; \
	exit $$?) || exit 1; \
	done
# Set up symlink for binding machine dependent module code 
# with machine independent mmfs object
Modules::
	@ln -fs $(LPPBIN)/mmfs $(DESTDIR)/bin ; \
	if [ -e $(LPPBIN)/mmfs-i386r ]; then ln -fs $(LPPBIN)/mmfs-i386r $(DESTDIR)/bin; fi ; \
	if [ -e $(LPPBIN)/mmfs-ppc64-rh4 ]; then ln -fs $(LPPBIN)/mmfs-ppc64-rh4 $(DESTDIR)/bin; fi ; \
	if [ -e $(LPPBIN)/mmfs-s390x-kernel-in-home-as ]; then ln -fs $(LPPBIN)/mmfs-s390x-kernel-in-home-as $(DESTDIR)/bin; fi ; \
	cd $(GPLDIR); $(MAKE) CONFIGDIR=$(CONFIGDIR) modules; \
	if [[ $$? -ne 0 ]]; then \
		exit 1;\
	fi 

# RPM source build option to install images for gpl kernel modules
InstallImages::
	(cd gpl-linux; $(MAKE) InstallImages; \
	exit $$?) || exit 1 

rpm: Rpm
Rpm::
	rm -rf $(RPMTMPDIR)
	rpmbuild --define "MODKERNEL `cat $(MODPATH)`" --define "GPLDIR $(GPLDIR)" -bb $(RPMSPECDIR)/$(RPMSPECNAME) --buildroot=$(RPMTMPDIR)

deb: Deb
Deb::
	rm -rf $(DEBTMPDIR)
	@echo "Deb package for gpl will be generated under $(DEBTMPDIR)...";
	cd $(CONFIGDIR); ./gpl2deb -m `cat $(MODPATH)` -r $(DEBTMPDIR); if [ $$? -ne 0 ]; then exit $$?; fi

# Use screwy method to clean up residual stuff left over
# from a gpl source build (if neccessary) and avoid
# various gripes from rpm uninstall
SrcBuildClean::
	@if [ -f $(CONFIGDIR)/env.mk ]; then make UninstallClean; fi; \
	rm -f config/env.mk; \
	rm -f config/installlink.ti; \
	rm -f $(LPPBIN)/mmfslinux; \
	rm -f $(LPPBIN)/tracedev; \
	rm -f $(LPPBIN)/dumpconv; \
	rm -f $(LPPBIN)/mmfs26; \
	rm -f $(LPPBIN)/tracedev.BAK; \
	if [ -d shark/config ]; then rmdir shark/config; fi; \
	if [ -d shark ]; then rmdir shark; fi; \
	if [ -d lib ]; then rmdir lib; fi; \
	if [ -d bin ]; then rmdir bin; fi; \
	if [ -d include ]; then rmdir include; fi; \
	sh -c 'flist=$$(find ./ -name .depends); rm -f $$flist'; \
	sh -c 'flist=$$(find ./ -name install.he); rm -f $$flist'; \
	sh -c 'flist=$$(find ./ -name Makefile.bk); rm -f $$flist'; \
	rm -f gpl-linux/Makefile gpl-linux/*.saved gpl-linux/*.ver 


