work : lib/ps3i.jar test.ps3i.alone
clean :: cleanMakefile

#include "java.mkf"

# ####################################### Deduced properties
CONFIGURATION	= ${HOME}/Cours/VideoC/Java/Configuration/lib/configuration.jar

# Compute now the full class path required for compilation
CP	=	.:${RT}:${JREGEXP}:${JGETOPT}:${SERVLET}:${JAXP}:${CRIMSON}:${CATALINA}:${CONFIGURATION}:${LOG4J}

# Compute now the full class path required for execution
RUNTIME_CP =	${PS3I_JAR}:${JREGEXP}:${JGETOPT}:${CONFIGURATION}:${LOG4J} 

#merou:  2.74 s with jikes, 66 s with javac.
JAVAC	=	jikes +F +P -g -classpath ${CP} 
#JAVAC	=	javac -deprecation

JAVADOC 	=  	javadoc
JAVADOC_FLAGS	=	-version -d doc -classpath ${CP}

JENGINE	=	${JDK_HOME}/bin/java

# The main class to start a textual Scheme toplevel
PS3I_MAIN	=	fr.lip6.qnc.ps3i.TopLevel
#PS3I_MAIN	=	fr.lip6.qnc.ps3i.world.TopLevel

# ######################################################### PS3I alone
# Just compile the PS3I interpreter and the ps3i/world package.

compile.ps3i : expand.classes refresh.libraries
	-rm -rf classes/fr/lip6/qnc/ps3i
	cd src ; ${JAVAC} -d ${HOME}/Cours/VideoC/Java/PS3I/classes/ \
		 fr/lip6/qnc/ps3i/?*.java \
		 fr/lip6/qnc/ps3i/world/?*.java

# In the /lib/ directory, there are links to all the libraries that
# are used at compile-time or run-time. There will be also the light
# jar lib/ps3i.jar

refresh.libraries :
	-mkdir lib
	-rm -f lib/`basename ${JREGEXP}`
	if [ -f ${JREGEXP} ] ; then ln -s ${JREGEXP} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${SERVLET}`
	if [ -f ${SERVLET} ] ; then ln -s ${SERVLET} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${JGETOPT}`
	if [ -f ${JGETOPT} ] ; then ln -s ${JGETOPT} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${JAXP}`
	if [ -f ${JAXP} ] ; then ln -s ${JAXP} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${CRIMSON}`
	if [ -f ${CRIMSON} ] ; then ln -s ${CRIMSON} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${CATALINA}`
	if [ -f ${CATALINA} ] ; then ln -s ${CATALINA} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${CONFIGURATION}`
	if [ -f ${CONFIGURATION} ] ; then ln -s ${CONFIGURATION} lib/ ; else exit 1 ; fi
	-rm -f lib/`basename ${LOG4J}`
	if [ -f ${LOG4J} ] ; then ln -s ${LOG4J} lib/ ; else exit 1 ; fi

# Convert .jpp files into .java files. They just pass through cpp. 
# Among the flags are -DWITH_SERIALIZATION_TRACE to include some code
# that traces the serialization process.
# NOTE: there exists EPP (a java pre-processor) but it only accepts the 
# java 1.1 language. JPP is not released.

#Unfortunately, this old cpp does not work !?
CPP	=	/usr/bin/cpp
#CPP = '/usr/lib/gcc-lib/i586-mandrake-linux/2.95.3/cpp' -P -C -traditional
#CPP = '/usr/lib/gcc-lib/i586-mandrake-linux/egcs-2.91.66/cpp' -P -C -traditional
expand.classes : srcpp/fr/lip6/qnc/ps3i/jpp.cpp
	cd srcpp ; for f in fr/lip6/qnc/ps3i/?*.jpp ; do \
	g=`basename $$f .jpp`.java ; \
	echo cpp-ing srcpp/$$f into src/fr/lip6/qnc/ps3i/$$g ; \
	( echo /'* Automatically generated -- Do not touch *'/ ; \
	  echo '#include "fr/lip6/qnc/ps3i/jpp.cpp"' ; \
	  cat $$f ) | ${CPP} - ../src/fr/lip6/qnc/ps3i/$$g ; done

