<?xml version="1.0" encoding="UTF-8"?>
<!--
   - Ant build for the JOGL demos. This build has been tested with ANT 1.5.3.
   -
   - In order for this build to succeed the resulting jar files from this build
   - (jogl-demos.jar, jogl-demos-data.jar, .., jogl-demos-util.jar) must not be on
   - the CLASSPATH.
   -
   - This build requires that the jogl project has been checked out into a sibling
   - directory to the jogl-demos top-level directory and that the jogl.jar has been
   - built into its build directory.
   -->
<project name="JOGL.demos" default="all">

    <!-- This is the version of jogl-demos you are building -->
    <property name="jogl-demos_base_version" value="2.0"/>
    <tstamp>
       <format property="version.timestamp" pattern="yyyyMMdd"/>
    </tstamp>
    <property name="jogl-demos.version" value="${jogl-demos_base_version}-${version.timestamp}" />

    <property name="project.root"  value=".." />

    <condition property="rootrel.build" value="build">
      <not>
          <isset property="rootrel.build"/>
      </not>
    </condition>
    <property name="build" location="${project.root}/${rootrel.build}" />

    <property name="gluegen.root"  value="${project.root}/../gluegen" />
    <property name="gluegen.build" value="${gluegen.root}/${rootrel.build}" />
    <!-- Pull in GlueGen cpptasks build file -->
    <import file="${gluegen.root}/make/gluegen-cpptasks.xml" />
    <import file="${gluegen.root}/make/jogamp-archivetasks.xml" />
    <import file="${gluegen.root}/make/jogamp-env.xml" />

    <property name="jogl.root"     value="${project.root}/../jogl" />
    <property name="jogl.build"    value="${jogl.root}/${rootrel.build}" />

    <property name="joal.root"     value="${project.root}/../joal" />
    <property name="joal.build"    value="${joal.root}/${rootrel.build}" />

    <property name="jogl-demos.build.number" value="manual-build"/>
    <property name="jogl-demos.build.id"     value="${version.timestamp}"/>
    <property name="jogl-demos.build.branch" value="master"/>
    <property name="jogl-demos.build.commit" value="manual"/>

    <!-- 
       - Make sure that jogl-demos.jar is not on the CLASSPATH; this can
       - cause builds to fail since if this Java process has the jar file
       - open we can not overwrite it.
      -->
    <target name="test.for.jogl-demos.jar">
        <available property="jogl-demos.jar.on.class.path" classname="demos.gears.Gears" />
    </target>
    <target name="java.class.path.validate" depends="test.for.jogl-demos.jar" if="jogl-demos.jar.on.class.path">
        <fail>
        
    ******************************************************************
    ** Your CLASSPATH environment variable appears to be set (some  **
    ** JOGL demos' classes are currently visible to the build.)     **
    ** This can cause the build to fail. Please unset your          **
    ** CLASSPATH variable and restart the build.                    **
    ******************************************************************
        </fail>
    </target>

    <target name="setup.gles">
        <condition property="isGLES">
          <or>
            <isset property="jogl.es" />
          </or>
        </condition>
    </target>

    <target name="setup.cg.excludes" unless="jogl.cg">
        <property name="jogl.cg.excludes" value="demos/cg/**,demos/hdr/CgPipeline.java,demos/hdr/shaders/cg/**" />
    </target>

    <target name="skip.cg.excludes" if="jogl.cg">
        <property name="jogl.cg.excludes" value="" />
    </target>

    <target name="init.swt">
        <condition property="jogl.swt.excludes"
                   value="demos/swt/**">
            <not>
                <isset property="user.swt.jar" />
            </not>
        </condition>

        <property name="swt.jar"            value="${user.swt.jar}"/>
    </target>

    <target name="init" depends="jogamp.env.init,gluegen.cpptasks.detect.os,java.class.path.validate,setup.gles,setup.cg.excludes,skip.cg.excludes,init.swt">
        <property name="gluegen-rt.jar"      value="${gluegen.build}/gluegen-rt.jar" />
        <property name="jogl-all.jar"        value="${jogl.build}/jar/jogl-all.jar" />
        <property name="jogl-cg.jar"         value="${jogl.build}/jar/atomic/jogl-cg.jar" />
        <property name="joal.jar"            value="${joal.build}/joal.jar" />
        <property name="simple-xml.jar"      value="${project.root}/lib/simple-xml-1.1.1.jar" />
        <property name="classes"             value="${build}/classes" />
        <property name="src"                 value="${project.root}/src" />
        <property name="javadoc"             value="${project.root}/javadoc" />
        <!-- property name="javadoc.link" value="http://java.sun.com/j2se/1.4.2/docs/api/" /-->
        <!--property name="javadoc.link" value="http://download.oracle.com/javase/1.5.0/docs/api/" /-->
        <property name="javadoc.link"        value="http://docs.oracle.com/javase/6/docs/api/" />
        <property name="javadoc.link.jogl"   value="${jogl.root}/javadoc-public/" />
        <property name="jogl-demos.jar"      value="${build}/jogl-demos.jar" />
        <property name="jogl-demos-util.jar" value="${build}/jogl-demos-util.jar" />
        <property name="jogl-demos-data.jar" value="${build}/jogl-demos-data.jar" />
        <property name="jogl-demos-dualDepthPeeling.jar" value="${build}/jogl-demos-dualDepthPeeling.jar" />
        <property name="jogl-demos-tennis.jar" value="${build}/jogl-demos-tennis.jar" />
        <property name="archive.name"        value="jogl-demos-${jogl-demos.version}-${os.and.arch}" />
        <property name="archive"             value="${build}/${archive.name}" />

        <property name="jogl.redbook.excludes" value="redbook/**" />

    </target>

    <target name="nurbs" if="jogl.nurbs">
        <javac destdir="${classes}" 
               includeAntRuntime="false"
               includes="demos/nurbs/**" 
               memoryMaximumSize="${javac.memorymax}"
               encoding="UTF-8"
               source="${target.sourcelevel}" 
               target="${target.targetlevel}" 
               bootclasspath="${target.rt.jar}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <src path="${src}" />
            <classpath refid="jogl-demos.classpath" />
        </javac>
	<!-- Copy icons to output dir -->
        <copy todir="${build}">
            <fileset dir="${src}">
                <include name="demos/nurbs/icons/*.png" />
            </fileset>
        </copy>
	<!-- Copy dependent libraries to output dir -->
        <copy file="../lib/simple-xml-1.1.1.jar" todir="${build}" />
        <copy file="../lib/stax-api-1.0.1.jar" todir="${build}" />
        <copy file="../lib/stax-1.2.0.jar" todir="${build}" />
    </target>

    <target name="redbook-javac">
        <javac destdir="${classes}" 
               includeantruntime="false"
               memoryMaximumSize="${javac.memorymax}"
               encoding="UTF-8"
               source="${target.sourcelevel}" 
               target="${target.targetlevel}" 
               bootclasspath="${target.rt.jar}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <src path="${src}/redbook/src" />
            <classpath refid="jogl-demos.classpath" />
        </javac>
    </target>

    <target name="all-desktop" unless="isGLES">
        <mkdir dir="${classes}" />
        <path id="jogl-demos.classpath">
            <pathelement location="${jogl-all.jar}" />
            <pathelement location="${jogl-cg.jar}" />
            <pathelement location="${joal.jar}" />
            <pathelement location="${gluegen-rt.jar}" />
            <pathelement location="${simple-xml.jar}" />
            <pathelement location="${swt.jar}" />
        </path>
        <javac destdir="${classes}" 
               excludes="${jogl.cg.excludes},demos/nurbs/**,${jogl.swt.excludes},jbullet/**,${jogl.redbook.excludes}" 
               includeantruntime="false"
               memoryMaximumSize="${javac.memorymax}"
               encoding="UTF-8"
               source="${target.sourcelevel}" 
               target="${target.targetlevel}" 
               bootclasspath="${target.rt.jar}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <src path="${src}" />
            <classpath refid="jogl-demos.classpath" />
        </javac>
        <antcall target="redbook-javac" inheritrefs="true" />
        <antcall target="nurbs" inheritrefs="true" />
        <jar destfile="${jogl-demos.jar}">
            <fileset dir="${classes}">
                <exclude name="gleem/**" />
                <exclude name="demos/util/**" />
                <exclude name="demos/dualDepthPeeling/**" />
                <exclude name="demos/tennis/**" />
            </fileset>
            <fileset dir="${src}">
                <include name="demos/cg/**/*.cg" />
            </fileset>
            <fileset dir="${src}">
                <include name="demos/hdr/shaders/**/*.cg" />
                <include name="demos/hdr/shaders/**/*.arbvp1" />
                <include name="demos/hdr/shaders/**/*.arbfp1" />
                <include name="demos/es1/bump/*.brs" />
                <include name="demos/es2/shader/**" />
                <include name="demos/es2/perftst/shader/**" />
                <include name="demos/es2/perftst/data/**" />
                <include name="demos/es2/openmax/shader/**" />
            </fileset>
            <!-- Avoid requiring dependence on huge jogl-demos-data.jar for
                 particle engine demo -->
            <fileset dir="${src}">
                <include name="demos/particles/engine/images/*.jpg" />
            </fileset>
        </jar>
        <jar destfile="${jogl-demos-util.jar}">
            <fileset dir="${classes}">
                <include name="gleem/**" />
                <include name="demos/util/**" />
            </fileset>
        </jar>
        <jar destfile="${jogl-demos-data.jar}">
            <fileset dir="${src}">
                <include name="demos/data/**" />
                <exclude name="demos/data/models/dragon.obj" />
                <exclude name="demos/data/tennis/**" />
            </fileset>
            <fileset dir="${classes}">
                <include name="demos/data/**" />
            </fileset>
        </jar>
        <!-- due to size or usability .. create self packaged jars (code + data) -->
        <jar destfile="${jogl-demos-dualDepthPeeling.jar}">
            <fileset dir="${classes}">
                <include name="demos/dualDepthPeeling/**" />
            </fileset>
            <fileset dir="${src}">
                <include name="demos/dualDepthPeeling/shader/*" />
            </fileset>
            <fileset dir="${src}">
                <include name="demos/data/models/dragon.obj" />
            </fileset>
            <fileset dir="${classes}">
                <include name="demos/data/**" />
            </fileset>
        </jar>
        <jar destfile="${jogl-demos-tennis.jar}">
            <fileset dir="${classes}">
                <include name="demos/tennis/**" />
            </fileset>
            <!--fileset dir="${src}">
                <include name="demos/tennis/shader/*" />
            </fileset!-->
            <fileset dir="${src}">
                <include name="demos/data/tennis/**" />
            </fileset>
            <fileset dir="${classes}">
                <include name="demos/data/**" />
            </fileset>
        </jar>
    </target>

    <target name="all-gles" if="isGLES">
        <echo message="classes destdir ${classes}" />
        <mkdir dir="${classes}" />
        <path id="jogl-demos.classpath">
            <pathelement location="${jogl-all.jar}" />
            <pathelement location="${jogl-cg.jar}" />
            <pathelement location="${gluegen-rt.jar}" />
        </path>
        <javac destdir="${classes}" 
               includes="demos/GLInfo*,demos/es1/**,demos/es2/**" 
               includeantruntime="false"
               memoryMaximumSize="${javac.memorymax}"
               encoding="UTF-8"
               source="${target.sourcelevel}" 
               target="${target.targetlevel}" 
               bootclasspath="${target.rt.jar}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <src path="${src}" />
            <classpath refid="jogl-demos.classpath" />
        </javac>
        <jar destfile="${jogl-demos.jar}">
            <fileset dir="${classes}">
                <include name="**" />
            </fileset>
            <fileset dir="${src}">
                <include name="demos/es1/bump/*.brs" />
                <include name="demos/es2/shader/**" />
                <include name="demos/es2/perftst/shader/**" />
                <include name="demos/es2/perftst/data/**" />
                <include name="demos/es2/openmax/shader/**" />
            </fileset>
        </jar>
    </target>

    <target name="all" depends="init, all-desktop, all-gles, tag.build, developer-zip-archive" />

    <target name="all.ide" depends="init, all-desktop, all-gles" />

    <target name="tag.build">
        <copy file="${jogl.build}/artifact.properties" todir="${build}" overwrite="true"/>
        <echo message='jogl-demos.build.number=${jogl-demos.build.number}${line.separator}' file="${build}/artifact.properties" append="true"/>
        <echo message='jogl-demos.build.id=${jogl-demos.build.id}${line.separator}'         file="${build}/artifact.properties" append="true"/>
        <echo message='jogl-demos.build.branch=${jogl-demos.build.branch}${line.separator}' file="${build}/artifact.properties" append="true"/>
        <echo message='jogl-demos.build.commit=${jogl-demos.build.commit}${line.separator}' file="${build}/artifact.properties" append="true"/>
    </target>

    <target name="javadoc" depends="init">
        <mkdir dir="${javadoc}" />
        <javadoc destdir="${javadoc}" 
                 windowtitle="JOGL Demos"
                 encoding="UTF-8"
                 source="${target.sourcelevel}"
                 maxmemory="${javac.memorymax}" >
            <packageset dir="${src}">
                <exclude name="demos/cg/**" />
            </packageset>
            <link href="${javadoc.link}" />
            <!-- FIXME: this doesn't work -->
            <link href="${javadoc.link.jogl}" />
        </javadoc>
    </target>    

    <target name="clean" depends="init">
        <delete includeEmptyDirs="true" quiet="true">
            <fileset dir="${build}" />
            <fileset dir="../javadoc" />
        </delete>
    </target>

    <!-- ================================================================== -->
    <!--
       - Build the binary zip archive for developers.
       - This must be called on one target.
      -->

    <target name="developer-zip-archive" depends="init" if="build.archiveon">
        <delete includeEmptyDirs="true" quiet="true" dir="${archive}" failonerror="false" />
        <mkdir dir="${archive}" />
        <copy file="${build}/artifact.properties" todir="${archive}"/>
        <mkdir dir="${archive}/jar" />
        <copy todir="${archive}/jar">
            <fileset dir="${build}" includes="jogl-demos*.jar"/>
        </copy>
        <mkdir dir="${archive}/jnlp-files" />
        <copy todir="${archive}/jnlp-files">
            <fileset dir="${project.root}/jnlp-files" includes="*" />
        </copy>
        <mkdir dir="${archive}/www" />
        <copy todir="${archive}/www">
            <fileset dir="${project.root}/www" includes="*" excludes="*.7z"/>
        </copy>
        <archive.7z destfile="${build}/${archive.name}.7z"
             basedir="${build}"
             includes="${archive.name}/**" />
        <!-- Clean up after ourselves -->
        <delete includeEmptyDirs="true" quiet="true" dir="${archive}" failonerror="false" />
    </target>

 </project>