# Makefile for building sysmond (client) and syscold (server)
# (and scyld_sysmond for Linux Beowulf clusters), for creating
# control scripts, and for installing.
#
# make [all]   -- build client and server and create scripts,
#                 architecture is recognized automatically
#
# make active  -- same as 'make all' except server will update
#                 system database by calling its update script
#
# make install -- installs executables and scripts, removes .o files
#                 (you might need to be root to do this)
#
# All of the configurable options are available in 'Make.options', and 
# this file name can even be overridden on the command line by defining
# LOCALOPTS in your call to 'make install' as an additional suffix to
# the options file, for example, 'make install "LOCALOPTS=.local"' will
# use the definitions in file 'Make.options.local'.
#
# The control scripts allow the syscold and sysmond daemons to be
# controlled properly during bootup and shutdown.  The control scripts
# have the advantage of allowing only one instance of each daemon to
# run on a particular machine.


include Make.options$(LOCALOPTS)


# platform dependent
CCOPTS =
LIBS =
DIR = sun irix alpha linux hpux

# platform independent
OBJFILES = sysmon.o syscol.o ihash.o getdate.o
TARGETS = sysmond syscold
ACTIVATE = -DDBUPDATE
SCYLD = -DSCYLD


all:
	@case "$(OSTYPE)" in      \
	'SunOS')  arch=sun ;;     \
	'IRIX')   arch=irix ;;    \
	'IRIX64') arch=irix ;;    \
	'OSF1')   arch=alpha ;;   \
	'Linux')  arch=linux ;;   \
	'HP-UX')  arch=hpux ;;    \
	*)        $(MAKE) help ;; \
	esac ; \
	if [ -n "$(TARGETS)" ] ; then \
	  $(MAKE) "MAKE=$(MAKE)" "CCOPTS=$(CCOPTS)" \
	          "LOCALOPTS=$(LOCALOPTS)" $$arch ; \
	else \
	  echo "installing: $(INSTALLPKG) from directory $$arch" ; \
	  for pkg in $(INSTALLPKG) ; do \
	    $(MAKE) "MAKE=$(MAKE)" "DIR=$$arch" "LOCALOPTS=$(LOCALOPTS)" \
	            "INSTALLPKG=$$pkg" finish_install ; \
	  done ; \
	fi

help:
	@echo
	@echo "Type:  \"make TARGET\""
	@echo
	@echo "where TARGET is one of the following architecture choices:"
	@echo
	@echo "$(DIR)"
	@echo

sun: dummy
	@$(MAKE) "DIR=$@" get_object_files
	@$(MAKE) "MAKE=$(MAKE)" \
	  "CCOPTS=$(CCOPTS) -O" "LIBS=-lsocket -lnsl -lresolv" \
	  $(TARGETS)
	@$(MAKE) "DIR=$@" put_object_files
	@$(MAKE) "SYSCOL=$@/$(SYSCOL)" "SYSMON=$@/$(SYSMON)" \
	  "LOCALOPTS=$(LOCALOPTS)" create_ctrl_scripts

irix: dummy
	@$(MAKE) "DIR=$@" get_object_files
	@$(MAKE) "MAKE=$(MAKE)" "DIR=$@/" \
	  "CCOPTS=$(CCOPTS) -O" "LIBS=" \
	  $(TARGETS)
	@$(MAKE) "DIR=$@" put_object_files
	@$(MAKE) "SYSCOL=$@/$(SYSCOL)" "SYSMON=$@/$(SYSMON)" \
	  "LOCALOPTS=$(LOCALOPTS)" create_ctrl_scripts

alpha: dummy
	@$(MAKE) "DIR=$@" get_object_files
	@$(MAKE) "MAKE=$(MAKE)" "DIR=$@/" \
	  "CCOPTS=$(CCOPTS) -O" "LIBS=" \
	  $(TARGETS)
	@$(MAKE) "DIR=$@" put_object_files
	@$(MAKE) "SYSCOL=$@/$(SYSCOL)" "SYSMON=$@/$(SYSMON)" \
	  "LOCALOPTS=$(LOCALOPTS)" create_ctrl_scripts

