AXIOMROOT=/usr/local/axiom.mod/test_system

SYS=x86
#SYS=alpha
LSP=
PART=${AXIOMROOT}/part
AXIOM=${AXIOMROOT}/mnt/${SYS}
SRC=${AXIOMROOT}/src
INT=${AXIOMROOT}/int
OBJ=${AXIOMROOT}/mnt
MNT=${AXIOMROOT}/mnt
BYE=system::quit
O=x86f
#O=axpf

# lisp file type
LISP=lisp
# command for lisp system
LISPSYS=cmu-lisp

IN=     ${SRC}/interp
MID=    ${INT}/interp
OUT=    ${OBJ}/${SYS}/interp
OUT_DEP=${OBJ}/${SYS}/dep

DEPSYS= ${OBJ}/${SYS}/bin/depsys

DEPSYS_ORIG= ${OBJ}/${SYS}/bin/depsys

SAVESYS= ${OBJ}/${SYS}/bin/interpsys

# files which are not compiled
LOADONLY= sys-pkg bootfuns newaux property setq	setvart

# 
DEP_LISP= util proclaims sys-pkg parsing \
	 metalex bootlex newaux preparse def \
	 metameta fnewmeta 

# load into lisp system
DEP=	 vmlisp.lisp ggreater.lisp hash.lisp union.lisp nlib.lisp \
         bootfuns.lisp macros.lisp comp.lisp debug.lisp spad.lisp \
         bits.lisp setq.lisp property.lisp

DEP_CLISP= c-util g-boot postpar g-util parse \
          clam setvars slam interop 

DEP2_BOOT= clam setvars slam

NEW_PARSER_TYPED_OBJS = \
	astr.bo cparse.bo cstream.bo dq.bo incl.bo int-top.bo \
	intint.lo macex.bo nci.lo osyscmd.bo packtran.bo \
	posit.bo scan.bo serror.bo server.bo parini.b \
	pf2sex.bo ptrees.bo ptrop.bo varini.b pile.bo

# NEW_PARSER_TYPED_OBJS = 

# files for interpsys
# .lo make object from lisp
# .l  load lisp
# .bo make object from boot
# .b  make lisp from boot        
INTERP_TYPED_OBJS := \
	vmlisp.lo ggreater.lo hash.lo \
	union.lo nlib.lo \
	bootfuns.l macros.lo \
	comp.lo \
	parsing.lo bootlex.lo \
	def.lo \
	fnewmeta.lo metalex.lo \
	metameta.lo \
	newaux.l \
	parse.bo postpar.bo \
	preparse.lo \
	debug.lo \
	spad.lo bits.lo property.l \
	setq.l  pathname.bo \
	apply.bo c-doc.bo \
	buildom.bo \
	c-util.bo \
	category.bo compiler.bo \
	define.bo functor.bo \
	info.bo iterator.bo \
	cattable.bo \
	clam.bo clammed.bo \
	compat.bo  compress.bo \
	database.bo \
	format.bo \
	g-boot.bo g-cndata.bo \
	g-error.bo g-opt.bo \
	g-timer.bo g-util.bo \
	i-analy.bo \
	i-code.bo i-coerce.bo \
	i-coerfn.bo i-eval.bo \
	i-funsel.bo i-hist.bo \
	i-intern.bo i-map.bo \
	i-output.bo i-resolv.bo \
	i-spec1.bo i-spec2.bo i-syscmd.bo \
	i-toplev.bo i-util.bo \
	lisplib.bo \
	modemap.bo msgdb.bo \
	newfort.bo \
	nrunfast.bo \
	nrungo.bo nrunopt.bo \
	nruntime.bo nruncomp.bo \
	package.bo \
	rulesets.bo \
	setvars.bo setvart.b showimp.bo \
	slam.bo \
	simpbool.bo template.bo \
	termrw.bo trace.bo \
	daase.lo foam_l.lo spaderror.lo \
	match.bo br-data.bo br-util.bo \
	hashcode.bo xrun.bo interop.bo \
	xruncomp.bo \
	$(NEW_PARSER_TYPED_OBJS) \
	patches.lo 

