
SHELL=/bin/sh

# ----- System configuration section -------------------------------------------

srcdir=.
vpath %.class ./classes
vpath %.java  ./src
vpath %.java  ./tmp

.SUFFIXES:

# change to suit your environment, or suggest a better way to do it without
# modifying this file
jdk=${JAVA_HOME}

JIKES=jikes
JAVA=${jdk}/bin/java
JAVAC=${JIKES}# jikes is faster!!!
JAVACFLAGS=-deprecation +E +P +OLDCSO
#use the following if javac is preferred over jikes
#JAVAC=${jdk}/bin/javac
#JAVACFLAGS=-deprecation
JAR=${jdk}/bin/jar
JAVADOC=${jdk}/bin/javadoc

# a workaround to allow using the same Makefile under both Unix and NT
ifeq (${OS},Windows_NT)
	PS:=;
else
	PS:=:
endif

# ----- Variables---------------------------------------------------------------

name:=cryptix-asn1
oneliner:=Cryptix ASN.1 Developer Kit
version:=0.1.10
build:=29

dist_file=${name}-${version}.zip

java_jars=${jdk}/lib/tools.jar${PS}${jdk}/jre/lib/rt.jar${PS}${jdk}/jre/lib/i18n.jar
sablecc_jar=lib/sablecc.jar
log_jar=lib/log4j.jar
opt_jar=lib/java-getopt.jar
junit_jar=lib/junit.jar
asn1_ast_jar=lib/asn1-ast.jar
cryptix_asn1_jar=lib/${name}.jar

asn1_classes=\
	cryptix/asn1/encoding/Factory.class \
	cryptix/asn1/encoding/DerDecoder.class \
	cryptix/asn1/encoding/DerEncoder.class \
	cryptix/asn1/encoding/DerInvalidTagValueException.class \
	cryptix/asn1/encoding/XerEncoder.class \
	\
	cryptix/asn1/lang/Any.class \
	cryptix/asn1/lang/ASNBoolean.class \
	cryptix/asn1/lang/ASNInteger.class \
	cryptix/asn1/lang/BitString.class \
	cryptix/asn1/lang/Choice.class \
	cryptix/asn1/lang/Null.class \
	cryptix/asn1/lang/ObjectIdentifier.class \
	cryptix/asn1/lang/OctetString.class \
	cryptix/asn1/lang/PrintableString.class \
	cryptix/asn1/lang/NumericString.class \
	cryptix/asn1/lang/TeletexString.class \
	cryptix/asn1/lang/VideotexString.class \
	cryptix/asn1/lang/IA5String.class \
	cryptix/asn1/lang/GraphicString.class \
	cryptix/asn1/lang/VisibleString.class \
	cryptix/asn1/lang/GeneralString.class \
	cryptix/asn1/lang/UniversalString.class \
	cryptix/asn1/lang/BMPString.class \
	cryptix/asn1/lang/Sequence.class \
	cryptix/asn1/lang/SequenceOf.class \
	cryptix/asn1/lang/Set.class \
	cryptix/asn1/lang/SetOf.class \
	cryptix/asn1/lang/UTCTime.class \
	cryptix/asn1/lang/GeneralizedTime.class \
	\
	cryptix/asn1/tool/Main.class

tmp_classes=\
	cryptix/asn1/common/AlgorithmIdentifier.class \
	cryptix/asn1/common/AttributeType.class \
	cryptix/asn1/common/AttributeValue.class \
	cryptix/asn1/common/AttributeValueAssertion.class \
	cryptix/asn1/common/Certificate.class \
	cryptix/asn1/common/CertificateInfo.class \
	cryptix/asn1/common/CertificateSerialNumber.class \
	cryptix/asn1/common/Name.class \
	cryptix/asn1/common/RDNSequence.class \
	cryptix/asn1/common/RelativeDistinguishedName.class \
	cryptix/asn1/common/SubjectPublicKeyInfo.class \
	cryptix/asn1/common/Validity.class \
	cryptix/asn1/common/Version.class

