########################################################################
# Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
# The Netherlands.
#
#                         All Rights Reserved
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
# provided that the above copyright notice appear in all copies and that
# both that copyright notice and this permission notice appear in
# supporting documentation, and that the names of Stichting Mathematisch
# Centrum or CWI not be used in advertising or publicity pertaining to
# distribution of the software without specific, written prior permission.
#
# STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
# THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
# FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM 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.
########################################################################

# Toplevel Makefile for Python
# Note -- if recursive makes fail, try adding MAKE=make

# Substitutions by configure
srcdir=		@srcdir@
VPATH=		@srcdir@
INSTALL=	@INSTALL@
INSTALL_PROGRAM=@INSTALL_PROGRAM@
INSTALL_DATA=	@INSTALL_DATA@
RANLIB=		@RANLIB@

# Machine-dependent subdirectories
MACHDEP=	@MACHDEP@

# Install prefix for architecture-independent files
prefix=		@prefix@

# Install prefix for architecture-dependent files
exec_prefix=	@exec_prefix@

# Expanded directories
MANDIR=$(prefix)/man
BINDIR=$(exec_prefix)/bin
LIBDIR=$(exec_prefix)/lib
INCLUDEDIR=$(prefix)/include
SCRIPTDIR=$(prefix)/lib

# Symbols used for using shared libraries
SO=		@SO@
LDSHARED=	@LDSHARED@
CCSHARED=	@CCSHARED@
LINKFORSHARED=	@LINKFORSHARED@
DESTSHARED=	$(SCRIPTDIR)/python/$(MACHDEP)

# Programs
SHELL=		/bin/sh

# --with-PACKAGE options for configure script
# e.g. --with-readline --with-svr5 --with-solaris --with-thread
# (see README for an explanation)
WITH=		

# Compiler options passed to subordinate makes
OPT=		@OPT@

# Subdirectories where to run make recursively
SUBDIRS=	Parser Objects Python Modules

# Other subdirectories
SUBDIRSTOO=	Include Lib Doc Misc Demo readline Grammar

# Files and directories to be distributed
CONFIGFILES=	configure configure.in acconfig.h config.h.in Makefile.in
DISTFILES=	README ChangeLog $(CONFIGFILES)
DISTDIRS=	$(SUBDIRS) $(SUBDIRSTOO) Ext-dummy
DIST=		$(DISTFILES) $(DISTDIRS)

# Default target
all:		python

# Build the interpreter
python:		Makefiles
		for i in $(SUBDIRS); do \
			(echo $$i; cd $$i; \
			 $(MAKE) OPT="$(OPT)" \
			         prefix="$(prefix)" \
				 exec_prefix="$(exec_prefix)" \
				 all); \
		done

