#-----------------------------------------------------------------------------#
# Copyright (C) 1995-2004 The University of Melbourne. 
# This file may only be copied under the terms of the GNU General
# Public Licence - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#

# Mmakefile - the top-level Mmake file for the Mercury implementation

# We need to explicitly include scripts/Mmake.vars here, even though `mmake'
# includes that file automatically, to make sure that we get the right
# version of that file.  The settings in that file include values set
# by parameters to configure (e.g. --prefix), and we need to make sure
# that we pick up the values from the Mmake.vars that we're going to install,
# rather than from the old version of mmake that we're installing with,
# which may have been configured with a different --prefix.
include scripts/Mmake.vars

MAIN_TARGET=all

MERCURY_DIR=.
include Mmake.common

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

SUBDIRS = \
		scripts \
		util \
		boehm_gc \
		runtime \
		library \
		trace \
		browser \
		analysis \
		compiler \
		doc \
		profiler \
		deep_profiler \
		tools

MMAKEFLAGS =

SUBDIR_MMAKE =	PATH=../scripts:../util:$$PATH \
		MMAKE_VPATH=. \
		MMAKE_DIR=../scripts \
		../scripts/mmake $(MMAKEFLAGS)

SUBSUBDIR_MMAKE = PATH=../../scripts:../../util:$$PATH \
		MMAKE_VPATH=. \
		MMAKE_DIR=../../scripts \
		../../scripts/mmake $(MMAKEFLAGS)

GENERATED_DOCS = README INSTALL WORK_IN_PROGRESS TODO

# If you change these, you will also need to change the files indicated
# in scripts/c2init.in.
RT_LIB_NAME = mer_rt
STD_LIB_NAME = mer_std
TRACE_LIB_NAME = mer_trace
BROWSER_LIB_NAME = mer_browser
MDBCOMP_LIB_NAME = mer_mdbcomp
ANALYSIS_LIB_NAME = mer_analysis

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

# `mmake dep' ensures that the .dep files exist;
# `mmake depend' forces them to be remade to ensure that they are up-to-date.

.PHONY: dep
dep: dep_library dep_browser dep_analysis dep_compiler \
		dep_profiler dep_deep_profiler

.PHONY: dep_library
dep_library: library/$(deps_subdir)$(STD_LIB_NAME).dep

library/$(deps_subdir)$(STD_LIB_NAME).dep:
	+cd library && $(SUBDIR_MMAKE) depend

.PHONY: dep_browser
dep_browser: \
	browser/$(deps_subdir)$(BROWSER_LIB_NAME).dep \
	browser/$(deps_subdir)$(MDBCOMP_LIB_NAME).dep

browser/$(deps_subdir)$(BROWSER_LIB_NAME).dep:
	+cd browser && $(SUBDIR_MMAKE) $(BROWSER_LIB_NAME).depend

browser/$(deps_subdir)$(MDBCOMP_LIB_NAME).dep:
	+cd browser && $(SUBDIR_MMAKE) $(MDBCOMP_LIB_NAME).depend

.PHONY: dep_analysis
dep_analysis: analysis/$(deps_subdir)$(ANALYSIS_LIB_NAME).dep

analysis/$(deps_subdir)$(ANALYSIS_LIB_NAME).dep:
	+cd analysis && $(SUBDIR_MMAKE) depend

.PHONY: dep_compiler
dep_compiler: compiler/$(deps_subdir)top_level.dep

compiler/$(deps_subdir)top_level.dep: library/$(deps_subdir)$(STD_LIB_NAME).dep
	+cd compiler && $(SUBDIR_MMAKE) depend

.PHONY: dep_profiler
dep_profiler: profiler/$(deps_subdir)mercury_profile.dep

profiler/$(deps_subdir)mercury_profile.dep: \
		library/$(deps_subdir)$(STD_LIB_NAME).dep
	+cd profiler && $(SUBDIR_MMAKE) depend

.PHONY: dep_deep_profiler
ifeq ("$(ENABLE_DEEP_PROFILER)","yes")
dep_deep_profiler: deep_profiler/$(deps_subdir)mdprof_cgi.dep \
		deep_profiler/$(deps_subdir)mdprof_test.dep
else
dep_deep_profiler:
endif

deep_profiler/$(deps_subdir)mdprof_cgi.dep: \
		library/$(deps_subdir)$(STD_LIB_NAME).dep
	+cd deep_profiler && $(SUBDIR_MMAKE) mdprof_cgi.depend