# This jar is a light version of the distribution, it only contains
# the compiled classes and the Scheme boot files.

#lib/ps3i.jar : compile.ps3i 
lib/ps3i.jar : lib/ps3i.manifest
lib/ps3i.jar : scmlib/ps3i.scm 
	-chmod u+w lib/ps3i.jar
	-rm -f lib/ps3i.jar
	${JAR} cfm lib/ps3i.jar lib/ps3i.manifest \
		PS3I.properties -C classes fr scmlib/?*.scm \
		`find srcpp -name '*.jpp' -print` \
		`find src -name '*.java' -print` \
		ChangeLog COPYING README Imakefile 
	chmod a=r lib/ps3i.jar

# Build the jar file also containing all included other jar files
# (that is, log4j, regexp and getopt).

lib/ps3i+.jar : lib/ps3i.jar
	-mkdir /tmp/ps3i+
	-rm -rf /tmp/ps3i+/.
	WD=`pwd` ; cd /tmp/ps3i+/ ; \
	for f in `RCP="${RUNTIME_CP}" ; IFS="$$IFS:" ; echo $$RCP` ; \
		do case X$$f in X/?*) ${JAR} xf $$f ;; \
		*) ${JAR} xf $$WD/$$f ;; esac ; done
	jar cfm lib/ps3i+.jar lib/ps3i.manifest \
		`cd /tmp/ps3i+ ; for f in * ; do \
		echo -C /tmp/ps3i+ $$f ; done`
	rm -rf /tmp/ps3i+

lib/ps3i.manifest :
	( echo "Manifest-Version: 1.0" ;\
	  echo "Sealed: true" ;\
	  echo "Main-Class: ${PS3I_MAIN}" ) > lib/ps3i.manifest

# Re-create the ps3i.scm file that contains the entire bootstrap ie
# the basis R4RS library as well an expansion engine to accept all
# derived syntaxes of Scheme R4RS. Take these files from Jaja.

scmlib/ps3i.scm : ${HOME}/icslas/Java/Javagen/boot1.scm
scmlib/ps3i.scm : ${HOME}/icslas/Java/Javagen/bootm1.scm
scmlib/ps3i.scm : scmlib/ps3i.scm.cpp
	cd ${HOME}/icslas/Java/Javagen ; ${MAKE} boot1.scm bootm1.scm
	-ln -s ${HOME}/icslas/Java/Javagen/boot1.scm scmlib/
	-ln -s ${HOME}/icslas/Java/Javagen/bootm1.scm scmlib/
	cd scmlib ; ( echo "(begin ";\
	  (sed -e '/^;;; #include boot1.scm/rboot1.scm' \
	       -e '/^;;; #include bootm1.scm/rbootm1.scm' ) \
		  < ps3i.scm.cpp | \
	   sed -e '/^#f$$/d' ;\
	  echo ")" ) > ps3i.scm
	@echo For documentation purposes ...
	-ln -s ${HOME}/icslas/Macros/clexpand.scm scmlib/
	-ln -s ${HOME}/icslas/Macros/clmacros.scm scmlib/

test.ps3i.alone : lib/ps3i.jar
	m test.ps3i.from.jar PS3I_JAR=lib/ps3i.jar < /dev/null
	echo NO NO NO m test.ps3i.directly.from.jar < /dev/null
	m test.ps3i.small PS3I_JAR=lib/ps3i.jar 
	m test.ps3i.scm PS3I_JAR=lib/ps3i.jar 
	m test.ps3i.macros PS3I_JAR=lib/ps3i.jar 
	m test.ps3i.with.one.url PS3I_JAR=lib/ps3i.jar < /dev/null
	m test.ps3i.with.two.urls PS3I_JAR=lib/ps3i.jar < /dev/null
	m test.ps3i.load PS3I_JAR=lib/ps3i.jar 
	m test.ps3i.worlds PS3I_JAR=lib/ps3i.jar 
	m test.ps3i.suite PS3I_JAR=lib/ps3i.jar 
	m test.ps3i.defaults.as.r4rs
	m test.ps3i.with.ldap
	@echo ; echo '*** *** *** All tests passed *** *** ***' ; echo