# Test the interpreter (twice, once without .pyc files, once with)
TESTPATH=	$(srcdir)/Lib:$(srcdir)/Lib/test:./Modules
test:		python
		-rm -f $(srcdir)/Lib/test/*.pyc
		PYTHONPATH=$(TESTPATH) ./python -c 'import autotest'
		PYTHONPATH=$(TESTPATH) ./python -c 'import autotest'

# Install the interpreter
install:	python
		$(INSTALL_PROGRAM) python $(BINDIR)/python
		@echo If this is your first time, consider make libinstall...

# Install the library.
# If your system does not support "cp -r", try "copy -r" or perhaps
# something like find Lib -print | cpio -pacvdmu $(LIBDEST)
LIBDEST=	$(SCRIPTDIR)/python
libinstall:
		-if test ! -d $(LIBDEST); \
		then mkdir $(LIBDEST); \
		fi
		cp -r $(srcdir)/Lib/* $(LIBDEST)
		PYTHONPATH=$(LIBDEST) \
			./python $(LIBDEST)/compileall.py $(LIBDEST)
		$(MAKE) \
			OPT="$(OPT)" \
			SO="$(SO)" \
			LDSHARED="$(LDSHARED)" \
			CCSHARED="$(CCSHARED)" \
			LINKFORSHARED="$(LINKFORSHARED)" \
			DESTSHARED="$(DESTSHARED)" \
			sharedinstall

# install the manual page
maninstall:
		$(INSTALL_DATA) $(srcdir)/Misc/python.man \
			$(MANDIR)/man1/python.1

# install the include files
INCLUDEPY=	$(INCLUDEDIR)/Py
inclinstall:
		-if test ! -d $(INCLUDEPY); \
		then mkdir $(INCLUDEPY); \
		fi
		$(INSTALL_DATA) $(srcdir)/Include/*.h $(INCLUDEPY)

# install the lib*.a files and miscellaneous stuff needed by extensions
LIBP=		$(LIBDIR)/python
LIBPL=		$(LIBP)/lib
libainstall:	all
		-if test ! -d $(LIBP); \
		then mkdir $(LIBP); \
		fi
		-if test ! -d $(LIBPL); \
		then mkdir $(LIBPL); \
		fi
		for i in $(SUBDIRS); do \
			echo $$i; $(INSTALL_DATA) $$i/lib$$i.a $(LIBPL)/lib$$i.a; \
			$(RANLIB) $(LIBPL)/lib$$i.a; \
		done
		$(INSTALL_DATA) Modules/config.c $(LIBPL)/config.c
		$(INSTALL_DATA) $(srcdir)/Modules/getpath.c $(LIBPL)/getpath.c
		$(INSTALL_DATA) $(srcdir)/Modules/config.c.in $(LIBPL)/config.c.in
		$(INSTALL_DATA) Modules/Makefile $(LIBPL)/Makefile
		$(INSTALL_DATA) Modules/Setup $(LIBPL)/Setup
		$(INSTALL_DATA) $(srcdir)/Modules/makesetup $(LIBPL)/makesetup
		$(INSTALL_DATA) config.h $(LIBPL)/config.h
		$(INSTALL_DATA) $(srcdir)/Python/frozenmain.c $(LIBPL)/frozenmain.c
		$(INSTALL_DATA) Modules/main.o $(LIBPL)/main.o

# install the dynamically loadable modules
sharedinstall:
		cd Modules; $(MAKE) \
			OPT="$(OPT)" \
			SO="$(SO)" \
			LDSHARED="$(LDSHARED)" \
			CCSHARED="$(CCSHARED)" \
			LINKFORSHARED="$(LINKFORSHARED)" \
			DESTSHARED="$(DESTSHARED)" \
			sharedinstall

# Build the sub-Makefiles
Makefiles:	config.status Modules/Makefile.pre
		(cd Modules; $(MAKE) -f Makefile.pre Makefile)
		for i in . $(SUBDIRS); do \
			(echo $$i; cd $$i; $(MAKE) Makefile); \
		done

# Build the intermediate Makefile in Modules
Modules/Makefile.pre: config.status
		$(SHELL) config.status

# Build the toplevel Makefile
Makefile:	Makefile.in config.status
		CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) config.status

# Run the configure script.  If config.status already exists,
# call it with the --recheck argument, which reruns configure with the
# same options as it was run last time; otherwise run the configure
# script with options taken from the $(WITH) variable
config.status:	$(srcdir)/configure
		if test -f config.status; \
		then $(SHELL) config.status --recheck; \
		     $(SHELL) config.status; \
		else $(SHELL) $(srcdir)/configure $(WITH); \
		fi

.PRECIOUS:	config.status python

# Rerun configure with the same options as it was run last time,
# provided the config.status script exists
recheck:
		$(SHELL) config.status --recheck
		$(SHELL) config.status

# Rebuild the configure script from configure.in; also rebuild config.h.in
autoconf:
		(cd $(srcdir); autoconf; autoheader)

# Create a tags file for vi
tags::
		ctags -w -t Include/*.h
		for i in $(SUBDIRS); do ctags -w -t -a $$i/*.[ch]; done
		sort tags -o tags

# Create a tags file for GNU Emacs
TAGS::
		etags Include/*.h
		for i in $(SUBDIRS); do etags -a $$i/*.[ch]; done

# Add dependencies to sub-Makefiles
depend:
		for i in $(SUBDIRS); do \
			(echo $$i; cd $$i; $(MAKE) depend); \
		done

# Sanitation targets -- clean leaves libraries, executables and tags
# files, which clobber removes those as well

localclean:
		-rm -f core *~ [@,#]* *.old *.orig *.rej

clean:		localclean
		-for i in $(SUBDIRS); do \
			(echo $$i; cd $$i; \
			 if test -f Makefile; \
			 then $(MAKE) clean; \
			 else $(MAKE) -f Makefile.*in clean; \
			 fi); \
		done

localclobber:	localclean
		-rm -f tags TAGS python
		-rm -f config.log config.cache config.h Makefile

clobber:	localclobber
		-for i in $(SUBDIRS); do \
			(echo $$i; cd $$i; \
			 if test -f Makefile; \
			 then $(MAKE) clobber; \
			 else $(MAKE) -f $(srcdir)/Makefile.in clobber; \
			 fi); \
		done

# Make things extra clean, before making a distribution
distclean:	clobber
		-$(MAKE) -f $(srcdir)/Makefile.in \
			SUBDIRS="$(SUBDIRSTOO)" clobber
		-rm -f config.status config.log config.cache config.h Makefile
		-rm -f Modules/Makefile
		-for i in $(SUBDIRS) $(SUBDIRSTOO); do \
			 for f in $$i/*.in; do \
				f=`basename "$$f" .in`; \
			 	if test "$$f" != "*"; then \
					echo rm -f "$$i/$$f"; \
				 	rm -f "$$i/$$f"; \
				fi; \
			 done; \
		done

# Find files with funny names
find:
		find $(DISTDIRS) -type d \
			-o -name '*.[chs]' \
			-o -name '*.py' \
			-o -name '*.doc' \
			-o -name '*.sty' \
			-o -name '*.bib' \
			-o -name '*.dat' \
			-o -name '*.el' \
			-o -name '*.fd' \
			-o -name '*.in' \
			-o -name '*.tex' \
			-o -name '*,[vpt]' \
			-o -name 'Setup' \
			-o -name 'Setup.*' \
			-o -name README \
			-o -name Makefile \
			-o -name ChangeLog \
			-o -name RCS \
			-o -name Repository \
			-o -name Entries \
			-o -name Tag \
			-o -name tags \
			-o -name TAGS \
			-o -name .cvsignore \
			-o -name MANIFEST \
			-o -print

# Build a distribution tar file (run make distclean first)
# (This leaves the RCS and CVS directories in :-( )
tar:
		tar cf - $(DIST) | gzip --best >dist.tar.gz
