<?xml version="1.0"?>
<project name="Processing" default="build">

  <!-- Sets properties for macosx/windows/linux depending on current system -->
  <condition property="platform" value="macosx">
    <os family="mac" />
  </condition>

  <condition property="platform" value="windows">
    <os family="windows" />
  </condition>

  <condition property="platform" value="linux">
    <and>
      <os family="unix" />
      <not>
        <os family="mac" />
      </not>
    </and>
  </condition>

  <target name="ignore-tools">
    <echo message="Ignore the 'Unable to locate tools.jar' message." />
    <echo message="The tools.jar file is not required to build Processing." />
  </target>

  <!-- detetect Raspberry Pi and friends -->
  <condition property="linux-arm32" value="linux-arm32">
    <and>
      <equals arg1="${platform}" arg2="linux" />
      <equals arg1="${os.arch}" arg2="arm" />
      <equals arg1="${sun.arch.data.model}" arg2="32" />
    </and>
  </condition>
  <condition property="linux-arm64" value="linux-arm64">
    <and>
      <equals arg1="${platform}" arg2="linux" />
      <equals arg1="${os.arch}" arg2="aarch64" />
      <equals arg1="${sun.arch.data.model}" arg2="64" />
    </and>
  </condition>

  <!-- there is currently no JRE available for ARM -->
  <target name="check-linux-arm32" if="linux-arm32">
    <property name="jre.download.jdk" value="true" />
    <property name="jre.downloader" value="linux-arm32-vfp-hflt.tar.gz" />
    <property name="linux.dist" value="linux/processing-${version}-linux-armv6hf.tgz" />
  </target>
  <target name="check-linux-arm64" if="linux-arm64">
    <property name="jre.download.jdk" value="true" />
    <property name="jre.downloader" value="linux-arm64-vfp-hflt.tar.gz" />
    <property name="linux.dist" value="linux/processing-${version}-linux-arm64.tgz" />
  </target>

  <!-- Require Java 8 everywhere. -->
  <fail message="Unsupported Java version: ${java.version}. To build, make sure that Java 8 (aka Java 1.8) is installed.">
    <condition>
      <not>
        <or>
          <contains string="${java.version}" substring="1.8" />
        </or>
      </not>
    </condition>
  </fail>

  <!-- could prompt here to download the necessary JRE
       (Windows/Linux) or JDK (on Mac OS X) -->

  <property name="examples.dir"
            value="../../processing-docs/content/examples" />

  <property name="jdk.version" value="8" />
  <property name="jdk.update" value="144" />
  <property name="jdk.build" value="1" />
  <!-- See https://gist.github.com/P7h/9741922
       or http://stackoverflow.com/q/10268583 -->
  <property name="jdk.hash" value="090f390dda5b47b9b721c7dfaa008135" />

  <property name="jdk.short" value="${jdk.version}u${jdk.update}" />
  <property name="jdk.esoteric" value="1.${jdk.version}.0_${jdk.update}" />

  <!-- Figure out the JRE download location for Linux and Windows. -->
  <!--
  <condition property="jre.file"
             value="jre-${jdk.short}-${platform}-i586.tar.gz">
    <equals arg1="${sun.arch.data.model}" arg2="32" />
  </condition>
  <condition property="jre.file"
             value="jre-${jdk.short}-${platform}-x64.tar.gz">
    <equals arg1="${sun.arch.data.model}" arg2="64" />
  </condition>
  -->

  <!-- JDK location for Mac OS X -->
  <!--
  <condition property="jdk.file" value="jdk-${jdk.short}-macosx-x64.dmg">
    <equals arg1="${platform}" arg2="macosx" />
  </condition>
  -->

  <!-- These lists haven't been updated since Java 6. The new list:
       http://www.oracle.com/technetwork/java/javase/jre-8-readme-2095710.html
       Please help: https://github.com/processing/processing/issues/3288 -->

  <fileset dir="windows/work/java" id="jre-optional-windows">
    <include name="lib/ext/dnsns.jar" />

    <include name="bin/dtplugin" />
    <include name="bin/plugin2" />

    <include name="bin/kinit.exe" />
    <include name="bin/klist.exe" />
    <include name="bin/ktab.exe" />

    <include name="bin/keytool" /> <!-- needed for Android -->
    <include name="bin/orbd" />
    <include name="bin/policytool" />
    <include name="bin/rmid" />
    <include name="bin/rmiregistry" />
    <include name="bin/servertool" />
    <include name="bin/tnameserv" />

    <include name="bin/javaws.exe" />
    <include name="lib/javaws.jar" />

    <include name="lib/cmm/PYCC.pf" />
  </fileset>

  <fileset dir="linux/work/java" id="jre-optional-linux">
    <include name="bin/keytool" /> <!-- needed for Android -->

    <include name="lib/ext/dnsns.jar" />

    <include name="bin/orbd" />
    <include name="bin/policytool" />
    <include name="bin/rmid" />
    <include name="bin/rmiregistry" />
    <include name="bin/servertool" />
    <include name="bin/tnameserv" />

    <include name="bin/javaws" />
    <include name="lib/javaws.jar" />

    <include name="lib/cmm/PYCC.pf" />
  </fileset>

  <!-- Unused JavaFX files that can be removed from the JRE on Windows
       and Linux. On Mac OS X, this is removed by the appbundler task.
       www.oracle.com/technetwork/java/javase/jdk-7-readme-429198.html
       However, we're now looking into using JavaFX as the default 2D
       renderer for 3.0. So in 3.0a8, we're no longer removing javafx. -->

  <fileset dir="${platform}/work/java" id="javafx-basics">
    <include name="THIRDPARTYLICENSEREADME-JAVAFX.txt" />
    <include name="lib/javafx.properties" />
    <include name="lib/jfxrt.jar" />
    <include name="lib/security/javafx.policy" />
  </fileset>

  <fileset dir="windows/work/java" id="javafx-windows">
    <include name="bin/decora-sse.dll" />
    <include name="bin/fxplugins.dll" />
    <include name="bin/glass.dll" />
    <include name="bin/glib-lite.dll" />
    <include name="bin/gstreamer-lite.dll" />
    <include name="bin/javafx-font.dll" />
    <include name="bin/javafx-iio.dll" />
    <include name="bin/jfxmedia.dll" />
    <include name="bin/jfxwebkit.dll" />
    <include name="bin/libxml2.dll" />
    <include name="bin/libxslt.dll" />
  </fileset>

  <fileset dir="linux/work/java" id="javafx-linux-32">
    <include name="lib/i386/fxavcodecplugin-52.so" />
    <include name="lib/i386/fxavcodecplugin-53.so" />
    <include name="lib/i386/fxplugins.so" />
    <include name="lib/i386/libglass.so" />
    <include name="lib/i386/libgstplugins-lite.so" />
    <include name="lib/i386/libgstreamer-lite.so" />
    <include name="lib/i386/libjavafx-font.so" />
    <include name="lib/i386/libjavafx-iio.so" />
    <include name="lib/i386/libjfxmedia.so" />
    <include name="lib/i386/libjfxwebkit.so" />
    <include name="lib/i386/libprism-es2.so" />
  </fileset>

  <fileset dir="linux/work/java" id="javafx-linux-64">
    <include name="lib/amd64/fxavcodecplugin-52.so" />
    <include name="lib/amd64/fxavcodecplugin-53.so" />
    <include name="lib/amd64/fxplugins.so" />
    <include name="lib/amd64/libglass.so" />
    <include name="lib/amd64/libgstplugins-lite.so" />
    <include name="lib/amd64/libgstreamer-lite.so" />
    <include name="lib/amd64/libjavafx-font.so" />
    <include name="lib/amd64/libjavafx-iio.so" />
    <include name="lib/amd64/libjfxmedia.so" />
    <include name="lib/amd64/libjfxwebkit.so" />
    <include name="lib/amd64/libprism-es2.so" />
  </fileset>

  <!--
  <echo message="${java.class.path}" />
  -->

  <!-- Set a property named macosx, linux, or windows.
       The 'value' chosen is arbitrary. -->
  <property name="${platform}" value="${platform}" />

  <property environment="env" />

  <property name="jre.tgz.path" value="${platform}/jre-${jdk.short}.tgz" />

  <target name="jre-check">
    <available file="${jre.tgz.path}" property="jre.tgz.downloaded" />
  </target>

  <target name="downloader-setup">
    <!-- make sure we're built -->
    <subant buildpath="jre" target="dist" />

    <!-- define our special JRE downloader task -->
    <taskdef name="downloader"
             classname="Downloader"
             classpath="jre/downloader.jar" />
  </target>

  <target name="jre-download" depends="jre-check, downloader-setup"
          unless="jre.tgz.downloaded">
    <!-- we normally download a JRE, except on arm -->
    <property name="jre.download.jdk" value="false" />

    <condition property="jre.downloader"
               value="${platform}-i586.tar.gz">
        <equals arg1="${sun.arch.data.model}" arg2="32" />
    </condition>
    <condition property="jre.downloader"
               value="${platform}-x64.tar.gz">
      <equals arg1="${sun.arch.data.model}" arg2="64" />
    </condition>

    <downloader version="${jdk.version}"
                update="${jdk.update}"
                build="${jdk.build}"
                hash="${jdk.hash}"
                jdk="${jre.download.jdk}"
                flavor="${jre.downloader}"
                path="${jre.tgz.path}" />
  </target>

  <target name="download-jdk-macosx" depends="downloader-setup">
    <downloader version="${jdk.version}"
                update="${jdk.update}"
                build="${jdk.build}"
                hash="${jdk.hash}"
                jdk="true"
                flavor="macosx-x64.dmg"
                path="${env.HOME}/Desktop/jdk-${jdk.short}.dmg" />
  </target>

  <!-- code signing hack, turns on code signing during dist -->
  <condition property="codesign">
    <equals arg1="${env.USER}" arg2="fry" />
  </condition>

  <!-- Set the version of Java that must be present to build. -->
  <property name="jdk.path.macosx"
            value="/Library/Java/JavaVirtualMachines/jdk${jdk.esoteric}.jdk" />

  <available file="${jdk.path.macosx}" property="macosx_jdk_found" />

  <!--
  <fail if="linux" unless="java_tools_found"
        message="The JAVA_HOME variable must be set to the location of a full JDK. For instance, on Ubuntu Linux, this might be /usr/lib/jvm/java-6-sun." />
  -->

  <!-- Figure out the platform-specific output directory for all this work. -->
  <condition property="target.path"
             value="macosx/work/Processing.app/Contents/Java">
    <os family="mac" />
  </condition>

  <condition property="target.path" value="linux/work">
    <os family="unix" />
  </condition>

  <condition property="target.path" value="windows/work">
    <os family="windows" />
  </condition>

  <!-- Libraries required for running processing -->
  <!-- also need to copy these to the bundleapp task for macosx -->
  <fileset dir=".." id="runtime.jars">
    <include name="app/pde.jar" />
    <include name="app/lib/antlr.jar" />
    <include name="app/lib/jna.jar" />
    <include name="app/lib/jna-platform.jar" />
    <include name="app/lib/ant.jar" />
    <include name="app/lib/ant-launcher.jar" />
  </fileset>

  <target name="build" description="Build Processing.">
    <antcall target="${platform}-build" />
  </target>

  <target name="run" description="Run Processing.">
    <antcall target="${platform}-run" />
  </target>

  <!-- Run the app in a more "native" manner, i.e. no additional
       console for debugging. Ensures that double-clicking shortcuts
       and other desktop integration features work properly. -->
  <target name="app" description="Run Processing w/o console.">
    <antcall target="${platform}-run-app" />
  </target>

  <target name="dist" depends="revision-check"
          description="Build Processing for distribution.">
    <input message="Enter version number:"
           addproperty="version"
           defaultvalue="${revision}" />

    <available file="${examples.dir}" property="examples.exist" />
    <fail unless="examples.exist" message="To do a distribution, the processing-docs repo must be checked out at the same level as the processing repo." />

    <!-- do a git pull in the docs repo so that it is up to date -->
    <exec executable="git" dir="${examples.dir}">
      <arg line="pull" />
    </exec>

    <antcall target="${platform}-dist" />
  </target>

  <!-- "§$§$&, ant doesn't have a built-in help target :(  -->
  <target name="help" description="Show project help">
    <java classname="org.apache.tools.ant.Main">
      <arg value="-p" />
    </java>
  </target>

  <!-- - - - - - - - - - - - - - - - - - -->
  <!-- Subprojects: Core, App, Libraries -->
  <!-- - - - - - - - - - - - - - - - - - -->

  <target name="subprojects-clean">
    <subant buildpath="../core" target="clean"/>
    <subant buildpath="../app" target="clean"/>
    <subant buildpath="../java/libraries/dxf" target="clean"/>
    <subant buildpath="../java/libraries/io" target="clean"/>
    <subant buildpath="../java/libraries/net" target="clean"/>
    <subant buildpath="../java/libraries/pdf" target="clean"/>
    <subant buildpath="../java/libraries/serial" target="clean"/>
    <subant buildpath="../java/libraries/svg" target="clean"/>
    <subant buildpath="shared/tools/MovieMaker" target="clean"/>
    <subant buildpath="../java" target="clean"/>

    <!-- make sure this isn't around from an old build 140730 -->
    <delete dir="../java/examples" />
  </target>

  <target name="subprojects-build">
    <subant buildpath="../core" target="build"/>
    <subant buildpath="../app" target="build"/>
    <subant buildpath="../java/libraries/dxf" target="build"/>
    <subant buildpath="../java/libraries/net" target="build"/>
    <subant buildpath="../java/libraries/pdf" target="build"/>
    <subant buildpath="../java/libraries/serial" target="build"/>
    <subant buildpath="../java/libraries/svg" target="build"/>
    <subant buildpath="shared/tools/MovieMaker" target="build"/>
    <subant buildpath="../java" target="build"/>
  </target>

  <!-- I/O library is only compiled on supported ARM platforms -->
  <target name="subprojects-build-linux-arm32" if="linux-arm32">
    <subant buildpath="../java/libraries/io" target="build"/>
  </target>
  <target name="subprojects-build-linux-arm64" if="linux-arm64">
    <subant buildpath="../java/libraries/io" target="build"/>
  </target>

  <!-- - - - - - - - - -->
  <!-- Basic Assembly  -->
  <!-- - - - - - - - - -->

  <target name="assemble" depends="version-clear, version-write">
    <fail unless="target.path"
          message="Do not call assemble from the command line." />

    <!-- copy shared tools folder -->
    <copy todir="${target.path}/tools">
      <fileset dir="shared/tools" />
    </copy>

    <copy todir="${target.path}/modes/java">
      <fileset dir="../java">
        <!-- don't include LWJGL, it's not operational -->
        <exclude name="libraries/lwjgl/**" />

        <exclude name="reference.zip" />
        <exclude name="**/._*" />
      </fileset>
    </copy>

    <!-- get the examples folder, but don't require it to buid -->
    <copy todir="${target.path}/modes/java/examples" failonerror="false">
      <fileset dir="${examples.dir}" />
    </copy>

    <!-- if we're creating a dist, the reference is required -->
    <condition property="reference.ignorable" value="false" else="true">
      <isset property="version" />
    </condition>

    <!--<echo message="ref ignoreable? ${reference.ignorable}" />-->
    <get src="http://download.processing.org/reference.zip"
         dest="../java/reference.zip"
         ignoreerrors="${reference.ignorable}"
         usetimestamp="true" />

    <unzip dest="${target.path}/modes/java"
           src="../java/reference.zip"
           overwrite="false">
      <patternset>
        <exclude name="__MACOSX/**" />
        <exclude name="**/._*" />
      </patternset>
    </unzip>

    <!-- copy PDE X mode folder-->
    <!--
    <copy todir="${target.path}/modes/">
      <fileset dir="../pdex/dist" />
    </copy>
    -->

  </target>

  <target name="version-clear">
    <delete file="${target.path}/lib/version.txt" />
  </target>

  <target name="version-write" if="version">
    <echo file="${target.path}/lib/version.txt" message="${version}"/>
  </target>


  <!-- - - - - - - - - -->
  <!-- Revision check  -->
  <!-- - - - - - - - - -->
  <target name="revision-check">
    <!-- figure out the revision number -->
    <loadfile srcfile="../todo.txt" property="revision">
      <filterchain>
        <headfilter lines="1"/>
        <tokenfilter>
          <stringtokenizer suppressdelims="true"/>
          <!-- grab the thing from the first line that's 4 digits -->
          <containsregex pattern="(\d\d\d\d)" />
        </tokenfilter>
      </filterchain>
    </loadfile>
    <!-- <echo message="revision is ${revision}." /> -->

    <!-- figure out the revision number in base.java -->
    <loadfile srcfile="../app/src/processing/app/Base.java"
              property="revision.base">
      <filterchain>
        <tokenfilter>
          <linetokenizer />
          <containsregex pattern="String VERSION_NAME = "/>
          <replaceregex pattern="[^0-9]*" flags="g" replace=""/>
        </tokenfilter>
      </filterchain>
    </loadfile>
    <!-- <echo message="base revision is ${revision.base}." /> -->

    <condition property="revision.correct">
      <!-- Using contains because I can't figure out how to get rid of the
           LF in revision.base. Please file a bug if you have a fix. -->
      <contains string="${revision.base}" substring="${revision}"/>
    </condition>

    <!-- the revision.base property won't be set
         if $revision wasn't found... -->
    <fail unless="revision.correct"
          message="Fix revision number in Base.java" />
  </target>


  <!-- - - - - - - - -->
  <!-- Mac OS X      -->
  <!-- - - - - - - - -->

  <target name="macosx-clean" depends="subprojects-clean" description="Clean Mac OS X build">
    <delete dir="macosx/work" />
    <delete>
      <fileset dir="macosx" includes="processing-*zip" />
    </delete>
  </target>

  <target name="macosx-check-os" unless="macosx">
    <echo>
      =======================================================
      Processing for Mac OS X can only be built on Mac OS X.

      Bye.
      =======================================================
    </echo>
    <fail message="wrong platform (${os.name})" />
  </target>

  <target name="macosx-build" if="macosx" depends="revision-check, macosx-check-os, subprojects-build" description="Build Mac OS X version">

    <!-- Require that a JDK be installed, but call this on build, so that
         the download-jdk-macosx target can be called. -->
    <fail unless="macosx_jdk_found"
          message="JDK ${jdk.short} required.${line.separator}To build on OS X, you must install Oracle's JDK ${jdk.short} from${line.separator}http://www.oracle.com/technetwork/java/javase/downloads${line.separator}Or... type 'ant download-jdk-macosx' to download it to your Desktop.${line.separator}Note that only ${jdk.short} (not a later or earlier version) will work. ${line.separator}And it must be the JDK, not the JRE. And do not try to defy me again." />

    <mkdir dir="macosx/work" />

    <!-- app bundler for OS X and Java 1.7 -->
    <taskdef name="bundleapp"
             classname="com.oracle.appbundler.AppBundlerTask"
             classpath="macosx/appbundler.jar" />

    <bundleapp outputDirectory="macosx/work"
               name="Processing"
               displayName="Processing"
               executableName="Processing"
               identifier="org.processing.app"
               signature="Pde3"
               icon="macosx/processing.icns"
               copyright="© The Processing Foundation"
               getInfo="${version}, Copyright © The Processing Foundation"
               shortVersion="${version}"
               version="${revision}"
               javafx="true"
               minimumSystem="10.8.5"
               mainClassName="processing.app.BaseSplash">

      <!-- The appbundler task needs a couple files (the Info.plist and
           anything else outside /jre) from the full JDK, even though
           it's primarily copying over the JRE folder. -->
      <runtime dir="${jdk.path.macosx}/Contents/Home" />
      <!-- Eventually we'll want to load the JRE directly from
           the .tgz on the Oracle site, though it's in a folder called
           jre1.7.0_40.jre, so we'll need to strip that out. -->

      <!-- Same as runtime.jars, seen above; plus core.jar. -->
      <classpath file="../app/pde.jar" />
      <classpath file="../app/lib/antlr.jar" />
      <classpath file="../app/lib/jna.jar" />
      <classpath file="../app/lib/jna-platform.jar" />
      <classpath file="../app/lib/ant.jar" />
      <classpath file="../app/lib/ant-launcher.jar" />

      <!-- plus core.jar... note that this is no longer shared -->
      <classpath file="../core/library/core.jar" />

      <arch name="x86_64"/>
      <!-- no support for this with Java 7 from Oracle -->
      <!--<arch name="i386"/>-->

      <bundledocument extensions="pde"
                      icon="macosx/document.icns"
                      name="Processing Source Code"
                      role="Editor">
      </bundledocument>

      <!-- !@#*&$ the @2x splash screen implementation was removed by Oracle -->
      <!-- tiffutil -cathidpicheck about.png about\@2x.png -out about.tiff -->
      <!--<option value="-splash:$APP_ROOT/Contents/Java/lib/about.png" />-->

      <!-- Sets dock icon when debugging (not launched via launch svcs) -->
      <option value="-Xdock:icon=$APP_ROOT/Contents/Resources/processing.icns" />
      <!-- Don't think these actually make any difference.
           (The apple.awt.application.name property is used.)-->
      <!--
      <option value="-Xdock:name=Processing" />
      -->

      <!-- Probably no longer needed? [fry 130917]
      <option value="-Xms128M" />
      -->
      <!-- returning 140606 per PDE X request -->
      <option value="-Xmx256M" />

      <option value="-Dapple.awt.application.name=Processing" />

      <!-- avoid conflicts with JNA DLLs already in the path -->
      <option value="-Djna.nosys=true" />

      <!-- deal with jokers who install JOGL, ANTLR, etc system-wide -->
      <option value="-Djava.ext.dirs=$APP_ROOT/Contents/PlugIns/jdk${jdk.esoteric}.jdk/Contents/Home/jre/lib/ext" />

      <option value="-Dapple.laf.useScreenMenuBar=true" />
      <option value="-Dcom.apple.macos.use-file-dialog-packages=true" />
      <option value="-Dcom.apple.macos.useScreenMenuBar=true" />
      <option value="-Dcom.apple.smallTabs=true" />