test.ps3i+.alone :
	m test.ps3i.from.jar PS3I_JAR=lib/ps3i+.jar < /dev/null
	echo NO NO NO m test.ps3i.directly.from.jar < /dev/null
	m test.ps3i.small PS3I_JAR=lib/ps3i+.jar 
	m test.ps3i.scm PS3I_JAR=lib/ps3i+.jar 
	m test.ps3i.macros PS3I_JAR=lib/ps3i+.jar 
	m test.ps3i.with.one.url PS3I_JAR=lib/ps3i+.jar < /dev/null
	m test.ps3i.with.two.urls PS3I_JAR=lib/ps3i+.jar < /dev/null
	m test.ps3i.load PS3I_JAR=lib/ps3i+.jar 
	m test.ps3i.worlds PS3I_JAR=lib/ps3i+.jar 
	m test.ps3i.suite PS3I_JAR=lib/ps3i+.jar
	m test.ps3i+.defaults.as.r4rs
	m test.ps3i.with.ldap
	@echo ; echo '*** *** *** All tests passed *** *** ***' ; echo

# ######################################################### OBSOLETE

compile.ps3i.and.servlets : refresh.libraries
	-rm -rf classes/fr/lip6/qnc/ps3i/
	cd src ; ${JAVAC} \
		 fr/lip6/qnc/ps3i/?*.java \
		 fr/lip6/qnc/ps3i/servlet/?*.java \
		 fr/lip6/qnc/authenticate/?*.java \
		 fr/lip6/qnc/memo/?*.java \
		 fr/lip6/qnc/persist/?*.java \
		 fr/lip6/qnc/relay/?*.java

# This jar contains PS3I and its servlets as well as the other
# required packages: regexp and getopt.

lib/ps3is.jar : lib/ps3i.jar
lib/ps3is.jar : lib/ps3is.manifest
	-chmod u+w lib/ps3is.jar
	-rm -f lib/ps3is.jar
	-mkdir classes/gnu
	-ln -s ${JREGEXPDIR}/classes/gnu/regexp classes/gnu/
	-ln -s ${JGETOPTDIR}/gnu/getopt         classes/gnu/
	-ln -s ../../../../../Configuration/classes/fr/lip6/qnc/configuration \
		classes/fr/lip6/qnc/
	-ln -s ${LOG4JDIR}/classes/icons classes/gnu/
	-ln -s ${LOG4JDIR}/classes/org   classes/gnu/
	cd classes ; ${JAR} cfm ../lib/ps3is.jar ../lib/ps3is.manifest \
		fr gnu -C .. PS3I.properties
	chmod a=r lib/ps3is.jar
	-rm lib/ps3is.manifest

lib/ps3is.manifest :
	( echo "Manifest-Version: 1.0" ;\
	  echo "Main-Class: ${PS3I_MAIN}" ;\
	  echo "Sealed: true" ) > lib/ps3is.manifest

test.ps3i.servlets : lib/ps3is.jar
	m test.ps3i.from.jar PS3I_JAR=lib/ps3is.jar < /dev/null
	m test.ps3i.directly.from.jar PS3I_JAR=lib/ps3is.jar < /dev/null
	m test.ps3i.small PS3I_JAR=lib/ps3is.jar 
	m test.ps3i.scm PS3I_JAR=lib/ps3is.jar 
	m test.ps3i.macros PS3I_JAR=lib/ps3is.jar 
	m test.laml.generation PS3I_JAR=lib/ps3is.jar 
	m test.ps3i.with.one.url PS3I_JAR=lib/ps3is.jar < /dev/null
	m test.ps3i.with.two.urls PS3I_JAR=lib/ps3is.jar < /dev/null
	m test.ps3i.load PS3I_JAR=lib/ps3is.jar 
	m test.ps3i.suite PS3I_JAR=lib/ps3is.jar 
	m test.ps3i.worlds PS3I_JAR=lib/ps3is.jar 
	@echo ; echo '*** *** *** All tests passed *** *** ***' ; echo

# ################################################################# Tests 

