<?xml version="1.0" encoding="UTF-8"?>
<!--
   -->
<project name="OculusVR" basedir="." default="all">

    <import file="build-common.xml"/>

    <!-- needed for outofdate task -->
    <taskdef resource="net/sf/antcontrib/antlib.xml">
      <classpath> <pathelement location="${ant-contrib.jar}"/> </classpath>
    </taskdef>

    <!-- ================================================================== -->
    <!-- 
       - Base initialization and detection of operating system.
      -->
    <target name="partitioning.setup" depends="common.init">
        <property name="java.part.oculusvr" 
                  value="com/jogamp/oculusvr/** jogamp/oculusvr/**"/>
        <property name="java.part.oculusvr.exclude" 
                  value="" />
    </target>

    <!-- ================================================================== -->
    <!-- 
       - Declare all paths and user defined variables.
      -->
    <target name="init" depends="declare.common">
        <!-- Create the required output directories. -->
        <mkdir dir="${src.generated.java}" />
        <mkdir dir="${src.generated.c}" />
        <mkdir dir="${classes}" />
        <mkdir dir="${obj.oculusvr}" />
        <mkdir dir="${obj.oculusvrsub}" />
    </target>

    <target name="declare.common" description="Declare properties" depends="partitioning.setup">
        <property name="config.oculusvr"          value="${config}/oculusvr" />

        <property name="rootrel.src.java"         value="src/oculusvr/classes" />
        <property name="rootrel.src.c"            value="src/oculusvr/native" />

        <property name="rootrel.src.generated"    value="${rootrel.build}/oculusvr/gensrc" />
        <property name="rootrel.generated.c"      value="${rootrel.src.generated}/native/oculusvr" />

        <property name="rootrel.oculusvr.sdk"     value="oculusvr-sdk"/>
        <property name="rel.oculusvr.sdk"         value="${project.root}/${rootrel.oculusvr.sdk}"/>

        <!-- The source directories. -->
        <property name="src.java"                 value="${project.root}/${rootrel.src.java}" />
        <property name="src.c"                    value="${project.root}/${rootrel.src.c}" />
        
        <!-- The generated source directories. -->
        <property name="src.generated"            value="${build.oculusvr}/gensrc" />
        <property name="src.generated.java"       value="${src.generated}/classes" />
        <property name="src.generated.c"          value="${src.generated}/native/oculusvr" />
        
        <!-- The compiler output directories. -->
        <property name="classes"                  value="${build.oculusvr}/classes" />
        <property name="obj.oculusvrsub"          value="${obj.oculusvr}" />

        <!-- The OculusVR headers from which Java files are generated -->
        <property name="stub.includes.ovr"        value="${rel.oculusvr.sdk}/LibOVR/Src" />
        <property name="stub.includes.all.ovr"    value="${stub.includes.ovr},${stub.includes.ovr}/CAPI" />

        <echo message="rel.oculusvr.sdk      ${rel.oculusvr.sdk}" />
        <echo message="stub.includes.ovr     ${stub.includes.ovr}" />
        <echo message="stub.includes.all.ovr ${stub.includes.all.ovr}"/>

        <fileset id="stub.includes.dependencies.fileset.1" dir="${stub.includes.ovr}">
            <include name="**" />
        </fileset>
        <!-- echo message="stub.includes.dependencies.fileset.1 ${toString:stub.includes.dependencies.fileset.1}"/ -->
        <fileset id="stub.includes.dependencies.fileset.2" file="${gluegen.jar}" />
        <fileset id="stub.includes.dependencies.fileset.3" dir="${config.oculusvr}">
            <include name="*.cfg" />
            <include name="*.java" />
            <include name="*.c" />
        </fileset>
        
        <!-- The javadoc dirs. -->
        <property name="javadoc" value="${project.root}/javadoc_oculusvr" />
        <property name="javadoc.windowtitle" value="OculusVR API Specification -- Version ${jogamp.version.base}" />
        <property name="javadoc.overview" value="doc/oculusvr/spec-overview.html" />
        <property name="javadoc.packagenames" value="com.jogamp.oculusvr.*" />

        <property name="javadoc.dev.packagenames" value="${javadoc.packagenames},jogamp.opengl.*,com.jogamp.gluegen,com.jogamp.gluegen.runtime" />

        <condition property="c.build.supported">
          <and>
              <or>
                  <isset property="isLinuxX86"/>
                  <isset property="isLinuxAMD64"/>
                  <!-- isset property="isAndroid"/-->
                  <!-- isset property="isWindowsX86"/-->
                  <!-- isset property="isWindowsAMD64"/-->
                  <!-- isset property="isOSX"/-->
              </or>
              <not>
                  <isset property="c.build.oculusvr.skip"/>
              </not>
          </and>
        </condition>
        <echo message="c.build.supported ${c.build.supported}" />
    </target>
    
    <!-- ================================================================== -->
    <!--
       - Check to see whether we need to rebuild the generated sources.
      -->
    <target name="java.generate.check">
        <!-- Blow away all target files if any dependencies are violated
             (the uptodate task doesn't allow arbitrary source and target filesets but should) -->
             <!--
        <dependset>
            <srcfileset refid="stub.includes.dependencies.fileset.1" />
            <srcfileset refid="stub.includes.dependencies.fileset.2" />
            <srcfileset refid="stub.includes.dependencies.fileset.3" />
            <targetfileset dir="${src.generated}">
                <include name="**/*.java" />
                <include name="**/*.c" />
            </targetfileset>
        </dependset>
        -->

        <!-- Now check for the presence of one well-known file -->
        <uptodate property="java.generate.skip.ovr"
                  targetfile="${src.generated.java}/com/jogamp/oculusvr/OVR.java">
            <srcfiles refid="stub.includes.dependencies.fileset.1" />
            <srcfiles refid="stub.includes.dependencies.fileset.2" />
            <srcfiles refid="stub.includes.dependencies.fileset.3" />
        </uptodate>

        <condition property="java.generate.skip">
          <and>
              <isset property="java.generate.skip.ovr"/>
          </and>
        </condition>

        <!--property name="java.generate.skip" value="true"/-->
    </target>

    <target name="java.generate" depends="init, common.gluegen.build, java.generate.check" unless="java.generate.skip">
        <echo message="Generating OVR" />
        <gluegen src="${config.oculusvr}/oculusvr.c"
                 outputRootDir="${build.oculusvr}"
                 config="${config.oculusvr}/oculusvr.cfg"
                 literalInclude="${stub.includes.gluegen.gg},${stub.includes.all.ovr}"
                 emitter="com.jogamp.gluegen.JavaEmitter"
                 debug="false"
                 dumpCPP="false">
            <classpath refid="gluegen.classpath" />
        </gluegen>
        <!--
                 emitter="com.jogamp.gluegen.procaddress.ProcAddressEmitter"
                 -->
    </target>

    <!-- ================================================================== -->

    <target name="java.compile" depends="java.generate">
        <!-- Perform the second pass Java compile; everything except portion of fixed function emulation depending on generated code. -->
        <javac destdir="${classes}"
               fork="yes"
               includeAntRuntime="false"
               memoryMaximumSize="${javac.memorymax}"
               encoding="UTF-8"
               source="${target.sourcelevel}" 
               target="${target.targetlevel}" 
               bootclasspath="${target.rt.jar}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <classpath refid="nativewindow_gluegen.classpath"/>
            <src path="${src.java}" />
            <src path="${src.generated.java}" />
        </javac>
    </target>

    <!-- ================================================================== -->
    <!-- 
       - Compile the native C code for OculusVR
      -->

    <target name="c.configure.1" depends="gluegen.cpptasks.detect.os,gluegen.cpptasks.setup.compiler">
      <!-- compiler configuration -->
      <!-- Note that we can use the base setups in the gluegen-cpptasks for most of these -->

      <compiler id="compiler.cfg.freebsd.oculusvr" extends="compiler.cfg.freebsd">
        <!-- Need to force X11R6 headers on to include path after stub_includes -->
        <includepath path="/usr/local/include" />
      </compiler>

      <compiler id="compiler.cfg.linux.armv6.oculusvr.x11" extends="compiler.cfg.linux.armv6">
        <!-- Need to force /usr/include headers on to include path (after all others), due to crosscompiler usage -->
        <compilerarg value="-idirafter" />
        <compilerarg value="/usr/include" />
      </compiler>

      <!-- linker configuration -->
 
      <linker id="linker.cfg.freebsd.oculusvr.x11" extends="linker.cfg.freebsd">
        <syslibset dir="/usr/local/lib" libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.freebsd.amd64.oculusvr.x11" extends="linker.cfg.freebsd.amd64">
        <syslibset dir="/usr/local/lib" libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.linux.oculusvr.x11" extends="linker.cfg.linux">
        <syslibset libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.linux.x86.oculusvr.x11" extends="linker.cfg.linux.x86">
        <syslibset libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.linux.amd64.oculusvr.x11" extends="linker.cfg.linux.amd64">
        <syslibset libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.linux.armv6.oculusvr.x11" extends="linker.cfg.linux.armv6">
        <syslibset dir="${env.TARGET_PLATFORM_ROOT}/usr/lib" libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.android.oculusvr" extends="linker.cfg.android">
      </linker>

      <linker id="linker.cfg.solaris.oculusvr.x11" extends="linker.cfg.solaris">
        <syslibset libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.solaris.sparcv9.oculusvr.x11" extends="linker.cfg.solaris.sparcv9">
        <linkerarg value="-L/usr/lib/sparcv9"/>
        <syslibset libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.solaris.amd64.oculusvr.x11" extends="linker.cfg.solaris.amd64">
        <linkerarg value="-L/usr/lib/amd64"/>
        <syslibset libs="X11 Xrandr udev m"/>
      </linker>

      <linker id="linker.cfg.win32.mingw.oculusvr" extends="linker.cfg.win32.mingw">
        <linkerarg value="-Wl,--kill-at" />        <!-- remove @ from function names -->
        <syslibset libs="gdi32, kernel32, strmiids, uuid, ole32, oleaut32"/> <!-- last 4 for dshow video input query! -->
      </linker>

      <linker id="linker.cfg.win64.mingw.oculusvr" extends="linker.cfg.win64.mingw">
        <linkerarg value="-Wl,--kill-at" />        <!-- remove @ from function names -->
        <syslibset libs="gdi32, kernel32, strmiids, uuid, ole32, oleaut32"/> <!-- last 4 for dshow video input query! -->
      </linker>

      <linker id="linker.cfg.win32.msvc.oculusvr" extends="linker.cfg.win32.msvc">
        <syslibset libs="user32, kernel32" />
    <!-- This is temporary -->
        <syslibset libs="winmm" />
      </linker>

      <linker id="linker.cfg.macosx.oculusvr" extends="linker.cfg.macosx">
        <linkerarg value="-weak_framework" />
        <linkerarg value="AppKit" />
        <linkerarg value="-weak_framework" />
        <linkerarg value="QuartzCore" />
        <linkerarg value="-weak_framework" />
        <linkerarg value="Cocoa" />
        <!--linkerarg value="-weak_framework" />
        <linkerarg value="OpenGL" /-->
      </linker>

      <linker id="linker.cfg.hpux.oculusvr" extends="linker.cfg.hpux">
        <!-- syslibset dir="/opt/graphics/OpenGL/lib" libs="GL, GLU"/-->
        <syslibset dir="/usr/lib" libs="X11 Xrandr udev m"/>
      </linker>
    </target>

    <target name="c.configure.win32.vc" if="isVCFamily">
      <echo message="Win32.VC" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.win32.msvc" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.win32.msvc.oculusvr" />
    </target>
    
    <target name="c.configure.win32.mingw" if="isMingW32">
      <echo message="Win32.MingW" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.win32.mingw" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.win32.mingw.oculusvr" />
    </target>

    <target name="c.configure.win64.mingw" if="isMingW64">
      <echo message="Win64.MingW" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.win64.mingw" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.win64.mingw.oculusvr" />
    </target>

    <target name="c.configure.linux.x86" if="isLinuxX86">
      <echo message="Linux.x86" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux.x86" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.x86.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.amd64" if="isLinuxAMD64">
      <echo message="Linux.AMD64" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux.amd64" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.amd64.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.armv6" if="isLinuxARMv6">
      <echo message="Linux.armv6" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux.armv6.oculusvr.x11" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.armv6.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.ia64" if="isLinuxIA64">
      <echo message="Linux.IA64" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.hppa" if="isLinuxHppa">
      <echo message="Linux.HPPA" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.mips" if="isLinuxMips">
      <echo message="Linux.MIPS" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.mipsel" if="isLinuxMipsel">
      <echo message="Linux.MIPSEL" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>
    
    <target name="c.configure.linux.ppc" if="isLinuxPpc">
      <echo message="Linux.PPC" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>

    <target name="c.configure.linux.s390" if="isLinuxs390">
      <echo message="Linux.S390" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>

    <target name="c.configure.linux.sparc" if="isLinuxSparc">
      <echo message="Linux.SPARC" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.linux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.linux.oculusvr.x11" />
    </target>

    <target name="c.configure.linux" depends="c.configure.linux.armv6,c.configure.linux.x86,c.configure.linux.amd64,c.configure.linux.ia64,c.configure.linux.hppa,c.configure.linux.mips,c.configure.linux.mipsel,c.configure.linux.ppc,c.configure.linux.s390,c.configure.linux.sparc,c.configure.x11" if="isLinux" />

    <target name="c.configure.android" if="isAndroid">
      <echo message="Android" />
      <property name="compiler.cfg.id"                      value="compiler.cfg.android" />
      <property name="linker.cfg.id.os"                     value="linker.cfg.android.oculusvr" />
    </target>
    
    <target name="c.configure.solaris32" depends="c.configure.x11" if="isSolaris32Bit">
      <echo message="Solaris" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.solaris" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.solaris.oculusvr.x11" />
    </target>
  
 
    <target name="c.configure.solaris.sparcv9" depends="c.configure.x11" if="isSolarisSparcv9">
      <echo message="SolarisSparcv9" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.solaris.sparcv9" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.solaris.sparcv9.oculusvr.x11" />
    </target>
   

    <target name="c.configure.solaris.amd64" depends="c.configure.x11" if="isSolarisAMD64">
      <echo message="SolarisAMD64" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.solaris.amd64" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.solaris.amd64.oculusvr.x11" />
    </target>
   
    <target name="c.configure.freebsd.x86" depends="c.configure.x11" if="isFreeBSDX86">
      <echo message="FreeBSD" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.freebsd.oculusvr" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.freebsd.oculusvr.x11" />
    </target>

    <target name="c.configure.freebsd.amd64" depends="c.configure.x11" if="isFreeBSDAMD64">
      <echo message="FreeBSD" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.freebsd.oculusvr" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.freebsd.amd64.oculusvr.x11" />
    </target>

    <target name="c.configure.freebsd" depends="c.configure.freebsd.x86,c.configure.freebsd.amd64,c.configure.x11" if="isFreeBSD" />

    <target name="c.configure.hpux" depends="c.configure.x11" if="isHPUX">
      <echo message="HP-UX" />
      <property name="compiler.cfg.id"                     value="compiler.cfg.hpux" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.hpux.oculusvr.x11" />
    </target>

    <target name="c.configure.win32" depends="c.configure.win32.vc,c.configure.win32.mingw,c.configure.win64.mingw" if="isWindows" />

    <target name="c.configure.x11" if="isX11" />

    <target name="c.configure.macosx" if="isOSX">
      <property name="compiler.cfg.id"                     value="compiler.cfg.macosx" />
      <property name="linker.cfg.id.os"                    value="linker.cfg.macosx.oculusvr" />
    </target>
    
    <target name="c.configure.2" depends="c.configure.win32,c.configure.linux,c.configure.android,c.configure.solaris32,c.configure.solaris.sparcv9,c.configure.solaris.amd64,c.configure.macosx,c.configure.freebsd,c.configure.hpux" />

    <target name="c.configure" depends="c.configure.1,c.configure.2" />

    <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" />
      <attribute name="c.compiler.use-jawt" default="false"/>
      <sequential>
        <echo message="Output lib name = @{output.lib.name}" />

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

        <patternset id="c.src.files.oculusvr">
            <!--
            $ g++ -print-file-name=libstdc++.a
            /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.a
            <include name="/usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.a"/>
             -->
            <include name="${rootrel.generated.c}/OVR_JNI.c"/>
            <include name="${rootrel.src.c}/OVRImplMisc.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_CAPI.cpp"/>
            <!-- include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/CAPI_DistortionRenderer.cpp"/-->
            <!-- include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/GL/CAPI_GL_DistortionRenderer.cpp"/-->
            <!-- include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/GL/CAPI_GL_Util.cpp"/-->
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/CAPI_FrameTimeManager.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/CAPI_GlobalState.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/CAPI_HMDRenderState.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/CAPI/CAPI_HMDState.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_DeviceHandle.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_DeviceImpl.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_JSON.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_LatencyTestImpl.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Profile.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Linux_SensorDevice.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_SensorCalibration.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_SensorFilter.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_SensorFusion.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_SensorImpl.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Sensor2Impl.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_SensorImpl_Common.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_SensorTimeFilter.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Stereo.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_ThreadCommandQueue.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Alg.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Allocator.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Atomic.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_File.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_FileFILE.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Log.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Math.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Recording.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_RefCount.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Std.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_String.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_String_FormatUtil.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_String_PathUtil.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_SysFile.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_System.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_Timer.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_UTF8Util.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Util/Util_LatencyTest.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Util/Util_LatencyTest2.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Util/Util_Render_Stereo.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/Kernel/OVR_ThreadsPthread.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Linux_HIDDevice.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Linux_SensorDevice.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Linux_DeviceManager.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/LibOVR/Src/OVR_Linux_HMDDevice.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/3rdParty/TinyXml/tinyxml2.cpp"/>
            <include name="${rootrel.oculusvr.sdk}/3rdParty/EDID/edid.cpp"/>
        </patternset>

        <echo message="Compiling @{output.lib.name}" />

      	<!-- have to wrap cc task with outofdate, because otherwise cc links a new library
      	     even when no files have been compiled -->
        <outofdate>
          <sourcefiles>
            <fileset dir="${project.root}"><patternset refid="@{c.compiler.src.files}"/></fileset>
          </sourcefiles>
          <targetfiles>
            <fileset dir="${obj.oculusvr}" includes="lib@{output.lib.name}.so"/>
            <fileset dir="${obj.oculusvr}" includes="@{output.lib.name}.dll"/>
            <fileset dir="${obj.oculusvr}" includes="lib@{output.lib.name}.jnilib"/>
          </targetfiles>
          <sequential>
            <cc outtype="shared" 
                objdir="${obj.oculusvrsub}" 
                outfile="${obj.oculusvr}/@{output.lib.name}"
                optimize="${c.compiler.optimise}" 
                debug="${c.compiler.debug}"
                multithreaded="true" 
                exceptions="false" 
                rtti="false">   
      
              <fileset dir="${project.root}">
                <patternset refid="@{c.compiler.src.files}"/>
              </fileset>
      
              <compiler extends="@{compiler.cfg.id}" >
                <sysincludepath path="${java.includes.dir}"/>
                <sysincludepath path="${java.includes.dir.platform}"/>
                <sysincludepath path="${stub.includes.gluegen.cc}"/>
                <includepath path="${stub.includes.ovr}"/>
                <includepath path="${stub.includes.ovr}/CAPI"/>
      
                <!-- This is for the generated headers for handwritten C code -->
                <includepath path="${src.c}"/>
                <includepath path="${src.generated.c}" />

                <compilerarg value="-fno-rtti"/>
              </compiler>

              <linker extends="@{linker.cfg.id}">
                <linkerarg value="-Wl,-Bstatic" if="isGCC"/>
                <!-- linkerarg value="-Wl,-whole-archive" if="isGCC"/-->
                <linkerarg value="-Wl,--undefined=__cxa_pure_virtual" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=__cxa_guard_release" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=__cxa_guard_abort" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=__cxa_guard_acquire" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=__gxx_personality_v0" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=_ZdaPv" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=_Znwm" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=_Znam" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=_Znaj" if="isGCC"/>
                <linkerarg value="-Wl,--undefined=_Znwj" if="isGCC"/>
                <linkerarg value="-lstdc++" />
                <!-- linkerarg value="-Wl,-no-whole-archive" if="isGCC"/-->
                <linkerarg value="-Wl,-Bdynamic" if="isGCC"/>
                <!-- syslibset libs="stdc++"/ -->
              </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="${obj.oculusvr}/lib@{output.lib.name}.dylib" />
                <param name="dest" value="${obj.oculusvr}/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="${obj.oculusvr}/lib@{output.lib.name}.so" />
                <param name="dest" value="${obj.oculusvr}/@{output.lib.name}.dll" />
            </antcall>

            <!-- this stripping may be called more than once on the same library dir,
                 but that should cause no harm, and doing it here inside outofdate
                 prevents the JARs from always being rebuilt even if no source code changes -->
            <antcall target="gluegen.cpptasks.striplibs" inheritRefs="true">
                <param name="libdir" value="${obj.oculusvr}"/>
            </antcall>

          </sequential>
        </outofdate>
      </sequential>
    </macrodef>  

    <target name="c.build" depends="c.configure" if="c.build.supported">
      <c.build c.compiler.src.files="c.src.files.oculusvr"
               output.lib.name="oculusvr"
               compiler.cfg.id="${compiler.cfg.id}"
               linker.cfg.id="${linker.cfg.id.os}"/>
    </target>

    <!-- ================================================================== -->
    <!--
       - Build the oculusvr.jar files.
      -->
    <target name="build-jars-dependset" depends="init,gluegen.cpptasks.detect.os" >
        <dependset>
            <srcfileset dir="${src.java}"/>
            <targetfileset dir="." includes="${build.oculusvr}/oculusvr.jar" />
        </dependset>
    </target>
    <target name="build-jars" depends="build-jars-dependset,build-jars-javase" />

    <target name="setup-manifestfile" depends="common.init">
        <property name="manifestfile" value="oculusvrversion"/>
        <copy file="${manifestfile}"
            tofile="${build.oculusvr}/manifest.mf"
            overwrite="true">
            <filterset>
                <filter token="VERSION" value="${jogamp.version}"/>
                <filter token="BUILD_VERSION" value="${jogl.version}"/>
                <filter token="SCM_BRANCH" value="${jogl.build.branch}"/>
                <filter token="SCM_COMMIT" value="${jogl.build.commit}"/>
                <filter token="BASEVERSION" value="${jogamp.version.base}"/>
                <filter token="JAR_CODEBASE_TAG" value="${jogamp.jar.codebase}"/>
            </filterset>
        </copy>
    </target>

    <target name="build-jars-javase" depends="setup-manifestfile">
        <jar manifest="${build.oculusvr}/manifest.mf" destfile="${build.oculusvr}/oculusvr.jar" filesonly="true">
            <fileset dir="${classes}"
                     includes="${java.part.oculusvr}"
                     excludes="${java.part.oculusvr.exclude}"/>
        </jar>
        <jar manifest="${build.oculusvr}/manifest.mf" destfile="${build.oculusvr}/oculusvr-natives-${os.and.arch}.jar" filesonly="true">
            <fileset dir="${obj.oculusvr}">
              <include name="*oculusvr.${native.library.suffix}" />
            </fileset>
        </jar>
    </target>

    <!-- ================================================================== -->
    <!--
       - Build the Javadocs for the sources.
       - NOTE:  these are not entirely correct as the javadocs targets depend 
       -        on the platform specific build targets.  To circumvent any 
       -        errors, ensure that the source is built first.
      -->
    <target name="javadoc" depends="init">
        <javadoc packagenames="${javadoc.packagenames}"
                 sourcepath="${src.java};${src.generated.java}"        
                 destdir="${javadoc}" windowtitle="${javadoc.windowtitle}"
                 overview="${javadoc.overview}" 
                 encoding="UTF-8"
                 source="${target.sourcelevel}"
                 maxmemory="${javac.memorymax}"
                 linkoffline="${javadoc.link} 142-packages"
                 bottom="" >
          <classpath refid="nativewindow_gluegen.classpath"/>
          <taglet name="net.highteq.nativetaglet.NativeTaglet" path="${gluegen.jar}" />
        </javadoc>
    </target>

    <!-- ================================================================== -->
    <!--
       - Clean up all that is built.
      -->
    <target name="clean" description="Remove all build products" depends="declare.common">
        <delete includeEmptyDirs="true" quiet="true">
            <fileset dir="${build.oculusvr}" />
            <fileset dir="${javadoc}" />
        </delete>
    </target>

    <!-- ================================================================== -->
    <!--
       - Build everything.
      -->
    <target name="all" description="Build OculusVR JAR file(s) and native libraries." depends="init,java.compile,c.build,build-jars,generate.version.txt" />

    <target name="generate.version.txt" depends="init">
        <!-- Create a version.txt file indicating which version we just built -->
        <echo message="${oculusvr.version}" file="${build.oculusvr}/version.txt" />
    </target>

</project>