<project name="LWJGL" default="compile" basedir=".">

  <!-- set global properties for this build -->
  <property name="lwjgl.src"            value="./src"/>
  <property name="lwjgl.bin"            value="./bin"/>
  <property name="lwjgl.lib"            value="./lib"/>
  <property name="lwjgl.dist"           value="./dist"/>
  <property name="lwjgl.docs"           value="./doc"/>
  <property name="lwjgl.temp"           value="./temp"/>
  <property name="lwjgl.res"            value="./res"/>
  <property name="lwjgl.version"        value="0.7"/>
  <property name="lwjgl.src.headers"    value="${lwjgl.src}/native/common"/>
  
  <!-- Creates a splash screen -->
  <target name="splash">
    <splash imageurl="http://java-game-lib.sourceforge.net/images/logo.png" showduration="0" taskname="progressscreen"/>  
  </target>
  
  <!-- Initializes whatever needs to be done before any targets are executed -->
  <target name="initialize">
    <mkdir dir="${lwjgl.bin}" taskname="initialiazing bin folder"/>
    <mkdir dir="${lwjgl.lib}" taskname="initialiazing lib folder"/>
    <mkdir dir="${lwjgl.dist}" taskname="initialiazing dist folder"/>
    <mkdir dir="${lwjgl.docs}/javadoc" taskname="initialiazing docs folder"/>
    <mkdir dir="${lwjgl.res}" taskname="initialiazing res folder"/>
    <mkdir dir="${lwjgl.temp}" taskname="initialiazing temp folder"/>
  </target>
  
  <target name="all" depends="splash" description="compile. package. javadoc and distribute">
  
    <!--
      Though we perform all targets, we do it in somewhat mixed.
      This is because we want the 'distribution_application' target to be
      executed as soon as possible, since this target is most likely to fail.
      That way we don't spend time doing javadocs, if the 'distribution_application'
      target is going to fail anyway. However we cannot call the 'distribution' before
      the javadoc target, since the 'distribution' target will try to create the javadoc
      archive.
    -->
 
    <antcall target="clean"/>
    <antcall target="compile"/>
    <antcall target="package"/>
    <antcall target="distribution_application"/>
    <antcall target="javadoc"/>
    <antcall target="distribution_javadoc"/>
    <antcall target="distribution_source"/>
    <antcall target="internal_clean"/>    
  </target>

  <target name="clean" description="Cleans the diectories controlled by this ant script (temp, dist, lib, javadoc, class files in bin)">
    <delete dir="${lwjgl.temp}" quiet="true" taskname="cleaning temp folder"/>
    <delete dir="${lwjgl.dist}" quiet="true" taskname="cleaning dist folder"/>
    <delete dir="${lwjgl.docs}/javadoc" quiet="true" taskname="cleaning javadoc folder"/>
    <delete dir="${lwjgl.bin}/org" quiet="true" taskname="cleaning bin folder"/>    
    <delete taskname="cleaning bin folder">
      <fileset dir="${lwjgl.bin}" includes="*.class"/>
    </delete>
  </target>

  <target name="compile" depends="initialize" description="Compiles the java source directory">
       <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/**.java" source="1.4" taskname="lwjgl"/>
       <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/input/**" source="1.4" taskname="input"/>
       <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/openal/**" source="1.4" taskname="openal"/>
       <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/opengl/**" source="1.4" taskname="opengl"/>
       <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/test/**" source="1.4" taskname="test"/>
       <javac srcdir="${lwjgl.src}/java/" destdir="${lwjgl.bin}" includes="org/lwjgl/vector/**" source="1.4" taskname="vector"/>
  </target>

  <target name="package" depends="compile" description="packages the java source files">
      <!-- Create lwjgl.jar -->
      <jar destfile="${lwjgl.lib}/lwjgl.jar" taskname="lwjgl.jar">
        <fileset dir="${lwjgl.bin}">
          <include name="**"/>
          <exclude name="**.*"/>
          <exclude name="org/lwjgl/test/**"/>
        </fileset>
      </jar>
      
      <!-- Create lwjgl_test.jar -->
      <jar destfile="${lwjgl.lib}/lwjgl_test.jar" taskname="lwjgl_test.jar">
        <fileset dir="${lwjgl.bin}">
          <exclude name="**.*"/>
          <include name="org/lwjgl/test/**"/>
        </fileset>
      </jar>
  </target>
  
  <target name="javadoc" description="Creates javadoc from java source code">
    <javadoc destdir="${lwjgl.docs}/javadoc" author="true" version="true" use="true" source="1.4" windowtitle="LWJGL API">
    
      <fileset dir="${lwjgl.src}/java">
        <include name="**/*.java" />
        <exclude name="org/lwjgl/test/**"/>
      </fileset>
    
      <doctitle><![CDATA[<h1>Lightweight Java Game Toolkit</h1>]]></doctitle>
      <bottom><![CDATA[<i>Copyright &#169; 2003 lwjgl.org. All Rights Reserved.</i>]]></bottom>
    </javadoc>
  </target>  
  
  <target name="distribution" depends="package" description="Creates a versioned distribution of lwjgl">  
    <antcall target="distribution_application"/>
    <antcall target="distribution_javadoc"/>
    <antcall target="distribution_source"/>
    <antcall target="internal_clean"/>
  </target>
  
  <target name="cvsbuild" description="Builds lwjgl, by exporting files from cvs into a LWJGL folder and executing the package target on that folders build file">
    <available file="LWJGL/build.xml" property="lwjgl.preexistingfiles"/>
    <available file="${lwjgl.src}/java/org/lwjgl/Sys.java" property="lwjgl.preexistingfiles"/>
    <fail if="lwjgl.preexistingfiles" message="Cannot perform webbuild from nonempty folder"/>
    <cvs command="export -D 'now'" compressionlevel="3" cvsRoot=":pserver:anonymous@cvs.sf.net:/cvsroot/java-game-lib" package="LWJGL/build.xml" dest="."/>
    <cvs command="export -D 'now'" compressionlevel="3" cvsRoot=":pserver:anonymous@cvs.sf.net:/cvsroot/java-game-lib" package="LWJGL/src" dest="."/>
    <cvs command="export -D 'now'" compressionlevel="3" cvsRoot=":pserver:anonymous@cvs.sf.net:/cvsroot/java-game-lib" package="LWJGL/doc" dest="."/>
    <ant dir="LWJGL" target="package"/>
  </target>  
  
  <target name="headers" description="invokes javah on java classes, producing the headers needed for native compilation" depends="compile">
    <javah classpath="${lwjgl.bin}" destdir="${lwjgl.src.headers}" force="yes">
      <class name="org.lwjgl.Display"/>
      <class name="org.lwjgl.Sys"/>
      <class name="org.lwjgl.Window"/>
      
      <class name="org.lwjgl.input.Controller"/>
      <class name="org.lwjgl.input.Cursor"/>
      <class name="org.lwjgl.input.Keyboard"/>
      <class name="org.lwjgl.input.Mouse"/>
      
      <class name="org.lwjgl.openal.ALC"/>
      <class name="org.lwjgl.openal.BaseAL"/>
      <class name="org.lwjgl.openal.CoreAL"/>
      <class name="org.lwjgl.openal.eax.BaseEAX"/>
      <class name="org.lwjgl.openal.eax.CoreEAX"/>
      <class name="org.lwjgl.openal.eax.EAXBufferProperties"/>
      <class name="org.lwjgl.openal.eax.EAXListenerProperties"/>
      
      <class name="org.lwjgl.opengl.CoreGL11"/>
      <class name="org.lwjgl.opengl.CoreGL12"/>
      <class name="org.lwjgl.opengl.CoreGL13"/>
      <class name="org.lwjgl.opengl.CoreGL14"/>
      <class name="org.lwjgl.opengl.GL"/>
      <class name="org.lwjgl.opengl.GLU"/>
      <class name="org.lwjgl.opengl.GLCaps"/>
      <class name="org.lwjgl.opengl.GLWindow"/>
      <class name="org.lwjgl.opengl.Pbuffer"/>
    </javah>    
  </target>
  
  <!-- Creates a versioned distribution for all supported platforms -->
  <target name="distribution_application">
    <!-- check for file presence -->
    <available file="${lwjgl.lib}/lwjglaudio.dll" property="lwjgl.lwjglaudio_dll.exists"/>
    <fail unless="lwjgl.lwjglaudio_dll.exists" message="Missing lwjglaudio.dll in lib directory"/>
    
    <available file="${lwjgl.lib}/libopenal.so" property="lwjgl.libopenal_so.exists"/>
    <fail unless="lwjgl.libopenal_so.exists" message="Missing libopenal.so in lib directory"/>    
    
    <available file="${lwjgl.lib}/lwjgl.dll" property="lwjgl.lwjgl_dll.exists"/>
    <fail unless="lwjgl.lwjgl_dll.exists" message="Missing lwjgl.dll in lib directory"/>

    <available file="${lwjgl.lib}/lwjgl_d.dll" property="lwjgl.lwjgl_d_dll.exists"/>
    <fail unless="lwjgl.lwjgl_d_dll.exists" message="Missing lwjgl_d.dll in lib directory"/>

    <available file="${lwjgl.lib}/liblwjgl.so" property="lwjgl.liblwjgl_so.exists"/>
    <fail unless="lwjgl.liblwjgl_so.exists" message="Missing liblwjgl.so in lib directory"/>

    <available file="${lwjgl.lib}/liblwjgl_d.so" property="lwjgl.liblwjgl_d_so.exists"/>
    <fail unless="lwjgl.liblwjgl_d_so.exists" message="Missing liblwjgl_d.so in lib directory"/>
    
    <available file="${lwjgl.lib}/lwjgl.jar" property="lwjgl.lwjgl_jar.exists"/>
    <fail unless="lwjgl.lwjgl_jar.exists" message="Missing lwjgl.jar in lib directory"/>

    <available file="${lwjgl.lib}/lwjgl_test.jar" property="lwjgl.lwjgl_test_jar.exists"/>
    <fail unless="lwjgl.lwjgl_test_jar.exists" message="Missing lwjgl_test.jar in lib directory"/>
    
    <mkdir dir="${lwjgl.temp}/lwjgl-${lwjgl.version}"/>
    
    <!-- copy files to lwjgl directory for proper zipping -->
    <copy todir="${lwjgl.temp}/lwjgl-${lwjgl.version}">
      <fileset dir="${lwjgl.lib}/">
        <include name="lwjgl.dll"/>
        <include name="lwjgl_d.dll"/>
        <include name="lwjglaudio.dll"/>
        <include name="liblwjgl.so"/>
        <include name="liblwjgl_d.so"/>
        <include name="libopenal.so"/>        
        <include name="lwjgl.jar"/>
        <include name="lwjgl_test.jar"/>
      </fileset>
      <fileset dir="${lwjgl.docs}">
        <include name="CREDITS"/>
        <include name="LICENSE"/>
        <include name="README"/>
      </fileset>
    </copy>
        
    <!-- zip 'em up -->
    <zip destfile="${lwjgl.dist}/lwjgl-${lwjgl.version}.zip" basedir="${lwjgl.temp}/"/>
  </target>
    
  <!-- Creates a versioned distribution for win32 -->
  <target name="distribution_application_win32">
    <!-- check for file presence -->
    <available file="${lwjgl.lib}/lwjglaudio.dll" property="lwjgl.lwjglaudio_dll.exists"/>
    <fail unless="lwjgl.lwjglaudio_dll.exists" message="Missing lwjglaudio.dll in lib directory"/>
    
    <available file="${lwjgl.lib}/lwjgl.dll" property="lwjgl.lwjgl_dll.exists"/>
    <fail unless="lwjgl.lwjgl_dll.exists" message="Missing lwjgl.dll in lib directory"/>

    <available file="${lwjgl.lib}/lwjgl_d.dll" property="lwjgl.lwjgl_d_dll.exists"/>
    <fail unless="lwjgl.lwjgl_d_dll.exists" message="Missing lwjgl_d.dll in lib directory"/>

    <available file="${lwjgl.lib}/lwjgl.jar" property="lwjgl.lwjgl_jar.exists"/>
    <fail unless="lwjgl.lwjgl_jar.exists" message="Missing lwjgl.jar in lib directory"/>

    <available file="${lwjgl.lib}/lwjgl_test.jar" property="lwjgl.lwjgl_test_jar.exists"/>
    <fail unless="lwjgl.lwjgl_test_jar.exists" message="Missing lwjgl_test.jar in lib directory"/>
    
    <mkdir dir="${lwjgl.temp}/lwjgl-${lwjgl.version}"/>
    
    <!-- copy files to lwjgl directory for proper zipping -->
    <copy todir="${lwjgl.temp}/lwjgl-${lwjgl.version}">
      <fileset dir="${lwjgl.lib}/">
        <include name="lwjgl.dll"/>
        <include name="lwjgl_d.dll"/>
        <include name="lwjglaudio.dll"/>
        <include name="lwjgl.jar"/>
        <include name="lwjgl_test.jar"/>
      </fileset>
      <fileset dir="${lwjgl.docs}">
        <include name="CREDITS"/>
        <include name="LICENSE"/>
        <include name="README"/>
      </fileset>
    </copy>
        
    <!-- zip 'em up -->
    <zip destfile="${lwjgl.dist}/lwjgl-${lwjgl.version}.zip" basedir="${lwjgl.temp}/"/>
  </target>
  
  <!-- Creates a versioned distribution for linux -->
  <target name="distribution_application_linux">
    <!-- check for file presence -->
    <available file="${lwjgl.lib}/libopenal.so" property="lwjgl.libopenal_so.exists"/>
    <fail unless="lwjgl.libopenal_so.exists" message="Missing libopenal.so in lib directory"/>    
    
    <available file="${lwjgl.lib}/liblwjgl.so" property="lwjgl.liblwjgl_so.exists"/>
    <fail unless="lwjgl.liblwjgl_so.exists" message="Missing liblwjgl.so in lib directory"/>

    <available file="${lwjgl.lib}/liblwjgl_d.so" property="lwjgl.liblwjgl_d_so.exists"/>
    <fail unless="lwjgl.liblwjgl_d_so.exists" message="Missing liblwjgl_d.so in lib directory"/>
    
    <available file="${lwjgl.lib}/lwjgl.jar" property="lwjgl.lwjgl_jar.exists"/>
    <fail unless="lwjgl.lwjgl_jar.exists" message="Missing lwjgl.jar in lib directory"/>

    <available file="${lwjgl.lib}/lwjgl_test.jar" property="lwjgl.lwjgl_test_jar.exists"/>
    <fail unless="lwjgl.lwjgl_test_jar.exists" message="Missing lwjgl_test.jar in lib directory"/>
    
    <mkdir dir="${lwjgl.temp}/lwjgl-${lwjgl.version}"/>
    
    <!-- copy files to lwjgl directory for proper zipping -->
    <copy todir="${lwjgl.temp}/lwjgl-${lwjgl.version}">
      <fileset dir="${lwjgl.lib}/">
        <include name="lwjgl.so"/>
        <include name="lwjgl_d.so"/>
        <include name="libopenal.so"/>
        <include name="lwjgl.jar"/>
        <include name="lwjgl_test.jar"/>
      </fileset>
      <fileset dir="${lwjgl.docs}">
        <include name="CREDITS"/>
        <include name="LICENSE"/>
        <include name="README"/>
      </fileset>
    </copy>
        
    <!-- zip 'em up -->
    <zip destfile="${lwjgl.dist}/lwjgl-${lwjgl.version}.zip" basedir="${lwjgl.temp}/"/>
  </target>  
  
  <!-- Creates a versioned distribution of javadocs -->
  <target name="distribution_javadoc">
    <zip destfile="${lwjgl.dist}/lwjgl-docs-${lwjgl.version}.zip" basedir="${lwjgl.docs}" includes="javadoc/**"/>
  </target>
  
  <!-- Creates a versioned distribution of the source code -->
  <target name="distribution_source">
    <zip destfile="${lwjgl.dist}/lwjgl-source-${lwjgl.version}.zip">
      <fileset dir="${lwjgl.src}/">
        <patternset>
          <include name="**/*.java"/>
          <include name="**/*.cpp"/>
          <include name="**/*.c"/>
          <include name="**/*.h"/>
          <include name="**/*.am"/>
          <exclude name="**/*CVS*"/>
          <exclude name="**/.*"/>
        </patternset>        
      </fileset>    
    </zip>
  </target>
  
  <!-- clean internal temporary directories -->
  <target name="internal_clean">
    <delete dir="${lwjgl.temp}" taskname="cleanup"/>
  </target>
</project>