deep_profiler/$(deps_subdir)mdprof_test.dep: \
		library/$(deps_subdir)$(STD_LIB_NAME).dep
	+cd deep_profiler && $(SUBDIR_MMAKE) mdprof_test.depend

# depend_library MUST be done before depend_compiler and depend_profiler

.PHONY: depend
depend:
	+cd library && $(SUBDIR_MMAKE) depend
	+cd browser && $(SUBDIR_MMAKE) depend
	+cd analysis && $(SUBDIR_MMAKE) depend
	+cd compiler && $(SUBDIR_MMAKE) depend
	+cd profiler && $(SUBDIR_MMAKE) depend
	+cd deep_profiler && $(SUBDIR_MMAKE) depend

.PHONY: depend_library
depend_library:
	+cd library && $(SUBDIR_MMAKE) depend

.PHONY: depend_browser
depend_browser:
	+cd browser && $(SUBDIR_MMAKE) depend

.PHONY: depend_compiler
depend_compiler:
	+cd compiler && $(SUBDIR_MMAKE) depend

.PHONY: depend_profiler
depend_profiler:
	+cd profiler && $(SUBDIR_MMAKE) depend

.PHONY: depend_deep_profiler
depend_deep_profiler:
	+cd deep_profiler && $(SUBDIR_MMAKE) depend

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

.PHONY: all
all: $(GENERATED_DOCS) mercury-compiler.spec $(SUBDIRS)

.PHONY: util
util: scripts
	+cd util && $(SUBDIR_MMAKE)

.PHONY: scripts
scripts:
	+cd scripts && $(SUBDIR_MMAKE)

.PHONY: boehm_gc
boehm_gc: scripts
	+gc_grade=`scripts/ml --grade $(GRADE) --print-gc-grade`; \
	cd boehm_gc && $(SUBDIR_MMAKE) GC_GRADE=$$gc_grade

.PHONY: runtime
runtime: scripts boehm_gc
	+cd runtime && $(SUBDIR_MMAKE)

.PHONY: library
library: dep_library scripts util boehm_gc runtime
	+cd library && $(SUBDIR_MMAKE)

.PHONY: browser
browser: dep_browser scripts util boehm_gc runtime library
	+cd browser && $(SUBDIR_MMAKE)

.PHONY: analysis
analysis: dep_analysis scripts util boehm_gc runtime library browser trace
	+cd analysis && $(SUBDIR_MMAKE)

.PHONY: runtime
trace: scripts boehm_gc runtime library browser
	+cd trace && $(SUBDIR_MMAKE)

.PHONY: compiler
compiler: dep_compiler scripts util boehm_gc runtime library \
		browser trace analysis
	+cd compiler && $(SUBDIR_MMAKE)

.PHONY: libmmc
libmmc: dep_compiler scripts util boehm_gc runtime library \
		browser trace analysis
	+cd compiler && $(SUBDIR_MMAKE) libmmc

.PHONY: doc
doc: scripts util
	+cd doc && $(SUBDIR_MMAKE)

.PHONY: profiler
profiler: dep_profiler scripts util boehm_gc runtime library browser trace
	+cd profiler && $(SUBDIR_MMAKE)

.PHONY: deep_profiler
deep_profiler: dep_deep_profiler scripts util boehm_gc runtime library \
		browser trace
	+cd deep_profiler && $(SUBDIR_MMAKE)

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

.PHONY: tags
tags: tags_compiler tags_library tags_browser tags_analysis \
		tags_profiler tags_deep_profiler

.PHONY: tags_compiler
tags_compiler:
	+cd compiler && $(SUBDIR_MMAKE) tags

.PHONY: tags_library
tags_library:
	+cd library && $(SUBDIR_MMAKE) tags

.PHONY: tags_browser
tags_browser:
	+cd browser && $(SUBDIR_MMAKE) tags

.PHONY: tags_analysis
tags_analysis:
	+cd analysis && $(SUBDIR_MMAKE) tags

.PHONY: tags_profiler
tags_profiler:
	+cd profiler && $(SUBDIR_MMAKE) tags

.PHONY: tags_deep_profiler
tags_deep_profiler:
	+cd deep_profiler && $(SUBDIR_MMAKE) tags

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

