<?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" />

    <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="gluegen.cpptasks.detect.os,java.class.path.validate,setup.gles,setup.cg.excludes,skip.cg.excludes,init.swt">
        <property name="jogl.core.jar"       value="${jogl.build}/jogl/jogl.core.jar" />
        <condition property="jogl.cg.jar"    value="${jogl.build}/jogl/jogl.cg.jar">
          <isset property="jogl.cg"/>
        </condition>
        <property name="gluegen-rt.jar"      value="${gluegen.build}/gluegen-rt.jar" />
        <property name="jogl.gles12.jar"     value="${jogl.build}/jogl/jogl.gles12.jar" />
        <property name="jogl.gles12.dbg.jar" value="${jogl.build}/jogl/jogl.gles12.dbg.jar" />
        <property name="jogl.gles1.jar"      value="${jogl.build}/jogl/jogl.gles1.jar" />
        <property name="jogl.gles1.dbg.jar"  value="${jogl.build}/jogl/jogl.gles1.dbg.jar" />
        <property name="jogl.gles2.jar"      value="${jogl.build}/jogl/jogl.gles2.jar" />
        <property name="jogl.gles2.dbg.jar"  value="${jogl.build}/jogl/jogl.gles2.dbg.jar" />
        <property name="jogl.egl.jar"        value="${jogl.build}/jogl/jogl.egl.jar" />
        <property name="jogl.gldesktop.jar"  value="${jogl.build}/jogl/jogl.gldesktop.jar" />
        <property name="jogl.gldesktop.dbg.jar" value="${jogl.build}/jogl/jogl.gldesktop.dbg.jar" />
        <property name="jogl.awt.jar"        value="${jogl.build}/jogl/jogl.awt.jar" />
        <property name="jogl.util.jar"       value="${jogl.build}/jogl/jogl.util.jar" />
        <property name="jogl.util.awt.jar"   value="${jogl.build}/jogl/jogl.util.awt.jar" />
        <property name="jogl.util.fixedfuncemu.jar" value="${jogl.build}/jogl/jogl.util.fixedfuncemu.jar" />
        <property name="jogl.util.gldesktop.jar" value="${jogl.build}/jogl/jogl.util.gldesktop.jar" />
        <property name="nativewindow.core.jar" value="${jogl.build}/nativewindow/nativewindow.core.jar" />
        <property name="nativewindow.x11.jar"  value="${jogl.build}/nativewindow/nativewindow.x11.jar" />
        <property name="nativewindow.awt.jar"  value="${jogl.build}/nativewindow/nativewindow.awt.jar" />
        <property name="newt.core.jar"       value="${jogl.build}/newt/newt.core.jar" />
        <property name="newt.ogl.jar"        value="${jogl.build}/newt/newt.ogl.jar" />
        <property name="newt.awt.jar"        value="${jogl.build}/newt/newt.awt.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.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="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">
        <!-- NOTE: this target requires a 1.5 javac to be on the PATH -->
        <javac destdir="${classes}" includes="demos/nurbs/**" source="1.5" debug="true" debuglevel="source,lines"
               includeantruntime="false">
            <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}" source="1.5" target="1.5" debug="true" debuglevel="source,lines"
               includeantruntime="false">
            <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="${nativewindow.core.jar}" />
            <pathelement location="${nativewindow.x11.jar}" />
            <pathelement location="${nativewindow.awt.jar}" />
            <pathelement location="${jogl.core.jar}" />
            <pathelement location="${jogl.cg.jar}" />
            <pathelement location="${jogl.gles1.jar}" />
            <pathelement location="${jogl.gles1.dbg.jar}" />
            <pathelement location="${jogl.gles2.jar}" />
            <pathelement location="${jogl.gles2.dbg.jar}" />
            <pathelement location="${jogl.egl.jar}" />
            <pathelement location="${jogl.gldesktop.jar}" />
            <pathelement location="${jogl.gldesktop.dbg.jar}" />
            <pathelement location="${jogl.awt.jar}" />
            <pathelement location="${jogl.util.jar}" />
            <pathelement location="${jogl.util.fixedfuncemu.jar}" />
            <pathelement location="${jogl.util.awt.jar}" />
            <pathelement location="${jogl.util.gldesktop.jar}" />
            <pathelement location="${newt.core.jar}" />
            <pathelement location="${newt.ogl.jar}" />
            <pathelement location="${newt.awt.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}" source="1.4" target="1.4" debug="true" debuglevel="source,lines"
            includeantruntime="false">
            <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/**" />
            </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/**" />
            </fileset>
        </jar>
    </target>

    <target name="all-gles" if="isGLES">
        <echo message="classes destdir ${classes}" />
        <mkdir dir="${classes}" />
        <path id="jogl-demos.classpath">
            <pathelement location="${nativewindow.core.jar}" />
            <pathelement location="${nativewindow.x11.jar}" />
            <pathelement location="${jogl.core.jar}" />
            <pathelement location="${jogl.gles1.jar}" />
            <pathelement location="${jogl.gles1.dbg.jar}" />
            <pathelement location="${jogl.gles2.jar}" />
            <pathelement location="${jogl.gles2.dbg.jar}" />
            <pathelement location="${jogl.egl.jar}" />
            <pathelement location="${jogl.util.jar}" />
            <pathelement location="${jogl.util.fixedfuncemu.jar}" />
            <pathelement location="${gluegen-rt.jar}" />
            <pathelement location="${newt.core.jar}" />
            <pathelement location="${newt.ogl.jar}" />
        </path>
        <javac destdir="${classes}" includes="demos/GLInfo*,demos/es1/**,demos/es2/**" source="1.4" target="1.4" debug="true" debuglevel="source,lines"
               includeantruntime="false">
               bootclasspath="${gluegen.root}/make/lib/cdc_fp.jar">
            <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="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"
                 source="1.4">
            <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" unless="build.noarchives">
        <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="*" />
        </copy>
        <delete quiet="true" file="${build}/${archive.name}.zip"/>
        <zip destfile="${build}/${archive.name}.zip"
             basedir="${build}"
             includes="${archive.name}/**" />
        <!-- Clean up after ourselves -->
        <delete includeEmptyDirs="true" quiet="true" dir="${archive}" failonerror="false" />
    </target>

 </project>