justM2 default :: initialize phase1

TOPDIR = ../..
include $(TOPDIR)/config.Makefile
srcdir = .
top_srcdir = ../..
INSTALL = /usr/bin/install -c
INSTALL_PROGRAM = $(INSTALL)
INSTALL_DATA = $(INSTALL)

all:: initialize
emacs html: all; $(MAKE) -C ../$@

##############################
.SUFFIXES: .m2
.PHONY: clean all install phase1 tests html
# CFLAGS =
# LDFLAGS = -s
# LOADLIBES =
DUMPSEQUENCE = $(shell cat dumpseq)
DOCSEQUENCE = $(shell cat docseq)

MADEM2FILES := gbdoc.m2 gbfunctions.m2 loads.m2 docloads.m2 tutorials.m2 cmdnames.m2

ifdef MP
mpcodes.m2: ../../include/MP.h mpcodes.sed
	sed -f mpcodes.sed $< > $@
all:: mpcodes.m2
MADEM2FILES += mpcodes.m2
endif

cmdnames.m2 : ../e/cmdnames.m2; cp $< $@

TUTORIALS := $(wildcard ../tutorial/final/*.out)

DUMPEDM2FILES := $(DUMPSEQUENCE) setup.m2 $(MADEM2FILES)

ifneq "$(DUMPDATA)" "no"
DUMPEDM2FILES := $(DUMPEDM2FILES) dumpdata.m2
endif

NONDOCM2FILES = setup.m2 $(DUMPSEQUENCE) dumpdata.m2 eg.m2 sagbi.m2 makeM2.m2

wc:
	wc -l $(DOCSEQUENCE)
	wc -l $(NONDOCM2FILES)

M2FILES = $(NONDOCM2FILES) $(DOCSEQUENCE)
SCRIPTS = ../bin/M2

ifeq "$(OS)" "MS-DOS"
SCRIPTS = ../bin/M2.bat ../bin/M2.arg
endif

ifeq "$(OS)" "Windows-95-98-NT"
SCRIPTS = ../bin/M2.bat ../bin/M2
endif


loads.m2 : dumpseq loads.awk
	@echo making $@
	@awk -f loads.awk <$< >$@

docloads.m2 : docseq loads.awk
	@echo making $@
	@awk -f loads.awk <$< >$@

tutorials.m2 : ../tutorial/final/*.out
	@ echo making tutorials.m2
	@ ls ../tutorial/final/*.out |awk '{printf "load \"%s\"\n", $$0}' >$@

################################# cache
cache cache/doc cache/tests ../tutorial/final/cache/doc :; mkdir $@
clean ::; rm -rf cache
initialize :: cache cache/tests cache/doc ../tutorial/final/cache/doc
#################################

gbdoc.m2 : ../e/misc/cmdnames.input gbdoc.awk
	awk -f gbdoc.awk ../e/misc/cmdnames.input >tmp
	mv tmp $@
gbfunctions.m2 :  ../e/misc/cmdnames.input gbfuns.awk
	awk -f gbfuns.awk ../e/misc/cmdnames.input >tmp
	mv tmp $@
default:: TAGS.doc
TAGS.doc : Makefile docseq
	@echo making $@
	@../util/echoout '>$@' $(foreach i, $(DOCSEQUENCE),  $(i),0)
clean::; rm -f TAGS.doc

default:: TAGS
clean::; rm -f TAGS
TAGS: Makefile dumpseq
	@echo making $@
	@../util/echoout '>$@' $(foreach i, \
			      $(M2FILES) $(MADEM2FILES) \
			      $(wildcard ../html/*.m2 ../test/*.m2 ../book/*.m2 \
				../basictests/*.m2 \
				../emacs/makehlp.m2 \
				../emacs/makem2.m2 \
				../*/COPYRIGHT \
				../emacs/makesyms.m2 \
				../tutorial/prelim/*.m2 ../tutorial/final/*.m2 \
				../packages/*.m2 \
				../*/Makefile* \
			        ../experiments/*.m2 \
			        ../slides/*.m2 \
			        ../slides/lib/*.m2 \
				../Vasconcelos-appendix/eg.m2 \
				../Vasconcelos-appendix/appendix.tex \
				../Vasconcelos-appendix/cohomology.tex \
				../Vasconcelos-appendix/elementary.tex \
				../Vasconcelos-appendix/introduction.tex \
				../examples/*.m2 ../schubert/*.m2 \
				../CHANGES), \
			       $(i),0)

phase1 :: $(DUMPEDM2FILES)

ifneq "$(DUMPDATA)" "no"
ARGS := -q -silent '-eloaddata("../$(DUMPDATAFILE)")' -- '-erunStartFunctions()' 
phase1 :: ../$(DUMPDATAFILE)
../$(DUMPDATAFILE) : $(DUMPEDM2FILES) ../libexec/Macaulay2
	 # phase 1: read *.m2 and dump data
	rm -f ../$(DUMPDATAFILE)
	time ../libexec/Macaulay2 -q -silent -tty '-ephase=1' setup.m2 dumpdata.m2 '-edump()'
else
ARGS := -silent setup.m2
endif

phase1 :: ../cache/Macaulay2-made
../cache/Macaulay2-made : $(DUMPEDM2FILES) ../libexec/Macaulay2
	touch $@

phase1 :: $(SCRIPTS)
ifeq "$(CC)" "cl"
$(SCRIPTS) : ../util/setup.exe
	cd ..; util/setup
else
$(SCRIPTS) : makeM2.m2
	rm -f $(SCRIPTS)
	../libexec/Macaulay2 $(ARGS) makeM2.m2 '-eexit(0)'
endif

phase2 :: initialize
phase2 :: phase1
phase2 :: ../cache/Macaulay2-pre

../cache/Macaulay2-pre : $(DUMPEDM2FILES) ../libexec/Macaulay2 $(DOCSEQUENCE) $(TUTORIALS)
	 # phase 2: make the example files, the test files, and $@
	rm -rf ../cache/Macaulay2-tmp
	rm -rf cache/tests
	mkdir  cache/tests
	../libexec/Macaulay2 -q -silent '-ephase=2' setup.m2 '-eexit(0)'
	mv ../cache/Macaulay2-tmp ../cache/Macaulay2-pre

all:: .gdbinit
.gdbinit : .gdbinit.$(USER)
	if [ -f ".gdbinit.$(USER)" ] ;\
	then cp ".gdbinit.$(USER)" $@ ;\
	else cp .gdbinit.dan $@ ;\
	fi
.gdbinit.$(USER) :
	cp .gdbinit.dan $@

backup : CVS/Entries
CVS/Entries : $(M2FILES)
	mount /a.ext2
	tar cfv - $? | (cd /a.ext2; mkdir -p m2; cd m2; tar xf -)
	umount /a.ext2

profile : gmon.out
	gprof ../libexec/Macaulay2 >profile
clean ::; rm -f profile

INPUTS := cache/doc/sample cache/doc/expression
cache/doc/sample: sample; cp $< $@
cache/doc/expression: expression; cp $< $@

phase3 : initialize phase2 cache/doc/sample cache/doc/expression
	 # phase 3: running the example input files
	$(MAKE) -k -C ../m2/cache/doc       -f ../../../m2/Makefile.egs
	$(MAKE) TOPDIR=../../../../.. -k -C ../tutorial/final/cache/doc -f ../../../../m2/Makefile.egs

all :: phase4
phase4 : phase3 ../cache/Macaulay2-doc
../cache/Macaulay2-doc : ../cache/Macaulay2-pre \
		$(MADEM2FILES) $(INPUTS) $(DOCSEQUENCE) $(TUTORIALS)
	rm -f ../cache/Macaulay2-tmp
	 # phase 4: make $@
	../libexec/Macaulay2 -q -silent '-ephase=4' setup.m2 '-eexit(0)'
	mv ../cache/Macaulay2-tmp ../cache/Macaulay2-doc

ifdef NEWENGINE
tests:: test1
test1 : test.m2 phase1 $(SCRIPTS)
	M2 '-e errorDepth 0' -q test.m2 '-e << "--test succeeded" << endl' '-e exit 0'
	touch $@
endif

tests:: test2
test2: $(SCRIPTS) phase1 ../libexec/Macaulay2
	$(MAKE) -k -C cache/tests -f ../../Makefile.tests
	touch $@
clean::; rm -f test2

tests:: test3
test3:
	echo 2+3 | ../bin/M2
	touch $@
clean::; rm -f test3

ifeq ($(OS),Linux)
tests:: test4
test4: ../util/screen
	echo 2+3 | ../util/screen ../bin/M2
	touch $@
clean::; rm -f test4
endif

gdb :; gdb ../libexec/Macaulay2

install::
	rm -rf $(datadir)/Macaulay2/m2
	$(INSTALL) -d $(datadir)/Macaulay2/m2
	$(INSTALL_DATA) $(DUMPEDM2FILES) $(datadir)/Macaulay2/m2

clean::
	rm -rf ../$(DUMPDATAFILE) ../cache/Macaulay2-doc \
		cache *.obj *.exe ../bin/M2 runexample \
		temp.data allfiles distfiles \
		gbdoc.m2 gbfunctions.m2 loads.m2 docloads.m2 tutorials.m2 cmdnames.m2 \
		mpcodes.m2 tutorials.m2 version.m2 core
