ROOT	= /net/beeblebrox
MC	= pmax
CAD	= /expand2/kchen/octtools
CADROOT	= /expand2/kchen/octtools
MIS	= $(CAD)/lib/misII
UNPACK	= unpack
COPY = .
SHELL = /bin/sh
MAKE = /bin/make
REQUIRE = oh oct utility st errtrap mm port
LINTCREATEFLAG = -C
LINTEXTRAS =


# directories which make up the MIS archive
#  ... array, avl, list, and st should really be in a generic package
DIRS	= array avl bdd command decomp delay error espresso \
	  extract factor gcd genlib graphics io list main map \
	  maxflow mincov minimize network node octio \
	  phase pld resub sim simplify sparse speed st test util

TARGET	= misII
TARGETG = misII-g
TARGETPG= misII-pg

TARLIB	= lib/libmisII.a
TARLIBG = lib/libmisII-g.a
TARLIBPG= lib/libmisII-pg.a

TARLINT	= lib/llib-lmisII.ln

LIBS	= $(CAD)/lib/liboh.a \
	  $(CAD)/lib/liboct.a \
	  $(CAD)/lib/libst.a \
	  $(CAD)/lib/libtr.a \
	  $(CAD)/lib/liberrtrap.a \
	  $(CAD)/lib/libuprintf.a \
	  $(CAD)/lib/libutility.a \
	  $(CAD)/lib/libmm.a \
	  $(CAD)/lib/libport.a

LIBSG	= $(CAD)/lib/liboh-g.a \
	  $(CAD)/lib/liboct-g.a \
	  $(CAD)/lib/libst-g.a \
	  $(CAD)/lib/libtr-g.a \
	  $(CAD)/lib/liberrtrap-g.a \
	  $(CAD)/lib/libuprintf-g.a \
	  $(CAD)/lib/libutility-g.a \
	  $(CAD)/lib/libmm-g.a \
	  $(CAD)/lib/libport-g.a

LIBSPG	= $(CAD)/lib/liboh-pg.a \
	  $(CAD)/lib/liboct-pg.a \
	  $(CAD)/lib/libst-pg.a \
	  $(CAD)/lib/libtr-pg.a \
	  $(CAD)/lib/liberrtrap-pg.a \
	  $(CAD)/lib/libuprintf-pg.a \
	  $(CAD)/lib/libutility-pg.a \
	  $(CAD)/lib/libmm-pg.a \
	  $(CAD)/lib/libport-pg.a

OPTFLAG=-O
CC	= cc
CFLAGS	= ${OPTFLAG} -DOCT
CFLAGSG = -g -DOCT
CFLAGSPG= -pg -O -DOCT
LDFLAGS = -lm -lX11

#---------------------------------------------------------------------------

$(TARGET): $(TARLIB) $(LIBS) do_link
$(TARGETG): cleansome $(TARLIBG) $(LIBSG) do_linkg
$(TARGETPG): cleansome $(TARLIBPG) $(LIBSPG) do_linkpg

$(TARLIB): do_make do_repack
	cp main/mis.o lib/mis.o
$(TARLIBG): do_makeg do_repack
	mv $(TARLIB) $(TARLIBG)
$(TARLIBPG): do_makepg do_repack
	mv $(TARLIB) $(TARLIBPG)
$(TARLINT): do_lintlib do_repack_lint

do_link:
	$(CC) -g -o $(TARGET) $(TARLIB) $(LIBS) $(LDFLAGS) 
do_linkg:
	$(CC) -g -o $(TARGETG) $(TARLIBG) $(LIBSG) $(LDFLAGS)
do_linkpg:
	$(CC) -pg -o $(TARGETPG) $(TARLIBPG) $(LIBSPG) $(LDFLAGS)

do_make:
	@for dir in $(DIRS); do				\
	    (cd $$dir; 					\
	     echo Making $$dir ...; 			\
	     ${MAKE} CC=$(CC) 'CFLAGS=$(CFLAGS) $$(INCLUDE)' MIS=.. CADROOT=$(CADROOT) CAD=$(CAD) lib$$dir.a)\
	done

