########################################################-*-mode:Makefile-*-
##                                                                       ##
##                Centre for Speech Technology Research                  ##
##                     University of Edinburgh, UK                       ##
##                       Copyright (c) 1996,1997                         ##
##                        All Rights Reserved.                           ##
##                                                                       ##
##  Permission to use, copy, modify, distribute this software and its    ##
##  documentation for research, educational and individual use only, is  ##
##  hereby granted without fee, subject to the following conditions:     ##
##   1. The code must retain the above copyright notice, this list of    ##
##      conditions and the following disclaimer.                         ##
##   2. Any modifications must be clearly marked as such.                ##
##   3. Original authors' names are not deleted.                         ##
##  This software may not be used for commercial purposes without        ##
##  specific prior written permission from the authors.                  ##
##                                                                       ##
##  THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK        ##
##  DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING      ##
##  ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT   ##
##  SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE     ##
##  FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES    ##
##  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN   ##
##  AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,          ##
##  ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF       ##
##  THIS SOFTWARE.                                                       ##
##                                                                       ##
###########################################################################
##
##  default make rules included by all Makefiles
##
include $(TOP)/config/config_make_rules

export TEMPLATE_DIRS

# extend the compiler options depending on the behaviour requested

ifdef DEBUG
ifneq ($(DEBUG),0)
ifneq ($(OPTIMISE),4)
	CFLAGS += $(DEBUG_CCFLAGS)
	CXXFLAGS += $(DEBUG_CXXFLAGS)
endif
endif
endif

ifdef OPTIMISE
ifneq ($(OPTIMISE),0)
	CFLAGS += $(OPTIMISE_CCFLAGS)
	CXXFLAGS += $(OPTIMISE_CXXFLAGS)
endif
endif

ifdef WARN
ifneq ($(WARN),0)
	CFLAGS += $(WARN_CCFLAGS)
	CXXFLAGS += $(WARN_CXXFLAGS)
endif
endif

ifdef VERBOSE
ifneq ($(VERBOSE),0)
	CFLAGS += $(VERBOSE_CCFLAGS)
	CXXFLAGS += $(VERBOSE_CXXFLAGS)
endif
endif

DEPEND=make.depend

ifndef MAKE_DEPEND
	MAKE_DEPEND = gcc -MM $(INCLUDES) $(TEMPLATES) $(TEMPLATE_SPECIFIC)
endif

ifndef BUILD_LIB
	BUILD_LIB =$(AR) cruv
endif

ifndef INDEX_LIB
	INDEX_LIB = $(RANLIB)
endif

ALL_DEPEND = $(SRCS) $(H)

CPPFLAGS = $(INCLUDES)

CXX_COMMAND = $(CXX) -c $(CXXFLAGS) $(CPPFLAGS) $(TEMPLATES) 
CXX_COMMAND_TEMPLATES = $(CXX_COMMAND) $(TEMPLATE_SPECIFIC)

%.o : %.cc
	$(CXX_COMMAND) $< -o $@

all:	$(ALL) nothing

$(TSRCS:.cc=.o) : %.o : %.cc
	$(CXX_COMMAND_TEMPLATES) $<

nothing:
	@ echo > /dev/null

.buildlib: $(OBJS)
ifdef INLIB
	$(BUILD_LIB) $(INLIB) $(OBJS)
	$(INDEX_LIB) $(INLIB)
endif
	@ touch .buildlib

$(ALL_EXECS) : $@

$(ALL_LIBS) : $($(@:.a=)_OBJ)
	$(BUILD_LIB) $@ $($(@:.a=)_OBJS)
	$(INDEX_LIB) $@

${BUILD_DIRS}: FORCE
	@ echo "Making in directory $(DIRNAME)/$@ ..."
	@ ${MAKE} --no-print-directory -C $@


# dependencies

depend:
	@ $(RM) -f $(DEPEND)
	@ # a little hack to get it to remake make.depend
	@ $(MAKE) nothing
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i depend ; \
	done
endif