INTERP_OBJS := $(addprefix ${OUT}/, $(patsubst %.b, %.${LISP}, $(patsubst %.bo, %.${O}, $(patsubst %.l, %.${LISP}, $(patsubst %.lo, %.${O}, $(INTERP_TYPED_OBJS))))))

INTERP_BOOT_TR := $(patsubst %.b, %, $(patsubst %.bo, %, $(filter %.b %.bo, $(INTERP_TYPED_OBJS))))
INTERP_BOOT_CO := $(patsubst %.bo, %, $(filter %.bo, $(INTERP_TYPED_OBJS)))
INTERP_BOOT_NCO := $(patsubst %.b, %, $(filter %.b, $(INTERP_TYPED_OBJS)))

INTERP_LISP_CO := $(patsubst %.lo, %, $(filter %.lo, $(INTERP_TYPED_OBJS)))
INTERP_LISP_NCO := $(patsubst %.l, %, $(filter %.l, $(INTERP_TYPED_OBJS)))


all:	${DEPSYS} ${SAVESYS}

# link normal lisp files into OUT dir

$(addprefix ${OUT_DEP}/, $(DEP_LISP:%=%.${LISP})): ${OUT_DEP}/%.${LISP}: ${IN}/%.lisp
	@ echo making $@ from $<
	@ ln -s $< $@

# link lisp version of bootstrap boot files into OUT dir

$(addprefix ${OUT_DEP}/, $(DEP_CLISP:%=%.${LISP})): ${OUT_DEP}/%.${LISP}: ${IN}/lisp/%.clisp
	@ echo making $@ from $<
	@ ln -s $< $@

# translate special boot files to lisp

# $(addprefix ${MID}/, $(DEP2_BOOT:%=%.clisp)): ${MID}/%.clisp: ${IN}/%.boot
# 	@ echo boottocl making $@ from $<
# 	(ln -s $< ${MID} ; \
#           cd ${MID} ; \
#            echo '(progn (boot::boottocl "$(notdir $<)") (${BYE}))' | ${DEPSYS} ; \
#            rm $(notdir $<) )
# 
# # compile translated special boot files
# 
# $(addprefix ${OUT}/, $(DEP2_BOOT:%=%.${O})): ${OUT}/%.${O}: ${MID}/%.clisp
# 	@ echo compile-file making $@ from $<
# 	@ (cd ${OUT} ; \
#            echo '(progn  (compile-file "$<" :output-file "$@") (${BYE}))' | ${DEPSYS} )

#
# rules for interpsys
#

# compile lisp files

$(addprefix ${OUT}/,  $(INTERP_LISP_CO:%=%.${O}) util.${O}): ${OUT}/%.${O}: ${IN}/%.lisp
	@ echo making $@ from $<
	@ ( cd ${OUT} ; \
           echo '(progn  (compile-file "$<" :output-file "$@") (${BYE}))' | ${DEPSYS_ORIG} )

# copy lisp files

$(addprefix ${OUT}/,  $(INTERP_LISP_NCO:%=%.${LISP}) sys-pkg.${LISP} proclaims.${LISP} util.${LISP}): ${OUT}/%.${LISP}: ${IN}/%.lisp
	@ echo copy $@ from $<
	@ cp -p $< $@

# translate boot files to lisp

$(addprefix ${MID}/, $(INTERP_BOOT_TR:%=%.clisp)): ${MID}/%.clisp: ${IN}/%.boot
	@ echo boottocl making $@ from $<
	(ln -s $< ${MID} ; \
          cd ${MID} ; \
           echo '(progn (boot::boottocl "$(notdir $<)") (${BYE}))' | ${DEPSYS_ORIG} ; \
           rm $(notdir $<) )

# compile translated boot files

