<?xml version="1.0" encoding="UTF-8"?>
<!--
   - Ant build for JOGL's GlueGen and corresponding ANT task.  This build 
   - should not be called directly.  It is invoked from the main "build.xml"
   - file and relies on the properties set therein.
   -
   - The optional.jar that contains the optional ANT tasks must be in the ANT
   - classpath (typically the ant/lib directory).
   -
   - This build has been tested with ANT 1.5.3 and JOGL 1.1.1.1.
   -
   - Public targets:
   -   all:  clean and build GlueGen and GlueGen Ant task
   -   clean:  clean all built
  -->
<project name="JOGL.GlueGen" default="all">
    <!-- ================================================================== -->
    <!-- 
       - Declare all paths and user defined variables.
      -->
    <target name="declare" description="Declare properties">

        <!-- Create the classpath for ANTLR.  This requires the user-defined
           - "antlr.jar" property. -->
        <path id="antlr.classpath">
            <pathelement location="${antlr.jar}" />
        </path>
    
        <!-- The location of the GlueGen source and the C grammar files. -->
        <property name="gluegen" value="${src}/net/java/games/gluegen" />
        <property name="c.grammar" value="${gluegen}/cgram" />
        
        <!-- The resulting location of the generated Java files from the
           - C grammar via ANTLR. -->
        <property name="gluegen.build" value="${src.generated.java}/net/java/games/gluegen" />
        <property name="generated.java.from.grammar" value="${gluegen.build}/cgram" />

    </target>

    <!-- ================================================================== -->
    <!--
       - Build GlueGen.
      -->
    <target name="build.gluegen" depends="declare">
        <!-- Generate the Java files from the C grammar using ANTLR. -->
        <antcall target="generate.c.grammar">
            <param name="target" value="${c.grammar}/StdCParser.g" />
            <param name="output.dir" value="${generated.java.from.grammar}" />
        </antcall>
        <antcall target="generate.c.grammar.glib">
            <param name="target" value="${c.grammar}/GnuCParser.g" />
            <param name="glib" value="${c.grammar}/StdCParser.g" />
            <param name="output.dir" value="${generated.java.from.grammar}" />
        </antcall>
        <antcall target="generate.c.grammar">
            <param name="target" value="${c.grammar}/GnuCTreeParser.g" />
            <param name="output.dir" value="${generated.java.from.grammar}" />
        </antcall>
        <antcall target="generate.c.grammar.glib">
            <param name="target" value="${c.grammar}/GnuCEmitter.g" />
            <param name="glib" value="${c.grammar}/GnuCTreeParser.g" />
            <param name="output.dir" value="${generated.java.from.grammar}" />
        </antcall>
        <antcall target="generate.c.grammar.glib">
            <param name="target" value="${c.grammar}/HeaderParser.g" />
            <param name="glib" value="${c.grammar}/GnuCTreeParser.g" />
            <param name="output.dir" value="${generated.java.from.grammar}" />
        </antcall>
    
        <!-- Ensure that the output classes directory exists. -->
        <mkdir dir="${classes}" />
            
        <!-- Build GlueGen using the generated Java files along with the
           - original source. 
           - NOTE:  GlueGenTask is NOT built at this time.  It is done in
           -        a separate task.  -->
        <javac destdir="${classes}" includes="**/gluegen/**" excludes="**/GlueGenTask.java"
               source="1.4" debug="true" debuglevel="source,lines">
            <src path="${src}" />
            <src path="${src.generated.java}" />
            <classpath refid="antlr.classpath" />
        </javac>
        
        <!-- Inform the user that GlueGen has been successfully built. -->
        <echo message="" />
        <echo message="GlueGen has been built successfully." />
    </target>      
    
    <!--
       - Using ANTLR generate the specified Java files.
       -
       - @param target the grammar file to process
       - @param output.dir the directory to write the generated files to.  If
       -        the directory does not exist, it will be created.
      -->
    <target name="generate.c.grammar" depends="declare">
        <!-- Ensure that the output directory exists.
           - NOTE:  this will ignore silently if the directory already exists. -->
        <mkdir dir="${output.dir}" />
        
        <!-- Generate the Java files -->
        <antlr target="${target}" outputdirectory="${output.dir}">
            <classpath refid="antlr.classpath" />
        </antlr>
    </target>
    
    <!--
       - Using ANTLR generate the specified Java files with an overridden
       - grammar file.
       -
       - @param target the grammar file to process
       - @param glib the overridding grammar file
       - @param output.dir the directory to write the generated files to.  If
       -        the directory does not exist, it will be created.
      -->
    <target name="generate.c.grammar.glib" depends="declare">
        <!-- Ensure that the output directory exists.
           - NOTE:  this will ignore silently if the directory already exists. -->
        <mkdir dir="${output.dir}" />
        
        <!-- Generate the Java files -->
        <antlr target="${target}" glib="${glib}" outputdirectory="${output.dir}">
            <classpath refid="antlr.classpath" />
        </antlr>
    </target>
    
    <!-- ================================================================== -->
    <!--
       - Build the GlueGen ANT task.
      -->
    <target name="build.gluegen.task" depends="declare">
        <!-- Ensure that the output classes directory exists. -->
        <mkdir dir="${classes}" />
            
        <!-- Build the GlueGen ANT task.
           - NOTE:  ONLY the GlueGenTask is built at this time.  GlueGen 
           -        itself is built in a separate task.  -->
        <javac destdir="${classes}" includes="**/GlueGenTask.java" source="1.4" debug="true" debuglevel="source,lines">
            <src path="${src}" />
            <classpath refid="antlr.classpath" />
        </javac>
        
        <!-- Inform the user that the GlueGen ANT task has been successfully 
             built. -->
        <echo message="" />
        <echo message="GlueGen ANT task has been built successfully." />
    </target>

    <!-- ================================================================== -->
    <!--
       - Clean up all that is built.  
       - NOTE:  this is a bit heavy-handed as it may delete more than just
       -        what is built with this build.
      -->
    <target name="clean" depends="declare">
        <delete includeEmptyDirs="true" quiet="true">
            <fileset dir="${src.generated.java}" />
            <fileset dir="${classes}" />
        </delete>
    </target>
    
    <!-- ================================================================== -->
    <!--
       - Build GlueGen and the GlueGen ANT task.
      -->
    <target name="all" depends="declare">
        <!-- Build GlueGen -->
        <antcall target="build.gluegen" />    
    
        <!-- Build the GlueGen ANT task -->
        <antcall target="build.gluegen.task" />
    </target>      

</project>