<project name="CTL4j" default="compile" basedir=".">
	
	<description>Component Template Library for Java</description>

	<property name="src" location="src"/>
	<property name="build" location="build"/>
	<property name="dist" location="dist"/>
	<property name="cache" location="depcache"/>
	<property name="doc" location="docs"/>
	
	<property name="debug" value="true"/>
	<property name="dbglevel" value="lines,vars,source"/>
	<property name="optimize" value="off"/>

	<!-- Hacky way of finding all available JARs automatically -->
	<exec executable="find" outputproperty="tmp-jars">
		<arg value="."/>
		<arg value="-name"/>
		<arg value="*.jar"/>
		<arg value="-print0"/>
	</exec>
	<exec executable="sed" outputproperty="jars" inputstring="${tmp-jars}">
		<arg value="s/jar/jar${path.separator}/g"/>
	</exec>
	<!-- <echo message="${jars}"/> -->

	<property environment="env"/>
	<property name="classpath" value="${java.class.path}${path.separator}${classpath}${path.separator}${env.CLASSPATH}${path.separator}${build}${path.separator}${jars}"/>

	<property name="example" value="Example.Client4"/>
	
	<condition property="ctlcc" value="I:\Python\python.exe" else="python">
		<os family="windows"/>
	</condition>
	
	<target name="run-only" description="Run example without compiling">
		<java classname="${example}" classpath="${classpath}" fork="true">
			<jvmarg value="-Dfile.encoding=ISO-8859-1"/>
		</java>
	</target>
	
	<target name="run" depends="compile" description="Run example">
		<java classname="${example}" classpath="${classpath}" fork="true">
			<jvmarg value="-Dfile.encoding=ISO-8859-1"/>
			<arg value="-L 6666"/>
		</java>
	</target>

	<target name="run2" depends="compile" description="Test daemon mode">
		<parallel>
			<java classname="Example.Server" classpath="${classpath}" 
				outputproperty="port.out"/>
			<sequential>
				<sleep seconds="1"/>
				<java classname="Example.Client5" classpath="${classpath}">
					<arg value="${port.out}"/>
				</java>
			</sequential>
		</parallel>
	</target>

	<target name="run3" depends="compile" description="Test HTTP transport">
		<parallel>
			<java classname="Example.WebServer" classpath="${classpath}"/>
			<sequential>
				<sleep seconds="1"/>
				<java classname="Example.Client6" classpath="${classpath}"/>
			</sequential>
		</parallel>
	</target>

	<target name="sloccount" description="Count lines of code">
		<exec executable="find" outputproperty="find.out">
			<arg value="src"/>
			<arg value="-name"/>
			<arg value="*.java"/>
		</exec>
		<exec executable="grep" outputproperty="grep.out" 
			inputstring="${find.out}">
			<arg value="-v"/>
			<arg value="\.svn"/>
		</exec>
		<exec executable="xargs" outputproperty="xargs.out" 
			inputstring="${grep.out}">
			<arg value="wc"/>
			<arg value="-l"/>
		</exec>
		<exec executable="tail" inputstring="${xargs.out}">
			<arg value="-n"/>
			<arg value="1"/>
		</exec>
	</target>

	<target name="todo" description="List of TODO items">
		<exec executable="grep" outputproperty="grep1.out">
			<arg value="-r"/>
			<arg value="TODO"/>
			<arg value="src"/>
		</exec>
		<exec executable="grep" outputproperty="grep2.out"
			inputstring="${grep1.out}">
			<arg value="-v"/>
			<arg value="\.svn"/>
		</exec>
		<exec executable="cut" outputproperty="cut.out"
			inputstring="${grep2.out}">
			<arg value="-d:"/>
			<arg value="-f1,3"/>
		</exec>
		<exec executable="sort" inputstring="${cut.out}"/>
	</target>
	
	<target name="bug" description="List of (known) bugs">
		<exec executable="grep" outputproperty="grep1.out">
			<arg value="-r"/>
			<arg value="XXX\|FIXME"/>
			<arg value="src"/>
		</exec>
		<exec executable="grep" outputproperty="grep2.out"
			inputstring="${grep1.out}">
			<arg value="-v"/>
			<arg value="\.svn"/>
		</exec>
		<exec executable="cut" outputproperty="cut.out"
			inputstring="${grep2.out}">
			<arg value="-d:"/>
			<arg value="-f1,3"/>
		</exec>
		<exec executable="sort" inputstring="${cut.out}"/>
	</target>
	
	<target name="todoc" description="List items which lack documentation">
		<exec executable="grep" outputproperty="grep1.out">
			<arg value="-r"/>
			<arg value="-L"/>
			<arg value="/\*\*"/>
			<arg value="src"/>
		</exec>
		<exec executable="grep" outputproperty="grep2.out"
			inputstring="${grep1.out}">
			<arg value="-v"/>
			<arg value="javaSys\|\.svn\|_default\|Impl/Linalg\.java\|Makefile\|read-foo\|write-foo\|locs\.txt"/>
		</exec>
		<exec executable="sort" inputstring="${grep2.out}"/>
	</target>

	<target name="gen-clean" description="Cleanup generated files">
		<delete quiet="true">
			<fileset dir="${src}/javaSys" includes="*.java"/>
			<fileset dir="${build}/javaSys" includes="*.class"/>
			<fileset dir="${src}/_default" includes="CTL_*.java"/>
			<fileset dir="${src}/_default" includes="CTL_*.class"/>
			<fileset dir="cpp/libs" includes="makefile.*"/>
			<fileset dir="cpp/libs" includes="*.cpp"/>
		</delete>
	</target>

	<target name="check" depends="compile" description="Run the testsuite">
		<java classname="Test.CTLTest" classpath="${classpath}"/>
	</target>

	<target name="init" description="Initialize the build">
		<tstamp/>
		<mkdir dir="${build}"/>
		<mkdir dir="${cache}"/>
	</target>

	<target name="compile-only" depends="init,genri" description="Compile static code">
		<depend srcdir="${src}" destdir="${build}" cache="${cache}"
			closure="yes"/>
		<javac srcdir="${src}" destdir="${build}" classpath="${classpath}"
			excludes="javaSys/*.java,Example/*.java,Test/*.java,Bench/*.java,Impl/Application.java,Debug/DummyDebugger.java,Impl/Chain.java,Impl/ExtChild.java" nowarn="true" debug="${debug}" 
			debuglevel="${dbglevel}" optimize="${optimize}"/>
	</target>

	<target name="compile-gen" depends="compile-only" description="Compile generated code">
		<available file="build/Impl/PiDotNET.class" property="has.net"/>
		<condition property="class.net" value="Impl.PiDotNET" else="">
			<istrue value="${has.net}"/>
		</condition>

		<java classname="CodeGen.Main" classpath="${classpath}" fork="true">
			<arg value="Impl.Mathe"/>
			<arg value="Impl.EvCalc"/>
			<arg value="Impl.CTest"/>
			<arg value="CTL.Group"/>
			<arg value="Impl.Send"/>
			<arg value="Components.Crypt"/>
			<arg value="Impl.Linalg"/>
			<arg value="_default.CTL_LocatorCTLI"/>
			<arg value="_default.CTL_RegistryCTLI"/>
			<arg value="Resourcery.CTL_LocatorCTLI"/>
			<arg value="_default.Add"/>
			<arg value="Impl.Hello"/>
			<arg value="Impl.ChainC"/>
			<arg value="Impl.ChainForwardDecl"/>
			<arg value="Impl.EvilArrayTest"/>
			<arg value="Impl.Anything"/>
			<!-- <arg value="Impl.Java"/> -->
			<arg value="Impl.CallByReference"/>
			<arg value="Impl.PiSimple"/>
			<arg value="Impl.ExtBase"/>
			<arg value="Impl.CTLList"/>
			<arg value="${class.net}"/>
		</java>

		<java classname="CodeGen.Main" classpath="${classpath}" fork="true">
			<!-- This is a template class, have to specify types... -->
			<arg value="-DRET=int"/>
			<arg value="-DX1x1=int"/>
			<arg value="-DX2x2=int"/>
			<arg value="_default.MatlabCTLI"/>
		</java>

		<javac srcdir="${src}" destdir="${build}" nowarn="true" excludes="Debug/DummyDebugger.java,Example/Client7.java,Example/Client15.java,Example/Client17.java" debug="${debug}" debuglevel="${dbglevel}" optimize="${optimize}" classpath="${classpath}"/>
		<java classname="CodeGen.Main" classpath="${classpath}" fork="true">
			<arg value="Impl.Application"/>
			<arg value="Impl.ExtChild"/>
		</java>
		<javac srcdir="${src}" destdir="${build}" nowarn="true" debug="${debug}"
			debuglevel="${dbglevel}" optimize="${optimize}" excludes="Example/Client15.java"/>

		<!-- <delete quiet="true">
			<fileset dir="${build}" includes="*.class"/>
		</delete>
		<javac srcdir="tmp" destdir="${build}"/> -->
	</target>

	<target name="compile-dotnet" if="has.net" description="Compile .NET example">
		<javac srcdir="${src}" destdir="${build}" nowarn="true" debug="${debug}"
			debuglevel="${dbglevel}" optimize="${optimize}"/>	
	</target>

	<target name="compile" depends="compile-gen,compile-dotnet" 
		description="Compile everything"/>

	<target name="genri" depends="init" description="Generate RIs">
		<exec executable="${ctlcc}" output="${src}/Impl/Linalg.java"
			logError="true">
			<arg value="ctlcc.py"/>
			<arg value="-PImpl"/>
			<arg value="cpp/rinc/linalg.ci"/>
		</exec>

		<exec executable="${ctlcc}" output="${src}/Impl/ChainC.java"
			logError="true">
			<arg value="ctlcc.py"/>
			<arg value="-PImpl"/>
			<arg value="-DChainCCI=ChainC"/>
			<arg value="cpp/chain/chain.ci"/>
		</exec>
		
		<exec executable="${ctlcc}" logError="true"
			output="${src}/_default/CTL_RegistryCTLI.java">
			<arg value="ctlcc.py"/>
			<arg value="-P_default"/>
			<arg value="-DCTL_Registry=CTL_RegistryCTLI"/>
			<arg value="cpp/rinc/components.ci"/>
		</exec>

		<exec executable="${ctlcc}" logError="true"
			output="${src}/_default/Add.java">
			<arg value="ctlcc.py"/>
			<arg value="-P_default"/>
			<arg value="cpp/rinc/add.ci"/>
		</exec>

		<exec executable="${ctlcc}" logError="true"
			output="${src}/_default/CTL_LocatorCTLI.java">
			<arg value="ctlcc.py"/>
			<arg value="-P_default"/>
			<arg value="-DCTL_Locator=CTL_LocatorCTLI"/>
			<arg value="test/locator_hacked.ci"/>
		</exec>

		<exec executable="${ctlcc}" logError="true">
			<arg value="cpp/native/ci2jni.py"/>
			<arg value="cpp/add/add.ri"/>
		</exec>

		<exec executable="${ctlcc}" logError="true"
			output="${src}/_default/ResourceManager.java">
			<arg value="ctlcc.py"/>
			<arg value="-P_default"/>
			<arg value="-DResourceManagerRI=ResourceManager"/>
			<arg value="-DlocationDescriptor=Impl.Types.LocationDescriptor"/>
			<arg value="cpp/rinc/ResourceManager.ci"/>
		</exec>

		<exec executable="${ctlcc}" logError="true">
			<arg value="cpp/native/ci2jni.py"/>
			<arg value="cpp/libunix/libunix.ri"/>
		</exec>

		<exec executable="${ctlcc}" logError="true"
			output="${src}/_default/MatlabMICTLI.java">
			<arg value="ctlcc.py"/>
			<arg value="-F"/>
			<arg value="-q"/>
			<arg value="-DMatlabMI=MatlabMICTLI"/>
			<arg value="cpp/rinc/mlab_multiindex_interface.ci"/>
		</exec>

		<exec executable="${ctlcc}" logError="true"
			output="${src}/_default/MatlabCTLI.java">
			<arg value="ctlcc.py"/>
			<arg value="-F"/>
			<arg value="-q"/>
			<arg value="-DMatlab=MatlabCTLI"/>
			<arg value="cpp/rinc/mlab_fun2.ci"/>
		</exec>
	</target>

	<target name="graph" depends="compile" description="Generate class diagramm">
		<java classname="DotClass.Main" classpath="${classpath}">
			<arg value="src"/>
			<arg value="CTL"/>
		</java>
		<exec executable="dot">
			<arg value="-Tgif"/>
			<arg value="-o"/>
			<arg value="CTL.gif"/>
			<arg value="CTL.dot"/>
		</exec>
		<move file="CTL.gif" todir="doc"/>
		<delete file="CTL.dot" quiet="true"/>
	</target>

	<target name="dist" depends="compile" description="Create a JAR">
		<mkdir dir="${dist}"/>
		<jar jarfile="${dist}/CTL4j-${DSTAMP}.jar" basedir="${build}">
			<manifest>
				<attribute name="Build-By" value="${user.name}"/>
				<attribute name="Main-class" value=""/>
			</manifest>
		</jar>
	</target>

	<target name="doc" description="Generate documentation">
		<mkdir dir="${doc}"/>
		<javadoc classpath="${classpath}" sourcepath="${src}" destdir="${doc}" 
			access="private">
			<fileset dir="${src}"/>
		</javadoc>
		<javadoc classpath="${classpath}" sourcepath="${src}" access="private"
			doclet="com.tarsec.javadoc.pdfdoclet.PDFDoclet"
			docletpath="lib/pdfdoclet-1.0.1-all.jar">
			<!-- docletpath="${env.HOME}/software/classpath/pdfdoclet-1.0.1-all.jar"> -->
			<fileset dir="${src}"/>
			<arg value="-pdf"/>
			<arg value="${doc}/ctl4j_api.pdf"/>
			<!-- <arg value="-config"/>
			<arg value="doc/pdf.prop"/> -->
		</javadoc>
	</target>

	<target name="clean" depends="gen-clean" description="Cleanup everything">
		<delete dir="${build}" quiet="true"/>
		<delete dir="${dist}" quiet="true"/>
		<delete dir="${cache}" quiet="true"/>
		<delete dir="${doc}" quiet="true"/>
		<delete quiet="true">
			<fileset dir="." includes="*.log"/>
		</delete>
		
		<delete file="${src}/Impl/Linalg.java"/>
		<delete file="${src}/_default/CTL_RegistryI.java"/>
		<delete file="${src}/_default/CTL_LocatorI.java"/>
		<delete file="${src}/_default/AddCI.java"/>
		<delete file="${src}/_default/AddLI.java"/>
		<delete file="${src}/_default/AddRI.java"/>
		<delete file="${src}/_default/AddLocal.java"/>
		<delete file="${src}/_default/AddDebug.java"/>
		<delete file="${src}/_default/Add.java"/>
		<delete file="${src}/Impl/ChainC.java"/>
		<delete file="${src}/_default/FooCI.java"/>
		<delete file="${src}/_default/FooRI.java"/>
		<delete file="${src}/_default/ResourceManager.java"/>
		<delete file="${src}/NCLib/Unix.java"/>
		<delete file="${src}/NCLib/UnixCI.java"/>
		<delete file="${src}/_default/MatlabMICTLI.java"/>
		<delete file="${src}/_default/MatlabMI.java"/>
		<delete file="${src}/_default/MatlabCTLI.java"/>
		<delete file="${src}/_default/Matlab.java"/>
	</target>

	<target name="help" description="Print out this fluff">
		<exec executable="./data/sh/ant-help.sh"/>
	</target>
</project>