linux: dummy
	@$(MAKE) "DIR=$@" "TARGETS=$(TARGETS) scyld_sysmond" get_object_files
	@$(MAKE) "MAKE=$(MAKE)" "DIR=$@/" \
	  "CCOPTS=$(CCOPTS) -O" "LIBS=" \
	  $(TARGETS)
	@$(MAKE) "MAKE=$(MAKE)" "DIR=$@/" \
	  "CCOPTS=$(CCOPTS) $(SCYLD) -O" "LIBS=" \
	  scyld_sysmond
	@$(MAKE) "DIR=$@" "TARGETS=$(TARGETS) scyld_sysmond" put_object_files
	@$(MAKE) "SYSCOL=$@/$(SYSCOL)" "SYSMON=$@/$(SYSMON)" \
	  "SCYLD_SYSMON=$@/$(SCYLD_SYSMON)" "PSFLAGS=$(LINUXPSFLAGS)" \
	  "LOCALOPTS=$(LOCALOPTS)" \
	  create_ctrl_scripts create_scyld_ctrl_scripts

hpux: dummy
	@$(MAKE) "DIR=$@" get_object_files
	@$(MAKE) "MAKE=$(MAKE)" "DIR=$@/" \
	  "CCOPTS=$(CCOPTS) -Ae +DAportable -O" "LIBS=" \
	  $(TARGETS)
	@$(MAKE) "DIR=$@" put_object_files
	@$(MAKE) "SYSCOL=$@/$(SYSCOL)" "SYSMON=$@/$(SYSMON)" \
	  "LOCALOPTS=$(LOCALOPTS)" create_ctrl_scripts

active:
	@$(MAKE) "MAKE=$(MAKE)" "CCOPTS=$(ACTIVATE) $(CCOPTS)" \
	  "LOCALOPTS=$(LOCALOPTS)" all

install:
	@$(MAKE) "MAKE=$(MAKE)" "TARGETS=" "LOCALOPTS=$(LOCALOPTS)" all

get_object_files:
	@-if [ ! -d $(DIR) ] ; then \
	  mkdir $(DIR) ; \
	else \
	  cd $(DIR) ; \
	  mv *.o $(TARGETS) .. ; \
	  cd .. ; \
	fi

put_object_files:
	mv *.o $(TARGETS) $(DIR)

dummy:  # use this as a dependency to "force it"

create_ctrl_scripts:
	@echo "creating syscold control script..."
	@echo "#!/bin/sh" > $(SYSCOL)
	@echo "#" >> $(SYSCOL)
	@echo "# control script for syscold" >> $(SYSCOL)
	@echo "" >> $(SYSCOL)
	@echo "SYSCOLD='$(SYSCOLDIR)/syscold'" >> $(SYSCOL)
	@echo "" >> $(SYSCOL)
	@echo "OPTPORT='-p$(PORT)'" >> $(SYSCOL)
	@echo "OPTLOG='-l$(LOGDIR)/$(LOG)'" >> $(SYSCOL)
	@echo "OPTOLDLOG='-o$(LOGDIR)/$(OLDLOG)'" >> $(SYSCOL)
	@echo "OPTSCRIPT='$(OPTSCRIPT)'" >> $(SYSCOL)
	@echo "" >> $(SYSCOL)
	@echo "PSFLAGS='$(PSFLAGS)'" >> $(SYSCOL)
	cat ctrl_syscold >> $(SYSCOL)
	chmod $(CHMODOPTS) $(SYSCOL)
	@echo "creating sysmond control script..."
	@echo "#!/bin/sh" > $(SYSMON)
	@echo "#" >> $(SYSMON)
	@echo "# control script for sysmond" >> $(SYSMON)
	@echo "" >> $(SYSMON)
	@echo "SYSMOND='$(SYSMONDIR)/sysmond'" >> $(SYSMON)
	@echo "" >> $(SYSMON)
	@echo "OPTMACH='-m$(MACH)'" >> $(SYSMON)
	@echo "OPTPORT='-p$(PORT)'" >> $(SYSMON)
	@echo "OPTSLEEP='-t$(SLEEP)'" >> $(SYSMON)
	@echo "" >> $(SYSMON)
	@echo "PSFLAGS='$(PSFLAGS)'" >> $(SYSMON)
	cat ctrl_sysmond >> $(SYSMON)
	chmod $(CHMODOPTS) $(SYSMON)