$(addprefix ${OUT}/, $(INTERP_BOOT_CO:%=%.${O})): ${OUT}/%.${O}: ${MID}/%.clisp
	@ echo compile-file making $@ from $<
	@ (cd ${OUT} ; \
           echo '(progn  (compile-file "$<" :output-file "$@") (${BYE}))' | ${DEPSYS_ORIG} )

# copy load only translated boot files

$(addprefix ${OUT}/, $(INTERP_BOOT_NCO:%=%.${LISP})): ${OUT}/%.${LISP}: ${MID}/%.clisp
	@ echo copy-file making $@ from $<
	@ cp -p $< $@

#
#

${SAVESYS}:	${OUT}/sys-pkg.${LISP} ${OUT}/proclaims.${LISP} ${OUT}/util.${O} ${INTERP_OBJS} \
	        ${OUTINTERP} ${COMPOBJS} ${PARSEOBJS} \
		# ${OUT}/cfuns.${O}
	@ echo invoking make in `pwd` with parms:
	@ echo SYS= ${SYS} LSP= ${LSP} PART= ${PART} 
	@ echo AXIOM= ${AXIOM} SRC= ${SRC} INT= ${INT}
	@ echo OBJ= ${OBJ} MNT= ${MNT} O=${O} LISP=${LISP} BYE=${BYE}
	@ echo '(load "${OUT}/sys-pkg")' > ${OUT}/makeint.lisp
	@ echo '(in-package "BOOT")' >> ${OUT}/makeint.lisp
	@ echo '(load "${OUT}/proclaims")' >> ${OUT}/makeint.lisp
	@ echo '(load "${OUT}/util")' >> ${OUT}/makeint.lisp
	@ echo '(build-interpsys (quote (${INTERP_OBJS})) "${AXIOM}"  "${LSP}" "${SRC}" "${INT}" "${OBJ}" "${MNT}" "${SYS}")' >> ${OUT}/makeint.lisp
# here we load the new parser
	@# echo '${COMPCMD}' >> ${OUT}/makeint.lisp
	@# echo '(si::faslink "${OUT}/cfuns.${O}" "${OBJ}/${SYS}/lib/cfuns-c.o -lc")' >> ${OUT}/makeint.lisp
	@# echo '(si::faslink "${OUT}/sockio.${O}" "${OBJ}/${SYS}/lib/sockio-c.o -lc")' >> ${OUT}/makeint.lisp
	@# echo '${PARSECMD}' >> ${OUT}/makeint.lisp
	@# optimize: (compilation-speed 0) (speed 3) (safety 0)
# here we load the interpreter hooks for the new parser
	@ (cd ${OBJ}/${SYS}/bin ; \
	   ( \
	    echo '(proclaim (quote (optimize (compilation-speed 0) (speed 1) (safety 3))))'; \
	    echo '(proclaim (quote (optimize-interface (compilation-speed 0) (speed 1) (safety 3))))'; \
	    echo '(load "${OUT}/makeint.lisp") (boot::spad-save "${SAVESYS}") (${BYE})' ) | ${LISPSYS} )
	@ mv ${SAVESYS} ${SAVESYS}.core
	@ echo '#!/bin/sh' > ${SAVESYS}
	@ echo 'exec ${LISPSYS} -core $$AXIOM/bin/interpsys.core "$$@"' >> ${SAVESYS}
	@ chmod 755 ${SAVESYS}
	@ echo ${SAVESYS} created

#
#