do_makeg:
	@for dir in $(DIRS); do 			\
	    (cd $$dir; 					\
	     echo Making $$dir ...; 			\
	     ${MAKE} CC=$(CC) 'CFLAGS=$(CFLAGSG) $$(INCLUDE)' MIS=.. CADROOT=$(CADROOT) CAD=$(CAD) lib$$dir.a)\
	done

do_makepg:
	@for dir in $(DIRS); do 			\
	    (cd $$dir; 					\
	     echo Making $$dir ...; 			\
	     ${MAKE} CC=$(CC) 'CFLAGS=$(CFLAGSPG) $$(INCLUDE)' MIS=.. CAD=$(CAD) lib$$dir.a)\
	done

do_lintlib:
	@-for dir in $(DIRS); do				\
	    (cd $$dir; 					\
	       echo Linting $$dir ...; 			\
	       ${MAKE} MIS=.. LINTCREATEFLAG=${LINTCREATEFLAG} LINTEXTRAS=${LINTEXTRAS} CADROOT=$(CADROOT) CAD=$(CAD) llib-l$$dir.ln);	\
	done

do_repack:
	@rm -rf $(UNPACK) $(TARLIB)
	@mkdir $(UNPACK)
	@for i in $(DIRS); do 				\
	    cwd=`pwd`;					\
	    (cd $(UNPACK); 				\
	     ar x $$cwd/$$i/lib$$i.a; 			\
  	     ar ql ../$(TARLIB) *.o; rm *.o);		\
	done
	@rm -rf $(UNPACK)
	ranlib $(TARLIB)

do_repack_lint:
	@rm -f _temp;
	@for dir in $(DIRS); do 			\
	    cat $$dir/llib-l$$dir.ln >>_temp;		\
	done
	@mv _temp $(TARLINT)

test: nothing
	(cd octio; ${MAKE} test)

help:
	cd lib/help; ${MAKE} install

clean: cleansome
	rm -f $(TARLIBPG) $(TARGETPG) $(TARLIBG) $(TARGETG) 

cleansome:
	rm -f $(TARLIB) $(TARLINT) $(TARGET) lib/mis.o tags make.out malloc.out gmon.out _temp
	@rm -rf $(UNPACK)
	@for dir in $(DIRS); do				\
	    (cd $$dir; 					\
	     echo Cleaning $$dir ...; 			\
	     ${MAKE} -i CAD=$(CAD) clean >/dev/null)	\
	done

depend:
	@for dir in $(DIRS); do 			\
	    (cd $$dir; 					\
	     ${MAKE} -i CAD=$(CAD) depend)			\
	done

strip_depend strip-depend:
	@for dir in $(DIRS); do 			\
	    (cd $$dir; 					\
	     ${MAKE} -i CAD=$(CAD) strip_depend)		\
	done

lint: $(TARLINT) do_lint

do_lint:
	@for dir in $(DIRS); do				\
	    (cd $$dir; 					\
	     echo; echo "lint $$dir ...";		\
	     ${MAKE} MIS=.. LINTCREATEFLAG=${LINTCREATEFLAG} LINTEXTRAS=${LINTEXTRAS} CADROOT=${CADROOT} CAD=$(CAD) lint)		\
	done

wc:
	wc */*.[cly] | tail -1
	grep ';' */*.[cly] | wc | tail -1

tags: _force
	rm -f tags
	touch tags
	for dir in $(DIRS); do				\
	    cwd=`pwd`;					\
	    (cd $$dir; 					\
	     rm -f tags; 				\
	     ln -s $$cwd/tags tags)			\
	done
	for dir in $(DIRS); do				\
	    (cd $$dir; 					\
	     sleep 1;					\
	     echo $$dir;				\
	     ${MAKE} CAD=$(CAD) tags)			\
	done
	sort -o tags tags

compile:
	rm -f io/read_eqn.c io/eqnlex.c 
	rm -f genlib/readlib.c genlib/readliblex.c
	date; ${MAKE} $(TARGETG)
	date; ${MAKE} $(TARGETPG)
	date; ${MAKE} cleansome $(TARGET) 
	date; ${MAKE} $(TARLINT)
	date; ${MAKE} do_lint | grep -v '\.c:$$' | grep -v '^lint -I' >.lint.out 2>&1
	date; ${MAKE} tags