# Start PS3I from the jar file in text-only mode. If PS3I_FLAGS is
# empty then the Scheme global environment that PS3i preloads will be
# nearly empty.  The name of the interpreter (the word after -t) may
# be PS3I.bare leading to a bare environment or PS3I.textual which
# leads to a r4rs environment.  If you use these previous words with
# the -t option you should also use the -r option with the
# PS3I.properties file that defines precisely what these titles
# involve.

PS3I_FLAGS	=	-t PS3I.bare -r PS3I.properties
#PS3I_JAR	=	lib/ps3is.jar
PS3I_JAR	=	lib/ps3i.jar
test.ps3i : test.ps3i.from.jar

# Two alternate ways to run PS3I from the jar file.
test.ps3i.from.jar : 
	export -n JAVA_HOME JAVA_COMPILER ; ${JENGINE} \
	-cp ${RUNTIME_CP} ${PS3I_MAIN} ${PS3I_FLAGS}
test.ps3i.directly.from.jar : 
	export -n JAVA_HOME JAVA_COMPILER ;\
	${JENGINE} -jar ${PS3I_JAR} ${PS3I_FLAGS}

# Should start up a r4rs interpreter:
start.ps3i.defaults.as.r4rs :
	export -n JAVA_HOME JAVA_COMPILER ; ${JENGINE} \
	-cp ${PS3I_JAR}:${JREGEXP}:${JGETOPT}:${CONFIGURATION}:${LOG4J} \
		${PS3I_MAIN}
test.ps3i.defaults.as.r4rs :
	echo '(cons 1 2)' | m start.ps3i.defaults.as.r4rs | \
		exec grep '1 . 2'
start.ps3i+.defaults.as.r4rs :
	export -n JAVA_HOME JAVA_COMPILER ; ${JENGINE} -jar lib/ps3i+.jar
test.ps3i+.defaults.as.r4rs :
	echo '(cons 1 2)' | m start.ps3i+.defaults.as.r4rs | \
		exec grep '1 . 2'

# Check if the text-only version accepts some simple expressions (no
# boot file yet loaded). This is mainly to test the binding with Java.
test.ps3i.small : 
	( echo '(#@new:fr.lip6.qnc.ps3i.Pair@ 1 2)' ; \
	  echo '(#@instanceof:java.lang.Boolean@ #t)' ;\
	  echo '(#@staticMethod:fr.lip6.qnc.ps3i.FreshSymbol.gensym@)' ) \
		| exec m test.ps3i

# Check if the bare text-only version loads successfully its boot file:
test.ps3i.scm : scmlib/ps3i.scm
	m PS3I_FLAGS="-t PS3I.bare -r PS3I.properties -T" \
		test.ps3i < scmlib/ps3i.scm

# Start PS3I with an initial URL:
PS3I_PRELUDE_URL	=	file:scmlib/ps3i.scm
test.ps3i.with.one.url : 
	m test.ps3i PS3I_FLAGS="${PS3I_PRELUDE_URL}"
test.ps3i.with.two.urls : 
	m test.ps3i PS3I_FLAGS="${PS3I_PRELUDE_URL} ${PS3I_PRELUDE_URL}"

# Test load function
test.ps3i.load :
	echo '(load "file:scmlib/ps3i.scm")' | \
		exec m test.ps3i

# Test again the boot file (this assumes that ps3i.scm is already loaded):
test.ps3i.reload :
	echo '(load "scmlib/ps3i.scm")' | \
		exec m PS3I_FLAGS="-t PS3I.textual -r PS3I.properties" test.ps3i

# Check the -w/-W option
test.ps3i.worlds : test.ps3i.create.world
test.ps3i.worlds : test.ps3i.restaure.world
test.ps3i.create.world :
	echo '(define a 123654)' | \
	m PS3I_FLAGS="-t PS3I.textual -r PS3I.properties -W /tmp/1.p3w" \
		 test.ps3i
test.ps3i.restaure.world :
	echo 'a' | m PS3I_FLAGS="-w file:/tmp/1.p3w" test.ps3i \
		| exec grep 123654
	-rm /tmp/1.p3w