create_scyld_ctrl_scripts:
	@echo "creating scyld_sysmond control script..."
	@echo "#!/bin/sh" > $(SCYLD_SYSMON)
	@echo "#" >> $(SCYLD_SYSMON)
	@echo "# control script for scyld_sysmond" >> $(SCYLD_SYSMON)
	@echo "" >> $(SCYLD_SYSMON)
	@echo "SYSMOND='$(SYSMONDIR)/scyld_sysmond'" >> $(SCYLD_SYSMON)
	@echo "" >> $(SCYLD_SYSMON)
	@echo "OPTMACH='-m$(MACH)'" >> $(SCYLD_SYSMON)
	@echo "OPTPORT='-p$(PORT)'" >> $(SCYLD_SYSMON)
	@echo "OPTSLEEP='-t$(SLEEP)'" >> $(SCYLD_SYSMON)
	@echo "" >> $(SCYLD_SYSMON)
	@echo "PSFLAGS='$(PSFLAGS)'" >> $(SCYLD_SYSMON)
	cat ctrl_sysmond >> $(SCYLD_SYSMON)
	chmod $(CHMODOPTS) $(SCYLD_SYSMON)

finish_install:
	@case "$(INSTALLPKG)" in \
	'syscold') cp $(DIR)/syscold $(SYSCOLDIR)/syscold ; \
	  echo "cp $(DIR)/syscold $(SYSCOLDIR)/syscold" ;; \
	'sysmond') cp $(DIR)/sysmond $(SYSMONDIR)/sysmond ; \
	  echo "cp $(DIR)/sysmond $(SYSMONDIR)/sysmond" ;; \
	'scyld_sysmond') \
	  if [ "$(DIR)" = "linux" ] ; then \
	    cp $(DIR)/scyld_sysmond $(SYSMONDIR)/scyld_sysmond ; \
	    echo "cp $(DIR)/scyld_sysmond $(SYSMONDIR)/scyld_sysmond" ; \
	  fi ;; \
	"$(SYSCOL)") cp $(DIR)/$(SYSCOL) $(CTRLDIR)/$(SYSCOL) ; \
	  echo "cp $(DIR)/$(SYSCOL) $(CTRLDIR)/$(SYSCOL)" ;; \
	"$(SYSMON)") cp $(DIR)/$(SYSMON) $(CTRLDIR)/$(SYSMON) ; \
	  echo "cp $(DIR)/$(SYSMON) $(CTRLDIR)/$(SYSMON)" ;; \
	"$(SCYLD_SYSMON)") \
	  if [ "$(DIR)" = "linux" ] ; then \
	    cp $(DIR)/$(SCYLD_SYSMON) $(CTRLDIR)/$(SCYLD_SYSMON) ; \
	    echo "cp $(DIR)/$(SCYLD_SYSMON) $(CTRLDIR)/$(SCYLD_SYSMON)" ; \
	  fi ;; \
	*)  echo "Unknown file $(INSTALLPKG)" ;; \
	esac

.c.o:
	$(CC) $(CCOPTS) -c $< -o $@

scyld_sysmon.o: sysmon.c
	$(CC) $(CCOPTS) -c $< -o $@

syscold: $(OBJFILES)
	$(CC) $(CCOPTS) -o $@ syscol.o ihash.o getdate.o $(LIBS)
	chmod $(CHMODOPTS) $@

sysmond: $(OBJFILES)
	$(CC) $(CCOPTS) -o $@ sysmon.o getdate.o $(LIBS)
	chmod $(CHMODOPTS) $@

scyld_sysmond: $(OBJFILES) scyld_sysmon.o
	$(CC) $(CCOPTS) -o $@ scyld_sysmon.o getdate.o $(LIBS)
	chmod $(CHMODOPTS) $@

clean:
	rm -rf $(TARGETS) scyld_sysmond *.o $(DIR)