regression_classes=\
	test/SeqType.class \
	test/SetType.class \
	test/SeqOfType.class \
	test/SetOfType.class \
	test/SeqTypeA.class \
	test/ChoiceType.class \
	test/SeqTypeB.class \
	test/SeqTypeC.class \
	test/SeqTypeD.class \
	test/SetTypeA.class

testcase_classes=\
	test/TestOfBlankOptional.class \
	test/TestOfOptionalChoice.class \
	test/TestOfConstructed.class \
	test/AllTests.class

# ----- Targets ---------------------------------------------------------------

.PHONY: parser jar junit test docs bin dist install cleandocs cleanjars clean depend

default:
	@ date
	@ echo "Use a specific target. Exiting..."

# ----- process grammar file --------------------------------------------------

parser: ${asn1_ast_jar}

${asn1_ast_jar}: ASN1-004.grammar ${sablecc_jar}
	@ echo "*** Parsing grammar..."
	- rm -rf classes/*
	${JAVA} -mx1024m -jar ${sablecc_jar} -d src $< --with-tools
	@ echo "*** Compiling output source files..."
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "src${PS}classes${PS}${java_jars}" src/cryptix/asn1/analysis/*.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "src${PS}classes${PS}${java_jars}" src/cryptix/asn1/lexer/*.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "src${PS}classes${PS}${java_jars}" src/cryptix/asn1/node/*.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "src${PS}classes${PS}${java_jars}" src/cryptix/asn1/parser/*.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "src${PS}classes${PS}${java_jars}" src/cryptix/asn1/tool/DisplayTree.java src/cryptix/asn1/tool/PrintTree.java src/cryptix/asn1/tool/PrintWalker.java src/cryptix/asn1/tool/TreeBuilder.java
	@ echo "*** Making "$@" file..."
	cp src/cryptix/asn1/lexer/*.dat classes/cryptix/asn1/lexer/
	cp src/cryptix/asn1/parser/*.dat classes/cryptix/asn1/parser/
	${JAR} cf $@ -C classes cryptix
	- rm -rf classes/*

# ----- cryptix_asn1.jar ------------------------------------------------------

jar: ${cryptix_asn1_jar}

${cryptix_asn1_jar}: ${asn1_ast_jar} ${log_jar} ${opt_jar} ${asn1_classes} etc/cryptix-asn1.mf
	@ echo "*** Unjarring AST classes..."
	cd classes; jar xf ../${asn1_ast_jar}
	@ echo "*** Making "$@" file..."
	- mkdir classes/properties
	cp -f properties/*.properties classes/properties/
	${JAR} cmf etc/cryptix-asn1.mf $@ -C classes cryptix properties

cryptix/asn1/%.class: cryptix/asn1/%.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "${asn1_ast_jar}${PS}src${PS}classes${PS}${java_jars}${PS}${log_jar}${PS}${opt_jar}" $<

# ----- JUnit tests -----------------------------------------------------------

junit: ${cryptix_asn1_jar} ${regression_classes} ${testcase_classes}
	${JAVA} -cp "classes${PS}${cryptix_asn1_jar}${PS}${junit_jar}" test.AllTests

${regression_classes}: test/Module.java

test/Module.java: etc/test.asn
	@ echo "*** Generating Java classes from ASN.1 specification (test.asn) test file..."
	${JAVA} -jar ${cryptix_asn1_jar} --Package=TestDefinitions=test -Dtmp $<
	@ echo "*** Compiling ASN.1 generated (in ./tmp) java files..."
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "${java_jars}${PS}${cryptix_asn1_jar}${PS}${log_jar}${PS}classes${PS}tmp" tmp/test/*.java

# ----- tests -----------------------------------------------------------------

test: junit ${tmp_classes} test/TestDer.class test/TestXer.class src/test/1eecert.x509 ${log_jar} ${opt_jar}
	@ echo "*** Running DER test harness..."
	${JAVA} -cp ".${PS}classes${PS}${cryptix_asn1_jar}${PS}${java_jars}${PS}${log_jar}${PS}${opt_jar}" test.TestDer src/test/1eecert.x509
	@ echo "*** Running XER test harness..."
	${JAVA} -cp ".${PS}classes${PS}${cryptix_asn1_jar}${PS}${java_jars}${PS}${log_jar}${PS}${opt_jar}" test.TestXer src/test/1eecert.x509

${tmp_classes}: ${cryptix_asn1_jar} cryptix/asn1/common/Module.java

cryptix/asn1/common/Module.java: etc/cryptix.asn
	@ echo "*** Generating Java classes from ASN.1 specification (cryptix.asn) test file..."
	# should fail because of syntax error in specifying the command line options
	- ${JAVA} -jar ${cryptix_asn1_jar} --Package=CryptixUsefulDefinitions=cryptix.asn1.common -Dtmp -P PKCS7=cryptix.asn1.pkc7 etc/cryptix.asn --not-there.asn
	# should fail because input file does not exist
	- ${JAVA} -jar ${cryptix_asn1_jar} --Package=CryptixUsefulDefinitions=cryptix.asn1.common -Dtmp -P PKCS7=cryptix.asn1.pkc7 not-there.asn -- etc/cryptix.asn
	# should work
	${JAVA} -jar ${cryptix_asn1_jar} --Package=CryptixUsefulDefinitions=cryptix.asn1.common -Dtmp -P PKCS7=cryptix.asn1.pkc7 etc/cryptix.asn
	@ echo "*** Compiling ASN.1 generated (in ./tmp) java files..."
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "${java_jars}${PS}${cryptix_asn1_jar}${PS}tmp${PS}classes${PS}${log_jar}" tmp/cryptix/asn1/common/*.java

test/%.class: test/%.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "${java_jars}${PS}${cryptix_asn1_jar}${PS}${log_jar}${PS}${junit_jar}${PS}classes${PS}tmp" $<

cryptix/asn1/common/%.class: cryptix/asn1/common/*.java
	${JAVAC} ${JAVACFLAGS} -d classes -classpath "${java_jars}${PS}${cryptix_asn1_jar}${PS}${log_jar}${PS}classes${PS}tmp" $<

# ----- documentation ---------------------------------------------------------

docs: docs/api/index.html

docs/api/index.html: docs/api ${cryptix_asn1_jar} ${log_jar} ${opt_jar}
	@ echo "*** Generating Javadoc files..."
	rm -rf docs/api/*
	${JAVADOC} -sourcepath src/ \
		-d docs/api/ \
		-classpath "${cryptix_asn1_jar}${PS}${log_jar}${PS}${opt_jar}" \
		-package \
		-version \
		-windowtitle "${oneliner}, version ${version}" \
		-doctitle "<H1>${oneliner}<br>Programmer's Documentation</H1>" \
		-header "For the latest news and information visit the<br> <A HREF=\"http://www.cryptix.org\">Cryptix web site</A>" \
		-footer "<!-- begin footer --><HR><!-- end footer -->" \
		-bottom "Copyright &copy; 1999-2001 <A HREF=\"http://www.cryptix.org\">The Cryptix Foundation Limited.</A> All Rights Reserved." \
		cryptix.asn1.encoding cryptix.asn1.io cryptix.asn1.lang cryptix.asn1.tool

docs/api:
	mkdir $@

# ----- distribution ----------------------------------------------------------

dist: test clean
	@ echo "*** Packing the distribution file..."
	zip -r ./${dist_file} \
	   ASN1-004.grammar Authors CGL ChangeLog KnownLimitations log.properties Makefile \
	   docs/index.html etc/* lib/cryptix-asn1.jar properties/* src/* -x \*/CVS/\* -x \*.old
	@ echo "*** Done..."

