#*************************************************************#
#
# Makefile: root Ensemble Makefile
#
# Author: Ohad Rodeh  12/2001
# Based on code by Mark Hayden
#
#*************************************************************#

.PHONY: socket tar hot ce maestro tools

include mk/config.mk

#include mk/preamble.mk

SUBDIRS = \
	appl		\
	ce		\
	cejava		\
	crypto		\
	demo		\
	demo/tk		\
	demo/life	\
	demo/dbm	\
	doc		\
	ejava		\
	groupd		\
	hot		\
	hot/include	\
	infr		\
	layers		\
	layers/bypass	\
	layers/debug	\
	layers/flow	\
	layers/total	\
	layers/vsync	\
	layers/other	\
	layers/trans	\
	layers/gossip	\
	layers/scale	\
	layers/security	\
	maestro		\
	mk		\
	mm		\
	route		\
	socket		\
	socket/u	\
	socket/s	\
	socket/s/unix	\
	socket/s/nt	\
	tar		\
	tools		\
	trans		\
	type		\
	util	

# Make sure the target directories are in place
#
dirs : 
	$(MKDIR) bin
	$(MKDIR) lib
	$(MKDIR) bin/$(PLATFORM)
	$(MKDIR) lib/$(PLATFORM)

# Make everything from scratch
# 
all: dirs
	cd socket ; $(MAKE) all ; $(MAKE) install
	$(MAKE_BASE) -f Makefile.top all; $(MAKE_BASE) -f Makefile.top install
	cd demo ; $(MAKE) ; $(MAKE) install
	cd ce ; $(MAKE)	  ; $(MAKE) install
	cd cejava ; $(MAKE) ; $(MAKE) install
	cd hot ; $(MAKE)  ; $(MAKE) install
	cd maestro ; $(MAKE) ; $(MAKE) install

maestro : 
	cd maestro ; $(MAKE) all

sock : 
	cd socket; $(MAKE) all ; $(MAKE) install

just:
	$(MAKE_BASE) -f Makefile.top all; $(MAKE_BASE) -f Makefile.top install
	cd demo ; $(MAKE) just

# Make the optimized versions
opt: dirs
	cd socket ; $(MAKE) opt ; $(MAKE) install
	$(MAKE_BASE) -f Makefile.top opt; $(MAKE_BASE) -f Makefile.top install
	cd demo ; 	$(MAKE) opt ;	$(MAKE) install
	cd ce ; $(MAKE) opt ; $(MAKE) install
	cd cejava ; $(MAKE) opt ; $(MAKE) install
	cd hot ; $(MAKE) opt ; $(MAKE) install
	cd maestro ; $(MAKE) ; $(MAKE) install

crypto : 
	cd crypto ; $(MAKE) ; $(MAKE) install 

crypto_opt : 
	cd crypto ; $(MAKE) opt ; $(MAKE) install 

tk :
	$(MAKE_BASE) -f Makefile.top tk

tk_opt :
	$(MAKE_BASE) -f Makefile.top OPT=yes tk


touch_depend : 
	touch .depend .depend.nt
	touch socket/.depend socket/.depend.nt
	touch ce/.depend ce/.depend.nt
	touch cejava/.depend ce/.depend.nt
	touch hot/.depend hot/.depend.nt
	touch demo/.depend demo/.depend.nt
	touch demo/dbm/.depend demo/dbm/.depend.nt
	touch demo/life/.depend demo/life/.depend.nt
	touch demo/tk/.depend demo/tk/.depend.nt


dos2unix : 
	make touch_depend
	dos2unix Makefile* */Makefile* */*/Makefile*
	dos2unix */*.[ch] */*/*.[ch]
	dos2unix */*.ml* */*/*.ml* 
	dos2unix */*.mk 
	tools/ntify.sh

# build a tar file containing the source only.
#
src: dos2unix
	make realclean
	make depend
	cd tar; tcsh tarcr 1.41 /home/orodeh/e/1.41/ensemble 
	cd doc; make build


# build a tar file containing executables and libraries.
#
dist : 
	cd ../build; for d in *; do (tar -cf ensemble-1_40-$$d.tar $$d; gzip ensemble-1_40-$$d.tar; rm -rf $$d); done


depend:
	cd socket; $(MAKE) depend
	cd socket; $(MAKE) depend
	cd ce; $(MAKE) depend
	cd cejava; $(MAKE) depend
	cd hot; $(MAKE) depend
	cd demo; $(MAKE) depend
	cd maestro; $(MAKE) depend
	$(MAKE_BASE) -f Makefile.top depend

# This gets around a difference between NMAKE and MAKE. 
#
ifeq ("$(PLATFORM)" , "nt")
ENS_ABSROOT = $(MAKEDIR)
CLEANALL = for %%d in ($(SUBDIRS)) do (cd %%d & $(MAKE) clean & cd $(ENS_ABSROOT))
else
CLEANALL = for d in $(SUBDIRS); do (cd $$d; $(MAKE) -k clean); done
endif

# MH: note 'make clean' should clean the def and opt
# directories.  It only leaves libraries, executables, 
# and postscript documents. 
clean: 
	$(CLEANALL)
	$(CLEANDIR)
	$(RM) ensemble.ml ensemble.mli emrg* 
	$(RM) .unknown


# realclean clean
#
realclean: clean 
	$(RMDIR) bin
	$(RMDIR) lib
	cd maestro ;	$(MAKE) realclean
	cd doc ; 	$(MAKE) realclean 


#*************************************************************#

