# Generic rules for all OCS systems 
# $Id: GlobalRules 615 2010-09-30 15:49:42Z florenz@TU-BERLIN.DE $

# $__xpoff$  -- we use `meta' attribute citations in this file


# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Target dispatcher
#   activates binding rule & variants 
#   then for each target a variant which defines ACTIONS to be performed
#   for most targets there is a version target2 to be performed in the
#   recursive call after LOCALDEFS has been updated

SETTINGS = $(bind) 

all: 	$(SETTINGS) +all $(ACTIONS)
all2: 	$(SETTINGS) +all2 $(ACTIONS)

sub: 	$(SETTINGS) +sub $(ACTIONS)
sub2: 	$(SETTINGS) +sub2 $(ACTIONS)

gen: 	$(SETTINGS) +gen $(ACTIONS)
gen2: 	$(SETTINGS) +gen2 $(ACTIONS)

genall: $(SETTINGS) +genall $(ACTIONS)
genall2: $(SETTINGS) +genall2 $(ACTIONS)

install: $(SETTINGS) +install $(ACTIONS)
install2: $(SETTINGS) +install2 $(ACTIONS)

installthis: $(SETTINGS) +installthis $(ACTIONS)
installthis2: $(SETTINGS) +installthis2 $(ACTIONS)

clean: 	$(SETTINGS) +clean $(ACTIONS)

cleanall: $(SETTINGS) +cleanall $(ACTIONS)
cleanall2: $(SETTINGS) +cleanall2 $(ACTIONS)

save: $(SETTINGS) +save $(ACTIONS)
save2: $(SETTINGS) +save2 $(ACTIONS)

sbmt: $(SETTINGS) +sbmt $(ACTIONS)
sbmt2: $(SETTINGS) +sbmt2 $(ACTIONS)

publ: $(SETTINGS) +publ $(ACTIONS)
publ2: $(SETTINGS) +publ2 $(ACTIONS)

pack: $(SETTINGS) +pack $(ACTIONS)
pack2: $(SETTINGS) +pack2 $(ACTIONS)

extract: $(SETTINGS) +extract $(ACTIONS)
extract2: $(SETTINGS) +extract2 $(ACTIONS)

update: $(SETTINGS) +update $(ACTIONS)
update2: $(SETTINGS) +update2 $(ACTIONS)

check: $(SETTINGS) +check $(ACTIONS)
check2: $(SETTINGS) +check2 $(ACTIONS)


# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Target definitions

all:+
	RTARGET	= all2
	ACTIONS = $(LOCALDEFS) _rerun

all2:+
	RTARGET = all
	ACTIONS = _subsystems _all

check:+
	RTARGET	= check2
	ACTIONS = $(LOCALDEFS) _rerun

check2:+
	RTARGET = check
	ACTIONS = _subsystems _check

sub:+
	RTARGET	= sub2
	ACTIONS = $(LOCALDEFS) _rerun

sub2:+
	RTARGET = all
	ACTIONS = _realsubsystems _all

install:+
	RTARGET	= install2
	ACTIONS = $(LOCALDEFS) _rerun

install2:+
	RTARGET = install
	ACTIONS = _subsystems _install

installthis:+
	RTARGET	= installthis2
	ACTIONS = $(LOCALDEFS) _rerun

installthis2:+
	RTARGET = installthis
	ACTIONS = _install

gen:+
	RTARGET	= gen2
	RERUNFLAGS = `if [ -n "$(LOCALDEFS)" ]; \
		      then $(ECHO) '-force $(LOCALDEFS)'; fi`
	ACTIONS = _rerun

gen2:+
	RTARGET = 
	ACTIONS = $(LOCALDEFS)

genall:+
	RTARGET	= genall2
	RERUNFLAGS = `if [ -n "$(LOCALDEFS)" ]; \
		      then $(ECHO) '-force $(LOCALDEFS)'; fi`
	ACTIONS = _rerun

genall2:+
	RTARGET = genall
	ACTIONS = _subsystems $(LOCALDEFS)

clean:+
	RTARGET	= 
	ACTIONS = _clean

cleanall:+
	RTARGET	= cleanall
	ACTIONS = _subsystems _clean


save:+
	RTARGET	= save2
	ACTIONS = $(LOCALDEFS) _rerun

save2:+
	RTARGET = save
	ACTIONS = _save _subsystems 

sbmt:+
	RTARGET	= sbmt2
	ACTIONS = $(LOCALDEFS) _rerun

sbmt2:+
	RTARGET = sbmt
	ACTIONS = _sbmt _subsystems

publ:+
	RTARGET	= publ2
	ACTIONS = $(LOCALDEFS) _rerun

publ2:+
	RTARGET = publ
	ACTIONS = _publ _subsystems

pack:+
	RTARGET	= pack2
	ACTIONS = $(LOCALDEFS) _rerun

pack2:+
	RTARGET = pack
	ACTIONS = _pack _subsystems

extract:+
	RTARGET = extract2
	ACTIONS = $(LOCALDEFS) _rerun

extract2:+
	RTARGET = extract
	ACTIONS = _extract _subsystems

update:+
	RTARGET = update2
	ACTIONS = $(LOCALDEFS) _rerun

update2:+
	RTARGET = update
	ACTIONS = _update _subsystems



# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Recursive calls of shape

# All variables the user might have defined on the command line ...

