<?xml version="1.0" encoding="UTF-8"?>
<!--
   - Ant build for the NativeWindow package.  This build has been tested with ANT 1.7.0.  The
   - optional.jar that contains the optional ANT tasks must be in the ANT
   - classpath (typically the ant/lib directory).
   -
   - A clean download of the NativeWindow sources is required for this build.
   -
   - This build has no dependence on environment variables; the needed
   - ones (e.g. java.home, ANT_HOME) are all set by the Ant wrapper shell
   - script, by the virtual machine, or elsewhere. However, on all platforms,
   - the C compiler and linker should be in the path. All other paths that
   - need to be set are in host.properties.
   -
   - NOTE:  because the GlueGen config files have their own relative paths
   -        which cannot be overridden by GlueGen, GlueGen MUST be run from
   -        the "make" directory. This also means that this build.xml MUST
   -        be run from the "make" directory.
   -
   - Public targets:
   -   all: (default; autodetects OS and chooses C compiler from gluegen.properties)
   -   clean:        clean all built
   -   javadoc:      create the standard developer Javadoc (recommended)
   -                 (Note: should build all first - may be dependence in the future)
   -   javadoc.spec: create the standard developer Javadoc but exclude com.jogamp.* classes
   -   javadoc.dev:  create the internal developer Javadoc.  This includes the
   -                       Java and C file generators. Note that it is only supported
   -                       to create the Javadoc for the platform on which you are
   -                       currently running.
   - 
   - Note: on Windows the "win32.c.compiler" property in gluegen.properties
   - is required to select the appropriate C compiler. See the example
   - gluegen.properties in the gluegen workspace for valid values. On Mac OS X
   - universal binaries may also be built by setting the "macosxfat"
   - property in gluegen.properties; again see the example file in this
   - directory.
   -   
   - Thanks to Rob Grzywinski and Artur Biesiadowski for the bulk of the
   - ANT build, including the GlueGen tasks, the building of
   - the Java generated sources, the first and second phase Java compiles, and
   - the building of the jar file. Thanks to Alex Radeski for the bulk of the
   - port to the ant-contrib CPPTask framework. Thanks to Athomas Goldberg for
   - the original OS detection code.
   -
   - Some environment defs affecting compilation

   - setup.nodesktop is set iff:
        !isWindows && !isOSX && !isX11

   - Internal settings, may not be necessary to set them manually,
     since all JAR archives are orthogonal.
       setup.noAWT
   -->
