#-----------------------------------------------------------------------------#
#-----------------------------------------------------------------------------#
# Copyright (C) 1996-2009, 2011 The University of Melbourne.
# This file may only be copied under the terms of the GNU General
# Public License - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#

# Mmake - Mmake file for the Mercury scripts

MAIN_TARGET=all

MERCURY_DIR=..
include $(MERCURY_DIR)/Mmake.common

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

NONCONF_SCRIPTS = \
	mprof_merge_runs \
	mtc \
	vpath_find

CONF_SCRIPTS = \
	c2init \
	canonical_grade \
	mdb \
	mdb.bat \
	mdprof \
	mercury.bat \
	mercury_config \
	mercury_update_interface \
	mgnuc \
	mkfifo_using_mknod \
	ml \
	mmake \
	mmc \
	mprof \
	mprof.bat \
	mtags \
	prepare_install_dir

SCRIPTS = $(NONCONF_SCRIPTS) $(CONF_SCRIPTS)

CONF_FILES = \
	Mercury.config.bootstrap \
	Mercury.config \
	Mmake.vars \
	parse_ml_options.sh-subr

CONF_DEBUG_SCRIPTS = 	\
	mdbrc

DEBUGGER_SCRIPTS = $(CONF_DEBUG_SCRIPTS) 	\
		xul_tree.xsl			\
		mdb_open			\
		mdb_grep			\
		mdb_track

EMACS_SCRIPTS = gud.el

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

# .SUFFIXES: .in

# we test membership of CONF_SCRIPTS and CONF_FILES, because testing $(@D)
# (the directory part of $*) does the wrong thing for Mercury.config.
# Not testing anything would make this rule apply even to ../Mmake.common.
# The grep is there to ensure that there were no mispelt autoconf variable
# names.

%::	%.in $(MERCURY_DIR)/config.status
	@for file in $(CONF_SCRIPTS) ; do \
		if test "$*" = "$$file" ; then \
			$(MERCURY_DIR)/config.status --file=$* ; \
			if grep -n '[^$$]@' $@ > /dev/null; \
			then false; \
			else true; \
			fi ; \
			chmod a+x $* ; \
		fi \
	done
	@for file in $(CONF_FILES) $(CONF_DEBUG_SCRIPTS) ; do \
		if test "$*" = "$$file" ; then \
			$(MERCURY_DIR)/config.status --file=$* ; \
			if grep -n '[^$$]@' $@ > /dev/null; \
			then false; \
			else true; \
			fi \
		fi \
	done

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

.PHONY: all
all: $(CONF_FILES) $(SCRIPTS) $(DEBUGGER_SCRIPTS) $(EMACS_SCRIPTS)

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

parse_ml_options.sh-subr mgnuc canonical_grade: init_grade_options.sh-subr
parse_ml_options.sh-subr mgnuc canonical_grade: parse_grade_options.sh-subr 
parse_ml_options.sh-subr mgnuc canonical_grade: final_grade_options.sh-subr 
ml c2init: parse_ml_options.sh-subr
ml c2init canonical_grade: canonical_grade.sh-subr 
mercury_config: ../configure.help

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

.PHONY: install
install: install_mmake install_scripts install_config \
	install_debugger_scripts install_emacs_scripts

.PHONY: install_dirs
install_dirs:
	[ -d $(INSTALL_BINDIR) ] || mkdir -p $(INSTALL_BINDIR)
	[ -d $(INSTALL_LIBDIR)/mmake ] || mkdir -p $(INSTALL_LIBDIR)/mmake
	[ -d $(INSTALL_LIBDIR)/mdb ] || mkdir -p $(INSTALL_LIBDIR)/mdb
	[ -d $(INSTALL_CONF_DIR) ] || mkdir -p $(INSTALL_CONF_DIR)
	[ -d $(INSTALL_ELISP_DIR) ] || mkdir -p $(INSTALL_ELISP_DIR)
	[ -d $(INSTALL_RECONF_DIR)/scripts ] || \
		mkdir -p $(INSTALL_RECONF_DIR)/scripts

.PHONY: install_mmake
install_mmake: Mmake.vars Mmake.rules install_dirs
	rm -f $(INSTALL_LIBDIR)/mmake/Mmake.vars
	cp `vpath_find Mmake.vars Mmake.rules` $(INSTALL_LIBDIR)/mmake

.PHONY: install_scripts
install_scripts: $(SCRIPTS) install_dirs
	# we move the installed `mmake' script before (re)installing it
	# to avoid overwriting the script while it is running
	# (just removing it doesn't work very well on win32, which will
	# deny you permission to write the file while mmake is running).
	-mv $(INSTALL_BINDIR)/mmake $(INSTALL_BINDIR)/mmake.old
	cp $(SCRIPTS) $(INSTALL_BINDIR) 
	-for file in $(SCRIPTS); do \
		chmod u+w $(INSTALL_BINDIR)/$$file ;\
	done
	cp *.in *.sh-subr $(SCRIPTS) $(INSTALL_RECONF_DIR)/scripts
	-rm -f $(INSTALL_BINDIR)/mmake.old

.PHONY: install_config
install_config: Mercury.config install_dirs
	rm -f $(INSTALL_CONF_DIR)/Mercury.config
	cp `vpath_find Mercury.config` $(INSTALL_CONF_DIR)

.PHONY: install_debugger_scripts
install_debugger_scripts: $(DEBUGGER_SCRIPTS) install_dirs
	# Reportedly old versions of Mercury
	# used to install mdbrc as read-only.
	# If that is the case, then we need to make sure
	# that it gets made writable before we install the
	# new version.
	-chmod u+w $(INSTALL_LIBDIR)/mdb/*
	cp $(DEBUGGER_SCRIPTS) $(INSTALL_LIBDIR)/mdb 

.PHONY: install_emacs_scripts
install_emacs_scripts: $(EMACS_SCRIPTS) install_dirs
	cp $(EMACS_SCRIPTS) $(INSTALL_ELISP_DIR)

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

.PHONY: uninstall
uninstall:
	-rm -r $(INSTALL_LIBDIR)/mmake
	-cd $(INSTALL_BINDIR) && rm $(SCRIPTS) 
	-cd $(INSTALL_LIBDIR)/mdb && rm $(DEBUGGER_SCRIPTS)
	# The reason why we don't uninstall $(EMACS_SCRIPTS) specifically here
	# is that the uninstall rule in the top-level Mmakefile does an "rm -r"
	# on $(INSTALL_LIBDIR), and the directory into which $(EMACS_SCRIPTS)
	# is installed, $(INSTALL_ELISP_DIR), is configured to be a
	# subdirectory of $(INSTALL_LIBDIR).

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

realclean_local: clean_scripts

.PHONY: clean_scripts
clean_scripts:
	for file in *.in; do rm -f `basename $$file .in`; done
	rm -f test_mdbrc

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