# Test file inclusion
test.ps3i.inclusion :
	-(echo '"a" (quote 2)' ; echo '((c) d)' ) > i.scm
	echo '(quote (1 #`i.scm` 3))' | m test.ps3i
	-(echo '"a" (quote 2))' ; echo '((c) d)' ) > i.scm
	echo '(quote (1 #`i.scm`)' | m test.ps3i
	-rm -f i.scm

# test macros
test.ps3i.macros :
	( echo '(define-macro (when condition . forms) ' ;\
	  echo '  `(if ,condition (begin . ,forms))) ' ;\
	  echo '(expand (quote (when 1 2 3)))' ) | \
	m test.ps3i PS3I_FLAGS="-t PS3I.textual -r PS3I.properties" | \
	exec grep '(if 1 (begin 2 3))'

# test laml generation (needs ps3i.servlet to run)
test.laml.generation :
	( echo '(display (expand (quote ' ;\
	  echo ' (html (head coucou: (quote lartiste) ' ;\
	  echo '  (title bgcolor: (quote red) (br) ' ;\
	  echo ' "c est un titre" )))))) ' ) | \
	m test.ps3i PS3I_FLAGS="-t PS3I+LAML -r PS3I.properties"

XMLFILE = ${SITE_SRCDIR}/content/cached/jargon/dwnld.xml
test.read.xml :
	( echo "(#@method:fr.lip6.qnc.ps3i.XMLReader.read@ " ;\
	  echo " (#@new:fr.lip6.qnc.ps3i.XMLReader(java.io.File)@ " ;\
	  echo "  (#@new:java.io.File(java.lang.String)@ " ;\
	  echo "   \"${XMLFILE}\" )))" ;\
	) | m test.ps3i PS3I_FLAGS="-t PS3I.bare -r PS3I.properties"

# Check non-regression suites with an empty PS3I interpreter.
# This produces ugly error messages since PS3I.properties is not used.
# @perou: 50 seconds.
test.ps3i.suite : scmlib/ps3i.scm
	@echo ; echo Attention this takes a minute ... ; echo
	( echo "\"wait a little while I'm loading ps3i.scm ...\"" ;\
	  cat scmlib/ps3i.scm ;\
	  cat ../../../../DEA/tester.scm ;\
	  echo " \"tester loaded\" \
(set! call/ep call/cc) ''(call/ep is for \"monitor.tst\" file) \
(set! t #t)\
(set! f #f)\
(set! nil (quote ()))\
(and (suite-test \"../../../../icslas/Test/monitor.tst\" \
            \"?? \" \"== \" #t \
            (lambda (read print error) \
              (lambda () (monitor (lambda (e c) (error e)) \
	 		    (print (eval (expand (read)))) )) ) \
            equal? ) \
     (suite-test \"../../../../DEA/scheme.tst\" \
            \"?? \" \"== \" #t \
            (lambda (read print error) \
              (lambda () \
                 (let ((exp (read))) \
                   (if (member exp (quote ((set! xyzzy 3)))) \
                       (error 567) \
                       (monitor (lambda (e c) (error e)) \
                                (print (eval exp)) ) ) ) ) ) \
            equal? ) \
     (suite-test \"scmlib/ps3i.tst\" \
            \"?? \" \"== \" #t \
            (lambda (read print error) \
              (lambda () \
                 (let ((exp (read))) \
                   (if (member exp (quote ((set! xyzzy 3)))) \
                       (error 567) \
                       (monitor (lambda (e c) (error e)) \
                                (print (eval (expand exp))) ) ) ) ) ) \
            equal? ) \
     \"                                             \@@\
               *** successful end of all tests ***  \@@\
                                                    \@@\
\"  ) " ) | time m test.ps3i PS3I_FLAGS="-t PS3I.bare -r PS3I.properties -T"

# ########################################################## Manager

# Test world.TopLevel which uses JNDI. To use the File system
# provider, fetch it from SUN. This will create the /tmp/ps3i
# directory. Unfortunately, this provider does not allow to serialize
# objects (this yields the javax.naming.OperationNotSupportedException:
# Can only bind References or Referenceable objects exception).

# NOTE: To avoid adding jars to the classpath, install
# ${JNDI}/fscontext.jar:${JNDI}/providerutil.jar into ${JDK_HOME}/jre/lib/ext/