# Remove from each of the listed directories mmc-generated files that don't
# belong there.
cleanint:
	for dir in analysis browser compiler deep_profiler library profiler; \
	do \
		echo Looking for inappropriate files in the $$dir directory: ; \
		( cd $$dir && ../tools/cleanint > .cleanint ) ; \
		if test -s $$dir/.cleanint ; then \
			cat $$dir/.cleanint ; \
		else \
			echo none found. ; \
		fi \
	done

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

configure: configure.in aclocal.m4
	autoconf

config.status: configure VERSION
	if [ -f ./config.status ]; then \
		./config.status --recheck; \
	else \
		echo "======> You need to run configure!"; \
		exit 1; \
	fi

Mmake.common: Mmake.common.in config.status
	./config.status

README: .README.in VERSION
	sed 's/@VERSION@/$(VERSION)/g' .README.in > README

INSTALL: .INSTALL.in VERSION
	sed 's/@VERSION@/$(VERSION)/g' .INSTALL.in > INSTALL

ifeq ("$(LYNX)","")
HTML_TO_TEXT = cat
else
HTML_TO_TEXT = TERM=vt100 lynx -dump
endif

WORK_IN_PROGRESS: compiler/notes/work_in_progress.html
	$(HTML_TO_TEXT) compiler/notes/work_in_progress.html > WORK_IN_PROGRESS

TODO: compiler/notes/todo.html
	$(HTML_TO_TEXT) compiler/notes/todo.html > TODO

mercury-compiler.spec: .mercury-compiler.spec.in VERSION
	version_with_underscores=`echo $(VERSION) | sed 's/-/_/g'`; \
	beta_dir=`expr "$(VERSION)" : '\(.*beta\).*'`; \
	maybe_beta=`case $(VERSION) in \
			rotd*) echo "beta-releases/rotd/" ;; \
			*beta*) echo "beta-releases/$$beta_dir/" ;; \
		    esac`; \
	sed -e "s/@VERSION@/$(VERSION)/g" \
	    -e "s/@VERSION_WITH_UNDERSCORES@/$$version_with_underscores/g" \
	    -e "s^@MAYBE_BETA@^$$maybe_beta^g" \
	    .mercury-compiler.spec.in > mercury-compiler.spec

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

# Generally you should do a `mmake realclean' before doing `mmake tar'.