$(DEPEND): $(ALL_DEPEND) 
	: making dependencies -- '$?'
	@if [ ! -f $(DEPEND) ] ;\
		then \
		{ \
		echo ' ######################################################################' ;\
		echo ' # ' ;\
		echo ' # 	Dependencies created for inclusion in $(SELF).' ;\
		echo " #		`date`" ;\
		echo ' # ' ;\
		echo ' ######################################################################' ;\
		echo '' ;\
		} > $(DEPEND) ;\
	fi
	@chmod +w $(DEPEND)
	@for i in  $? ;\
		do \
		case $$i in \
		*.c )   base=`basename $$i .c`; \
			{ \
			awk 'BEGIN {s=0} \
			     s==0 && $$1=="#" && $$2=="'$${base}'" {s=1;next} \
			     s==0 {print; next} \
			     s==1 && NF==0 {s=2; next} \
			     s==2 && NF==0 {s=3; next} \
			     s==3 {print}' \
				$(DEPEND) ;\
			echo "# $${base} `date`" ;\
			echo ;\
			$(MAKE_DEPEND) $(DEPEND_FLAGS) $$i ; \
			echo ;\
			} > "#xxxx" ;\
			mv "#xxxx" $(DEPEND) ;;\
		*.cc )   base=`basename $$i .cc`; \
			{ \
			awk 'BEGIN {s=0} \
			     s==0 && $$1=="#" && $$2=="'$${base}'" {s=1;next} \
			     s==0 {print; next} \
			     s==1 && NF==0 {s=2; next} \
			     s==2 && NF==0 {s=3; next} \
			     s==3 {print}' \
				$(DEPEND) ;\
			echo "# $${base} `date`" ;\
			echo ;\
			$(MAKE_DEPEND) $(DEPEND_FLAGS) $$i ; \
			echo ;\
			} > "#xxxx" ;\
			mv "#xxxx" $(DEPEND) ;;\
		esac ;\
	done
	@chmod -w $(DEPEND)

# Visual C++ Support

vc_make.depend: make.depend
	@echo Creating vc_make.depend for $(DIRNAME)
	@sed -e '/\.o/s//.obj/g' -e 's/[ 	]\/[^ 	]*/ /g' -e 's/\//\\/g' make.depend > vc_make.depend

VCMakefile: FORCE 
	@echo Creating VCMakefile for $(DIRNAME)
	@{ \
	echo ;\
	echo '# Makefile for MicroCruft Visual C++' ;\
	echo ;\
	echo TOP=$(subst /,\\,$(TOP)) ;\
	echo ;\
	echo DIRNAME=$(subst /,\\,$(DIRNAME)) ;\
	echo ;\
	echo todo: default_target ;\
	echo ;\
	} > VCMakefile
ifdef OBJS
	@{ \
	echo OBJS = $(subst _unix,_win32,$(OBJS:%.o=%.obj));\
	echo ;\
	} >> VCMakefile
endif
ifdef AUX_OBJS
	@{ \
	echo 'AUX_OBJS = $(subst /,\,$(subst .o,.obj,$(AUX_OBJS)))' ;\
	echo ;\
	} >> VCMakefile
endif
ifdef BUILD_DIRS
	@{ \
	echo DIRS = $(BUILD_DIRS);\
	echo ;\
	} >> VCMakefile
endif
ifdef MODULE_DIRS
	@echo 'MODULE_DIRS = $(MODULE_DIRS)' >> VCMakefile
endif
ifdef ABSTRACT_TYPES
	@echo 'ABSTRACT_TYPES = $(ABSTRACT_TYPES)' >> VCMakefile
endif
ifdef LOCAL_INCLUDES
	@{ \
	echo LOCAL_INCLUDES = $(subst -I,/I,$(subst /,\\,$(LOCAL_INCLUDES)));\
	echo ;\
	} >> VCMakefile
endif
ifdef WIN_CFLAGS
	@{ \
	echo 'CFLAGS = $(WIN_CFLAGS)';\
	echo ;\
	} >> VCMakefile
else
	@{ \
	echo 'CFLAGS = $$(DEBUGFLAGS) $$(OPTFLAGS) $$(INCLUDEFLAGS)' ;\
	echo ;\
	} >> VCMakefile
endif
ifdef INLIB
	@echo 'INLIB = $(subst /,\,$(subst .a,.lib,$(INLIB)))' >> VCMakefile
else
	@echo 'INLIB = $$(TOP)\src\lib\libfestival.lib' >> VCMakefile
endif
ifdef VCLIBS
	@echo 'VCLIBS = $(subst /,\,$(subst .a,.lib,$(VCLIBS)))' >> VCMakefile
endif
ifdef TOADD
	@echo 'TOADD = $(subst /,\,$(subst .o,.obj,$(TOADD)))' >> VCMakefile
endif
ifdef ADDLIB
	@echo 'ADDLIB = $(subst /,\,$(subst .a,.lib,$(ADDLIB)))' >> VCMakefile
endif
ifdef MANPAGES
	@echo 'ALL = .vc_build_manpages' >> VCMakefile
else
ifdef SHELL_SCRIPTS
	@echo 'ALL = .vc_build_scripts' >> VCMakefile