# The LDAP provider allows Worlds to be serialized but if handled with
# Manager, the nodes do not have a 'cn' attribute. Therefore one
# should use the LDAPManager.

JNDI_ENGINE	=	${JDK_HOME}/bin/java
JNDI_FLAGS_FILE	= \
  -Djava.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory \
  -Djava.naming.provider.url=file:///tmp
JNDI_FLAGS_LDAP	= \
  -Djava.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory \
  -Djava.naming.provider.url=ldap:///dc=vld7net,dc=fr \
  -Djava.naming.security.principal=cn=Manager,dc=vld7net,dc=fr \
  -Djava.naming.security.authentication=simple \
  -Djava.naming.security.credentials=qnc \
  -Dfr.lip6.qnc.ps3i.world.manager.factory=fr.lip6.qnc.ps3i.world.LDAPManager
#JNDI_FLAGS	=	${JNDI_FLAGS_FILE}
JNDI_FLAGS	=	${JNDI_FLAGS_LDAP}
JNDI	=	/java/jndi-fs/lib
ADDITIONAL_CP	=	${JNDI}/fscontext.jar:${JNDI}/providerutil.jar

check.extension.jars : ${JDK_HOME}/jre/lib/ext/fscontext.jar
${JDK_HOME}/jre/lib/ext/fscontext.jar : ${JNDI}/fscontext.jar
	cp ${JNDI}/fscontext.jar ${JDK_HOME}/jre/lib/ext/
check.extension.jars : ${JDK_HOME}/jre/lib/ext/providerutil.jar
${JDK_HOME}/jre/lib/ext/providerutil.jar : ${JNDI}/providerutil.jar
	cp ${JNDI}/providerutil.jar ${JDK_HOME}/jre/lib/ext/

# One should create a zone in the LDAP server with write access.  That
# zone should have a cn=ps3i common name.  Use kldap or gq to
# create/see this node.

# Schemas in openLDAP do not seem to be modifiable, so this does not work:
prepare.openldap.for.java.objects :
	cd ${JAVASTUFFDIR}/jnditutorial/config/LDAP/ ;\
	java -Djava.naming.provider.url=ldap:///dc=vld7net,dc=fr \
		CreateJavaSchema \
		-n'cn=Manager,dc=vld7net,dc=fr' -p'qnc'

test.ps3i.record.worlds : check.extension.jars
	m test.ps3i.from.jar \
		JENGINE="${JNDI_ENGINE} ${JNDI_FLAGS}" \
		PS3I_MAIN=fr.lip6.qnc.ps3i.world.TopLevel \
		PS3I_FLAGS='-R'
	@echo Determine the size of the empty World
	ldapsearch -R -L -b 'dc=vld7net,dc=fr' 'cn=empty' | wc
	@echo Determine the size of the r4rs World
	ldapsearch -R -L -b 'dc=vld7net,dc=fr' 'cn=r4rs' | wc
#@perou: 25 seconds

test.ps3i.use.r4rs.world : check.extension.jars
	echo '(cons 2 3)' | \
	m test.ps3i.from.jar \
		JENGINE="${JNDI_ENGINE} ${JNDI_FLAGS}" \
		PS3I_MAIN=fr.lip6.qnc.ps3i.world.TopLevel \
		PS3I_FLAGS='-t r4rs' | \
	exec grep '2 . 3'
#@perou: 15 seconds

# Test the -W option to record a World (using a SharedAbsorbingGlobalEnv).
# Check the size of the serialized worlds in LDAP.
test.ps3i.record.new.world : check.extension.jars
test.ps3i.record.new.world : test.ps3i.record.new.world.1
test.ps3i.record.new.world : test.ps3i.record.new.world.2
test.ps3i.record.new.world.1 :
	echo '(define (triple n) (* 3 n)) (triple 333)' | \
	  m test.ps3i.from.jar \
		JENGINE="${JNDI_ENGINE} ${JNDI_FLAGS}" \
		PS3I_MAIN=fr.lip6.qnc.ps3i.world.TopLevel \
		PS3I_FLAGS='-t r4rs -W r4rs+triple' 
	@echo Determine the size of the r4rs+triple World
	ldapsearch -R -L -b 'dc=vld7net,dc=fr' 'cn=r4rs+triple' | wc