# hack -- adjust filenames for nfs access
	sed 's!/users/awang!/net/beeblebrox/users/saldanha!g' tags >tags1
	mv tags1 tags
#	${MAKE} depend
	${MAKE} help

# fix the symbolic link problems in a copy of misII from the src directory
fix_symbolic:
	(cd $(COPY)/include;\
	rm -f *.h;\
	for file in $(DIRS); do\
	    ln -s ../$$file/$$file.h;\
	done;\
	rm -f main.h mis.h sim.h test.h genlib.h;\
	ln -s ../node/nodeindex.h;\
	ln -s ../lsort/lsort.h;\
	ln -s ../lsort/luniq.h;\
	ln -s ../main/mis.h;\
	ln -s ../map/library.h;\
	cd ../doc;\
	rm -f *.doc;\
	for file in $(DIRS); do\
	    ln -s ../$$file/$$file.doc;\
	done;\
	rm -f main.doc test.doc espresso.doc sim.doc;\
	ln -s ../node/nodeindex.doc;\
	ln -s ../map/library.doc;)

require:
	@echo $(REQUIRE)

install: $(TARGET) install_copy

install.lint: $(TARLINT) install_lint

install_copy:
	-rm -rf $(MIS)
	-mkdir $(MIS) $(MIS)/src
	-cp -r ex lib doc include $(MIS)
	-cp -r test $(MIS)/src
	cp $(TARGET) $(CAD)/bin
	cp lib/help/misII.1 $(CAD)/man/man1/misII.1
	ranlib $(MIS)/lib/libmisII.a
	cp ${MIS}/lib/libmisII.a ${CAD}/lib/libmisII.a
	ranlib $(CAD)/lib/libmisII.a
	-ranlib $(MIS)/lib/libmisII-g.a
	-ranlib $(MIS)/lib/libmisII-pg.a

install_lint:
	cp ${MIS}/lib/llib-lmisII.ln ${CAD}/lib/llib-lmisII.ln

# ------ distribute misII to other machines ------
DHOST	= eros
DFLAG	= -Rh
DSRCS	= ex lib doc include

dist:
	rdist -c . $(DISTHOST):$(CAD)/src/misII

update:
	@echo "making directories ..."
	@-rsh $(DHOST) -n "mkdir $(DDIST)/lib >& /dev/null"
	@-rsh $(DHOST) -n "mkdir $(DDIST)/lib/misII >& /dev/null"
	@-rsh $(DHOST) -n "mkdir $(DDIST)/lib/misII/src >& /dev/null"
	@-rsh $(DHOST) -n "mkdir $(DDIST)/bin >& /dev/null"
	@-rsh $(DHOST) -n "mkdir $(DDIST)/man >& /dev/null"
	@-rsh $(DHOST) -n "mkdir $(DDIST)/man/man1 >& /dev/null"
	@for f in $(DSRCS); do (					\
	     echo dist $$f ...;						\
	     rdist $(DFLAG) -c $$f $(DHOST):$(DDIST)/lib/misII/$$f 	\
	     ) 								\
	     done
	rdist $(DFLAG) -c test $(DHOST):$(DDIST)/lib/misII/src/test
	rdist $(DFLAG) -c misII $(DHOST):$(DDIST)/bin/misII
	rdist $(DFLAG) -c lib/help/misII.1 $(DHOST):$(DDIST)/man/man1/misII.1

# ----- distribute misII to a flat directory for porting to CMS ------
IBMHOST = eros
IBMDIST = /eros1/awang/misII.ibm/src
ibmdist: _force
	for dir in $(DIRS) lsort; do				\
	    (cd $$dir; 						\
	     echo $$dir;					\
	     ${MAKE} IBMHOST=$(IBMHOST) IBMDIST=$(IBMDIST) ibmdist)\
	done
#-------------------------------------------------------------


# dummy targets
nothing:;

build header print uninstall debug debug-g debug-pg install.lint: nothing
	@echo no rule

_force:
