#######################################################################
# $Header$
#######################################################################

prefix      = @prefix@
exec_prefix = @exec_prefix@
srcdir      = @srcdir@

##############################################################################
# Compiler and system configuration
##############################################################################

SHELL       = /bin/sh
SWIG_LIB    = @swig_lib@
BIN_DIR     = @bindir@
TARGET      = swig@release_suffix@@EXEEXT@
SOURCE      = Source

swig: source

source:
	@cd $(SOURCE) && $(MAKE)

.PHONY: source

#####################################################################
# All the languages SWIG speaks (when it wants to)
#####################################################################

skip-tcl	= test -n "@SKIP_TCL@"
skip-perl5	= test -n "@SKIP_PERL5@"
skip-python	= test -n "@SKIP_PYTHON@"
skip-java	= test -n "@SKIP_JAVA@"
skip-guilescm   = test -n "@SKIP_GUILESCM@"
skip-guile	= test -n "@SKIP_GUILE@"
skip-mzscheme	= test -n "@SKIP_MZSCHEME@"
skip-ruby	= test -n "@SKIP_RUBY@"
skip-php4	= test -n "@SKIP_PHP4@"
skip-ocaml      = test -n "@SKIP_OCAML@"
skip-pike       = test -n "@SKIP_PIKE@"
skip-chicken	= test -n "@SKIP_CHICKEN@"
skip-csharp	= test -n "@SKIP_CSHARP@"
skip-modula3	= test -n "@SKIP_MODULA3@"
skip-lua    	= test -n "@SKIP_LUA@"
skip-allegrocl  = test -n "@SKIP_ALLEGROCL@"

#####################################################################
# CHECK
#####################################################################

ACTION = check

chk-set-swiglib		= SWIG_LIB=@ROOT_DIR@/Lib
chk-set-swig		= SWIG=@ROOT_DIR@/$(TARGET)
chk-set-env = $(chk-set-swiglib) $(chk-set-swig)

chk = $(MAKE) -k -s $(chk-set-env) $(ACTION)

check-aliveness:
	test -x ./$(TARGET)
	./$(TARGET) -version
	./$(TARGET) -help
	@$(skip-tcl)      || ./$(TARGET) -tcl      -help
	@$(skip-perl5)    || ./$(TARGET) -perl     -help
	@$(skip-python)   || ./$(TARGET) -python   -help
	@$(skip-java)     || ./$(TARGET) -java     -help
	@$(skip-guile)    || ./$(TARGET) -guile    -help
	@$(skip-mzscheme) || ./$(TARGET) -mzscheme -help
	@$(skip-ruby)     || ./$(TARGET) -ruby     -help
	@$(skip-ocaml)    || ./$(TARGET) -ocaml    -help
	@$(skip-php4)     || ./$(TARGET) -php4     -help
	@$(skip-pike)     || ./$(TARGET) -pike     -help
	@$(skip-chicken)  || ./$(TARGET) -chicken  -help
	@$(skip-csharp)   || ./$(TARGET) -csharp   -help
	@$(skip-modula3)  || ./$(TARGET) -modula3  -help
	@$(skip-lua)      || ./$(TARGET) -lua      -help

check-examples:					\
	check-tcl-examples			\
	check-perl5-examples			\
	check-python-examples			\
	check-java-examples			\
	check-guile-examples			\
	check-mzscheme-examples			\
	check-ruby-examples			\
	check-ocaml-examples			\
	check-php4-examples			\
	check-pike-examples			\
	check-chicken-examples                  \
	check-csharp-examples                   \
	check-modula3-examples                  \
	check-lua-examples			\
	check-allegrocl-examples

check-%-examples:
	@passed=true;						\
	dir="Examples/$*";					\
	if $(skip-$*); then					\
	  echo skipping $* $(ACTION);				\
	elif [ ! -f $$dir/check.list ]; then			\
	  echo skipping $* $(ACTION) "(no $$dir/check.list)";	\
	else							\
	  all=`sed '/^#/d' $$dir/check.list`;			\
	  for a in $$all; do					\
	    echo $(ACTION)ing $$dir/$$a;			\
	    (cd $$dir/$$a && $(chk))				\
	    || passed=false;					\
	  done;							\
	fi;							\
	test $$passed = true

# Checks testcases in the test-suite excluding those which are known to be broken
check-test-suite:				\
	check-tcl-test-suite			\
	check-perl5-test-suite			\
	check-python-test-suite			\
	check-java-test-suite			\
	check-guilescm-test-suite		\
	check-guile-test-suite			\
	check-mzscheme-test-suite		\
	check-ruby-test-suite			\
	check-ocaml-test-suite			\
	check-php4-test-suite			\
	check-pike-test-suite			\
	check-csharp-test-suite			\
	check-modula3-test-suite		\
	check-lua-test-suite			\
	check-allegrocl-test-suite		\
#	check-chicken-test-suite

check-%-test-suite:
	@passed=true;							\
	dir="Examples/test-suite/$*";					\
	if $(skip-$*); then						\
	  echo skipping $* test-suite $(ACTION);			\
	elif [ ! -d $$dir ]; then					\
	  echo warning: cannot $(ACTION) $* test-suite "(no dir $$dir)";\
	else								\
	  (cd $$dir && $(MAKE) -k -s $(ACTION))				\
	  || passed=false;						\
	fi;								\
	test $$passed = true

gifplot-library:
	@echo $(ACTION)ing Examples/GIFPlot/Lib
	@cd Examples/GIFPlot/Lib && $(MAKE) -k -s $(ACTION)

check-gifplot:					\
	check-tcl-gifplot			\
	check-perl5-gifplot			\
	check-python-gifplot			\
	check-java-gifplot			\
	check-guile-gifplot			\
	check-mzscheme-gifplot			\
	check-ruby-gifplot			\
	check-ocaml-gifplot			\
	check-php4-gifplot			\
	check-pike-gifplot			\
	check-chicken-gifplot                   \
#	check-lua-gifplot                  	\
#	check-csharp-gifplot                    \
#	check-modula3-gifplot

check-%-gifplot: gifplot-library
	@passed=true;						\
	up=`$(srcdir)/Tools/capitalize $*`;			\
	dir="Examples/GIFPlot/$$up";				\
	if $(skip-$*); then					\
	  echo skipping $$up $(ACTION);				\
	elif [ ! -f $$dir/check.list ]; then			\
	  echo skipping $$up $(ACTION) "(no $$dir/check.list)";	\
	else							\
	  all=`sed '/^#/d' $$dir/check.list`;			\
	  for a in $$all; do					\
	    echo $(ACTION)ing $$dir/$$a;			\
	    (cd $$dir/$$a && $(chk))				\
	    || passed=false;					\
	  done;							\
	fi;							\
	test $$passed = true

check: check-aliveness check-examples check-gifplot check-test-suite

#####################################################################
# ALL TEST SUITE: Known broken and broken testcases in the test-suite
#####################################################################

all-test-suite:					\
	all-tcl-test-suite			\
	all-perl5-test-suite			\
	all-python-test-suite			\
	all-java-test-suite			\
	all-guilescm-test-suite			\
	all-guile-test-suite			\
	all-mzscheme-test-suite			\
	all-ruby-test-suite			\
	all-ocaml-test-suite			\
	all-php4-test-suite			\
	all-pike-test-suite			\
	all-csharp-test-suite			\
	all-modula3-test-suite			\
	all-lua-test-suite			\
	all-allegrocl-test-suite		\
#	all-chicken-test-suite

all-%-test-suite:
	@$(MAKE) -k -s check-$*-test-suite ACTION=all

#####################################################################
# BROKEN: Known broken tests in the test-suite
#####################################################################

broken-test-suite:				\
	broken-tcl-test-suite			\
	broken-perl5-test-suite			\
	broken-python-test-suite		\
	broken-java-test-suite			\
	broken-guilescm-test-suite		\
	broken-guile-test-suite			\
	broken-mzscheme-test-suite		\
	broken-ruby-test-suite			\
	broken-ocaml-test-suite			\
	broken-php4-test-suite			\
	broken-pike-test-suite			\
	broken-csharp-test-suite		\
	broken-modula3-test-suite		\
	broken-lua-test-suite			\
	broken-allegrocl-test-suite		\
#	broken-chicken-test-suite

broken-%-test-suite:
	@$(MAKE) -k -s check-$*-test-suite ACTION=broken

#####################################################################
# CLEAN
#####################################################################

clean: clean-objects clean-examples clean-gifplot clean-test-suite

clean-objects: clean-source

clean-source:
	@echo cleaning Source
	@cd $(SOURCE) && $(MAKE) -s clean
	@rm -f $(TARGET)

clean-examples:
	@$(MAKE) -k -s check-examples ACTION=clean

clean-gifplot:
	@$(MAKE) -k -s check-gifplot ACTION=clean

clean-test-suite:
	@echo cleaning Examples/test-suite
	@$(MAKE) -k -s check-test-suite ACTION=clean

clean-%-examples:
	@$(MAKE) -k -s check-$*-examples ACTION=clean

clean-%-test-suite:
	@$(MAKE) -k -s check-$*-test-suite ACTION=clean

clean-%-gifplot:
	@$(MAKE) -k -s check-$*-gifplot ACTION=clean

#####################################################################
# DISTCLEAN
#####################################################################

DISTCLEAN-DEAD = config.status config.log config.cache swig.spec Makefile mkmf.log libtool

distclean: distclean-objects clean-examples clean-gifplot distclean-test-suite distclean-dead

distclean-objects: distclean-source

distclean-source:
	@echo dist cleaning Source
	@cd $(SOURCE) && $(MAKE) -s distclean
	@rm -f $(TARGET)

distclean-test-suite:
	@echo dist cleaning Examples/test-suite
	@$(MAKE) -k -s noskip-test-suite ACTION=distclean

noskip-test-suite:				\
	noskip-tcl-test-suite			\
	noskip-perl5-test-suite			\
	noskip-python-test-suite		\
	noskip-java-test-suite			\
	noskip-guilescm-test-suite		\
	noskip-guile-test-suite			\
	noskip-mzscheme-test-suite		\
	noskip-ruby-test-suite			\
	noskip-ocaml-test-suite			\
	noskip-php4-test-suite			\
	noskip-pike-test-suite			\
	noskip-csharp-test-suite		\
	noskip-lua-test-suite			\
	noskip-allegrocl-test-suite		\
	noskip-chicken-test-suite

noskip-%-test-suite:
	dir="Examples/test-suite/$*";					\
	if [ ! -d $$dir ]; then						\
	  echo warning: cannot $(ACTION) $* test-suite "(no dir $$dir)";\
	else								\
	  (cd $$dir && $(MAKE) -k -s $(ACTION))				\
	fi;

distclean-dead:
	rm -f $(DISTCLEAN-DEAD)

#####################################################################
# TARGETS: install & friends
#####################################################################

INSTALL         = @abs_srcdir@/Tools/config/install-sh -c
INSTALL_DATA    = ${INSTALL} -m 644
INSTALL_PROGRAM = ${INSTALL} -m 755
MKINSTDIRS      = @abs_srcdir@/Tools/config/install-sh -m 0755 -d

install: install-main install-lib
	@echo "Installation complete"

install-main:
	@echo "Installing SWIG executable"
	@$(MKINSTDIRS) $(DESTDIR)$(BIN_DIR)
	@echo "Installing $(BIN_DIR)/$(TARGET)"
	@$(INSTALL_PROGRAM) $(TARGET) $(DESTDIR)$(BIN_DIR)/$(TARGET)

lib-languages = typemaps tcl perl5 python guile java mzscheme ruby php4 ocaml \
	pike chicken csharp modula3 allegrocl clisp lua

lib-modules = std

install-lib:
	@echo "Installing the SWIG library"
	@$(MKINSTDIRS) $(DESTDIR)$(SWIG_LIB)
	@for file in $(srcdir)/Lib/*.i $(srcdir)/Lib/*.swg ; do \
	    i=`basename $$file` ;				\
	    echo "Installing $(DESTDIR)$(SWIG_LIB)/$$i";	\
            $(INSTALL_DATA) $$file $(DESTDIR)$(SWIG_LIB)/$$i;	\
	    done;
	@for lang in $(lib-languages) $(lib-modules);		\
	    do							\
	    echo "Installing language specific files for $$lang"; \
	    dst=$(DESTDIR)$(SWIG_LIB)/$$lang;			\
	    $(MKINSTDIRS) $$dst;				\
	     (doti="`cd $(srcdir)/Lib/$$lang && ls *.i 2>/dev/null`" || doti="";	\
	      dotswg="`cd $(srcdir)/Lib/$$lang && ls *.swg 2>/dev/null`" || dotswg="";	\
	      if [ -f $(srcdir)/Lib/$$lang/extra-install.list ]; then	\
		  extra="`sed '/^#/d' $(srcdir)/Lib/$$lang/extra-install.list`";	\
	      fi;						\
	      files="`echo $$doti $$dotswg $$extra`";		\
	      if [ x"$$files" = x ]; then			\
		  echo "Installing nothing from Lib/$$lang";	\
	      else for file in $$doti $$dotswg $$extra;		\
		  do						\
		  echo "Installing $$dst/$$file";		\
		  $(INSTALL_DATA) $(srcdir)/Lib/$$lang/$$file $$dst/$$file; \
		  done;						\
	      fi) ; 						\
	done


#####################################################################
# TARGETS: uninstall & friends
#####################################################################

uninstall: uninstall-main uninstall-lib
	@echo "Uninstall complete"

uninstall-main:
	@echo "Uninstalling $(DESTDIR)$(BIN_DIR)/$(TARGET)"
	rm -f $(DESTDIR)$(BIN_DIR)/$(TARGET)

uninstall-lib:
	@echo "Uninstalling the SWIG library"
	rm -rf $(DESTDIR)$(SWIG_LIB)/

############################################################################
# DIST and other maintenance
############################################################################

# distribution directory
dd = @PACKAGE_NAME@-@PACKAGE_VERSION@
srpm = @PACKAGE_NAME@-@PACKAGE_VERSION@

dist:
	@echo 'Dave, what do you want to do w/ "make dist"?'
	@echo 'See Makefile.in target "dist-suggested" for an idea.'
	@echo '    --thi'
	false

dist-suggested:
	rm -rf $(dd) $(dd).tar.gz
	cvs export -d $(dd) -r HEAD SWIG
	tar cf - $(dd) | gzip --best > $(dd).tar.gz
	rm -rf $(dd)

srcrpm:
	rm -fr $(srpm) $(srpm).src.rpm
	cvs export -d $(srpm) -r HEAD SWIG
	cp swig.spec $(srpm)
	tar -cf - $(srpm) | gzip --best > $(srpm).tar.gz
	rm -fr $(srpm)
	rpmbuild -ts $(srpm).tar.gz

# Update the autoconf files for detecting host/targets. Automake will do this in
# version 1.10 for our case of not having a top level Makefile.am. Until then we
# can fetch them manually and will have to commit them to CVS.
configfiles:
	wget ftp://ftp.gnu.org/pub/gnu/config/config.guess -O Tools/config/config.guess
	chmod a+x Tools/config/config.guess
	wget ftp://ftp.gnu.org/pub/gnu/config/config.sub -O Tools/config/config.sub
	chmod a+x Tools/config/config.sub

# Makefile ends here