<project name="NativeWindow" basedir="." default="all">

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

    <!-- ================================================================== -->
    <!-- 
       - Base initialization and detection of operating system.
      -->
    <target name="base.init" depends="common.init">

        <condition property="setup.noNativeAWT">
            <or>
                <isset property="setup.noAWT"/> 
                <isset property="setup.nodesktop"/> 
            </or>
        </condition>

        <echo message="setup.noNativeAWT: ${setup.noNativeAWT}" />

        <!-- partitioning -->

        <property name="java.part.core"
                  value="javax/media/nativewindow/*, javax/media/nativewindow/util/*, javax/media/nativewindow/egl/*, javax/media/nativewindow/macosx/*, javax/media/nativewindow/windows/*, com/jogamp/nativewindow/*, com/jogamp/nativewindow/impl/*, com/jogamp/nativewindow/impl/jvm/*"/>

        <property name="java.part.awt"
                  value="javax/media/nativewindow/awt/*, com/jogamp/nativewindow/impl/jawt/**, com/jogamp/nativewindow/impl/**/awt/**"/>

        <property name="java.part.x11"
                  value="com/jogamp/nativewindow/impl/x11/** javax/media/nativewindow/x11/*" />

        <property name="java.part.windows"
                  value="com/jogamp/nativewindow/impl/windows/** javax/media/nativewindow/windows/*" />

        <!-- condition excludes -->

        <condition property="java.excludes.awt"
                   value="${java.part.awt}">
           <isset property="setup.noAWT"/> 
        </condition>

        <property name="java.excludes.all" value="${java.excludes.awt}" />
        <echo message="java.excludes.all: ${java.excludes.all}" />
    </target>


    <!-- ================================================================== -->
    <!-- 
       - Declare all paths and user defined variables.
      -->
    <target name="declare.common" description="Declare properties" depends="base.init">

        <property name="config.nativewindow" value="${config}/nativewindow" />

        <property name="rootrel.src" value="src/nativewindow" />
        <property name="rootrel.src.java" value="${rootrel.src}/classes" />
        <property name="rootrel.src.c" value="${rootrel.src}/native" />

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

        <!-- 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.nativewindow}/gensrc" />
        <property name="src.generated.java" value="${src.generated}/classes" />
        <property name="src.generated.java-cdc" value="${src.generated}/classes-cdc" />
        <property name="src.generated.c" value="${src.generated}/native" />
        
        <!-- The compiler output directories. -->
        <property name="classes" value="${build.nativewindow}/classes" />
        <property name="classes-cdc" value="${build.nativewindow}/classes-cdc" />

        <!-- The headers from which Java files are generated -->
        <dirset id="stub.includes.fileset.all" dir=".">
            <include name="${stub.includes}/macosx/**" />
            <include name="${stub.includes}/win32/**" />
            <include name="${stub.includes}/x11/**" />
            <include name="${stub.includes}/gluegen/**" />
            <include name="${stub.includes}/khr/**" />
            <include name="${stub.includes}/jni/**" />
        </dirset>
        <fileset id="stub.includes.dependencies.fileset.1" dir="${stub.includes}">
            <include name="macosx/**" />
            <include name="win32/**" />
            <include name="x11/**" />
            <include name="common/**" />
            <include name="jni/**" />
        </fileset>
        <fileset id="stub.includes.dependencies.fileset.2" file="${gluegen.jar}" />
        <fileset id="stub.includes.dependencies.fileset.3" dir="${config.nativewindow}">
            <include name="*.cfg" />
            <include name="*.java" />
            <include name="*.c" />
        </fileset>

        <!-- The javadoc dirs. -->
        <property name="javadoc" value="${project.root}/javadoc_nativewindow_public" />
        <property name="javadoc.spec" value="${project.root}/javadoc_nativewindow_spec" />
        <property name="javadoc.dev" value="${project.root}/javadoc_nativewindow_dev" />
        <property name="javadoc.link" value="http://java.sun.com/j2se/1.4.2/docs/api/" />
        <property name="javadoc.windowtitle" value="Native Windowing Interface (NativeWindow) API -- ${nativewindow_base_version} Specification" />
        <property name="javadoc.overview" value="../src/nativewindow/classes/javax/media/nativewindow/package.html" />
        <property name="javadoc.spec.packagenames" value="javax.media.nativewindow.*" />

        <property name="javadoc.packagenames" value="${javadoc.spec.packagenames}" />

        <property name="javadoc.dev.packagenames" value="${javadoc.packagenames},com.jogamp.nativewindow.util.*,com.jogamp.nativewindow.impl.*,com.jogamp.gluegen,com.jogamp.gluegen.runtime" />
    <property name="javadoc.bottom" value="Copyright 2005 Sun Microsystems, Inc. All rights reserved. Use is subject to &lt;a href=&quot;http://jcp.org/en/jsr/detail?id=231&quot;&gt;license terms&lt;/a&gt;." />
    </target>
    
    <!-- ================================================================== -->
    <!-- 
       - Initialize all parameters required for the build and create any
       - required directories.
      -->
    <target name="init" depends="declare.common">
        <!-- Create the required output directories. -->
        <mkdir dir="${src.generated.java}" />
        <mkdir dir="${src.generated.java-cdc}" />
        <mkdir dir="${src.generated.c}" />
        <mkdir dir="${src.generated.c}/MacOSX" />
        <mkdir dir="${src.generated.c}/Windows" />
        <mkdir dir="${src.generated.c}/X11" />
        <mkdir dir="${classes}" />
        <mkdir dir="${classes-cdc}" />
        <mkdir dir="${obj.nativewindow}" />
    </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.x11windowlib"
                  targetfile="${src.generated.java}/com/jogamp/nativewindow/impl/x11/X11Lib.java">
            <srcfiles refid="stub.includes.dependencies.fileset.1" />
            <srcfiles refid="stub.includes.dependencies.fileset.2" />
            <srcfiles refid="stub.includes.dependencies.fileset.3" />
        </uptodate>
        <uptodate property="java.generate.skip.jawt"
                  targetfile="${src.generated.java}/com/jogamp/nativewindow/impl/jawt/JAWT.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.x11windowlib"/>
              <isset property="java.generate.skip.jawt"/>
          </and>
        </condition>

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

    <target name="java.generate.windowlib" if="windowlib.os.cfg">
        <echo message="Generating Windowing Lib implementation class" />
        <gluegen src="${stub.includes}/${window.os.system}/window-lib.c"
                 outputRootDir="${build.nativewindow}"
                 config="${windowlib.os.cfg}"
                 includeRefid="stub.includes.fileset.platform"
                 emitter="com.jogamp.gluegen.JavaEmitter">
            <classpath refid="gluegen.classpath" />
        </gluegen>
        <copy todir="${src.generated.java-cdc}">
            <fileset dir="${src.generated.java}"
                     includes="com/jogamp/nativewindow/impl/x11/** com/jogamp/nativewindow/impl/windows/**" />
        </copy>
    </target>

    <target name="java.generate.jawt" unless="setup.noAWT">
        <!-- NOTE:  the "literalInclude" in this GlueGen call is simply to
           -        get around the fact that neither FileSet nor DirSet can
           -        handle different drives in an effective manner. -->
        <echo message="Generating JAWT interface class" />
        <echo message="java.home.dir=${java.home.dir}" />
        <gluegen src="${jawt.platform.header}"
                 outputRootDir="${build.nativewindow}"
                 config="${jawt.cfg}"
                 literalInclude="${stub.includes}/jni"
                 includeRefid="stub.includes.fileset.platform"
                 emitter="com.jogamp.gluegen.JavaEmitter">
            <classpath refid="gluegen.classpath" />
        </gluegen>
        <copy todir="${src.generated.java-cdc}">
            <fileset dir="${src.generated.java}"
                     includes="com/jogamp/nativewindow/impl/jawt/**" />
        </copy>
    </target>

    <target name="java.generate.platforms" >
        <echo message="Generating platform-specifics: os: ${window.os.system}, cfgs: ${windowlib.os.cfg}, ${jawt.cfg}" />
        <dirset id="stub.includes.fileset.platform" dir="." includes="${stub.includes}/${window.os.system}/** ${stub.includes}/gluegen/** ${stub.includes}/khr/**" />
        <antcall target="java.generate.windowlib" inheritRefs="true" />
        <antcall target="java.generate.jawt" inheritRefs="true" />
    </target>

    <!--
       - Setup the generating ANT tasks and use it to generate the Java files 
       - from the C GL headers.  This involves setting the taskdef and creating
       - the classpath reference id then running the task on each header.
      -->
    <target name="java.generate" depends="init, common.gluegen.build, java.generate.check" unless="java.generate.skip">

        <!-- Add the GlueGen task to ANT -->
        <taskdef name="gluegen" classname="com.jogamp.gluegen.ant.GlueGenTask"
                 classpathref="gluegen.classpath" />
                 
        <!-- Use the GlueGen task to generate the Java files -->

        <echo message="Generating platform-specifics: X11" />
        <antcall target="java.generate.platforms" inheritRefs="true">
            <param name="window.os.system"                       value="x11"/>
            <param name="windowlib.os.cfg"                       value="${config.nativewindow}/x11-lib.cfg" />
            <param name="jawt.cfg"                               value="${config.nativewindow}/jawt-x11.cfg" />
            <param name="jawt.platform.header"                   value="${stub.includes}/jni/x11/jawt_md.h" />
        </antcall>

        <echo message="Generating platform-specifics: Win32" />
        <antcall target="java.generate.platforms" inheritRefs="true">
            <param name="window.os.system"                       value="win32"/>
            <param name="windowlib.os.cfg"                       value="${config.nativewindow}/win32-lib.cfg" />
            <param name="jawt.cfg"                               value="${config.nativewindow}/jawt-win32.cfg" />
            <param name="jawt.platform.header"                   value="${stub.includes}/jni/win32/jawt_md.h" />
        </antcall>          

        <echo message="Generating platform-specifics: MaxOsX" />
        <antcall target="java.generate.platforms" inheritRefs="true">
          <param name="window.os.system"                     value="macosx"/>
          <param name="jawt.cfg"                             value="${config.nativewindow}/jawt-macosx.cfg" />
          <param name="jawt.platform.header"                 value="${stub.includes}/jni/macosx/jawt_md.h" />
        </antcall>
    
        <!-- Inform the user that the generators have successfully created 
           - the necessary Java files -->
        <echo message="" />
        <echo message="GlueGen has successfully generated files." />
    
    </target>      

    <!-- ================================================================== -->
    <!-- 
       - Compile the original and generated source.  The composable pipelines
       - will be generated.
      -->
    <target name="java.compile.javacdc" depends="java.generate" unless="setup.noCDC">
        <!-- Perform the first pass Java compile; everything -->
        <javac destdir="${classes-cdc}"
               excludes="${java.part.awt} ${java.excludes.all}"
               source="${target.sourcelevel}"
               classpath="${gluegen-rt.cdc.jar}"
               bootclasspath="${javac.bootclasspath-cdc.jar}"
               fork="yes"
               includeAntRuntime="false"
               memoryMaximumSize="${javac.memorymax}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <src path="${src.java}" />
            <src path="${src.generated.java-cdc}" />
        </javac>
    </target>

    <target name="java.compile.javase" depends="java.generate">
        <!-- Perform the second pass Java compile; everything. -->
        <javac destdir="${classes}"
               excludes="${java.excludes.all}"
               source="${target.sourcelevel}"
               classpath="${gluegen-rt.jar}"
               fork="yes"
               includeAntRuntime="false"
               memoryMaximumSize="${javac.memorymax}"
               debug="${javacdebug}" debuglevel="${javacdebuglevel}">
            <src path="${src.java}" />
            <src path="${src.generated.java}" />
        </javac>
    </target>

    <target name="java.compile" depends="java.compile.javase,java.compile.javacdc" />

    <!-- ================================================================== -->
    <!-- 
       - Compile the native C code for JOGL (and optionally the Cg binding).
      -->

    <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.nativewindow" extends="compiler.cfg.freebsd">
        <!-- Need to force X11R6 headers on to include path after stub_includes -->
        <includepath path="/usr/local/include" />
      </compiler>

      <!-- linker configuration -->

      <linker id="linker.cfg.freebsd.nativewindow.x11" extends="linker.cfg.freebsd">
        <syslibset dir="/usr/local/lib" libs="X11"/>
        <syslibset dir="/usr/local/lib" libs="Xxf86vm" />
        <syslibset dir="/usr/local/lib" libs="Xinerama"/>
      </linker>

      <linker id="linker.cfg.freebsd.amd64.nativewindow.x11" extends="linker.cfg.freebsd.amd64">
        <syslibset dir="/usr/local/lib" libs="X11" />
        <syslibset dir="/usr/local/lib" libs="Xxf86vm" />
        <syslibset dir="/usr/local/lib" libs="Xinerama"/>
      </linker>

      <linker id="linker.cfg.linux.nativewindow.x11" extends="linker.cfg.linux">
        <syslibset libs="X11"/>
        <syslibset libs="Xxf86vm" />
        <syslibset libs="Xinerama"/>
      </linker>

      <linker id="linker.cfg.linux.amd64.nativewindow.x11" extends="linker.cfg.linux.amd64">
        <syslibset libs="X11"/>
        <syslibset libs="Xxf86vm" />
        <syslibset libs="Xinerama"/>
      </linker>

      <linker id="linker.cfg.solaris.nativewindow.x11" extends="linker.cfg.solaris">
        <syslibset libs="X11"/>
      </linker>

      <linker id="linker.cfg.solaris.sparcv9.nativewindow.x11" extends="linker.cfg.solaris.sparcv9">
        <syslibset dir="/usr/lib/sparcv9" libs="X11"/>
      </linker>

      <linker id="linker.cfg.solaris.amd64.nativewindow.x11" extends="linker.cfg.solaris.amd64">
        <syslibset dir="/usr/lib/amd64" libs="X11"/>
      </linker>

      <linker id="linker.cfg.win32.mingw.nativewindow" extends="linker.cfg.win32.mingw">
        <linkerarg value="-Wl,--kill-at" />        <!-- remove @ from function names -->
        <syslibset libs="gdi32, kernel32"/>
      </linker>

      <linker id="linker.cfg.win64.mingw.nativewindow" extends="linker.cfg.win64.mingw">
        <linkerarg value="-Wl,--kill-at" />        <!-- remove @ from function names -->
        <syslibset libs="gdi32, kernel32"/>
      </linker>

      <linker id="linker.cfg.win32.msvc.nativewindow" extends="linker.cfg.win32.msvc">
        <syslibset libs="gdi32, user32, kernel32" />
      </linker>
      
      <linker id="linker.cfg.macosx.nativewindow" extends="linker.cfg.macosx">
        <linkerarg value="-framework" />
        <linkerarg value="Cocoa" />
      </linker>

      <linker id="linker.cfg.hpux.nativewindow" extends="linker.cfg.hpux">
        <syslibset dir="/usr/lib" libs="X11"/>
        <syslibset dir="/usr/lib" libs="Xinerama"/>
      </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.oswin"                  value="linker.cfg.win32.msvc.nativewindow" />
    </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.oswin"                  value="linker.cfg.win32.mingw.nativewindow" />
    </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.oswin"                  value="linker.cfg.win64.mingw.nativewindow" />
    </target>

    <target name="c.configure.linux.x86" if="isLinuxX86">
      <echo message="Linux.x86" />
      <property name="compiler.cfg.id"                      value="compiler.cfg.linux" />
      <property name="linker.cfg.id.oswin"                  value="linker.cfg.linux.nativewindow.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.oswin"                  value="linker.cfg.linux.amd64.nativewindow.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.oswin"                  value="linker.cfg.linux.nativewindow.x11" />
    </target>

    <target name="c.configure.linux" depends="c.configure.linux.x86,c.configure.linux.amd64,c.configure.linux.ia64,c.configure.x11" if="isLinux" />

    <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.oswin"                  value="linker.cfg.solaris.nativewindow.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.oswin"                  value="linker.cfg.solaris.sparcv9.nativewindow.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.oswin"                  value="linker.cfg.solaris.amd64.nativewindow.x11" />
    </target>
   
    <target name="c.configure.freebsd.x86" if="isFreeBSDX86">
      <echo message="FreeBSD.x86" />
      <property name="compiler.cfg.id"                      value="compiler.cfg.freebsd.nativewindow" />
      <property name="linker.cfg.id.oswin"                  value="linker.cfg.freebsd.nativewindow.x11" />
    </target>
    
    <target name="c.configure.freebsd.amd64" if="isFreeBSDAMD64">
      <echo message="FreeBSD.AMD64" />
      <property name="compiler.cfg.id"                      value="compiler.cfg.freebsd.nativewindow" />
      <property name="linker.cfg.id.oswin"                  value="linker.cfg.freebsd.amd64.nativewindow.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.oswin"                  value="linker.cfg.hpux.nativewindow.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.oswin"                  value="linker.cfg.macosx.nativewindow" />
    </target>
    
    <target name="c.configure.2" depends="c.configure.win32,c.configure.linux,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}" />
        <copy file="${dest}" tofile="${dest-cdc}" />
    </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}" />

        <!-- 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>

        <!-- since properties are immutable, we need one for each target -->
        <condition property="@{output.lib.name}.useLibJAWT">
            <istrue value="@{c.compiler.use-jawt}" />
        </condition>
        <echo message="c.compiler.use-jawt @{c.compiler.use-jawt}"/>
        <echo message="@{output.lib.name}.useLibJAWT ${@{output.lib.name}.useLibJAWT}"/>

        <condition property="@{output.lib.name}.useLibJVM">
          <and>
            <isset property="isHPUX"/>
            <isset property="@{output.lib.name}.useLibJAWT"/>
          </and>
        </condition> 

        <patternset id="c.src.files.awt">
          <include name="${rootrel.src.c}/JAWT*.c"/>
          <include name="${rootrel.generated.c}/X11/JAWT*.c" if="isX11"/>
          <include name="${rootrel.generated.c}/MacOSX/JAWT*.c" if="isOSX"/>
          <include name="${rootrel.generated.c}/Windows/JAWT*.c" if="isWindows"/>
        </patternset>

        <patternset id="c.src.files.x11">
          <include name="${rootrel.generated.c}/X11/X11*.c"/>
          <include name="${rootrel.src.c}/x11/Xmisc.c"/>
          <include name="${rootrel.src.c}/x11/XineramaHelper.c"/>
          <include name="${rootrel.src.c}/NativewindowCommon.c"/>
        </patternset>

        <patternset id="c.src.files.windows">
          <include name="${rootrel.generated.c}/Windows/GDI*.c"/>
          <include name="${rootrel.src.c}/windows/GDImisc.c"/>
          <include name="${rootrel.src.c}/NativewindowCommon.c"/>
        </patternset>

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

        <cc outtype="shared" 
            objdir="${obj.nativewindow}" 
            outfile="${obj.nativewindow}/@{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}"/>
            <!-- This is for the generated headers for handwritten C code -->
            <includepath path="${src.generated.c}" />
            <includepath path="${src.generated.c}/X11" if="isX11"/>
            <includepath path="${src.generated.c}/MacOSX" if="isOSX"/>
            <includepath path="${src.generated.c}/Windows" if="isWindows"/>
            <includepath path="${src.c}"/>
  
            <!-- This must come last to not override real include paths -->
            <!-- includepath path="stub_includes/macosx" if="isOSX" / -->
          </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.nativewindow}/obj/lib@{output.lib.name}.dylib" />
            <param name="dest" value="${build.nativewindow}/obj/lib@{output.lib.name}.jnilib" />
            <param name="dest-cdc" value="${build.nativewindow}/obj/lib@{output.lib.name}.so" />
        </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.nativewindow}/obj/lib@{output.lib.name}.so" />
            <param name="dest" value="${build.nativewindow}/obj/@{output.lib.name}.dll" />
        </antcall>
      </sequential>
    </macrodef>  

    <target name="c.fixup.jawt.version.macosx" if="isOSX" unless="setup.noNativeAWT">
      <!-- Edit the link to the JAWT version in the resulting jnilib
           file; this isn't strictly needed but seems to allow the
           universal binaries to work on 10.3 machines as well, which
           is desirable for some end users -->
      <apply executable="install_name_tool">
        <arg value="-change" />
        <arg value="/System/Library/Frameworks/JavaVM.framework/Versions/1.5.0/Libraries/libjawt.dylib" />
        <arg value="/System/Library/Frameworks/JavaVM.framework/Libraries/libjawt.dylib" />
        <srcfile />
        <fileset dir="${obj.nativewindow}" includes="libnativewindow_awt.jnilib" />
      </apply>
    </target>

    <target name="c.build.nativewindow.awt" unless="setup.noNativeAWT">
      <c.build c.compiler.src.files="c.src.files.awt"
               c.compiler.use-jawt="true"
               output.lib.name="nativewindow_awt"
               compiler.cfg.id="${compiler.cfg.id}"
               linker.cfg.id="${linker.cfg.id.oswin}"/>
    </target>

    <target name="c.build.nativewindow.windowlib.x11" if="isX11">
      <javah destdir="${src.generated.c}/X11" classpath="${classes}" class="com.jogamp.nativewindow.impl.x11.X11Lib" />

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

    <target name="c.build.nativewindow.windowlib.windows" if="isWindows">
      <javah destdir="${src.generated.c}/Windows" classpath="${classes}" class="com.jogamp.nativewindow.impl.windows.GDI" />

      <c.build c.compiler.src.files="c.src.files.windows"
               output.lib.name="nativewindow_win32"
               compiler.cfg.id="${compiler.cfg.id}"
               linker.cfg.id="${linker.cfg.id.oswin}"/>
    </target>
    <target name="c.build.nativewindow.windowlib" depends="c.build.nativewindow.windowlib.x11, c.build.nativewindow.windowlib.windows"/>

    <target name="c.manifest" if="isVC8Family">
      <!-- exec mt, the Microsoft Manifest Tool, to include DLL manifests in order to resolve the location of msvcr80.dll -->
      <msvc.manifest objdir="${obj.nativewindow}" dllname="nativewindow_awt" />
      <msvc.manifest objdir="${obj.nativewindow}" dllname="nativewindow_win32" />
    </target>

    <target name="c.build.nativewindow" depends="c.configure,c.build.nativewindow.windowlib,c.build.nativewindow.awt">
      <antcall target="gluegen.cpptasks.striplibs" inheritRefs="true">
          <param name="libdir" value="${obj.nativewindow}"/>
      </antcall>

      <antcall target="c.fixup.jawt.version.macosx" inheritrefs="true" />
      <antcall target="c.manifest" inheritRefs="true" />
    </target>

    <!-- ================================================================== -->
    <!--
       - Build the nativewindow.jar files.
      -->
    <target name="build-jars" depends="gluegen.cpptasks.detect.os,build-jars-javase,build-jars-cdc" />

    <target name="setup-manifestfile">
        <property name="manifestfile" value="nativewindowversion"/>
        <copy file="${manifestfile}"
          tofile="tempversion"
          overwrite="true">
          <filterset>
              <filter token="VERSION" value="${nativewindow.version}"/>
              <filter token="SCM_BRANCH" value="${jogl.build.branch}"/>
              <filter token="SCM_COMMIT" value="${jogl.build.commit}"/>
              <filter token="BASEVERSION" value="${nativewindow_base_version}"/>
          </filterset>
        </copy>
    </target>

    <target name="setup-manifestfile-cdc">
        <property name="manifestfile" value="nativewindowversion-cdc"/>
        <copy file="${manifestfile}"
          tofile="tempversion-cdc"
          overwrite="true">
          <filterset>
              <filter token="VERSION" value="${nativewindow.version}"/>
              <filter token="SCM_BRANCH" value="${jogl.build.branch}"/>
              <filter token="SCM_COMMIT" value="${jogl.build.commit}"/>
              <filter token="BASEVERSION" value="${nativewindow_base_version}"/>
          </filterset>
        </copy>
    </target>

    <target name="build-jars-awt" depends="setup-manifestfile" unless="setup.noAWT">
        <jar manifest="tempversion" destfile="${nativewindow.awt.jar}" filesonly="true">
            <fileset dir="${classes}"
                     includes="${java.part.awt}"
                     excludes="${java.excludes.awt}"/>
        </jar>
    </target>

    <target name="build-jars-x11" depends="setup-manifestfile">
        <jar manifest="tempversion" destfile="${nativewindow.os.x11.jar}" filesonly="true">
            <fileset dir="${classes}"
                     includes="${java.part.x11}" />
        </jar>
    </target>
    <target name="build-jars-x11-cdc" depends="setup-manifestfile-cdc">
        <jar manifest="tempversion-cdc" destfile="${nativewindow.os.x11.cdc.jar}" filesonly="true">
            <fileset dir="${classes-cdc}"
                     includes="${java.part.x11}" />
        </jar>
    </target>

    <target name="build-jars-windows" depends="setup-manifestfile">
        <jar manifest="tempversion" destfile="${nativewindow.os.windows.jar}" filesonly="true">
            <fileset dir="${classes}"
                     includes="${java.part.windows}" />
        </jar>
    </target>
    <target name="build-jars-windows-cdc" depends="setup-manifestfile-cdc">
        <jar manifest="tempversion-cdc" destfile="${nativewindow.os.windows.cdc.jar}" filesonly="true">
            <fileset dir="${classes-cdc}"
                     includes="${java.part.windows}" />
        </jar>
    </target>

    <target name="build-jars-all" depends="setup-manifestfile" unless="setup.noAWT">
        <jar manifest="tempversion" destfile="${nativewindow.all.jar}" filesonly="true">
            <fileset dir="${classes}"
                     includes="javax/media/nativewindow/** com/jogamp/nativewindow/**" />
        </jar>
    </target>
    <target name="build-jars-all-noawt" depends="setup-manifestfile">
        <jar manifest="tempversion" destfile="${nativewindow.all-noawt.jar}" filesonly="true">
            <fileset dir="${classes}"
                     includes="javax/media/nativewindow/**, com/jogamp/nativewindow/**" 
                     excludes="${java.part.awt}"/>
        </jar>
    </target>
    <target name="build-jars-all-cdc" depends="setup-manifestfile-cdc">
        <jar manifest="tempversion-cdc" destfile="${nativewindow.all.cdc.jar}" filesonly="true">
            <fileset dir="${classes-cdc}"
                     includes="javax/media/nativewindow/** com/jogamp/nativewindow/**" />
        </jar>
    </target>

    <target name="build-jars-javase" depends="setup-manifestfile,build-jars-awt,build-jars-x11,build-jars-windows,build-jars-all,build-jars-all-noawt">
        <jar manifest="tempversion" destfile="${nativewindow.core.jar}" filesonly="true">
            <fileset dir="${classes}"
                     includes="${java.part.core}"
                     excludes="${java.part.awt} ${java.part.x11} ${java.part.windows}"/>
        </jar>
        <jar manifest="tempversion" destfile="${build.nativewindow}/nativewindow-natives-${os.and.arch}.jar" filesonly="true">
            <fileset dir="${obj.nativewindow}">
              <include name="*.${native.library.suffix}" />
            </fileset>
        </jar>
        <delete file="tempversion"/>
    </target>

    <target name="build-jars-cdc" depends="setup-manifestfile-cdc,build-jars-x11-cdc,build-jars-windows-cdc,build-jars-all-cdc">
        <jar manifest="tempversion-cdc" destfile="${nativewindow.core.cdc.jar}" filesonly="true">
            <fileset dir="${classes-cdc}"
                     includes="${java.part.core}"
                     excludes="${java.part.awt} ${java.part.x11} ${java.part.windows}"/>
        </jar>
        <jar manifest="tempversion-cdc" destfile="${build.nativewindow}/nativewindow-natives-${os.and.arch}-cdc.jar" filesonly="true">
            <fileset dir="${obj.nativewindow}">
              <include name="*_jvm.${native.library.suffix-cdc}" />
              <include name="*_x11.${native.library.suffix-cdc}" />
            </fileset>
        </jar>

        <delete file="tempversion-cdc"/>
    </target>

    <!-- ================================================================== -->
    <!--
       - Build the Javadocs for the sources.
       - NOTE:  these are not entirely correct as the javadoc targets depend 
       -        on the platform specific build targets.  To circumvent any 
       -        errors, ensure that the source is built first.
      -->
    <target name="javadoc" depends="init">
        <!-- Build the general public Javadoc -->
        <javadoc packagenames="${javadoc.packagenames}"
                 excludepackagenames="${java.excludes.javadoc.packagenames}"
                 sourcepath="${src.java};${src.generated.java}"        
                 classpath="${gluegen-rt.cdc.jar}"
                 destdir="${javadoc}" windowtitle="${javadoc.windowtitle}"
                 overview="${javadoc.overview}" 
                 source="1.4"
                 linkoffline="${javadoc.link} 142-packages"
         bottom="${javadoc.bottom}" >
        </javadoc>
    </target>

    <target name="javadoc.spec" depends="init">
        <!-- Build the specification Javadoc -->
        <javadoc packagenames="${javadoc.spec.packagenames}"
                 excludepackagenames="${java.excludes.javadoc.packagenames}"
                 sourcepath="${src.java};${src.generated.java}"
                 classpath="${gluegen-rt.cdc.jar}"
                 destdir="${javadoc.spec}" windowtitle="${javadoc.windowtitle}"
                 overview="${javadoc.overview}"
                 source="1.4"
                 linkoffline="${javadoc.link} 142-packages"
                 bottom="${javadoc.bottom}" >
        </javadoc>
    </target>
                                                                                                                                   
    <target name="javadoc.dev" depends="init">
        <!-- Build the internal developer Javadoc -->
        <javadoc packagenames="${javadoc.dev.packagenames}"
                 excludepackagenames="${java.excludes.javadoc.packagenames}"
                 sourcepath="${src.java};${src.generated.java}"        
                 classpath="${gluegen-rt.cdc.jar}"
                 destdir="${javadoc.dev}" windowtitle="${javadoc.windowtitle}"
                 overview="${javadoc.overview}" 
                 source="1.4"
                 linkoffline="${javadoc.link} 142-packages"
         bottom="${javadoc.bottom}" >
        </javadoc>
    </target>

    <target name="all.doc" description="Build NativeWindow docs" depends="init,javadoc,javadoc.spec,javadoc.dev" />

    <!-- ================================================================== -->
    <!--
       - 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.nativewindow}" />
            <fileset dir="${javadoc}" />
            <fileset dir="${javadoc.spec}" />
            <fileset dir="${javadoc.dev}" />
        </delete>
    </target>

    <!-- ================================================================== -->
    <!--
       - Build everything.
      -->
    <target name="all" description="Build NativeWindow JAR file(s) and native libraries." depends="init,java.compile,c.build.nativewindow,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="${nativewindow.version}" file="${build.nativewindow}/version.txt" />
    </target>

</project>