.PHONY: tar
tar: $(GENERATED_DOCS)
	touch Mmake.params
	cd util && mmake
	+cd runtime && $(SUBDIR_MMAKE) cs $(RT_LIB_NAME).init
	+cd library && $(SUBDIR_MMAKE) depend
	+cd library && $(SUBDIR_MMAKE) all-ints cs $(STD_LIB_NAME).init tags
	+cd browser && $(SUBDIR_MMAKE) depend
	+cd browser && $(SUBDIR_MMAKE) all-ints cs \
		$(BROWSER_LIB_NAME).init $(MDBCOMP_LIB_NAME).init tags
	+cd trace && $(SUBDIR_MMAKE) cs
	+cd analysis && $(SUBDIR_MMAKE) depend
	+cd analysis && $(SUBDIR_MMAKE) all-ints cs tags
	+cd compiler && $(SUBDIR_MMAKE) depend
	+cd compiler && $(SUBDIR_MMAKE) cs tags
	+cd profiler && $(SUBDIR_MMAKE) depend
	+cd profiler && $(SUBDIR_MMAKE) cs tags
	+cd deep_profiler && $(SUBDIR_MMAKE) depend
	+cd deep_profiler && $(SUBDIR_MMAKE) cs tags
	+cd doc && $(SUBDIR_MMAKE) info html dvi mdb_doc
	# the following commands might fail on Windows?
	-cd bindist && $(SUBDIR_MMAKE) bindist.Makefile
	-cd bindist && $(SUBDIR_MMAKE) bindist.INSTALL
	-cd extras/dynamic_linking && $(SUBSUBDIR_MMAKE) sources
	# clean up
	cd scripts && mmake realclean
	cd scripts && mmake canonical_grade
	cd util && mmake realclean
	cd doc && mmake distclean
	-rm -f errs errs2 update.log
	-rm -f config.status config.cache config.log configure.log a.out
	-rm -f runtime/mercury_conf.h boehm_gc/mercury_boehm_gc_conf.h
	-rm -f Mmake.common
	-rm -f extras/Mmake.params
	chmod -R a+r *
	# Package up the mercury directory with some subdirectories
	# excluded, into a gzipped tar archive that will unpack into
	# mercury-compiler-$(VERSION).
	# Put the extras directory into a gzipped tar archive that
	# will unpack into mercury-extras-$(VERSION).
	# Put the tests directory into a gzipped tar archive that
	# will unpack into mercury-tests-$(VERSION).
	DIRNAME="`pwd`";						\
	ROOTNAME="`basename $$DIRNAME`";				\
	export ROOTNAME;						\
	cd .. && (							\
		mkdir stuff-to-exclude;					\
		mv $$ROOTNAME/trial	stuff-to-exclude;		\
		mv $$ROOTNAME/bytecode	stuff-to-exclude;		\
		mv $$ROOTNAME/lp_solve	stuff-to-exclude;		\
		mv $$ROOTNAME/trax	stuff-to-exclude;		\
		mv $$ROOTNAME/extras/opium_m	stuff-to-exclude;	\
		mv $$ROOTNAME/extras/aditi stuff-to-exclude;		\
		mv $$ROOTNAME/extras	mercury-extras-$(VERSION);	\
		mv $$ROOTNAME		mercury-compiler-$(VERSION);	\
		mv tests		mercury-tests-$(VERSION);	\
		tar -cf - mercury-compiler-$(VERSION) |			\
			gzip -9 > mercury-compiler-$(VERSION).tar.gz;	\
		tar -cf - mercury-extras-$(VERSION) |			\
			gzip -9 > mercury-extras-$(VERSION).tar.gz;	\
		tar -cf - mercury-tests-$(VERSION) |			\
			gzip -9 > mercury-tests-$(VERSION).tar.gz;	\
		mv mercury-compiler-$(VERSION)	$$ROOTNAME;		\
		mv mercury-extras-$(VERSION)	$$ROOTNAME/extras;	\
		mv mercury-tests-$(VERSION)	tests;			\
		mv stuff-to-exclude/opium_m	$$ROOTNAME/extras/opium_m;\
		mv stuff-to-exclude/aditi	$$ROOTNAME/extras/aditi;\
		mv stuff-to-exclude/*		$$ROOTNAME;		\
		rmdir stuff-to-exclude;					\
	)

.PHONY: version
version:
	@echo $(VERSION)

.PHONY: fullarch
fullarch:
	@echo $(FULLARCH)

.PHONY: echo_libgrades
echo_libgrades:
	@echo $(LIBGRADES)

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

# The code of the install rule is duplicated in bindist/bindist.Makefile.in.

.PHONY: install
install: install_main install_grades
	@echo
	@echo "-- Installation complete."
	@echo
	@echo "-- Don't forget to add $(INSTALL_BINDIR) to your PATH,"
	@echo "-- $(INSTALL_MAN_DIR) to your MANPATH,"
	@echo "-- and $(INSTALL_INFO_DIR) to your INFOPATH,"
	@if test $(ENABLE_DEEP_PROFILER) != yes || \
		cmp -s deep_profiler/mdprof_cgi \
			$(INSTALL_CGI_DIR)/mdprof_cgi; \
	then true ; else \
		echo "-- to copy deep_profiler/mdprof_cgi" \
			"to $(INSTALL_CGI_DIR),"; \
	fi
	@echo "-- and to add the following lines to the \`.emacs' file"
	@echo "-- in your home directory:"
	@echo "	(setq load-path (cons (expand-file-name "
	@echo "		\"$(INSTALL_ELISP_DIR)\") load-path))"
	@echo "	(autoload 'mdb \"gud\" \"Invoke the Mercury debugger\" t)"

.PHONY: install_main
install_main: all \
		install_scripts install_util install_runtime install_boehm_gc \
  		install_library install_browser install_trace \
		install_compiler install_profiler install_deep_profiler \
		install_doc install_config
 
.PHONY: install_scripts
install_scripts: scripts
	+cd scripts && $(SUBDIR_MMAKE) install

.PHONY: install_util
install_util: util
	+cd util && $(SUBDIR_MMAKE) install

.PHONY: install_config
install_config:
	[ -d $(INSTALL_RECONF_DIR) ] || mkdir -p $(INSTALL_RECONF_DIR)
	cp VERSION aclocal.m4 configure configure.in config.guess \
		config.sub install-sh $(INSTALL_RECONF_DIR)

.PHONY: install_runtime
install_runtime: runtime
	+cd runtime && $(SUBDIR_MMAKE) install

.PHONY: install_trace
install_trace: trace
	+cd trace && $(SUBDIR_MMAKE) install

.PHONY: install_boehm_gc
install_boehm_gc: boehm_gc
	+gc_grade=`scripts/ml --grade $(GRADE) --print-gc-grade`; \
	cd boehm_gc && $(SUBDIR_MMAKE) install GC_GRADE=$$gc_grade

.PHONY: install_library
install_library: dep_library library
	+cd library && $(SUBDIR_MMAKE) install

.PHONY: install_browser
install_browser: dep_browser browser
	+cd browser && $(SUBDIR_MMAKE) install

.PHONY: install_compiler
install_compiler: dep_compiler compiler
	+cd compiler && $(SUBDIR_MMAKE) install

.PHONY: install_doc
install_doc: doc
	+cd doc && $(SUBDIR_MMAKE) install

.PHONY: install_profiler
install_profiler: profiler
	+cd profiler && $(SUBDIR_MMAKE) install

.PHONY: install_deep_profiler
install_deep_profiler: deep_profiler
	+cd deep_profiler && $(SUBDIR_MMAKE) install

.PHONY: install_grades
install_grades: scripts
	for dir in boehm_gc runtime trace; do \
	    ( cd $$dir; rm -rf tmp_dir; mkdir tmp_dir; \
		mv -f *.$O *.pic_o *.$A *.so tmp_dir; true ); \
	done
	for dir in library browser; do \
	    ( cd $$dir && rm -rf tmp_dir && mkdir tmp_dir && \
		for ext in $(GRADE_SUBDIR_EXTS); do \
		    mv -f *.$$ext Mercury/$${ext}s/*.$$ext tmp_dir; \
		done; \
		mv -f $(deps_subdir)*.dep $(deps_subdir)*.dv *.$O \
			Mercury/os/*.$O *.$A *.so tmp_dir; true ); \
	done
	#
	# Use the newly installed compiler to build the libraries
	# in various different grades.  We need to override MC=mmc
	# so that we use the mmc from the scripts directory, which
	# runs the newly installed compiler, rather than using the
	# bootstrap compiler.
	#
	+for grade in x $(LIBGRADES); do \
	    if [ "$$grade" != "x" -a "$$grade" != "$(GRADE)" ]; then \
	    	gc_grade=`scripts/ml --grade $$grade --print-gc-grade`; \
	        ( cd boehm_gc && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade GC_GRADE=$$gc_grade \
		  	install_lib ) && \
		( cd runtime && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade install_lib ) && \
		( cd library && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade depend && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade install_library ) && \
		( cd browser && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade depend && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade install_library ) && \
		( cd trace && \
		  $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade install_lib ) && \
		for dir in boehm_gc runtime trace; do \
			( cd $$dir && rm -f *.$O *.pic_o *.$A *.so ); \
		done && \
		for dir in library browser; do \
		   ( cd $$dir && \
		   	for ext in $(GRADE_SUBDIR_EXTS); do \
				rm -f *.$$ext Mercury/$${ext}s/*.$$ext; \
			done && \
			rm -f $(deps_subdir)*.dep $(deps_subdir)*.dv *.$O \
				Mercury/os/*.$O *.$A *.so ); \
		done \
		|| { scripts/mercury_cleanup_install; exit 1; }; \
	    fi; \
	done
	for dir in boehm_gc runtime trace; do \
	    ( cd $$dir && { mv tmp_dir/* . ; rmdir tmp_dir; true; } ); \
	done
	for dir in library browser; do \
	    ( cd $$dir && { \
		for ext in $(GRADE_SUBDIR_EXTS); do \
		    [ -d Mercury/$${ext}s ] && \
		    	mv tmp_dir/*.$$ext Mercury/$${ext}s; \
		done; \
		mv tmp_dir/*.dep tmp_dir/*.dv $(deps_subdir).; \
	    	mv tmp_dir/* . ; rmdir tmp_dir; true; } ); \
	done

.PHONY: install_split_library
install_split_library: scripts dep_library
	#
	# Use the newly installed compiler to build the libraries
	# in various different grades.  We need to override MC=mmc
	# so that we use the mmc from the scripts directory, which
	# runs the newly installed compiler, rather than using the
	# bootstrap compiler.
	#
	+cd library && \
	rm -rf tmp_dir && \
	mkdir tmp_dir && \
	for ext in $(GRADE_SUBDIR_EXTS); do \
		mv -f *.$$ext Mercury/$${ext}s/*.$$ext tmp_dir; \
	done || true && \
	{ mv -f $(deps_subdir)*.dep $(deps_subdir)*.dv *.$O Mercury/os/*.$O \
		*.$A *.so tmp_dir || true; } && \
	for grade in x $(LIBGRADES); do \
	    if [ "$$grade" != "x" ]; then \
	        $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade depend && \
	        $(SUBDIR_MMAKE) MC=mmc GRADE=$$grade install_split_library || \
			{ scripts/mercury_cleanup_install; exit 1; }; \
		for ext in $(GRADE_SUBDIR_EXTS); do \
			rm -f *.$$ext Mercury/$${ext}s/*.$$ext; \
		done; \
		rm -f *.$O Mercury/os/*.$O *.$A *.so; \
	    fi; \
	done && \
	{ for ext in $(GRADE_SUBDIR_EXTS); do \
	    [ -d Mercury/$${ext}s ] && mv tmp_dir/*.$$ext Mercury/$${ext}s; \
	done; \
	mv tmp_dir/*.dep tmp_dir/*.dv $(deps_subdir).; \
	mv tmp_dir/* . ; rmdir tmp_dir; true; }

#-----------------------------------------------------------------------------#
#
# Various horrible hacks for gnu-win32 on Windows.
#

# `make touch_files' is a work-around for the broken gnu-win32 `tar'
# that loses all the file dates.
.PHONY: touch_files
touch_files:
	-find . | xargs touch
	sleep 1
	touch library/*.date*
	touch library/*.optdate
	chmod +w library/*.dep
	touch library/*.dep
	touch browser/*.date*
	touch browser/*.optdate
	chmod +w browser/*.dep
	touch browser/*.dep
	touch analysis/*.date*
	chmod +w analysis/*.dep
	touch analysis/*.dep
	touch compiler/*.date*
	chmod +w compiler/*.dep
	touch compiler/*.dep
	touch profiler/*.date*
	chmod +w profiler/*.dep
	touch profiler/*.dep
	touch deep_profiler/*.date*
	chmod +w deep_profiler/*.dep
	touch deep_profiler/*.dep
	touch doc/*.texi configure
	sleep 1
	touch boehm_gc/*.c
	touch runtime/*.c
	touch library/*.c
	touch browser/*.c
	touch trace/*.c
	touch compiler/*.c
	touch profiler/*.c
	touch deep_profiler/*.c
	touch doc/*.info doc/*.dvi doc/*.html config.status

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

.PHONY: uninstall
uninstall:
	+cd scripts; $(SUBDIR_MMAKE) uninstall
	+cd deep_profiler; $(SUBDIR_MMAKE) uninstall
	+cd util; $(SUBDIR_MMAKE) uninstall
	+cd doc; $(SUBDIR_MMAKE) uninstall
	-rm -r $(INSTALL_LIBDIR)

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

.PHONY : bindist
bindist: WORK_IN_PROGRESS TODO
	cd bindist; \
		PATH="$(INSTALL_PREFIX)/bin:$$PATH" \
		MMAKE_DIR="$(INSTALL_MMAKE_DIR)" \
		mmake -v binary_distribution

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

clean: clean_subdirs clean_tests

.PHONY: clean_subdirs
clean_subdirs:
	rm -rf runtime/tmp_dir library/tmp_dir browser/tmp_dir trace/tmp_dir
	+for dir in $(SUBDIRS); do \
		if [ "$$dir" = scripts ]; then continue; fi; \
		(cd $$dir; $(SUBDIR_MMAKE) clean) \
	done

.PHONY: clean_tests
clean_tests:
	+if test -d tests; then \
		(cd tests; $(MMAKE) clean) \
	fi

realclean: realclean_subdirs realclean_local realclean_tests

.PHONY: realclean_local
realclean_local: realclean_config realclean_docs

.PHONY: realclean_subdirs
realclean_subdirs: clean_subdirs
	rm -rf stage[1-3] stage[1-3].*
	+for dir in $(SUBDIRS); do \
		if [ "$$dir" = scripts ]; then continue; fi; \
		(cd $$dir; $(SUBDIR_MMAKE) realclean) \
	done
	+cd scripts; $(SUBDIR_MMAKE) realclean

.PHONY: realclean_docs
realclean_docs:
	rm -f $(GENERATED_DOCS)

.PHONY: realclean_config
realclean_config:
	rm -f config.cache config.status config.log configure.log configure.help

.PHONY: realclean_tests
realclean_tests:
	+if test -d tests; then \
		(cd tests; $(MMAKE) realclean) \
	fi

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