test.ps3i.record.new.world.2 :
	echo '(+ 1 (triple 333))' | \
	  m test.ps3i.from.jar \
		JENGINE="${JNDI_ENGINE} ${JNDI_FLAGS}" \
		PS3I_MAIN=fr.lip6.qnc.ps3i.world.TopLevel \
		PS3I_FLAGS='-t r4rs+triple' | \
	  exec grep 1000

# This test supposes a LDAP server to be ready and prepared:
test.ps3i.with.ldap : test.ps3i.record.worlds
test.ps3i.with.ldap : test.ps3i.use.r4rs.world
test.ps3i.with.ldap : test.ps3i.record.new.world

# Other ideas: ldap has a shell interface towards 'real' database.
# Adapter JNDI -> JDBC ?

# ########################################################## Distribution
#  TO BE DONE AGAIN ...




DISTRIBUTION_NAME	=	`date +ps3i-%Y%h%d`

distribution : \
	compile.ps3i.and.servlets \
	ps3i.report \
	generate.documentation \
	generate.ps3i.jar \
	update.ps3i.data

generate.ps3i.jar :
	m ps3i.jar && cp ps3i.jar `date +ps3i-%Y%h%d.jar`

update.ps3i.data :
	${MAKE} update.file FILE=${HOME}/admin/Exportations \
                STAMP=ps3i DATE=`date +%Y%h%d`

# Make a jar file and include the Imakefile which is, currently, the main 
# source of information. Caution, VideoC documentation may also be present.
# Include gnu.getopt, gnu.regexp and servlets to ease the deployment of PS3I.
ps3i.jar : scmlib/ps3i.scm
ps3i.jar : scmlib/servlet/laml.scm
ps3i.jar : prepare.gnu.getopt
ps3i.jar : prepare.gnu.regexp
#ps3i.jar : prepare.javax.servlet
ps3i.jar : doc/index.html
ps3i.jar : ps3i.manifest
	m makefile && ${JAR} cfm ps3i.jar ps3i.manifest \
		fr/lip6/qnc/configuration/?*.class \
		fr/lip6/qnc/configuration/?*.java \
		fr/lip6/qnc/ps3i/?*.class \
		fr/lip6/qnc/ps3i/?*.java \
		fr/lip6/qnc/ps3i/?*.scm \
		fr/lip6/qnc/ps3i/servlet/?*.class \
		fr/lip6/qnc/ps3i/servlet/?*.java \
		fr/lip6/qnc/ps3i/servlet/?*.laml \
		fr/lip6/qnc/ps3i/servlet/?*.scm \
		fr/lip6/qnc/ps3i/servlet/?*.js \
		fr/lip6/qnc/ps3i/servlet/demo/?*.laml \
		fr/lip6/qnc/ps3i/servlet/demo/?*.scm \
		fr/lip6/qnc/ps3i/servlet/demo/?*.png \
		fr/lip6/qnc/ps3i/servlet/demo/?*.gif \
		fr/lip6/qnc/ps3i/servlet/demo/?*.png \
		fr/lip6/qnc/ps3i/servlet/tests/?*.scm \
		fr/lip6/qnc/ps3i/servlet/tests/?*.html \
		fr/lip6/qnc/ps3i/servlet/tests/?*.laml \
		fr/lip6/qnc/ps3i/ROADMAP \
		fr/lip6/qnc/relay/?*.class \
		fr/lip6/qnc/relay/?*.java \
		fr/lip6/qnc/memo/?*.class \
		fr/lip6/qnc/memo/?*.java \
		PS3I.properties \
		doc \
		Documents/ps3i.ps \
		Documents/ps3i.html \
		Documents/?*.png \
		makefile \
		-C .. COPYING \
		-C fr/lip6/qnc/ps3i/ README
	rm -f makefile 

# Prepare a makefile for the distribution:
makefile : Imakefile
	@echo "#include INCLUDE_IMAKEFILE" >/tmp/Imake.tmpl
	@imake -v -T/tmp/Imake.tmpl -s makefile
	@rm -f /tmp/Imake.tmpl