<!--
    the old options; most of these are probably no longer useful
        <key>apple.laf.useScreenMenuBar</key>
        <string>true</string>
        <key>apple.awt.showGrowBox</key>
        <string>true</string>
        <key>com.apple.smallTabs</key>
        <string>true</string>
        <key>apple.awt.Antialiasing</key>
        <string>false</string>
        <key>apple.awt.TextAntialiasing</key>
        <string>true</string>
        <key>com.apple.hwaccel</key>
        <string>true</string>
        <key>apple.awt.use-file-dialog-packages</key>
        <string>false</string>
        <key>apple.awt.graphics.UseQuartz</key>
        <string>true</string>
-->
    </bundleapp>

    <!-- Temporary fix until new appbundler is included again after solving
         https://github.com/processing/processing/issues/3359
         https://github.com/processing/processing/issues/3360
         The 'keytool' file is deleted by our appbundler. Add it back so that
         Android signing works properly. (Not modifying our appbundler since
         most of the time that appbundler is used, keytool isn't needed).
         Also, because Ant's copy task does not retain file permissions on
         Unix systems, we need to use <exec executable="cp" ... > instead -->
    <exec executable="cp">
      <arg line="${jdk.path.macosx}/Contents/Home/bin/keytool macosx/work/Processing.app/Contents/PlugIns/jdk${jdk.esoteric}.jdk/Contents/Home/jre/bin"/>
    </exec>

    <property name="contents.dir"
              location="macosx/work/Processing.app/Contents" />

    <!-- Replace libjli.dylib symlink with actual file.
         Deals with code signing issues on OS X 10.9.5+ -->
    <property name="jli.path" value="${contents.dir}/PlugIns/jdk${jdk.esoteric}.jdk/Contents/MacOS/libjli.dylib" />
    <delete file="${jli.path}" />
    <exec executable="cp">
      <arg line="${jdk.path.macosx}/Contents/Home/jre/lib/jli/libjli.dylib ${jli.path}"/>
    </exec>

    <copy todir="${contents.dir}/Java">
      <fileset dir=".." includes="core/library/**" /> <!-- why this? -->
      <!--<fileset dir="shared" includes="launch4j/**" />-->
      <fileset dir="shared" includes="lib/**" />
      <fileset file="shared/revisions.txt" />
    </copy>

    <!-- Use the Processing executable as the stub for exported apps.
         This works b/c everything app-specific is in Info.plist. -->
    <property name="app.stub" value="${contents.dir}/Java/modes/java/application/mac-app-stub" />
    <!-- Grab a copy of the stub binary before it is signed.
         (See processing.mode.java.JavaBuild for usage.)
         Prevents signing errors with exported apps. -->
    <copy file="${contents.dir}/MacOS/Processing" tofile="${app.stub}" />
    <!-- The ant copy command does not preserve permissions. -->
    <chmod file="${app.stub}" perm="ugo+x" />

    <antcall target="assemble">
      <param name="target.path" value="${contents.dir}/Java" />
    </antcall>

    <exec executable="macosx/language_gen.py" />

    <property name="launch4j.dir" value="${contents.dir}/Java/modes/java/application/launch4j" />

    <!-- rename the version we need -->
    <move file="${launch4j.dir}/bin/windres-macosx"
          tofile="${launch4j.dir}/bin/windres" />
    <move file="${launch4j.dir}/bin/ld-macosx"
          tofile="${launch4j.dir}/bin/ld" />

    <!-- make executable (ant doesn't preserve) -->
    <chmod perm="ugo+x" file="${launch4j.dir}/bin/windres" />
    <chmod perm="ugo+x" file="${launch4j.dir}/bin/ld" />

    <!-- remove the others -->
    <delete failonerror="true">
      <fileset dir="${launch4j.dir}/bin" includes="ld-*" />
      <fileset dir="${launch4j.dir}/bin" includes="windres-*" />
    </delete>
  </target>

  <target name="macosx-run" depends="macosx-build"
          description="Run Mac OS X version">
    <exec executable="open" dir="macosx/work" spawn="true">
      <arg value="-a" />
      <arg value="/Applications/Utilities/Terminal.app" />
      <arg value="Processing.app/Contents/MacOS/Processing" />
    </exec>
  </target>

  <target name="macosx-run-app" depends="macosx-build"
          description="Run Mac OS X version without console">
    <exec executable="open" dir="macosx/work" spawn="true">
      <arg value="Processing.app" />
    </exec>
  </target>

  <target name="macosx-dist-sign" if="codesign">
    <echo>
      Code signing will only work if you have a $99/yr Apple developer ID.

      With a proper ID, if code signing fails, you may need to use:
      export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/usr/bin/codesign_allocate"
    </echo>

    <!-- 3rd party is for the app store, dev id is gatekeeper only -->
    <!--<arg value="3rd Party Mac Developer Application" />-->

    <exec executable="/usr/bin/codesign" dir="macosx/work">
      <arg value="--force" />
      <arg value="--sign" />
      <arg value="Developer ID Application" />
      <arg value="Processing.app/Contents/PlugIns/jdk${jdk.esoteric}.jdk" />
    </exec>

    <exec executable="/usr/bin/codesign" dir="macosx/work">
      <arg value="--force" />
      <arg value="--sign" />
      <arg value="Developer ID Application" />
      <arg value="Processing.app" />
    </exec>

    <!-- Verify that the signature will pass Gatekeeper checks
         https://developer.apple.com/library/mac/technotes/tn2206 -->
    <!--
    <exec executable="/usr/bin/codesign" dir="macosx/work">
      <arg value="- -verify" />
      <arg value="- -deep" />
      <arg value="- -verbose=2" />
      <arg value="Processing.app" />
    </exec>
    -->
    <!-- Disabling since it's a lot of gunk but not that useful. -->
  </target>

  <target name="macosx-dist" if="macosx"
          depends="macosx-build"
          description="Create a downloadable .zip for the Mac OS X version">

    <antcall target="macosx-dist-sign" />

    <exec executable="ditto" dir="macosx/work">
      <arg line="-c -k -rsrc . ../processing-${version}-macosx.zip" />
    </exec>

    <echo>
      =======================================================
      Processing for Mac OS X was built. Grab it from

      macosx/processing-${version}-macosx.zip
      =======================================================
    </echo>
  </target>


  <!-- - - - - - - - -->
  <!-- Linux         -->
  <!-- - - - - - - - -->

  <target name="linux-clean" depends="subprojects-clean" description="Clean linux version">
    <delete dir="linux/work" />
    <delete>
      <fileset dir="linux" includes="processing-*tgz" />
    </delete>
  </target>

  <target name="linux-check-os" unless="linux">
    <echo>
      =======================================================
      Processing for Linux can only be built on *nix systems.

      Bye.
      =======================================================
    </echo>

    <fail message="wrong platform (${os.name})" />
  </target>

  <target name="linux-build" depends="ignore-tools, check-linux-arm32, check-linux-arm64, revision-check, linux-check-os, jre-download, subprojects-build, subprojects-build-linux-arm32, subprojects-build-linux-arm64" description="Build Linux version">
    <mkdir dir="linux/work" />

    <copy todir="linux/work">
      <fileset dir=".." includes="core/library/**" />
      <fileset dir="shared" includes="launch4j/**" />
      <fileset dir="shared" includes="lib/**"  />
      <fileset dir="shared" includes="modes/**" />
      <fileset file="shared/revisions.txt" />
    </copy>

    <antcall target="assemble">
      <param name="target.path" value="linux/work" />
    </antcall>

    <property name="launch4j.dir"
              value="linux/work/modes/java/application/launch4j" />

    <!-- rename the version we need -->
    <move file="${launch4j.dir}/bin/windres-linux"
          tofile="${launch4j.dir}/bin/windres" />
    <move file="${launch4j.dir}/bin/ld-linux"
          tofile="${launch4j.dir}/bin/ld" />

    <!-- make executable (ant doesn't preserve) -->
    <chmod perm="ugo+x" file="${launch4j.dir}/bin/windres" />
    <chmod perm="ugo+x" file="${launch4j.dir}/bin/ld" />

    <!-- remove the others -->
    <delete failonerror="true">
      <fileset dir="${launch4j.dir}/bin" includes="ld-*" />
      <fileset dir="${launch4j.dir}/bin" includes="windres-*" />
    </delete>

    <copy todir="linux/work/lib" flatten="true">
      <fileset refid="runtime.jars" />
    </copy>

    <copy file="linux/processing" todir="linux/work" />
    <chmod perm="ugo+x" file="linux/work/processing" />

    <!-- copy command line tool -->
    <copy file="linux/processing" tofile="linux/work/processing-java" />
    <chmod perm="ugo+x" file="linux/work/processing-java" />

    <!-- This allows Linux users to add mime types to the PDE by simply
         running the install script added to the Processing folder.
         This adds the following features:
         - the icons for the PDE in different resolutions
         - icons for the files
         - a desktop icon
         - when double clicking the *.pde files, the PDE will be opened

         from Sweden with <3
    -->
    <copy file="linux/install.sh" todir="linux/work" />
    <chmod perm="ugo+x" file="linux/work/install.sh" />

    <copy file="linux/uninstall.sh" todir="linux/work" />
    <chmod perm="ugo+x" file="linux/work/uninstall.sh" />

    <copy file="linux/processing-pde.xml" todir="linux/work/lib" />
    <copy file="linux/appdata.xml" todir="linux/work/lib" />
    <copy file="linux/desktop.template" todir="linux/work/lib" />

<!--
    Cannot use ant version of tar because it doesn't preserve properties.
    <untar compression="gzip"
           dest="linux/work"
           src="linux/jre.tgz"
           overwrite="false"/>
-->

<!--
    http://www.gnu.org/software/tar/manual/html_section/transform.html
-->
    <exec executable="tar" dir="linux">
      <!-- Change directory -->
      <!--
      <arg value="-C" />
      <arg value="linux/work" />
      <arg value="-xzpf" />
      -->
      <arg value="xfz" />
      <arg value="../${jre.tgz.path}"/>
    </exec>

    <!-- use the jre subfolder when having downloaded a JDK file -->
    <condition property="jre.dir" value="jdk${jdk.esoteric}/jre">
      <!-- property might not be set, but it is for arm -->
      <equals arg1="${jre.download.jdk}" arg2="true" />
    </condition>
    <condition property="jre.dir" value="jre${jdk.esoteric}">
      <not>
        <equals arg1="${jre.download.jdk}" arg2="true" />
      </not>
    </condition>

    <exec executable="rsync" dir="linux">
      <arg value="-a" />
      <arg value="--delete" />
      <arg value="${jre.dir}/" />
      <arg value="work/java/" />
    </exec>

    <delete dir="linux/jre${jdk.esoteric}" failonerror="false" />
    <delete dir="linux/jdk${jdk.esoteric}" failonerror="false" />

    <!-- Remove unused JRE bloat. -->
    <delete failonerror="true">
      <!--
      <fileset refid="javafx-basics" />
      <fileset refid="javafx-linux-${sun.arch.data.model}" />
      -->
      <fileset refid="jre-optional-linux" />
    </delete>
  </target>

  <target name="linux-run" depends="linux-build"
          description="Run Linux version">
    <exec executable="./processing" dir="linux/work" spawn="true"/>
  </target>

  <target name="linux-dist" depends="linux-build"
          description="Build .tar.gz of linux version">

<!--
    <tar compression="gzip" destfile="linux/processing-${version}.tgz">
      <tarfileset dir="linux/work" prefix="processing-${version}" />
    </tar>
-->

   <!-- rename the work folder temporarily -->
   <move file="linux/work" tofile="linux/processing-${version}" />

   <property name="linux.dist" value="linux/processing-${version}-linux${sun.arch.data.model}.tgz" />

   <exec executable="tar">
     <arg value="--directory=linux" />
     <arg value="--file=${linux.dist}" />
     <arg value="-cpz" />
     <arg value="processing-${version}" />
   </exec>

   <!-- put... the candle... back -->
   <!-- (rename the work processing-NNNN version to work) -->
   <move file="linux/processing-${version}" tofile="linux/work" />

    <echo>
      =======================================================
      Processing for Linux was built. Grab the archive from

      ${linux.dist}
      =======================================================
    </echo>
  </target>

  <target name="deb" depends="dist"
          description="Build .deb of linux version">

   <!-- start with a clean debian folder -->
   <delete dir="linux/debian" quiet="true" />

   <!-- setup the file structure -->
   <mkdir dir="linux/debian/opt" />
   <mkdir dir="linux/debian/usr/bin" />
   <mkdir dir="linux/debian/usr/share/applications/" />
   <mkdir dir="linux/debian/usr/share/mime/packages/" />
   <!-- rename the work folder temporarily -->
   <move file="linux/work" tofile="linux/debian/opt/processing" />
   <symlink link="linux/debian/usr/bin/processing"
            resource="../../opt/processing/processing" />
   <symlink link="linux/debian/usr/bin/processing-java"
            resource="../../opt/processing/processing-java" />

   <!-- place .desktop and .sharedmimeinfo file -->
   <copy file="linux/processing.desktop"
         tofile="linux/debian/usr/share/applications/processing.desktop">
       <filterchain>
           <replacetokens>
               <token key="version" value="${version}" />
           </replacetokens>
       </filterchain>
   </copy>
   <copy file="linux/processing.sharedmimeinfo"
         tofile="linux/debian/usr/share/mime/packages/processing.xml" />

   <!-- Set properties for DEBIAN/control file -->
   <condition property="linux.deb" value="linux/processing-${version}-linux-armv6hf.deb">
     <equals arg1="${linux-arm32}" arg2="linux-arm32" />
   </condition>
   <condition property="linux.deb" value="linux/processing-${version}-linux-arm64.deb">
     <equals arg1="${linux-arm64}" arg2="linux-arm64" />
   </condition>
   <property name="linux.deb" value="linux/processing-${version}-linux${sun.arch.data.model}.deb" />

   <!-- Raspbian seems to borrow armhf for armv6hf, so this works -->
   <condition property="deb.arch" value="armhf">
     <equals arg1="${linux-arm32}" arg2="linux-arm32" />
   </condition>
   <condition property="deb.arch" value="arm64">
     <equals arg1="${linux-arm64}" arg2="linux-arm64" />
   </condition>
   <condition property="deb.arch" value="i386">
     <equals arg1="${sun.arch.data.model}" arg2="32" />
   </condition>
   <condition property="deb.arch" value="amd64">
     <equals arg1="${sun.arch.data.model}" arg2="64" />
   </condition>

   <length property="deb.bsize" >
     <fileset dir="linux/debian" />
   </length>

   <script language="javascript">
     <![CDATA[
        var length_bytes = project.getProperty("deb.bsize");
        var length_kbytes = Math.ceil(length_bytes / 1024);
        project.setNewProperty("deb.kbsize", length_kbytes);
     ]]>
   </script>

  <!-- place DEBIAN/control file. -->
   <mkdir dir="linux/debian/DEBIAN" />
   <copy file="linux/control" tofile="linux/debian/DEBIAN/control" >
       <filterchain>
           <replacetokens >
               <token key="version" value="${version}" />
               <token key="size" value="${deb.kbsize}" />
               <token key="arch" value="${deb.arch}" />
           </replacetokens>
       </filterchain >
   </copy >
   <copy file="linux/copyright" tofile="linux/debian/DEBIAN/copyright" />

   <!-- Create .deb file -->
   <exec executable="fakeroot" dir="linux" failonerror="true">
     <arg value="dpkg-deb" />
     <arg value="--build" />
     <arg value="debian" />
     <arg value="../${linux.deb}" />
   </exec>

   <!-- put... the candle... back -->
   <!-- (rename the debian processing version to work) -->
   <move file="linux/debian/opt/processing" tofile="linux/work" />

   <!-- cleanup -->
   <delete dir="linux/debian" />

    <echo>
      ========================================================
      Processing for Debian Linux was built. Grab the deb from

      ${linux.deb}
      ========================================================
    </echo>
  </target>


  <!-- - - - - - - - -->
  <!-- Windows       -->
  <!-- - - - - - - - -->

  <target name="windows-clean" depends="subprojects-clean"
          description="Clean windows version">
    <delete dir="windows/work" />
    <delete>
      <fileset dir="windows" includes="processing-*zip" />
    </delete>
  </target>

  <target name="windows-check-os" unless="windows">
    <echo>
      =======================================================
      Processing for Windows can only be built on windows.

      Bye.
      =======================================================
    </echo>

    <fail message="wrong platform (${os.name})" />
  </target>

  <target name="windows-build" depends="ignore-tools, revision-check, windows-check-os, jre-download, subprojects-build" description="Build Windows version">
    <mkdir dir="windows/work" />

    <!-- assemble the pde -->
    <mkdir dir="windows/work/lib" />
    <copy todir="windows/work/lib" flatten="true">
      <fileset refid="runtime.jars" />
    </copy>

    <!-- unpack the JNA DLLs for Windows to work around
         https://github.com/processing/processing/issues/3624 -->

    <condition property="jna.subfolder" value="win32-x86">
      <equals arg1="${sun.arch.data.model}" arg2="32" />
    </condition>
    <condition property="jna.subfolder" value="win32-x86-64">
      <equals arg1="${sun.arch.data.model}" arg2="64" />
    </condition>

    <unzip src="../app/lib/jna.jar" dest="windows/work/lib">
      <patternset>
        <include name="com/sun/jna/${jna.subfolder}/jnidispatch.dll" />
      </patternset>
      <mapper type="flatten"/>
    </unzip>

    <copy todir="windows/work">
      <fileset dir=".." includes="core/library/**" />
      <fileset dir="shared" includes="launch4j/**" />
      <fileset dir="shared" includes="lib/**" />
      <fileset dir="shared" includes="modes/**" />
      <fileset file="shared/revisions.txt" />
    </copy>

    <fixcrlf file="windows/work/revisions.txt" eol="crlf" encoding="UTF-8" />

    <antcall target="assemble">
      <param name="target.path" value="windows/work" />
    </antcall>

    <property name="launch4j.dir" value="windows/work/modes/java/application/launch4j" />

    <!-- rename the version we need -->
    <move file="${launch4j.dir}/bin/windres-windows.exe"
          tofile="${launch4j.dir}/bin/windres.exe" />
    <move file="${launch4j.dir}/bin/ld-windows.exe"
          tofile="${launch4j.dir}/bin/ld.exe" />

    <!-- remove the others -->
    <delete failonerror="true">
      <fileset dir="${launch4j.dir}/bin" includes="ld-*" />
      <fileset dir="${launch4j.dir}/bin" includes="windres-*" />
    </delete>

    <taskdef name="launch4j"
             classname="net.sf.launch4j.ant.Launch4jTask"
             classpath="${launch4j.dir}/launch4j.jar; ${launch4j.dir}/lib/xstream.jar" />

    <!-- not all launch4j options are available when embedded inside this
         file (i.e. the icon param doesn't work), so use a config file -->
    <launch4j configFile="windows/config.xml" />
    <launch4j configFile="windows/config-cmd.xml" />

    <!-- cygwin requires html, dll, and exe to have the +x flag -->
    <chmod perm="ugo+x">
      <fileset dir="windows/work" includes="**/*.html, **/*.dll, **/*.exe" />
    </chmod>

    <!-- starting with 2.0a7, require the local JRE + tools.jar -->
<!--
    <get src="http://download.processing.org/java/${jre.file}"
         dest="windows/jre.tgz"
         usetimestamp="true" />
-->

    <!--
    <unzip dest="windows/work" src="windows/jre.zip" overwrite="false"/>
    -->
    <!-- Hopefully this is OK with the permissions (unlike Linux),
         since those shouldn't matter on Windows. -->
    <untar compression="gzip"
           dest="windows/work"
           src="${jre.tgz.path}"
           overwrite="false" />
    <move file="windows/work/jre${jdk.esoteric}"
          tofile="windows/work/java" />

    <!-- Remove unused JRE bloat. -->
    <delete failonerror="true">
      <!--
      <fileset refid="javafx-basics" />
      <fileset refid="javafx-windows" />
      -->
      <fileset refid="jre-optional-windows" />
    </delete>
  </target>

  <target name="windows-run" depends="windows-build"
          description="Run windows version">
    <exec executable="windows/work/processing.exe"
          dir="windows/work" spawn="true"/>
  </target>

  <target name="windows-dist" depends="windows-build"
          description="Create .zip files of windows version">
    <!--
    <zip basedir="windows/work"
         prefix="processing-${version}"
         destfile="windows/processing-${version}.zip" />
    <zip basedir="windows/work"
         prefix="processing-${version}"
         destfile="windows/processing-${version}-expert.zip"
         excludes="java/**" />
    -->

    <property name="windows.dist" value="windows/processing-${version}-windows${sun.arch.data.model}.zip" />

    <zip destfile="${windows.dist}">
      <zipfileset dir="windows/work"
                  prefix="processing-${version}" />
    </zip>

<!-- Expert is too much of a headache. Just nix it for 2.0. -->
<!--
    <zip destfile="windows/processing-${version}-windows-expert.zip">
      <zipfileset dir="windows/work"
                  prefix="processing-${version}"
                  excludes="java/**" />
    </zip>
-->

    <echo>
      =======================================================
      Processing for Windows was built. Grab the archive from

      ${windows.dist}
      =======================================================
    </echo>
  </target>


  <!-- bundle a bunch of PNGs into an OS X iconset -->
  <target name="iconset">
    <mkdir dir="${icon.set}" />
    <!--<echo message="root = ${icon.root} / set = ${icon.set}" />-->

    <copy file="${icon.root}-16.png"
          tofile="${icon.set}/icon_16x16.png" />
    <copy file="${icon.root}-32.png"
          tofile="${icon.set}/icon_16x16@2x.png" />

    <copy file="${icon.root}-32.png"
          tofile="${icon.set}/icon_32x32.png" />
    <copy file="${icon.root}-64.png"
          tofile="${icon.set}/icon_32x32@2x.png" />

    <copy file="${icon.root}-128.png"
          tofile="${icon.set}/icon_128x128.png" />
    <copy file="${icon.root}-256.png"
          tofile="${icon.set}/icon_128x128@2x.png" />

    <copy file="${icon.root}-256.png"
          tofile="${icon.set}/icon_256x256.png" />
    <copy file="${icon.root}-512.png"
          tofile="${icon.set}/icon_256x256@2x.png" />

    <copy file="${icon.root}-512.png"
          tofile="${icon.set}/icon_512x512.png" />
    <copy file="${icon.root}-1024.png"
          tofile="${icon.set}/icon_512x512@2x.png" />

    <exec executable="iconutil" logError="true">
      <arg line="-c icns -o ${icon.icns} ${icon.set}" />
    </exec>

    <delete dir="${icon.set}" />
  </target>


  <!-- Target to create the icons... putting this in here rather than docs.
       For OS X (though Linux might work), not intended for general use,
       because it requires things like iconutil (on OS X) or ImageMagick's
       convert tool (primarily in *nix environments). -->
  <target name="icons">
    <property name="icon.set" value="/tmp/pde.iconset" />

    <!-- create iconset for the PDE application for Mac OS X -->
    <antcall target="iconset">
      <param name="icon.root" value="shared/lib/icons/pde" />
      <param name="icon.icns" value="macosx/processing.icns" />
    </antcall>

    <!-- create iconset for exported sketch on Mac OS X -->
    <antcall target="iconset">
      <param name="icon.root" value="../core/src/icon/icon" />
      <param name="icon.icns" value="../java/application/sketch.icns" />
    </antcall>

    <!-- Create .ico for the PDE itself
         https://msdn.microsoft.com/en-us/library/dn742485.aspx
         "Application icons and Control Panel items: The full set includes
         16x16, 32x32, 48x48, and 256x256 (code scales between 32 and 256).
         The .ico file format is required. For Classic Mode, the full set
         is 16x16, 24x24, 32x32, 48x48 and 64x64."
         We're missing size 24x24, but, eh... -->
    <exec executable="convert" dir="shared/lib/icons">
      <arg line="pde-16.png pde-32.png pde-48.png pde-64.png pde-256.png ../../../windows/application.ico" />
    </exec>

    <!-- Create .ico for exported Java applications -->
    <exec executable="convert" dir="../core/src/icon">
      <arg line="icon-16.png icon-32.png icon-48.png icon-64.png icon-256.png ../../../java/application/sketch.ico" />
    </exec>
  </target>


  <!-- - - - - - - - - - - - - - - - - - -->
  <!-- Package source 'n tag the release -->
  <!-- - - - - - - - - - - - - - - - - - -->

<!--
not ready to automate this yet, since we often have to reset the tag
  <target name="dist-src" depends="dist">
    <exec executable="git">
remove the spaces for depth since it should be double dash, but screws up comments
      <arg line="clone - -depth 1 git@github.com:processing/processing.git /tmp/processing-${version}-src" />
    </exec>
  </target>
-->


  <!-- - - - - - - - - -->
  <!-- Developer Docs -->
  <!-- - - - - - - - - -->

  <target name="doc">

    <mkdir dir="javadoc" />

    <!-- Core is in the classpath, so we must build it. -->
    <subant buildpath="../core" target="build" failonerror="false" />

    <!-- build doc for core -->
    <exec executable="find" dir="javadoc" errorproperty="ignored">
      <arg line="core -type f -exec rm -rf {} ';'" />
    </exec>

    <javadoc access="public" author="false" classpath="../core/library/jogl-all.jar:../core/bin:../core/library/gluegen-rt.jar" destdir="javadoc/core" nodeprecated="false" nodeprecatedlist="false" noindex="false" nonavbar="false" notree="false" source="1.8" splitindex="false" use="false" version="false">

      <!-- provide links for java.* classes.
           also suppresses the java.lang prefix in the text.  -->
      <link href="http://docs.oracle.com/javase/7/docs/api/" />

      <!-- prevent files from always appearing to have changed -->
      <arg value="-notimestamp" />

      <arg value="-quiet" />

      <!-- Suppress errors and display some information. -->
      <tag name="webref" enabled="false" />
      <tag name="nowebref" enabled="false" />
      <tag name="generate" enabled="false" />
      <tag name="instanceName" enabled="false" />
      <tag name="see_external" enabled="false" />
      <tag name="brief" description="In brief:" />
      <tag name="usage" />
      <arg value="-Xdoclint:reference,accessibility" />

      <packageset dir="../core/src">
        <include name="processing/**" />
      </packageset>

    </javadoc>

<!--
    <copy file="javadoc/stylesheet.css"
          tofile="javadoc/core/stylesheet.css" />
    <copy file="javadoc/index.html"
          tofile="javadoc/core/index.html" />
-->

    <!-- build everything else -->
    <exec executable="find" dir="javadoc" errorproperty="ignored">
      <arg line="everything -type f -exec rm -rf {} ';'" />
    </exec>

    <javadoc access="public" author="false" classpath="../app/lib/ant.jar:../app/lib/ant-launcher.jar:../app/lib/antlr.jar:../app/lib/apple.jar:../app/lib/jna.jar:../app/lib/jna-platform.jar:../core/bin:../core/library/gluegen-rt.jar:../core/library/jogl-all.jar:../java/libraries/svg:../java/libraries/pdf/library/itext.jar:../java/libraries/dxf:../java/libraries/serial/library:${java.home}/lib/tools.jar" destdir="javadoc/everything" nodeprecated="false" nodeprecatedlist="false" noindex="false" nonavbar="false" notree="false" source="1.8" splitindex="false" use="false" version="false" noqualifier="all">

      <arg value="-notimestamp" />

      <arg value="-quiet" />

      <link href="http://docs.oracle.com/javase/7/docs/api/" />

      <packageset dir="../app/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>


      <tag name="webref" enabled="false" />
      <tag name="nowebref" enabled="false" />
      <tag name="generate" enabled="false" />
      <tag name="instanceName" enabled="false" />
      <tag name="see_external" enabled="false" />
      <tag name="brief" description="In brief:" />
      <tag name="usage" />
      <arg value="-Xdoclint:reference,accessibility" />

      <!--<packageset dir="../app/generated">
        <include name="processing/**" />
      </packageset>-->

      <packageset dir="../core/src">
        <include name="processing/**" />
        <!--
        <include name="japplemenubar/**" />
        -->
      </packageset>
    </javadoc>


    <!-- do libraries -->
    <exec executable="find" dir="javadoc" errorproperty="ignored">
      <arg line="libraries -type f -exec rm -rf {} ';'" />
    </exec>

    <javadoc access="public" author="false" classpath="../app/lib/ant.jar:../app/lib/ant-launcher.jar:../app/lib/antlr.jar:../app/lib/apple.jar:../app/lib/jna.jar:../app/lib/jna-platform.jar:../core/bin:../core/library/gluegen-rt.jar:../core/library/jogl-all.jar:../java/libraries/svg/library/batik-dom-1.8.jar:../java/libraries/svg/library/batik-svggen-1.8.jar:../java/libraries/pdf/library/itext.jar:../java/libraries/dxf:../java/libraries/serial/library/jssc.jar:${java.home}/lib/tools.jar" destdir="javadoc/libraries" nodeprecated="false" nodeprecatedlist="false" noindex="false" nonavbar="false" notree="false" source="1.8" splitindex="false" use="false" version="false" noqualifier="all">

      <arg value="-notimestamp" />

      <arg value="-quiet" />

      <link href="http://docs.oracle.com/javase/7/docs/api/" />
      <link href="../../javadoc/core/" />

      <tag name="webref" enabled="false" />
      <tag name="nowebref" enabled="false" />
      <tag name="generate" enabled="false" />
      <tag name="instanceName" enabled="false" />
      <tag name="see_external" enabled="false" />
      <tag name="brief" description="In brief:" />
      <tag name="usage" />
      <arg value="-Xdoclint:reference,accessibility" />


      <packageset dir="../java/libraries/dxf/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>
      <packageset dir="../java/libraries/io/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>
      <packageset dir="../java/libraries/net/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>
      <packageset dir="../java/libraries/pdf/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>
      <packageset dir="../java/libraries/serial/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>
      <packageset dir="../java/libraries/svg/src">
        <include name="antlr/**" />
        <include name="processing/**" />
      </packageset>
    </javadoc>



<!--
    <copy file="javadoc/stylesheet.css"
          tofile="javadoc/everything/stylesheet.css" />
    <copy file="javadoc/index.html"
          tofile="javadoc/everything/index.html" />
-->

    <!-- set the MIME type so that Google Code shows the files properly -->
<!--
    <exec executable="find" dir=".">
      <arg line="javadoc -name '*.html' -exec svn propset svn:mime-type text/html {} ';'" />
    </exec>
-->

  </target>

<!-- no longer necessary because it comes straight from Google Code -->
<!--
  <target name="doc-upload">
    <exec executable="rsync" dir="javadoc" spawn="true">
      <arg value="-avz" />
      <arg value="- -delete" />
      <arg value="core/" />
      <arg value="fry@processing.org:dev/reference/core/javadoc/" />
    </exec>

    <exec executable="rsync" dir="javadoc" spawn="true">
      <arg value="-avz" />
      <arg value="- -delete" />
      <arg value="everything/" />
      <arg value="fry@processing.org:dev/reference/core/everything/" />
    </exec>

    rsync -avz - -delete core/ fry@processing.org:dev/reference/core/javadoc/
    rsync -avz - -delete everything/ fry@processing.org:dev/reference/everything/javadoc/
  </target>
-->


  <!-- - - - - - - - -->
  <!-- Run It!       -->
  <!-- - - - - - - - -->

  <target name="clean" description="Perform a spring cleaning"
          depends="linux-clean, windows-clean, macosx-clean, subprojects-clean">
  </target>

</project>