${DEPSYS}:	$(addprefix ${OUT_DEP}/, $(DEP_LISP:%=%.${LISP})) \
                $(addprefix ${OUT_DEP}/, $(DEP_CLISP:%=%.${LISP}))
	@ echo making ${DEPSYS}
	@ echo '(load "${OUT_DEP}/sys-pkg")' > ${OUT_DEP}/makedep.lisp
	@ echo '(in-package "BOOT")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(push :oldboot *features*)' >>${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/proclaims")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/util")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(build-depsys (quote ($(addprefix ${IN}/, $(DEP)))) "${AXIOM}" "${LSP}" "${SRC}" "${INT}" "${OBJ}" "${MNT}" "${SYS}")' >> ${OUT_DEP}/makedep.lisp
	@ echo >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/vmlisp.lisp" :output-file "${OUT_DEP}/vmlisp.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/vmlisp")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/ggreater.lisp" :output-file "${OUT_DEP}/ggreater.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/ggreater")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/hash.lisp" :output-file "${OUT_DEP}/hash.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/hash")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/union.lisp" :output-file "${OUT_DEP}/union.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/union")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/nlib.lisp" :output-file "${OUT_DEP}/nlib.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/nlib")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/macros.lisp" :output-file "${OUT_DEP}/macros.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/macros")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/comp.lisp" :output-file "${OUT_DEP}/comp.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/comp")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/debug.lisp" :output-file "${OUT_DEP}/debug.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/debug")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/bits.lisp" :output-file "${OUT_DEP}/bits.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/bits")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/postpar.${LISP}" :output-file "${OUT_DEP}/postpar.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/postpar")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/parse.${LISP}" :output-file "${OUT_DEP}/parse.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/parse")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/parsing.${LISP}" :output-file "${OUT_DEP}/parsing.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/parsing")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/metalex.${LISP}" :output-file "${OUT_DEP}/metalex.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/metalex")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/bootlex.${LISP}" :output-file "${OUT_DEP}/bootlex.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/bootlex")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/newaux.${LISP}" :output-file "${OUT_DEP}/newaux.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/newaux")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/preparse.${LISP}" :output-file "${OUT_DEP}/preparse.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/preparse")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/def.${LISP}" :output-file "${OUT_DEP}/def.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/def")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/metameta.${LISP}" :output-file "${OUT_DEP}/metameta.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/metameta")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/fnewmeta.${LISP}" :output-file "${OUT_DEP}/fnewmeta.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/fnewmeta")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${IN}/spad.lisp" :output-file "${OUT_DEP}/spad.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/spad")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/g-boot.${LISP}" :output-file "${OUT_DEP}/g-boot.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/g-boot")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/c-util.${LISP}" :output-file "${OUT_DEP}/c-util.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/c-util")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/g-util.${LISP}" :output-file "${OUT_DEP}/g-util.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/g-util")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/clam.${LISP}" :output-file "${OUT_DEP}/clam.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/clam")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/setvars.${LISP}" :output-file "${OUT_DEP}/setvars.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/setvars")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(recompile-file-if-necessary "${OUT_DEP}/slam.${LISP}" :output-file "${OUT_DEP}/slam.${O}")' >> ${OUT_DEP}/makedep.lisp
	@ echo '(load "${OUT_DEP}/slam")' >> ${OUT_DEP}/makedep.lisp
	@# echo '(recompile-file-if-necessary "${OUT_DEP}/interop.${LISP}" :output-file "${OUT_DEP}/interop.${O}")' >> ${OUT_DEP}/makedep.lisp
	@# echo '(load "${OUT_DEP}/interop")' >> ${OUT_DEP}/makedep.lisp
	@# optimize: (compilation-speed 0) (speed 3) (safety 0)
	@ (cd ${MNT}/${SYS}/bin ; \
	   ( \
	    echo '(proclaim (quote (optimize (compilation-speed 0) (speed 1) (safety 3))))'; \
	    echo '(proclaim (quote (optimize-interface (compilation-speed 0) (speed 1) (safety 3))))'; \
	    echo '(load "${OUT_DEP}/makedep.lisp") (boot::spad-save "${DEPSYS}") (${BYE})' ) | ${LISPSYS} )
	@ mv ${DEPSYS} ${DEPSYS}.core
	@ echo '#!/bin/sh' > ${DEPSYS}
	@ echo 'exec ${LISPSYS} -core $$AXIOM/bin/depsys.core "$$@"' >> ${DEPSYS}
	@ chmod 755 ${DEPSYS}
	@ echo ${DEPSYS} created