else
ifdef ALL_EXECS
	@{ \
		echo ;\
	PROG_NAMES=`echo '$(ALL_EXECS)' | sed -e 's%[^ ]*/%%g'` ;\
	echo PROGS = `echo "$$PROG_NAMES" | sed -e 's%\([^ ][^ ]*\)%\1.exe%g'` ;\
	echo ;\
	echo 'ALL = $$(PROGS)' ;\
	} >> VCMakefile
else
	@{ \
	echo ;\
	echo ALL =$(subst .o,.obj,$(subst .add_to_lib,.vc_add_to_lib, $(subst .buildlib,.vcbuildlib,$(ALL)))) ;\
	echo ;\
	} >> VCMakefile
endif
endif
endif
ifeq (yes,$(shell test -f VCLocalRules && echo yes))
	@{ \
	echo 'dummy_target_1:' ;\
	echo ;\
	echo '!include VCLocalRules' ;\
	echo ;\
	} >> VCMakefile
endif
	@{ \
	echo 'dummy_target_2:' ;\
	echo ;\
	echo '!include $$(TOP)\config\vc_default_make_rules';\
	echo ;\
	} >> VCMakefile
ifeq (yes,$(shell test -f make.depend && echo yes))
	@$(MAKE) --no-print-directory vc_make.depend
	@{ \
	echo 'dummy_target_3:' ;\
	echo ;\
	echo '!include vc_make.depend' ;\
	echo ;\
	} >> VCMakefile
endif
ifdef ALL_EXECS
	@{ \
	PROG_NAMES=`echo '$(ALL_EXECS)' | sed -e 's%[^ ]*/%%g'` ;\
	echo ;\
	for ex in $$PROG_NAMES ; do \
		if [ -f $${ex}_main.cc ] ;\
			then \
			echo "$${ex}.exe : $${ex}_main.obj  \$$(AUX_OBJS) \$$(VCLIBS)" ;\
			echo "	link/nologo \$$(LINKFLAGS) /out:$${ex}.exe $${ex}_main.obj \$$(AUX_OBJS) \$$(VCLIBS) \$$(WINLIBS)" ;\
		else \
			echo "$${ex}.exe : $${ex}.obj  \$$(AUX_OBJS) \$$(VCLIBS)" ;\
			echo "	link/nologo \$$(LINKFLAGS) /out:$${ex}.exe $${ex}.obj \$$(AUX_OBJS) \$$(VCLIBS) \$$(WINLIBS)";\
		fi ;\
		echo ;\
	done ;\
	echo ;\
	} >> VCMakefile
endif
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i VCMakefile ; \
	done
endif

# general junk

clean:
	$(RM) -f $(OBJS) $(ALL_EXECS) $(ALL_LIBS) $(LOCAL_CLEAN) *~
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i clean ; \
	done
endif


# ok, here is the top level building rule

file-list :
	@ for i in $(FILES) ; \
	do  \
	   echo $(DIRNAME)/$$i ; \
	done >>$(TOP)/.file-list 
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i file-list ; \
	done
endif

FORCE:

checkin:
	@ echo "Checking in directory $(DIRNAME)/$@ ..."
	@for i in $(FILES) ; \
	do \
	   if $(TEST) -w $$i ; then \
	      ci -u $$i; \
	   fi; \
	done
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i checkin ; \
	done
endif

update:
	@ echo "Updating in directory $(DIRNAME)/$@ ..."
	@for i in $(FILES) ; \
	do \
	   if $(TEST) ! -f $$i ; then \
	      co $$i; \
	   fi; \
	   if $(TEST) RCS/$$i,v -nt $$i ; then \
		co $$i; \
	   fi; \
	done
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i update ; \
	done
endif

LOCKED_FILTER=-l$(USER),$(LOGNAME)
export LOCKED_FILTER

all_locked:
	$(MAKE) --no-print-directory LOCKED_FILTER= locked


locked:
	@locked=`rlog -L -R $(LOCKED_FILTER) $(FILES)` ;\
	if $(TEST) -n "$$locked" ; then \
		 echo "Locked in directory $(DIRNAME) ..."; \
		for i in $$locked ; \
		do \
			rlog -h $$i | awk '$$1 == "Working" {f=$$3} $$1=="locks:" {n=1;next} n==1 {w=$$1;n=0} END {print w "\t" f}' - ;\
		done ;\
	else \
		echo "Nothing in $(DIRNAME) ..." ;\
	fi
ifdef ALL_DIRS
	@ for i in $(ALL_DIRS) ; \
	do \
	   $(MAKE) --no-print-directory -C $$i locked ; \
	done
endif

# Finally, here are the automatically updated dependencies
ifdef SRCS
-include $(DEPEND)
endif