RERUNVARS =	-f $(SHAPEFILE) \
		"bind=$(bind)" \
		"os=$(os)" \
		"ocs=$(ocs)" \
		"opt=$(opt)" \
		"debug=$(debug)" \
		"profile=$(profile)" \
		"EXP_OC1=$(EXP_OC1)" \
		"EXP_OC1FLAGS=$(EXP_OC1FLAGS)" \
		"EXP_OC2=$(EXP_OC2)" \
		"EXP_OC2FLAGS=$(EXP_OC2FLAGS)" \
		"INSTALLBINPATH=$(INSTALLBINPATH)" \
		"INSTALLMANPATH=$(INSTALLMANPATH)" \
		"INSTALLLIBPATH=$(INSTALLLIBPATH)" \
		"SYSDEFS=$(SYSDEFS)" \
		"EXTRACTDEST=$(EXTRACTDEST)" 

# Rerun SHAPE with RTARGET

_rerun:
	@$(SHAPE) $(RERUNFLAGS) $(RERUNVARS) 'RTARGET=' 'ACTIONS=' $(RTARGET)


# Run SHAPE with RTARGET on all SUBNODES

_subsystems:
	@__subsystems="$(SUBNODES)"; \
	for i in $$__subsystems; \
	do \
	  $(ECHO) ">>>> Visiting subnode '$$i' making '$(RTARGET)' <<<<" ; \
	  $(DATE);	\
          ($(CD) $$i; if [ ! -d $(OCSDIR) ]; then $(MKDIR) $(OCSDIR); fi; \
                $(SHAPE) $(RERUNVARS) 'RTARGET=' 'ACTIONS=' $(RTARGET)) \
	  || exit 2; \
	done

# Run SHAPE with RTARGET on all SUBSYSTEMS

_realsubsystems:
	@__subsystems="$(SUBSYSTEMS)"; \
	for i in $$__subsystems; \
	do \
	  $(ECHO) ">>>> Visiting subsystem '$$i' making '$(RTARGET)' <<<<" ; \
	  $(DATE);	\
    	  ($(CD) $$i; \
	  if [ ! -d $(OCSDIR) ]; \
	  then $(MKDIR) $(OCSDIR); fi; \
	  $(SHAPE) $(RERUNVARS) 'RTARGET=' 'ACTIONS=' $(RTARGET)) \
	  || exit 2; \
	done

# +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Miscellaneous generic actions


_installmanuals: $(MANUALS)
	@-if [ -z "$(INSTALLMANPATH)" ] ; \
	then $(ECHO) "You must define the variable INSTALLMANPATH." ; \
	else \
	_sections="1 2 3 4 5 6 7"; \
	_manuals="$(MANUALS)"; \
	for m in $$_manuals; \
	do \
	  for i in $$_sections; \
	  do \
	    if [ "`basename $$m .$$i`.$$i" = $$m ] ; \
	    then \
	      $(ECHO) "Installing $$m in $(INSTALLMANPATH)/man$$i"; \
	      $(OCSOM)/etc/xinstall $(INSTALLMANFLAGS) \
	             $$m $(INSTALLMANPATH)/man$$i ; \
 	    fi; \
	  done; \
	done; \
	fi

_save:
	@-_busy=`$(LS) $(COMPONENTS) 2>/dev/null`; \
	if [ -z "$$_busy" ] ; then $(ECHO) "Nothing to save."; \
	else \
	  _user=`$(OCSOM)/etc/user_at`; \
	  _locked=`$(VL) -rule "max(version),eq(locker,$$_user)." \
		-format '$$__unixname$$ ' $$_busy 2>/dev/null 2>/dev/null`; \
	  if [ -z "$$_locked" ] ; then \
	    $(ECHO) "Busy files, but you have nothing locked."; \
	  else \
	    $(SAVE) $$_locked </dev/tty; \
	  fi; \
	fi

_sbmt:
	@_bind=`$(VBIND) -nomsg $(BINDOPTS) -rule 'le(state,saved).' \
					$(COMPONENTS) 2>/dev/null`;\
	if [ -z "$$_bind" ] ; then $(ECHO) "Nothing to submit."; \
	else $(SBMT) $$_bind ; fi

_publ:
	@_bind=`$(VBIND) -nomsg $(BINDOPTS) -rule 'le(state,proposed).' $(COMPONENTS) 2>/dev/null`;\
	if [ -z "$$_bind" ] ; then $(ECHO) "Nothing to publish."; \
	else $(PUBL) $$_bind ; fi

_pack: $(COMPONENTS)
	@$(ECHO) "Packing node $(NODENAME)"; \
	$(TAR) cvf - $(COMPONENTS) | $(COMPRESS) > $(NODENAME).tar.gz

_extract: 
	@if [ -z "$(EXTRACTDEST)" ] ; then \
	   $(ECHO) "You must define variable EXTRACTDEST"; \
	else \
	   $(ECHO) "Extracting $(COMPONENTS)"; \
	   $(OCSOM)/etc/xinstall $(EXTRACTDEST)/$(RELEASENODEPATH) ; \
	   $(RETRV) -dest $(EXTRACTDEST)/$(RELEASENODEPATH) \
			$(BINDOPTS) $(COMPONENTS); \
	fi

_update:
	@$(ECHO) "Retrieving  components:"; \
	_comps="$(COMPONENTS)"; \
	for c in $$_comps; do \
	  if [ -w $$c ] ; then \
	    $(ECHO) "$$c is writable, not retrieved"; \
	  else \
	    if [ -r $$c ] ; then \
	      $(RM) -f $$c; \
	    fi; \
	    $(RETRV) $(BINDOPTS) $$c; \
	  fi; \
	done

