<!-- Build file for CKS -->

<project name="cks" default="build" basedir=".">

  <property name="output.dir" value="${basedir}/Output"/>
  <property name="source.dir" value="${basedir}/Source"/>

  <property name="cks.source.dir" value="${source.dir}/cks"/>
  <property name="cks.output.dir" value="${output.dir}/cks"/>
  <property name="cks.bytecode.dir" value="${cks.output.dir}/bytecode"/>
  <property name="cks.generated.dir" value="${cks.output.dir}/gen"/>
  <property name="cks.depend.dir" value="${cks.output.dir}/depend"/>
  <property name="cks.javadoc.dir" value="${cks.output.dir}/javadoc"/>
  <property name="jar.file" value="${cks.output.dir}/cks.jar"/>

  <property name="tools.output.dir" value="${output.dir}/tools"/>
  <property name="tools.bytecode.dir" value="${tools.output.dir}/bytecode"/>
  <property name="tools.source.dir" value="${source.dir}/tools"/>

  <property name="codes.source" value="${cks.source.dir}/parser/Codes.tokencodes"/>
  <property name="codes.target.dir" value="${cks.generated.dir}"/>
  <property name="codes.target" value="${codes.target.dir}/Codes.java"/>

  <!-- Jar File -->
  <target name="jar" depends="build">
    <jar
      destfile="${jar.file}"
      basedir="${cks.bytecode.dir}">
      <manifest>
        <attribute name="Main-Class" value="cks.Main"/>
      </manifest>
    </jar>
  </target>

  <!-- Default target -->
  <target name="build" depends="compile"/>

  <!-- Clean -->
  <target name="clean">
    <delete dir="${output.dir}"/>
    <delete file="${jar.file}"/>
  </target>

  <!-- Compile Java source files to class files -->
  <target name="compile" depends="generated">
		<mkdir dir="${cks.bytecode.dir}"/>
		<!--
		<depend
			srcdir="${source.dir}:${cks.generated.dir}"
			destdir="${cks.bytecode.dir}"
			cache="${cks.depend.dir}"
			closure="yes"/>
		-->
    <javac
        srcdir="${source.dir}:${cks.generated.dir}"
        includes="cks/**/*.java"
        destdir="${cks.bytecode.dir}"
        debug="true" debuglevel="lines,source"
				source="1.5">
      <compilerarg value="-Xlint:unchecked"/>
    </javac>
  </target>

	<!-- JavaDoc -->
	<target name="javadoc" depends="compile">
		<mkdir dir="${cks.javadoc.dir}"/>
		<javadoc
			sourcepath="${source.dir}:${cks.generated.dir}"
			destdir="${cks.javadoc.dir}"
			access="public"
			packagenames="cks.*"
			windowtitle="CKS Library Javadoc"
			source="1.5">
			<doctitle><![CDATA[<h1>CKS Library Javadoc</h1>]]></doctitle>
		</javadoc>
	</target>

  <!-- Run code generators to produce Java source files -->
  <target name="generated" depends="scanner,codes"/>
  
  <!-- Run JFlex to generate scanner -->
  <target name="scanner">
		<mkdir dir="${cks.generated.dir}"/>
    <jflex
      file="${cks.source.dir}/parser/StreamTokenizer.jflex"
      destdir="${cks.generated.dir}"
    />
  </target>

  <!-- Run tools/TokenCodeGenerator to generate token codes -->
  <target name="codes" depends="tools,codes.uptodate" unless="codes.uptodate">
    <java
      classname="tools.TokenCodeGenerator"
      classpath="${tools.bytecode.dir}">
      <arg value="${codes.source}"/>
      <arg value="${codes.target.dir}"/>
    </java>
  </target>

  <!-- Dependency check for parser/Codes.java -->
  <target name="codes.uptodate">
    <!-- check token code generator dependencies -->
		<uptodate property="codes.uptodate" targetfile="${codes.target}">
			<srcfiles>
				<filename name="${codes.source}"/>
				<filename name="${source.dir}/tools/TokenCodeGenerator.java"/>
			</srcfiles>
		</uptodate>
  </target>

  <!-- Tools -->
  <target name="tools">
		<mkdir dir="${tools.bytecode.dir}"/>
    <javac
        srcdir="${source.dir}"
        includes="tools/**/*.java"
        destdir="${tools.bytecode.dir}">
      <compilerarg value="-Xlint:unchecked"/>
    </javac>
  </target>

  <!-- JFlex task -->
  <taskdef classname="JFlex.anttask.JFlexTask" name="jflex"/>

</project>

