banner = $(SILENT) \
	echo ; \
	echo "****************************************************************" ; \
	echo "* Module  : "$(MODULE_NAME) ; \
	echo "* Comment : "$(MODULE_COMMENT) ; \
	echo "****************************************************************" ; \

subdir_recurse = $(SILENT) \
	for i in $(SUBDIRS) xxxx ; do \
		if [ -d $$i ] ; then \
			if ! $(MAKE) -C $$i $@ ; then \
                                exit -1; \
                        fi; \
		fi \
	done

install_includes = $(SILENT) \
	for i in $(PUBLIC_INCLUDES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(INC_DIR)/carmen/$$i $$i ; then \
			echo "    ---- Copying $$i to $(INC_DIR)/carmen" ; \
			export dir=`pwd` ; \
			$(RM) -f $(INC_DIR)/carmen/$$i ; \
			$(LN) -s $$dir/$$i $(INC_DIR)/carmen/$$i ; \
		fi; \
	done 

install_libraries = $(SILENT) \
	for i in $(PUBLIC_LIBRARIES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(LIB_DIR)/$$i $$i ; then \
			echo "    ---- Copying $$i to $(LIB_DIR)" ; \
			export dir=`pwd` ; \
			$(RM) -f $(LIB_DIR)/$$i ; \
			$(LN) -s $$dir/$$i $(LIB_DIR)/$$i ; \
		fi; \
	done 

install_binaries = $(SILENT) \
	for i in $(PUBLIC_BINARIES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(BIN_DIR)/$$i $$i ; then \
			echo "    ---- Copying $$i to $(BIN_DIR)" ; \
			export dir=`pwd` ; \
			$(RM) -f $(BIN_DIR)/$$i ; \
			$(CP) $$dir/$$i $(BIN_DIR)/$$i ; \
		fi; \
	done 

install_manpages = $(SILENT) \
	for i in $(MAN_PAGES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(MAN_DIR)/$$i $$i ; then \
			echo "    ---- Copying $$i to $(MAN_DIR)" ; \
			export dir=`pwd` ; \
			$(RM) -f $(MAN_DIR)/$$i ; \
			$(LN) -s $$dir/$$i $(MAN_DIR)/$$i ; \
		fi; \
	done

global_install_includes = $(SILENT) \
	for i in $(PUBLIC_INCLUDES) xxxx ; do \
		if test -f $$i && \
		   ! $(NEWER) $(GLOBAL_INC_DIR)/carmen/$$i $$i ; then \
			echo \
			 "    ---- Copying $$i to $(GLOBAL_INC_DIR)/carmen" ; \
			export dir=`pwd` ; \
			$(RM) -f $(GLOBAL_INC_DIR)/carmen/$$i ; \
			$(CP) $$dir/$$i $(GLOBAL_INC_DIR)/carmen/$$i ; \
		fi; \
	done 

global_install_libraries = $(SILENT) \
	for i in $(PUBLIC_LIBRARIES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(GLOBAL_LIB_DIR)/$$i $$i ; then \
			echo "    ---- Copying $$i to $(GLOBAL_LIB_DIR)" ; \
			export dir=`pwd` ; \
			$(RM) -f $(GLOBAL_LIB_DIR)/$$i ; \
			$(CP) $$dir/$$i $(GLOBAL_LIB_DIR)/$$i ; \
		fi; \
	done 

global_install_binaries = $(SILENT) \
	for i in $(PUBLIC_BINARIES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(GLOBAL_BIN_DIR)/$$i $$i ; then \
			echo "    ---- Copying $$i to $(GLOBAL_BIN_DIR)" ; \
			export dir=`pwd` ; \
			$(RM) -f $(GLOBAL_BIN_DIR)/$$i ; \
			$(CP) $$dir/$$i $(GLOBAL_BIN_DIR)/$$i ; \
		fi; \
	done 

global_install_manpages = $(SILENT) \
	for i in $(MAN_PAGES) xxxx ; do \
		if test -f $$i && ! $(NEWER) $(GLOBAL_MAN_DIR)/$$i $$i ; then \
			echo "    ---- Copying $$i to $(GLOBAL_MAN_DIR)" ; \
			export dir=`pwd` ; \
			$(RM) -f $(GLOBAL_MAN_DIR)/$$i ; \
			$(CP) $$dir/$$i $(GLOBAL_MAN_DIR)/$$i ; \
		fi; \
	done

remove_includes = $(SILENT) \
	for i in $(PUBLIC_INCLUDES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(INC_DIR)/carmen" ; \
			$(RM) -f $(INC_DIR)/carmen/$$i ; \
		fi ; \
	done 

remove_libraries = $(SILENT) \
	for i in $(PUBLIC_LIBRARIES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(LIB_DIR)" ; \
			$(RM) -f $(LIB_DIR)/$$i ; \
		fi ; \
	done 

remove_binaries = $(SILENT) \
	for i in $(PUBLIC_BINARIES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(BIN_DIR)" ; \
			$(RM) -f $(BIN_DIR)/$$i ; \
		fi ; \
	done 

remove_manpages = $(SILENT) \
	for i in $(MAN_PAGES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(MAN_DIR)" ; \
			$(RM) -f $(MAN_DIR)/$$i ; \
		fi ; \
	done

global_remove_includes = $(SILENT) \
	for i in $(PUBLIC_INCLUDES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(GLOBAL_INC_DIR)/carmen" ; \
			$(RM) -f $(GLOBAL_INC_DIR)/carmen/$$i ; \
		fi ; \
	done 

global_remove_libraries = $(SILENT) \
	for i in $(PUBLIC_LIBRARIES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(GLOBAL_LIB_DIR)" ; \
			$(RM) -f $(GLOBAL_LIB_DIR)/$$i ; \
		fi ; \
	done 

global_remove_binaries = $(SILENT) \
	for i in $(PUBLIC_BINARIES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(GLOBAL_BIN_DIR)" ; \
			$(RM) -f $(GLOBAL_BIN_DIR)/$$i ; \
		fi ; \
	done 

global_remove_manpages = $(SILENT) \
	for i in $(MAN_PAGES) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			echo "    ---- Removing $$i from $(GLOBAL_MAN_DIR)" ; \
			$(RM) -f $(GLOBAL_MAN_DIR)/$$i ; \
		fi ; \
	done

libraries:
	$(SILENT) for i in $(filter %.a, $(TARGETS)) $(filter %.so, $(TARGETS)) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			if ! $(MAKE) $$i ; then \
                                exit -1; \
                        fi; \
		fi ; \
	done 

binaries:
	$(SILENT) for i in $(filter-out %.a, $(TARGETS)) xxxx ; do \
		if test ! "$$i" = "xxxx" ; then \
			if ! $(MAKE) $$i ; then \
                                exit -1; \
                        fi; \
		fi ; \
	done 

phase1:
	$(banner)
	$(ECHO) ""
	$(ECHO) "  --> Starting make"
	$(install_includes)
	$(install_manpages)
ifneq (Makefile.depend, $(wildcard Makefile.depend))
	$(SILENT) $(MAKE) depend
endif
	$(SILENT) $(MAKE) libraries
	$(install_libraries)
	$(ECHO) "  <-- Make done"

phase2:
	$(banner)
	$(ECHO) ""
	$(ECHO) "  --> Starting make"
	$(SILENT) $(MAKE) binaries
	$(install_binaries)
	$(ECHO) "  <-- Make done"

all:	
	$(banner)
	$(ECHO) ""
	$(ECHO) "  --> Starting make"
	$(install_includes)
	$(install_manpages)
ifneq (Makefile.depend, $(wildcard Makefile.depend))
	$(SILENT) $(MAKE) depend
endif
	$(SILENT) $(MAKE) libraries
	$(install_libraries)
	$(SILENT) $(MAKE) binaries
	$(install_binaries)
	$(ECHO) "  <-- Make done"

install:
	$(banner)
	$(global_install_libraries)
	$(global_install_binaries)
	$(global_install_includes)

clean:
	$(ECHO) "    ---- Cleaning up "$(MODULE_NAME)
	$(SILENT) $(RM) *.o *.a *.so *.exe core a.out Makefile.depend Makefile.depend.bak $(TARGETS) $(CLASSFILES)
	$(subdir_recurse)

relink:
	$(SILENT) $(RM) $(filter-out %.a, $(TARGETS))
	$(SILENT) for i in $(filter-out %.a, $(TARGETS)) ; do \
		$(MAKE) $$i ; \
	done
	$(subdir_recurse)

distclean:
	$(ECHO) "    ---- Cleaning up "$(MODULE_NAME)
	$(SILENT) $(RM) *.o *.a *.so *.exe *~ core a.out
	$(SILENT) $(RM) Makefile.depend Makefile.depend.bak $(TARGETS) $(CLASSFILES)
	$(remove_includes)
	$(remove_manpages)
	$(remove_libraries)
	$(remove_binaries)
	$(RM) core gmon.out *~ .\#* \#*
	$(subdir_recurse)

export:
	$(install_includes)
	$(subdir_recurse)

dep depend:
	$(ECHO) "    ---- Assigning dependencies in "$(MODULE_NAME)
	$(SILENT) $(TOUCH) Makefile.depend
	$(SILENT) if test ! "$(SOURCES)x" = x ; then \
		$(CC) -M $(SOURCES) $(IFLAGS) $(filter -D%, $(CFLAGS)) > Makefile.depend ; \
	fi
	$(SILENT) $(RM) Makefile.depend.bak
	$(subdir_recurse)

debug:
	$(SILENT) $(MAKE) CARMEN_DEBUG=1 all

loud:
	$(SILENT) $(MAKE) MAKEFLAGS= LOUD=1 all

.SUFFIXES: .c .o .a .so .C

.PHONY:	   all clean dep debug

%.o:	%.c
	$(ECHO) "    ---- Compiling $< to $@ (C)"
	$(SILENT) $(CC) $(CFLAGS) $(IFLAGS) -c $< -o $@

%.a:	
	$(ECHO) "    ---- Archiving $^ into $@ (C)"
	$(SILENT) $(AR) $@ $^
	$(SILENT) $(RANLIB) $@

%.o:	%.C
	$(ECHO) "    ---- Compiling $< to $@ (C++)"
	$(SILENT) $(CXX) $(CXXFLAGS) $(IFLAGS) -c $< -o $@

%.o:	%.cpp
	$(ECHO) "    ---- Compiling $< to $@ (C++)"
	$(SILENT) $(CXX) $(CXXFLAGS) $(IFLAGS) -c $< 


%.o:	%.cc
	$(ECHO) "    ---- Compiling $< to $@ (C++)"
	$(SILENT) $(CXX) $(CXXFLAGS) $(IFLAGS) -c $< 

%.so:	
	$(ECHO) "    ---- Archiving $^ into $@ (C)"
	$(SILENT) $(CXX) -shared -o $@ $^

%.doxygen:	
	$(ECHO) "    ---- Compiling $< (Doxygen)"
	$(SILENT) $(DOXYGEN) $<

%:	
	$(ECHO) "    ---- Linking $^ to $@ (C)"
	$(SILENT) $(LINK) $(CFLAGS) $(IFLAGS) $(filter %.o, $^) $(filter %.a, $^) -o $@ -L. $(patsubst lib%.a,-l%,$(filter %.a, $^)) $(LFLAGS) $(LFLAGS_POST)


ifeq (Makefile.depend, $(wildcard Makefile.depend))
include Makefile.depend
endif