# ----- installation ----------------------------------------------------------

install: inflate bin docs
	@ echo "*** Done..."

inflate:
	@ echo "*** Unpacking the distribution file..."
	# already done
	- mkdir ./classes

bin:
	@ echo "*** Generating shell scripts..."
	- mkdir bin
	echo "@ rem COMMAND.COM" >bin/asn2java.bat
	echo "@ echo off" >>bin/asn2java.bat
	echo "" >>bin/asn2java.bat
	echo "set ASN1_HOME=\""`pwd | sed \
	   -e 's/\(\/cygdrive\/\)\([a-z]\)\(\/.\)/\2:\3/' \
	   -e 'y/\//\\\\/' \
	   -e q `\" \
	   >>bin/asn2java.bat
	cat etc/asn2java.bat.tmpl >>bin/asn2java.bat

	echo "#! /usr/bin/bash" >bin/asn2java.sh
	echo "" >>bin/asn2java.sh
	echo "ASN1_HOME=\""`pwd`\" >>bin/asn2java.sh
	cat etc/asn2java.sh.tmpl >>bin/asn2java.sh

# ----- cleaning --------------------------------------------------------------

cleandocs:
	- rm -rf docs/api/*
	- rmdir docs/api

clean: cleandocs
	- rm -rf classes/*
	- rm -rf src/cryptix/asn1/analysis/*
	- rm -rf src/cryptix/asn1/lexer/*
	- rm -rf src/cryptix/asn1/node/*
	- rm -rf src/cryptix/asn1/parser/*
	- rm -f src/cryptix/asn1/tool/DisplayTree.java
	- rm -f src/cryptix/asn1/tool/PrintTree.java
	- rm -f src/cryptix/asn1/tool/PrintWalker.java
	- rm -f src/cryptix/asn1/tool/TreeBuilder.java
	- rmdir src/cryptix/asn1/analysis
	- rmdir src/cryptix/asn1/lexer
	- rmdir src/cryptix/asn1/node
	- rmdir src/cryptix/asn1/parser
	- rm -rf tmp/*
	- rmdir tmp
	- rm anX509.xer

cleanjar: clean
	- rm ${cryptix_asn1_jar}

cleanall: cleanjar
	- rm ${asn1_ast_jar}
	- rm bin/*
	- rmdir bin

# ----- other implicit rules --------------------------------------------------


# ----- experimental section --------------------------------------------------

depend: ${asn1_ast_jar}
	${JIKES} +B +M -classpath "src${PS}${asn1_ast_jar}${PS}${java_jars}${PS}${log_jar}${PS}${opt_jar}" \
		src/cryptix/asn1/tool/Main.java
	- mkdir .dependencies
	- find -path 'src/*.u' -exec mv \{} .dependencies/ \;

${sablecc_jar}:
	wget -v -t=2 -O sablecc-2.17.1.tar.gz http://download.sourceforge.net/sablecc/sablecc-2.17.1.tar.gz
	tar -xvzf sablecc-2.17.1.tar.gz sablecc-2.17.1/lib/sablecc.jar
	mv sablecc-2.17.1/lib/sablecc.jar lib/
	rm -rf sablecc-2.17.1/*
	rmdir sablecc-2.17.1

${log_jar}:
	wget -v -t=2 -O jakarta-log4j-1.0.4.tgz http://jakarta.apache.org/log4j/jakarta-log4j-1.0.4.tgz
	tar -xvzf jakarta-log4j-1.0.4.tgz jakarta-log4j-1.0.4/log4j.jar
	mv jakarta-log4j-1.0.4/log4j.jar lib/
	rm -rf jakarta-log4j-1.0.4/*
	rmdir jakarta-log4j-1.0.4

${opt_jar}:
	wget -v -t=2 -O lib/java-getopt.jar ftp://ftp.urbanophile.com/pub/arenn/software/sources/java-getopt-1.0.8.jar