# javadoc-ize the PS3I and required packages.
generate.documentation : 
	-rm -rf doc
	-mkdir doc
	${JAVADOC} ${JAVADOC_FLAGS} \
		`find fr/lip6/qnc/[cmpr]* -name CVS -prune \
			-o -name Archive -prune \
		        -o -name '*.java' -print`

# Start ps3i with all the libraries needed. This is useful for debugging
# laml pages directly.
run.ps3i.laml :
	m test.ps3i PS3I_FLAGS='-t PS3I+LAML -r PS3I.properties'
run.ps3i :
	m test.ps3i PS3I_FLAGS='-t PS3I.textual -r PS3I.properties'

# ############################################################### Utilities
# Turn code of all java classes of PS3I into Postscript:

ps3i.ps :
	a2ps -A virtual -o ps3i.ps \
		fr/lip6/qnc/ps3i/?*.java \
		fr/lip6/qnc/ps3i/?*.scm \
		fr/lip6/qnc/ps3i/servlet/?*.java \
		fr/lip6/qnc/ps3i/servlet/?*.laml \
		fr/lip6/qnc/ps3i/servlet/?*.scm 

tags : 
	-rm TAGS
	m TAGS
TAGS :
	export EXTENSION=jpp ; jtags .
	jtags src/fr/lip6/qnc/ps3i/world/
	echo NO	jtags `ls -d src/fr/lip6/qnc/ps3i/[a-z]*/`
	etags -a -o TAGS scmlib/?*.scm

# ############################################################### Benchmarks
# Timings for various JVM or versions of PS3I.
# The benchmark is the following: starts an empty interpreter then
# loads ps3i.scm twice.

bench.ps3i :
	export -n JAVA_HOME JAVA_COMPILER ; time ${JENGINE} \
	-cp ${PS3I_JAR}:${JREGEXP}:${JGETOPT}:${CONFIGURATION}:${LOG4J} \
		${PS3I_MAIN} ${PS3I_FLAGS} \
		${PS3I_PRELUDE_URL} ${PS3I_PRELUDE_URL} < /dev/null

# This is the PS3I version of september 2000 with a jvm 1.2.
# Unfortunately, one should use the old version of ps3i.scm (with
# .ps3i. written as .PS3I.) This version did not use log4j.

bench.ps3i.videoc2000.jdk1.2 :
	m bench.ps3i \
	  JENGINE=/stuff/CD/bin/i386linux/jre1.2.2/bin/java \
	  PS3I_MAIN=fr.lip6.qnc.PS3I.TopLevel \
	  PS3I_FLAGS= \
	  PS3I_JAR=/stuff/CD/content/WEB-INF/lib/videoc.jar \
	  LOG4J= \
	  PS3I_PRELUDE_URL=file:/stuff/CD/content/fr/lip6/qnc/PS3I/ps3i.scm
#@perou: 51.43 sec

bench.ps3i.videoc2000.jdk1.3 :
	m bench.ps3i \
	  JENGINE=/opt/jdk1.3/bin/java \
	  PS3I_MAIN=fr.lip6.qnc.PS3I.TopLevel \
	  PS3I_FLAGS= \
	  PS3I_JAR=/stuff/CD/content/WEB-INF/lib/videoc.jar \
	  LOG4J= \
	  PS3I_PRELUDE_URL=file:/stuff/CD/content/fr/lip6/qnc/PS3I/ps3i.scm
#@perou: 33.74 sec

# This is PS3I (with classes from the ps3i package) with log4j. I also
# introduced ConcatenatedStrings.

bench.ps3i.jdk1.3 :
	m bench.ps3i \
	  JENGINE=/opt/jdk1.3/bin/java \
	  PS3I_MAIN=fr.lip6.qnc.ps3i.TopLevel \
	  PS3I_FLAGS='-t empty' \
	  PS3I_JAR=lib/ps3i.jar \
	  PS3I_PRELUDE_URL=file:scmlib/ps3i.scm
#@perou: 34.13 sec

# end of Imakefile
