<?xml version="1.0" encoding="UTF-8"?>

<project name="GlueGenTest" basedir=".">

    <description>JUNIT Tests GlueGen</description>

    <!-- On jpackage.org-compatible systems, antlr.jar can be found in /usr/share/java -->
    <available property="antlr.jar" file="/usr/share/java/antlr.jar"
              value="/usr/share/java/antlr.jar"/>

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

    <import file="gluegen-cpptasks.xml" />

    <condition property="rootrel.build" value="build">
        <not>
          <isset property="rootrel.build"/>
        </not>
    </condition>

    <target name="init" depends="gluegen.properties.load.user">

        <!-- Call the external config validator script to make sure the config is ok and consistent -->
        <ant antfile="validate-properties.xml" inheritall="true"/>

        <property name="make" value="." />

        <property name="test.base.dir"  value="${gluegen.root}/src/junit" />
        <property name="test.junit.rel" value="com/jogamp/gluegen/test/junit" />
        <property name="test.junit.dir" value="${test.base.dir}/${test.junit.rel}" />

        <property name="test.dir"     value="${gluegen.root}/${rootrel.build}/test"/>
        <property name="results"      value="${test.dir}/results" />
        <property name="build_t"      value="${test.dir}/build" />
        <property name="build_t.gen"  value="${build_t}/gensrc"/>
        <property name="build_t.java" value="${build_t}/classes"/>
        <property name="build_t.obj"  value="${build_t}/obj"/>
        <property name="build_t.lib"  value="${build_t}/natives"/>

        <property name="test.junit.rootrel" value="src/junit/${test.junit.rel}" />
        <property name="build_t.gen.rootrel" value="${rootrel.build}/test/build/gensrc"/>

        <mkdir dir="${test.dir}"/>
        <mkdir dir="${results}"/>
        <mkdir dir="${build_t}"/>
        <mkdir dir="${build_t.gen}"/>
        <mkdir dir="${build_t.java}"/>
        <mkdir dir="${build_t.obj}"/>
        <mkdir dir="${build_t.lib}"/>

        <property name="gluegen.jar" value="${gluegen.root}/${rootrel.build}/gluegen.jar" />
        <property name="gluegen-rt.jar" value="${gluegen.root}/${rootrel.build}/gluegen-rt.jar" />
        <property name="gluegen.lib" value="${gluegen.root}/${rootrel.build}/obj" />

        <property name="junit.jar" value="${gluegen.root}/make/lib/junit-4.5.jar" />

        <property name="gluegen-test.jar" value="${build_t}/gluegen-test.jar" />

        <path id="gluegen.classpath">
          <pathelement location="${gluegen.jar}" />
          <pathelement location="${antlr.jar}" />
        </path>

        <path id="gluegen_rt.classpath">
            <pathelement location="${gluegen-rt.jar}" />
        </path>

        <path id="junit.compile.classpath">
            <pathelement location="${junit.jar}" />
            <pathelement location="${gluegen-rt.jar}" />
        </path>

        <path id="junit.run.classpath">
            <pathelement location="${junit.jar}" />
            <pathelement location="${gluegen-rt.jar}" />
            <pathelement location="${gluegen-test.jar}" />
        </path>

        <property name="stub.includes.dir" value="stub_includes" /> <!-- NOTE:  this MUST be relative for FileSet -->

        <echo message="test.base.dir: ${test.base.dir} "/>
        <echo message="test.junit.dir: ${test.junit.dir} "/>
        <echo message="test.dir: ${test.dir} "/>
        <echo message="results: ${results} "/>
        <echo message="build_t: ${build_t} "/>
        <echo message="build_t.gen: ${build_t.gen} "/>
        <echo message="build_t.java: ${build_t.java} "/>
        <echo message="build_t.obj: ${build_t.obj} "/>
        <echo message="build_t.lib: ${build_t.lib} "/>

        <!-- Add the GlueGen and BuildStaticGLInfo tasks to ANT -->
        <taskdef name="gluegen" classname="com.sun.gluegen.ant.GlueGenTask"
                 classpathref="gluegen.classpath" />
        <taskdef name="staticglgen" classname="com.sun.gluegen.ant.StaticGLGenTask"
                 classpathref="gluegen.classpath" />
    </target>

    <target name="java.build" depends="java.generate">
        <echo message=" - - - compiling all java files - - - "/>
        <echo message=" test.base.dir ${test.base.dir}"/>
        <echo message=" build_t.gen     ${build_t.gen}"/>

        <javac destdir="${build_t.java}" 
               source="1.5" debug="true" 
               fork="yes"
               debuglevel="lines,vars,source">
            <classpath refid="junit.compile.classpath"/>
            <src path="${test.base.dir}"/>
            <src path="${build_t.gen}" />
        </javac>

        <jar destfile="${gluegen-test.jar}">
          <fileset dir="${build_t.java}">
            <include name="${test.junit.rel}/**/*.class"/>
          </fileset>
        </jar>
    </target>

    <target name="c.configure" depends="gluegen.cpptasks.detect.os,gluegen.cpptasks.setup.compiler">
        <property name="compiler.cfg.id" value="${compiler.cfg.id.base}" />
        <property name="linker.cfg.id"   value="${linker.cfg.id.base}" />
    </target>

    <target name="rename.mingw.dll" if="isMingW">
        <move file="${src}" tofile="${dest}" />
    </target>

    <target name="rename.dylib" if="isOSX">
        <move file="${src}" tofile="${dest}" />
    </target>

    <macrodef name="c.build">
      <attribute name="c.compiler.src.files" />
      <attribute name="compiler.cfg.id" />
      <attribute name="linker.cfg.id" />
      <attribute name="output.lib.name" />
      <sequential>
        <echo message="Compiling @{output.lib.name}" />
        <echo message="   c.compiler.src.files @{c.compiler.src.files}" />
        <echo message="   compiler.cfg.id @{compiler.cfg.id}" />
        <echo message="   linker.cfg.id @{linker.cfg.id}" />
        <echo message="   output.lib.name @{output.lib.name}" />

        <!-- NOTE: the value of the debug and optimise attributes will not be overridden if already set externally -->
        <property name="c.compiler.debug"     value="false" /> 
        <!-- Optimise flags one of { none, size, speed, minimal, full, aggressive, extreme, unsafe } --> 
        <property name="c.compiler.optimise"  value="none" /> 

        <condition property="c.compiler.use-debug"><istrue value="${c.compiler.debug}"/></condition>

        <cc outtype="shared" 
            objdir="${build_t.obj}" 
            outfile="${build_t.lib}/@{output.lib.name}"
            optimize="${c.compiler.optimise}" 
            debug="${c.compiler.debug}"
            multithreaded="true" 
            exceptions="false" 
            rtti="false">   
  
          <fileset dir="${gluegen.root}"><patternset refid="@{c.compiler.src.files}"/></fileset>
  
          <compiler extends="@{compiler.cfg.id}" >
            <sysincludepath path="${java.includes.dir}"/>
            <sysincludepath path="${java.includes.dir.platform}"/>
            <includepath path="${stub.includes.dir}/common"/>
            <includepath path="${test.junit.dir}/generation"/>
            <includepath path="${build_t.gen}/native"/>
          </compiler>

          <linker extends="@{linker.cfg.id}">
            <syslibset dir="${java.lib.dir.platform}" libs="jawt" if="@{output.lib.name}.useLibJAWT"/>
            <syslibset dir="${java.lib.dir.platform}/server" libs="jvm" if="@{output.lib.name}.useLibJVM"/>
          </linker>
        </cc>

        <!-- FIXME: this is a hack; the cpptask should have an option to change the
             suffix or at least understand the override from dylib to jnilib -->
        <antcall target="rename.dylib" inheritRefs="true">
            <param name="src"  value="${build_t.lib}/lib@{output.lib.name}.dylib" />
            <param name="dest" value="${build_t.lib}/lib@{output.lib.name}.jnilib" />
        </antcall>

        <!-- FIXME: this is a hack; the cpptask should have an option to change the
             suffix or at least understand the override from dylib to jnilib -->
        <antcall target="rename.mingw.dll" inheritRefs="true">
            <param name="src"  value="${build_t.lib}/lib@{output.lib.name}.so" />
            <param name="dest" value="${build_t.lib}/@{output.lib.name}.dll" />
        </antcall>
      </sequential>
    </macrodef>  

    <target name="junit.compile" depends="init, java.generate, java.build, c.build"/>

    <target name="junit.run" depends="init">
        <!-- Perform the junit tests-->
        <mkdir dir="${results}"/>
        <junit forkmode="once" showoutput="true" fork="true">
            <jvmarg value="-Djava.library.path=${gluegen.lib}:${build_t.lib}"/>
            <jvmarg value="-Drootrel.build=${rootrel.build}"/>
            <!--jvmarg value="-Dgluegen.debug.NativeLibrary=true"/-->
            <!--jvmarg value="-Dgluegen.debug.ProcAddressHelper=true"/-->
            <formatter usefile="false" type="plain"/>
            <formatter usefile="true" type="xml"/>
            <classpath refid="junit.run.classpath"/>

            <batchtest todir="${results}">
              <fileset dir="${build_t.java}">
                  <include name="${test.junit.rel}/**/Test*"/>
              </fileset>
              <formatter usefile="false" type="brief"/>
              <formatter usefile="true" type="xml"/>
            </batchtest>
        </junit>
    </target>

    <!-- 

        Hook all junit.test* ..

      -->

    <target name="java.generate" depends="junit.test1.java.generate"/>

    <target name="c.build" depends="c.configure, junit.test1.c.build" unless="build.javaonly" />

    <!-- 

        junit.test1

      -->


    <target name="junit.test1.java.generate">
        <echo message=" - - - junit.test1.java.generate" />

        <dirset id="stub.includes.fileset.test" dir=".">
            <include name="${test.junit.dir}/generation/**"/>
            <include name="${stub.includes.dir}/**" />
        </dirset>

        <gluegen src="${test.junit.dir}/generation/test1-gluegen.c"
                 outputRootDir="${build_t.gen}"
                 config="${test.junit.dir}/generation/test1-gluegen.cfg"
                 literalInclude="${test.junit.dir}/generation"
                 includeRefid="stub.includes.fileset.test"
                 emitter="com.sun.gluegen.JavaEmitter">
            <classpath refid="gluegen.classpath" />
        </gluegen>

        <gluegen src="${test.junit.dir}/generation/test1-gluegen.c"
                 outputRootDir="${build_t.gen}"
                 config="${test.junit.dir}/generation/test1p1-gluegen.cfg"
                 literalInclude="${test.junit.dir}/generation"
                 includeRefid="stub.includes.fileset.test"
                 emitter="com.sun.gluegen.JavaEmitter">
            <classpath refid="gluegen.classpath" />
        </gluegen>

        <gluegen src="${test.junit.dir}/generation/test1-gluegen.c"
                 outputRootDir="${build_t.gen}"
                 config="${test.junit.dir}/generation/test1p2-gluegen.cfg"
                 literalInclude="${test.junit.dir}/generation"
                 includeRefid="stub.includes.fileset.test"
                 emitter="com.sun.gluegen.procaddress.ProcAddressEmitter">
            <classpath refid="gluegen.classpath" />
        </gluegen>
    </target>

    <target name="junit.test1.c.build" depends="junit.test1p1.c.build, junit.test1p2.c.build" unless="build.javaonly" />

    <target name="junit.test1p1.c.build">
        <patternset id="junit.test1p1.c.src.files">
          <include name="${test.junit.rootrel}/generation/test1.c"/>
          <include name="${build_t.gen.rootrel}/native/BindingTest1p1Impl_JNI.c"/>
        </patternset>

        <c.build c.compiler.src.files="junit.test1p1.c.src.files"
                 output.lib.name="test1p1"
                 compiler.cfg.id="${compiler.cfg.id}"
                 linker.cfg.id="${linker.cfg.id}"/>
    </target>

    <target name="junit.test1p2.c.build">
        <patternset id="junit.test1p2.c.src.files">
          <include name="${test.junit.rootrel}/generation/test1.c"/>
          <include name="${build_t.gen.rootrel}/native/BindingTest1p2Impl_JNI.c"/>
        </patternset>

        <c.build c.compiler.src.files="junit.test1p2.c.src.files"
                 output.lib.name="test1p2"
                 compiler.cfg.id="${compiler.cfg.id}"
                 linker.cfg.id="${linker.cfg.id}"/>
    </target>

    <!-- 

        junit.test2

      -->

</project>