<?xml version="1.0"?>
<project name="Arduino" default="build">
  <!--echo message="os.name = ${os.name}" /-->
  <!--echo message="os.arch = ${os.arch}" /-->
  <!--echo message="os.version = ${os.version}" /-->

  <tstamp>
    <format property="BUILD_DATE" pattern="yyyy/MM/dd hh:mm"/>
  </tstamp>

  <!-- Sets properties for macosx/windows/linux depending on current system -->
  <condition property="platform" value="macosx-old">
    <and>
      <os family="mac" />
      <matches string="${os.version}" pattern="^10.[56]." />
    </and>
  </condition>
  <condition property="macosx-old"><equals arg1="${platform}" arg2="macosx-old" /></condition>
  <fail if="macosx-old" message="MacOSX older than 10.7 are not supported"/>

  <condition property="platform" value="macosx"><os family="mac" /></condition>
  <condition property="platform" value="windows"><os family="windows" /></condition>
  <condition property="platform" value="linux32"><os family="unix" arch="i386" /></condition>
  <condition property="platform" value="linux64"><os family="unix" arch="amd64" /></condition>
  <condition property="platform" value="linuxarm"><os family="unix" arch="arm" /></condition>
  <condition property="platform" value="linuxaarch64"><os family="unix" arch="aarch64" /></condition>

  <condition property="windows_host" value="true"><os family="windows" /></condition>

  <condition property="macosx"><equals arg1="${platform}" arg2="macosx" /></condition>
  <condition property="windows"><equals arg1="${platform}" arg2="windows" /></condition>
  <condition property="linux32"><equals arg1="${platform}" arg2="linux32" /></condition>
  <condition property="linux64"><equals arg1="${platform}" arg2="linux64" /></condition>
  <condition property="linux"><equals arg1="${platform}" arg2="linux32" /></condition>
  <condition property="linux"><equals arg1="${platform}" arg2="linux64" /></condition>
  <condition property="linux"><equals arg1="${platform}" arg2="linuxarm" /></condition>
  <condition property="linux"><equals arg1="${platform}" arg2="linuxaarch64" /></condition>

  <condition property="staging_folder" value="macosx"><equals arg1="${platform}" arg2="macosx" /></condition>
  <condition property="staging_folder" value="windows"><equals arg1="${platform}" arg2="windows" /></condition>
  <condition property="staging_folder" value="linux"><equals arg1="${platform}" arg2="linux32" /></condition>
  <condition property="staging_folder" value="linux"><equals arg1="${platform}" arg2="linux64" /></condition>
  <condition property="staging_folder" value="linux"><equals arg1="${platform}" arg2="linuxarm" /></condition>
  <condition property="staging_folder" value="linux"><equals arg1="${platform}" arg2="linuxaarch64" /></condition>

  <condition property="staging_hardware_folder" value="Arduino.app/Contents/Java/hardware"><equals arg1="${platform}" arg2="macosx" /></condition>
  <condition property="staging_hardware_folder" value="hardware"><equals arg1="${platform}" arg2="windows" /></condition>
  <condition property="staging_hardware_folder" value="hardware"><equals arg1="${platform}" arg2="linux32" /></condition>
  <condition property="staging_hardware_folder" value="hardware"><equals arg1="${platform}" arg2="linux64" /></condition>
  <condition property="staging_hardware_folder" value="hardware"><equals arg1="${platform}" arg2="linuxarm" /></condition>
  <condition property="staging_hardware_folder" value="hardware"><equals arg1="${platform}" arg2="linuxaarch64" /></condition>

  <condition property="arch-bits" value="32">
    <equals arg1="${platform}" arg2="linux32"/>
  </condition>
  <condition property="arch-bits" value="32">
    <equals arg1="${platform}" arg2="linuxarm"/>
  </condition>
  <condition property="arch-bits" value="64">
    <equals arg1="${platform}" arg2="linux64"/>
  </condition>
  <condition property="arch-bits" value="64">
    <equals arg1="${platform}" arg2="linuxaarch64"/>
  </condition>

  <condition property="launch4j-download-unpack-target-name" value="launch4j-windows"><os family="windows" /></condition>
  <property name="launch4j-download-unpack-target-name" value="launch4j-linux"/>

  <property name="MACOSX_BUNDLED_JVM" value="${java.home}/../"/>
  <property name="WINDOWS_BUNDLED_JVM" value="${java.home}"/>
  <property name="LINUX32_BUNDLED_JVM" value="none"/>
  <property name="LINUX64_BUNDLED_JVM" value="none"/>
  <property name="LINUXARM_BUNDLED_JVM" value="none"/>
  <property name="LINUXAARCH64_BUNDLED_JVM" value="none"/>
  <condition property="linux-bundle-jvm-task" value="noop">
    <and>
      <equals arg1="${LINUX32_BUNDLED_JVM}" arg2="none"/>
      <equals arg1="${LINUX64_BUNDLED_JVM}" arg2="none"/>
      <equals arg1="${LINUXARM_BUNDLED_JVM}" arg2="none"/>
      <equals arg1="${LINUXAARCH64_BUNDLED_JVM}" arg2="none"/>
    </and>
  </condition>
  <condition property="linux-bundle-jvm-task" value="bundle">
    <or>
      <not>
        <equals arg1="${LINUX32_BUNDLED_JVM}" arg2="none"/>
      </not>
      <not>
        <equals arg1="${LINUX64_BUNDLED_JVM}" arg2="none"/>
      </not>
      <not>
        <equals arg1="${LINUXARM_BUNDLED_JVM}" arg2="none"/>
      </not>
      <not>
        <equals arg1="${LINUXAARCH64_BUNDLED_JVM}" arg2="none"/>
      </not>
    </or>
  </condition>

  <property name="portable" value="false" />

  <property name="ARDUINO-BUILDER-VERSION" value="1.5.2" />
  <property name="LIBLISTSERIAL-VERSION" value="1.4.2-2" />
  <property name="AVRGCC-VERSION" value="7.3.0-atmel3.6.1-arduino5" />
  <property name="AVRDUDE-VERSION" value="6.3.0-arduino17" />
  <property name="AVRCORE-VERSION" value="1.8.2" />
  <property name="arduinoOTA-VERSION" value="1.3.0" />

  <!-- Libraries required for running arduino -->
  <fileset dir=".." id="runtime.jars">
    <include name="arduino-core/arduino-core.jar" />
    <include name="app/pde.jar" />
    <include name="app/lib/*.jar" />
    <include name="arduino-core/lib/*.jar" />
  </fileset>

  <!-- Remove all default excludes for directory tasks (see https://ant.apache.org/manual/dirtasks.html#defaultexcludes) -->
  <defaultexcludes remove="**/.git"/>
  <defaultexcludes remove="**/.git/**"/>
  <defaultexcludes remove="**/.gitattributes"/>
  <defaultexcludes remove="**/.gitignore"/>
  <defaultexcludes remove="**/.gitmodules"/>
  <defaultexcludes remove="**/.hg"/>
  <defaultexcludes remove="**/.hg/**"/>
  <defaultexcludes remove="**/.hgignore"/>
  <defaultexcludes remove="**/.hgsub"/>
  <defaultexcludes remove="**/.hgsubstate"/>
  <defaultexcludes remove="**/.hgtags"/>
  <defaultexcludes remove="**/.bzr"/>
  <defaultexcludes remove="**/.bzr/**"/>
  <defaultexcludes remove="**/.bzrignore"/>

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

    <antcall target="generate-hourly-build-txt"/>
  </target>

  <target name="run" description="Packs and runs Arduino">
    <antcall target="${platform}-run" />
  </target>

  <target name="start" description="Starts Arduino">
    <antcall target="${platform}-start" />
  </target>

  <target name="dist" depends="revision-check" description="Build Arduino for distribution.">
    <input message="Enter version number:" addproperty="version" defaultvalue="${revision}"/>
    <condition property="full-version" value="${version}-${platform}">
      <not>
        <equals arg1="${portable}" arg2="true"/>
      </not>
    </condition>
    <condition property="full-version" value="${version}-${platform}-portable">
      <equals arg1="${portable}" arg2="true"/>
    </condition>
    <antcall target="${platform}-dist">
      <param name="full-version" value="${full-version}"/>
    </antcall>
  </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>

  <target name="test" depends="subprojects-build, subprojects-test"/>

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

  <target name="subprojects-clean">
    <subant buildpath="../arduino-core" target="clean"/>
    <subant buildpath="../app" target="clean"/>
  </target>

  <target name="subprojects-build">
    <subant buildpath="../arduino-core" target="build"/>
    <subant buildpath="../app" target="build"/>
  </target>

  <target name="subprojects-test">
    <subant buildpath="../app" target="test">
      <propertyset>
        <!-- Forward these to subant. Use propertyset/propertyref instead of a direct property so we do not need to specify a value -->
        <propertyref name="single-test-class"/>
        <propertyref name="single-test-methods"/>
        <propertyref name="running-from-github-actions"/>
      </propertyset>
    </subant>
  </target>

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

  <target name="assemble">
    <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 file="shared/icons/48x48/apps/arduino.png" tofile="${target.path}/lib/arduino_small.png"/>

    <antcall target="assemble-hardware" />

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

    <mkdir dir="${target.path}/reference"/>

    <antcall target="assemble-docs" />

    <!-- Write the revision file! -->
    <echo file="${target.path}/lib/version.txt" message="${version}" />

    <antcall target="assemble-libraries" />

    <!-- Add WiFi101 updater tool -->
    <antcall target="unzip">
      <param name="archive_file" value="shared/WiFi101-Updater-ArduinoIDE-Plugin-0.10.10.zip" />
      <param name="archive_url" value="https://github.com/arduino-libraries/WiFi101-FirmwareUpdater-Plugin/releases/download/v0.10.10/WiFi101-Updater-ArduinoIDE-Plugin-0.10.10.zip" />
      <param name="final_folder" value="${target.path}/tools/WiFi101" />
      <param name="dest_folder" value="${target.path}/tools/" />
    </antcall>
  </target>

  <target name="assemble-docs" unless="no_docs">
      <!-- Unzip documentation -->
      <antcall target="unzip">
        <param name="archive_file" value="shared/reference-1.6.6-3.zip" />
        <param name="archive_url" value="https://downloads.arduino.cc/reference-1.6.6-3.zip" />
        <param name="final_folder" value="${target.path}/reference/www.arduino.cc" />
        <param name="dest_folder" value="${target.path}/reference/" />
      </antcall>
  </target>

  <!-- copy library folder -->
  <target name="assemble-libraries" unless="light_bundle">
    <download-library name="Ethernet" version="2.0.0"/>
    <download-library name="GSM" version="1.0.6"/>
    <download-library name="Stepper" version="1.1.3"/>
    <download-library name="TFT" version="1.0.6"/>
    <download-library name="WiFi" version="1.2.7"/>
    <download-library githubuser="firmata" name="arduino" version="2.5.8" foldername="Firmata"/>
    <download-library name="Bridge" version="1.7.0"/>
    <download-library name="Robot_Control" version="1.0.4"/>
    <download-library name="Robot_Motor" version="1.0.3"/>
    <download-library name="RobotIRremote" version="2.0.0"/>
    <download-library name="SpacebrewYun" version="1.0.2"/>
    <download-library name="Temboo" version="1.2.1"/>
    <download-library name="Esplora" version="1.0.4"/>
    <download-library name="Mouse" version="1.0.1"/>
    <download-library name="Keyboard" version="1.0.2"/>
    <download-library name="SD" version="1.2.4"/>
    <download-library name="Servo" version="1.1.6"/>
    <download-library name="LiquidCrystal" version="1.0.7"/>
    <download-library githubuser="Adafruit" name="Adafruit_CircuitPlayground" version="1.10.4" foldername="Adafruit_Circuit_Playground"/>
  </target>

  <macrodef name="download-library">
    <attribute name="name"/>
    <attribute name="foldername" default="@{name}"/>
    <attribute name="version"/>
    <attribute name="tag" default="@{version}"/>
    <attribute name="githubuser" default="arduino-libraries"/>
    <sequential>
      <antcall target="unzip">
        <param name="archive_file" value="@{foldername}-@{version}.zip"/>
        <param name="archive_url" value="https://github.com/@{githubuser}/@{name}/archive/@{tag}.zip"/>
        <param name="final_folder" value="${target.path}/libraries/@{name}-@{version}"/>
        <param name="dest_folder" value="${target.path}/libraries"/>
      </antcall>
      <move file="${target.path}/libraries/@{name}-@{version}" tofile="${target.path}/libraries/@{foldername}"/>
    </sequential>
  </macrodef>

  <!-- copy hardware folder -->
  <target name="assemble-hardware" unless="light_bundle">
    <mkdir dir="${target.path}/hardware/arduino" />
    <antcall target="untar-bz2">
      <param name="archive_file" value="avr-${AVRCORE-VERSION}.tar.bz2"/>
      <param name="archive_url" value="https://downloads.arduino.cc/cores/avr-${AVRCORE-VERSION}.tar.bz2"/>
      <param name="final_folder" value="${target.path}/hardware/arduino/avr"/>
      <param name="dest_folder" value="${target.path}/hardware/arduino"/>
    </antcall>
    <copy file="../hardware/package_index_bundled.json" todir="${target.path}/hardware/" />
  </target>

  <!-- - - - - - - - - -->
  <!-- Revision check  -->
  <!-- - - - - - - - - -->
  <target name="revision-check">

    <!-- figure out the latest AVR core version number in package_index.json -->
    <loadfile srcfile="../hardware/package_index_bundled.json" property="revision.avr.index">
      <filterchain>
        <tokenfilter>
          <linetokenizer />
          <containsregex pattern="archiveFileName.*&quot;avr-.......?tar.bz2"/>
          <replaceregex pattern=".*avr-(.*).tar.bz2.*" flags="g" replace="\1"/>
        </tokenfilter>
        <striplinebreaks/>
        <tailfilter lines="1"/>
      </filterchain>
    </loadfile>

    <echo message="AVR Arduino core version in build.xml is: ${AVRCORE-VERSION}" />
    <echo message="    latest in package_index_bundled.json is: ${revision.avr.index}" />
    <condition property="revision.avr.ok">
      <or>
        <!-- fail build if -Drevision.check=enforce is set -->
        <not><equals arg1="${revision.check}" arg2="enforce"/></not>
        <equals arg1="${revision.avr.index}" arg2="${AVRCORE-VERSION}"/>
      </or>
    </condition>
    <fail unless="revision.avr.ok">
      Mismatching versions for bundled AVR core and package_index_bundled.json.
      Please check your package_index_bundled.json.
    </fail>

    <!-- figure out the IDE version number -->
    <loadfile srcfile="shared/revisions.txt" property="revision">
      <filterchain>
        <ignoreblank />
        <headfilter lines="1"/>
        <tokenfilter>
          <linetokenizer includeDelims="false" />
          <!-- grab the thing from the first line that's 4 digits -->
          <containsregex pattern="ARDUINO ([^ ]*)" />
          <replaceregex pattern="ARDUINO ([^ ]*).*" replace="\1" />
        </tokenfilter>
        <tokenfilter>
          <stringtokenizer suppressdelims="true" />
        </tokenfilter>
      </filterchain>
    </loadfile>

    <!-- figure out the IDE version number in base.java -->
    <loadfile srcfile="../arduino-core/src/processing/app/BaseNoGui.java"
	      property="revision.base">
      <filterchain>
        <tokenfilter>
          <linetokenizer />
          <containsregex pattern="String VERSION_NAME = "/>
          <replaceregex pattern=".*&quot;(.*)&quot;.*" flags="g" replace="\1"/>
        </tokenfilter>
      </filterchain>
    </loadfile>
    <echo message="Latest revision detected in shared/revision.txt is: ${revision}" />
    <echo message="                     Revision in BaseNoGui.java is: ${revision.base}" />
  </target>

  <!-- - - - - - - - -->
  <!-- Mac OS X      -->
  <!-- - - - - - - - -->
  <target name="macosx-clean" depends="subprojects-clean" description="Clean Mac OS X build">
    <delete dir="macosx/work" />
    <delete dir="macosx/working_dir" />
    <delete dir="macosx/working.dmg" />
    <delete file="macosx/arduino-*.dmg" />
    <delete>
      <fileset dir="macosx" includes="arduino-*macosx*.zip"/>
    </delete>
  </target>

  <target name="macosx-checkos" unless="macosx">
    <echo>
      =======================================================
      Arduino 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-checkos, subprojects-build" description="Build Mac OS X version">
    <fail unless="MACOSX_BUNDLED_JVM" message="MacOSX requires MACOSX_BUNDLED_JVM property set"/>
    <mkdir dir="${staging_folder}/work" />

    <antcall target="unzip">
      <param name="archive_file" value="${staging_folder}/appbundler-1.0ea-arduino5.jar.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/appbundler-1.0ea-arduino5.jar.zip" />
      <param name="final_folder" value="${staging_folder}/appbundler-1.0ea-arduino5" />
      <param name="dest_folder" value="${staging_folder}/appbundler-1.0ea-arduino5" />
    </antcall>

    <taskdef name="bundleapp" classname="com.oracle.appbundler.AppBundlerTask" classpath="${staging_folder}/appbundler-1.0ea-arduino5/appbundler-1.0ea-arduino5.jar"/>

    <bundleapp
            jvmRequired="1.8"
            jrepreferred="true"
            outputdirectory="${staging_folder}/work"
            name="Arduino"
            displayname="Arduino"
            executablename="Arduino"
            identifier="cc.arduino.Arduino"
            shortversion="${version}"
            version="${revision}"
            signature="Pde1"
            icon="macosx/processing.icns"
            mainclassname="processing.app.Base"
            copyright="Arduino LLC"
            applicationCategory="public.app-category.education"
            minimumsystemversion="10.8"
            highresolutioncapable="true">

      <runtime dir="${MACOSX_BUNDLED_JVM}"/>

      <arch name="x86_64"/>
      <arch name="i386"/>

      <classpath refid="runtime.jars"/>

      <option value="-Dapple.awt.application.name=Arduino"/>
      <option value="-Dcom.apple.macos.use-file-dialog-packages=true"/>
      <option value="-Dcom.apple.smallTabs=true"/>
      <option value="-DAPP_DIR=$APP_ROOT/Contents/Java"/>
      <option value="-Djava.ext.dirs=$JVM_RUNTIME/Contents/Home/lib/ext/:$JVM_RUNTIME/Contents/Home/jre/lib/ext/"/>
      <option value="-Djava.net.preferIPv4Stack=true"/>

      <!--
      <option value="-Dapple.awt.showGrowBox=false"/>
      <option value="-Dapple.awt.Antialiasing=false"/>
      <option value="-Dapple.awt.TextAntialiasing=true"/>
      <option value="-Dcom.apple.hwaccel=true"/>
      <option value="-Dapple.awt.graphics.UseQuartz=true"/>
      -->

      <!--<option value="-Dcom.apple.macos.useScreenMenuBar=true"/>-->

      <!-- Workaround since the icon parameter for bundleapp doesn't work -->
      <option value="-Xdock:name=Arduino"/>
      <option value="-Dcom.apple.mrj.application.apple.menu.about.name=Arduino"/>
      <option value="-Dfile.encoding=UTF-8"/>

      <option value="-Xms128M"/>
      <option value="-Xmx512M"/>
      <option value="-splash:$APP_ROOT/Contents/Java/lib/splash.png"/>

      <bundledocument extensions="ino,c,cpp,h"
                      icon="macosx/pde.icns"
                      name="Arduino Source File"
                      role="Editor" ispackage="false">
      </bundledocument>

    </bundleapp>

    <mkdir dir="${staging_folder}/work/${staging_hardware_folder}" />

    <copy todir="${staging_folder}/work/${staging_hardware_folder}/../">
      <fileset dir="shared" includes="lib/**" />
      <fileset file="shared/revisions.txt" />
    </copy>

    <mkdir dir="${staging_folder}/work" />
    <mkdir dir="${staging_folder}/work/${staging_hardware_folder}" />

    <antcall target="macosx-build-avr-toolchain" />

    <antcall target="assemble">
      <param name="target.path" value="${staging_folder}/work/${staging_hardware_folder}/.." />
    </antcall>

    <antcall target="unzip">
      <param name="archive_file" value="./libastylej-2.05.1-5.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/libastylej-2.05.1-5.zip" />
      <param name="final_folder" value="${staging_folder}/libastylej-2.05.1" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="macosx/libastylej-2.05.1/libastylej.jnilib" todir="macosx/work/${staging_hardware_folder}/../lib/" />
    <chmod perm="755" file="macosx/work/${staging_hardware_folder}/../lib/libastylej.jnilib" />
    <copy file="macosx/libastylej-2.05.1/libastylej.jnilib" tofile="macosx/work/${staging_hardware_folder}/../lib/libastylej.dylib" />
    <chmod perm="755" file="macosx/work/${staging_hardware_folder}/../lib/libastylej.dylib" />

    <antcall target="unzip">
      <param name="archive_file" value="./liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/liblistSerials/liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="final_folder" value="${staging_folder}/liblistSerials-${LIBLISTSERIAL-VERSION}" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="macosx/liblistSerials-${LIBLISTSERIAL-VERSION}/osx/liblistSerialsj.dylib" todir="macosx/work/${staging_hardware_folder}/../lib/" />
    <chmod perm="755" file="macosx/work/${staging_hardware_folder}/../lib/liblistSerialsj.dylib" />

    <property name="ARDUINO-BUILDER-EXTRA-VERSION" value="-signed" />
    <antcall target="build-arduino-builder" />

    <antcall target="portable-${portable}">
      <param name="parentdir" value="macosx/work/${staging_hardware_folder}/.." />
    </antcall>
  </target>

  <!-- Unzip AVR tools -->
  <target name="macosx-build-avr-toolchain" unless="light_bundle">
    <antcall target="avr-toolchain-bundle">
      <param name="unpack_target" value="untar-native"/>
      <param name="gcc_archive_file" value="avr-gcc-${AVRGCC-VERSION}-x86_64-apple-darwin14-signed.tar.bz2"/>
      <param name="gcc_version" value="${AVRGCC-VERSION}"/>
      <param name="avrdude_archive_file" value="avrdude-${AVRDUDE-VERSION}-x86_64-apple-darwin12-signed.tar.bz2"/>
      <param name="avrdude_version" value="${AVRDUDE-VERSION}"/>
      <param name="arduinoOTA_archive_file" value="arduinoOTA-${arduinoOTA-VERSION}-darwin_amd64-signed.tar.bz2"/>
      <param name="arduinoOTA_version" value="${arduinoOTA-VERSION}"/>
    </antcall>

    <chmod perm="+x">
      <fileset dir="${staging_folder}/work/${staging_hardware_folder}/tools" includes="**/bin/*"/>
      <fileset dir="${staging_folder}/work/${staging_hardware_folder}/tools" includes="**/libexec/gcc/avr/4.8.1/*"/>
    </chmod>
  </target>

  <target name="macosx-run" depends="build,start"/>

  <target name="macosx-start">
    <exec executable="macosx/work/Arduino.app/Contents/MacOS/Arduino" spawn="false" failonerror="true"/>
  </target>

  <!-- - - - - - - - - - - - - - - - -->
  <!-- Sign application for MacOSX.  -->
  <!-- - - - - - - - - - - - - - - - -->
  <target name="macosx-signed-dist" if="macosx" depends="macosx-singed-dist-check, dist"
    description="Create a downloadable and signed .zip for the Mac OS X version">
    <fail unless="version" message="Please set the property 'version' to correctly sign distribution file" />

    <!-- Remove everything from working folder -->
    <delete dir="macosx/work/Arduino.app" />

    <!-- Unzip unsigned app into working dir -->
    <exec executable="unzip" dir="macosx/work" failonerror="true">
      <arg line="../arduino-${version}-${platform}.zip" />
    </exec>

    <!-- Unlock keychain file -->
    <exec executable="security" dir="macosx/work" failonerror="true">
      <arg line="unlock-keychain -p &quot;${macosx-sign-keychain-pass}&quot; &quot;${macosx-sign-keychain}&quot;" />
    </exec>

    <!-- Sign app -->
    <exec executable="codesign" dir="macosx/work" failonerror="true">
      <arg line="--keychain &quot;${macosx-sign-keychain}&quot; --force -s &quot;${macosx-sign-id}&quot; --timestamp --options runtime --deep -v Arduino.app/" />
    </exec>

    <!-- Check for successful signing -->
    <exec executable="codesign" dir="macosx/work" failonerror="true">
      <arg line="-vvvv Arduino.app/" />
    </exec>

    <delete file="macosx/arduino-${version}-${platform}.zip" />

    <!-- Create signed zip file -->
    <exec executable="zip" dir="macosx/work" failonerror="true">
      <arg line="-q -r ../arduino-${full-version}-signed.zip ." />
    </exec>

    <echo>
      =======================================================
      Arduino for Mac OS X built and signed.

      macosx/arduino-${full-version}-signed.zip
      =======================================================
    </echo>
  </target>

  <target name="macosx-singed-dist-check">
    <fail unless="macosx-sign-keychain" message="Please set the property 'macosx-sign-keychain' to the correct keychain file" />
    <fail unless="macosx-sign-keychain-pass" message="Please set the property 'macosx-sign-keychain-pass' with the password to unlock the keychain" />
    <fail unless="macosx-sign-id" message="Please set the property 'macosx-sign-id' to the correct cert identifier" />
  </target>

  <!-- - - - - - - - - - - - - - - - - - - -->
  <!-- Build distribution file for MacOSX. -->
  <!-- - - - - - - - - - - - - - - - - - - -->
  <target name="macosx-dist" if="macosx" depends="build" description="Create a downloadable .zip for the Mac OS X version">
    <exec executable="zip" dir="macosx/work" failonerror="true">
      <arg line="-q -r ../arduino-${full-version}.zip ." />
    </exec>

    <echo>
      =======================================================
      Arduino for Mac OS X was built. Grab the image from

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

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

  <target name="linux-clean" depends="subprojects-clean" description="Clean linux version">
    <delete dir="linux/work" />
    <delete>
      <fileset dir="linux" includes="arduino-*linux*.tar.xz"/>
    </delete>
    <delete>
      <fileset dir="linux" includes="arduino-*linux*.tar.xz"/>
    </delete>
  </target>

  <target name="linux-checkos" unless="linux">
    <echo>
      =======================================================
      Arduino for Linux can only be built on unix systems.

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

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

  <target name="linux-build" depends="revision-check, linux-checkos, subprojects-build" description="Build linux version">
    <mkdir dir="linux/work" />
    <mkdir dir="linux/work/${staging_hardware_folder}" />

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

    <copy todir="linux/work">
      <fileset dir="linux/dist" includes="lib/**" />
    </copy>

    <copy todir="linux/work/lib">
      <fileset dir="shared" includes="icons/**/*.png" />
    </copy>

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

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

    <copy tofile="linux/work/lib/arduino-arduinoide.xml" file="linux/dist/mime.xml" />
    <copy todir="linux/work/lib" file="linux/dist/desktop.template" />
    <copy todir="linux/work/lib" file="linux/dist/appdata.xml" />

    <copy todir="linux/work" file="linux/dist/arduino" />
    <copy todir="linux/work" file="linux/dist/install.sh" />
    <copy todir="linux/work" file="linux/dist/arduino-linux-setup.sh" />
    <copy todir="linux/work" file="linux/dist/uninstall.sh" />

    <chmod perm="ugo+x">
        <fileset dir="linux/work" includes="arduino" />
        <fileset dir="linux/work" includes="**/*.sh" />
        <fileset dir="linux/work/lib" includes="**/*desktop*" />
    </chmod>
  </target>

  <target name="linux-libastyle-x86" depends="linux-build" description="Download libastyle.so for x86/x64 arch">
    <antcall target="unzip">
      <param name="archive_file" value="./libastylej-2.05.1-5.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/libastylej-2.05.1-5.zip" />
      <param name="final_folder" value="${staging_folder}/libastylej-2.05.1" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="linux/libastylej-2.05.1/libastylej${arch-bits}.so" tofile="linux/work/lib/libastylej.so" />
    <chmod perm="755" file="linux/work/lib/libastylej.so" />

    <antcall target="portable-${portable}">
      <param name="parentdir" value="linux/work" />
    </antcall>

    <antcall target="unzip">
      <param name="archive_file" value="./liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/liblistSerials/liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="final_folder" value="${staging_folder}/liblistSerials-${LIBLISTSERIAL-VERSION}" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="linux/liblistSerials-${LIBLISTSERIAL-VERSION}/linux${arch-bits}/liblistSerialsj.so" todir="linux/work/lib/" />
    <chmod perm="755" file="linux/work/lib/liblistSerialsj.so" />

  </target>

  <target name="linux-libastyle-arm" depends="linux-build" description="Download libastyle.so for ARM">
    <antcall target="unzip">
      <param name="archive_file" value="./libastylej-2.05.1-5.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/libastylej-2.05.1-5.zip" />
      <param name="final_folder" value="${staging_folder}/libastylej-2.05.1" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="linux/libastylej-2.05.1/libastylej_arm.so" tofile="linux/work/lib/libastylej.so" />
    <chmod perm="755" file="linux/work/lib/libastylej.so" />

    <antcall target="portable-${portable}">
      <param name="parentdir" value="linux/work" />
    </antcall>

    <antcall target="unzip">
      <param name="archive_file" value="./liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/liblistSerials/liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="final_folder" value="${staging_folder}/liblistSerials-${LIBLISTSERIAL-VERSION}" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="linux/liblistSerials-${LIBLISTSERIAL-VERSION}/arm/liblistSerialsj.so" todir="linux/work/lib/" />
    <chmod perm="755" file="linux/work/lib/liblistSerialsj.so" />

  </target>

  <target name="linuxarm-build" depends="linux-libastyle-arm" description="Build linux (32-bit) version">
    <antcall target="linux-jvm-${linux-bundle-jvm-task}">
      <param name="JVM" value="${LINUXARM_BUNDLED_JVM}"/>
    </antcall>

    <antcall target="build-arduino-builder" />

    <antcall target="avr-toolchain-bundle">
      <param name="unpack_target" value="untar-native"/>
      <param name="gcc_archive_file" value="avr-gcc-${AVRGCC-VERSION}-arm-linux-gnueabihf.tar.bz2"/>
      <param name="gcc_version" value="${AVRGCC-VERSION}"/>
      <param name="avrdude_archive_file" value="avrdude-${AVRDUDE-VERSION}-armhf-pc-linux-gnu.tar.bz2"/>
      <param name="avrdude_version" value="${AVRDUDE-VERSION}"/>
      <param name="arduinoOTA_archive_file" value="arduinoOTA-${arduinoOTA-VERSION}-linux_arm.tar.bz2"/>
      <param name="arduinoOTA_version" value="${arduinoOTA-VERSION}"/>
    </antcall>
  </target>

  <target name="linux-libastyle-aarch64" depends="linux-build" description="Download libastyle.so for AArch64">
    <antcall target="unzip">
      <param name="archive_file" value="./libastylej-2.05.1-5.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/libastylej-2.05.1-5.zip" />
      <param name="final_folder" value="${staging_folder}/libastylej-2.05.1" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="linux/libastylej-2.05.1/libastylej_aarch64.so" tofile="linux/work/lib/libastylej.so" />
    <chmod perm="755" file="linux/work/lib/libastylej.so" />

    <antcall target="portable-${portable}">
      <param name="parentdir" value="linux/work" />
    </antcall>

    <antcall target="unzip">
      <param name="archive_file" value="./liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/liblistSerials/liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="final_folder" value="${staging_folder}/liblistSerials-${LIBLISTSERIAL-VERSION}" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="linux/liblistSerials-${LIBLISTSERIAL-VERSION}/aarch64/liblistSerialsj.so" todir="linux/work/lib/" />
    <chmod perm="755" file="linux/work/lib/liblistSerialsj.so" />
  </target>

  <target name="linuxaarch64-build" depends="linux-libastyle-aarch64" description="Build Linux (AArch64) version">
    <antcall target="linux-jvm-${linux-bundle-jvm-task}">
      <param name="JVM" value="${LINUXAARCH64_BUNDLED_JVM}"/>
    </antcall>

    <antcall target="build-arduino-builder" />

    <antcall target="avr-toolchain-bundle">
      <param name="unpack_target" value="untar-native"/>
      <param name="gcc_archive_file" value="avr-gcc-${AVRGCC-VERSION}-aarch64-pc-linux-gnu.tar.bz2"/>
      <param name="gcc_version" value="${AVRGCC-VERSION}"/>
      <param name="avrdude_archive_file" value="avrdude-${AVRDUDE-VERSION}-aarch64-pc-linux-gnu.tar.bz2"/>
      <param name="avrdude_version" value="${AVRDUDE-VERSION}"/>
      <param name="arduinoOTA_archive_file" value="arduinoOTA-${arduinoOTA-VERSION}-linux_aarch64.tar.bz2"/>
      <param name="arduinoOTA_version" value="${arduinoOTA-VERSION}"/>
    </antcall>
  </target>

  <target name="linux32-build" depends="linux-libastyle-x86" description="Build linux (32-bit) version">
    <antcall target="linux-jvm-${linux-bundle-jvm-task}">
      <param name="JVM" value="${LINUX32_BUNDLED_JVM}"/>
    </antcall>

    <antcall target="build-arduino-builder" />

    <antcall target="avr-toolchain-bundle">
      <param name="unpack_target" value="untar-native"/>
      <param name="gcc_archive_file" value="avr-gcc-${AVRGCC-VERSION}-i686-pc-linux-gnu.tar.bz2"/>
      <param name="gcc_version" value="${AVRGCC-VERSION}"/>
      <param name="avrdude_archive_file" value="avrdude-${AVRDUDE-VERSION}-i686-pc-linux-gnu.tar.bz2"/>
      <param name="avrdude_version" value="${AVRDUDE-VERSION}"/>
      <param name="arduinoOTA_archive_file" value="arduinoOTA-${arduinoOTA-VERSION}-linux_386.tar.bz2"/>
      <param name="arduinoOTA_version" value="${arduinoOTA-VERSION}"/>
    </antcall>
  </target>

  <target name="linux64-build" depends="linux-libastyle-x86" description="Build linux (64-bit) version">
    <antcall target="linux-jvm-${linux-bundle-jvm-task}">
      <param name="JVM" value="${LINUX64_BUNDLED_JVM}"/>
    </antcall>

    <antcall target="build-arduino-builder" />

    <antcall target="avr-toolchain-bundle">
      <param name="unpack_target" value="untar-native"/>
      <param name="gcc_archive_file" value="avr-gcc-${AVRGCC-VERSION}-x86_64-pc-linux-gnu.tar.bz2"/>
      <param name="gcc_version" value="${AVRGCC-VERSION}"/>
      <param name="avrdude_archive_file" value="avrdude-${AVRDUDE-VERSION}-x86_64-pc-linux-gnu.tar.bz2"/>
      <param name="avrdude_version" value="${AVRDUDE-VERSION}"/>
      <param name="arduinoOTA_archive_file" value="arduinoOTA-${arduinoOTA-VERSION}-linux_amd64.tar.bz2"/>
      <param name="arduinoOTA_version" value="${arduinoOTA-VERSION}"/>
    </antcall>
  </target>

  <target name="linux-jvm-noop"/>

  <target name="linux-jvm-bundle">
    <mkdir dir="${staging_folder}/work/java" />

    <exec executable="rsync">
      <arg value="-a"/>
      <arg value="${JVM}"/>
      <arg value="${staging_folder}/work/java/"/>
    </exec>
  </target>

  <target name="linux32-run" depends="build,start"/>

  <target name="linux64-run" depends="build,start"/>

  <target name="linuxarm-run" depends="build,start"/>

  <target name="linuxaarch64-run" depends="build,start"/>

  <target name="linux32-start">
    <exec executable="./linux/work/arduino" spawn="false" failonerror="true"/>
  </target>

  <target name="linux64-start">
    <exec executable="./linux/work/arduino" spawn="false" failonerror="true"/>
  </target>

  <target name="linuxarm-start">
    <exec executable="./linux/work/arduino" spawn="false" failonerror="true"/>
  </target>

  <target name="linuxaarch64-start">
    <exec executable="./linux/work/arduino" spawn="false" failonerror="true"/>
  </target>

  <target name="build-arduino-builder" unless="no_arduino_builder">
    <property name="ARDUINO-BUILDER-EXTRA-VERSION" value="" /> <!-- default if not set already -->
    <delete dir="${staging_folder}/arduino-builder-${platform}" includeemptydirs="true"/>
    <mkdir dir="${staging_folder}/arduino-builder-${platform}"/>
    <antcall target="untar-native">
      <param name="archive_file" value="./arduino-builder-${platform}-${ARDUINO-BUILDER-VERSION}${ARDUINO-BUILDER-EXTRA-VERSION}.tar.bz2" />
      <param name="archive_url" value="https://downloads.arduino.cc/tools/arduino-builder-${platform}-${ARDUINO-BUILDER-VERSION}${ARDUINO-BUILDER-EXTRA-VERSION}.tar.bz2" />
      <param name="final_folder" value="${staging_folder}/arduino-builder-${platform}/arduino-builder" />
      <param name="dest_folder" value="${staging_folder}/arduino-builder-${platform}" />
    </antcall>
    <copy file="${staging_folder}/arduino-builder-${platform}/arduino-builder" tofile="${staging_folder}/work/${staging_hardware_folder}/../arduino-builder" />
    <chmod perm="755" file="${staging_folder}/work/${staging_hardware_folder}/../arduino-builder" />
    <move file="${staging_folder}/arduino-builder-${platform}/tools" tofile="${staging_folder}/work/${staging_hardware_folder}/../tools-builder"/>
    <copy todir="${staging_folder}/work/${staging_hardware_folder}" overwrite="true">
      <fileset dir="${staging_folder}/arduino-builder-${platform}/hardware" includes="*.txt"/>
    </copy>
    <delete dir="${staging_folder}/arduino-builder-${platform}" includeemptydirs="true"/>
  </target>

  <!-- Set '${dist_file}_available' property if toolchain dist_file is downloaded              -->
  <!-- Set '${dist_file}_installed' property if toolchain is installed in working directory    -->
  <!--                              hardware/tools/${dist_check_file} is checked for existence -->
  <target name="untar-unzip-check">
    <available file="${archive_file}" property="${archive_file}_available" />
    <available file="${final_folder}" property="${archive_file}_installed" />
  </target>

  <!-- Retrieve tool -->
  <target name="untar-unzip-download" depends="untar-unzip-check" unless="${archive_file}_available">
      <antcall target="untar-unzip-download-web" />
      <antcall target="untar-unzip-download-local" />
  </target>
  <target name="untar-unzip-download-web" unless="local_sources">
    <get src="${archive_url}" dest="${archive_file}" verbose="true" ignoreerrors="true" />
  </target>
  <target name="untar-unzip-download-local" if="local_sources">
    <basename file="${archive_file}" property="basename" />
    <echo>Skipping download of ${archive_url}, using makepkg downloaded ${basename}</echo>
    <exec executable="ln" failonerror="true">
        <arg value="-s" />
        <arg value="${basedir}/../../${basename}" />
        <arg value="${archive_file}" />
    </exec>
  </target>

  <target name="untar-unzip-checksum" depends="untar-unzip-download">
    <echo>Testing checksum of "${archive_file}"</echo>
    <checksum file="${archive_file}" algorithm="sha" fileext=".sha" verifyproperty="checksum.matches"/>
    <condition property="checksum.matches.fail">
      <equals arg1="${checksum.matches}" arg2="false"/>
    </condition>
    <fail if="checksum.matches.fail">Checksum failed.

      File ${archive_file} failed checksum.
      Please remove "${archive_file}" to download it again.
    </fail>
  </target>

  <!-- Ensure that the tool is downloaded and test checksums, if everything's ok unzip it on the tools folder  -->
  <target name="untar" depends="untar-unzip-checksum" unless="${archive_file}_installed">
    <echo>Untarring ${archive_file} into folder ${dest_folder}</echo>
    <untar src="${archive_file}" dest="${dest_folder}"/>
  </target>
  <target name="untar-bz2" depends="untar-unzip-checksum" unless="${archive_file}_installed">
    <echo>Untarring ${archive_file} into folder ${dest_folder}</echo>
    <untar src="${archive_file}" dest="${dest_folder}" compression="bzip2"/>
  </target>
  <target name="untar-native" depends="untar-unzip-checksum" unless="${archive_file}_installed">
    <echo>Untarring ${archive_file} into folder ${dest_folder}</echo>
    <exec executable="tar" failonerror="true">
      <arg value="xf"/>
      <arg value="${archive_file}"/>
      <arg value="--directory=${dest_folder}"/>
    </exec>
  </target>

  <target name="unzip" depends="untar-unzip-checksum" unless="${archive_file}_installed">
    <echo>Unzipping ${archive_file} into folder ${dest_folder}</echo>
    <mkdir dir="${dest_folder}" />
    <unzip src="${archive_file}" dest="${dest_folder}"/>
  </target>

  <!-- Ensure that the executable flag is set in all enviroments/OS -->
  <target name="make-file-executable" depends="make-file-executable-windows">
    <chmod perm="755" file="${file}" />
  </target>

  <target name="make-file-executable-windows" if="windows_host">
    <exec executable="icacls" failonerror="false">
      <arg value="${file}"/>
      <arg value="/grant"/>
      <arg value="Everyone:(RX)"/>
    </exec>
  </target>

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

    <move file="linux/work" tofile="linux/arduino-${version}" />

    <exec executable="tar" dir="linux" failonerror="true">
      <arg value="--lzma"/>
      <arg value="-c"/>
      <arg value="-f"/>
      <arg value="arduino-${full-version}.tar.xz"/>
      <arg value="arduino-${version}"/>
    </exec>

    <move file="linux/arduino-${version}" tofile="linux/work" />

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

      linux/arduino-${full-version}.tar.xz
      =======================================================
    </echo>
  </target>

  <target name="linux32-dist" depends="linux-dist"
	  description="Build .tar.xz of linux x86_32 version" />

  <target name="linux64-dist" depends="linux-dist"
	  description="Build .tar.xz of linux x86_64 version" />

  <target name="linuxarm-dist" depends="linux-dist"
	  description="Build .tar.xz of linux armhf version" />

  <target name="linuxaarch64-dist" depends="linux-dist"
	  description="Build .tar.xz of linux aarch64 version" />

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

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

  <target name="windows-checkos" unless="windows">
    <echo>
      =======================================================
      Arduino for Windows can only be built on windows.

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

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

  <target name="download-launch4j-windows">
    <antcall target="unzip">
      <param name="archive_file" value="windows/launch4j-3.9-win32.zip"/>
      <param name="archive_url" value="https://downloads.arduino.cc/tools/launch4j-3.9-win32.zip"/>
      <param name="final_folder" value="windows/launcher/launch4j"/>
      <param name="dest_folder" value="windows/launcher/"/>
    </antcall>
  </target>

  <target name="download-launch4j-linux">
    <antcall target="untar-native">
      <param name="archive_file" value="windows/launch4j-3.9-linux.tgz"/>
      <param name="archive_url" value="https://downloads.arduino.cc/tools/launch4j-3.9-linux.tgz"/>
      <param name="final_folder" value="windows/launcher/launch4j"/>
      <param name="dest_folder" value="windows/launcher/"/>
    </antcall>
  </target>

  <target name="windows-build"
	  depends="revision-check, windows-checkos, subprojects-build"
	  description="Build windows version">
    <mkdir dir="windows/work" />
    <mkdir dir="windows/work/${staging_hardware_folder}" />

    <copy todir="windows/work/lib">
      <fileset dir="shared" includes="icons/**/*.png"/>
    </copy>

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

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

    <fixcrlf file="windows/work/revisions.txt" eol="dos"/>
    <fixcrlf file="windows/work/lib/formatter.conf" eol="dos"/>

    <copy todir="windows/work">
      <fileset dir="windows/dist" includes="*.dll" />
    </copy>

    <copy todir="windows/work">
      <fileset dir="windows/dist" includes="drivers/**" />
    </copy>

    <antcall target="windows-build-avr-toolchain" />

    <antcall target="unzip">
      <param name="archive_file" value="./libastylej-2.05.1-5.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/libastylej-2.05.1-5.zip" />
      <param name="final_folder" value="${staging_folder}/libastylej-2.05.1" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="windows/libastylej-2.05.1/AStylej.dll" todir="windows/work/lib" />
    <copy file="windows/msvcp100.dll" todir="windows/work" />
    <copy file="windows/msvcr100.dll" todir="windows/work" />

    <antcall target="unzip">
      <param name="archive_file" value="./liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/liblistSerials/liblistSerials-${LIBLISTSERIAL-VERSION}.zip" />
      <param name="final_folder" value="${staging_folder}/liblistSerials-${LIBLISTSERIAL-VERSION}" />
      <param name="dest_folder" value="${staging_folder}" />
    </antcall>
    <copy file="windows/liblistSerials-${LIBLISTSERIAL-VERSION}/windows/listSerialsj.dll" todir="windows/work/lib/" />
    <antcall target="make-file-executable">
      <param name="file" value="windows/work/lib/listSerialsj.dll" />
    </antcall>

    <delete dir="${staging_folder}/arduino-builder-windows" includeemptydirs="true"/>
    <mkdir dir="${staging_folder}/arduino-builder-windows"/>
    <antcall target="unzip">
      <param name="archive_file" value="./arduino-builder-windows-${ARDUINO-BUILDER-VERSION}.zip" />
      <param name="archive_url" value="https://downloads.arduino.cc/tools/arduino-builder-windows-${ARDUINO-BUILDER-VERSION}.zip" />
      <param name="final_folder" value="${staging_folder}/arduino-builder-windows/arduino-builder.exe" />
      <param name="dest_folder" value="${staging_folder}/arduino-builder-windows" />
    </antcall>
    <copy file="${staging_folder}/arduino-builder-windows/arduino-builder.exe" tofile="windows/work/arduino-builder.exe" />
    <antcall target="make-file-executable">
      <param name="file" value="windows/work/arduino-builder.exe" />
    </antcall>
    <move file="${staging_folder}/arduino-builder-windows/tools" tofile="windows/work/tools-builder"/>
    <antcall target="make-file-executable">
      <param name="file" value="windows/work/tools-builder/ctags/5.8-arduino11/ctags.exe" />
    </antcall>
    <copy todir="windows/work/hardware" overwrite="true">
      <fileset dir="${staging_folder}/arduino-builder-windows/hardware" includes="*.txt"/>
    </copy>
    <delete dir="${staging_folder}/arduino-builder-windows" includeemptydirs="true"/>

    <unzip src="../arduino-core/lib/jna-4.2.2.jar" dest="windows/work/lib">
      <patternset>
        <include name="com/sun/jna/win32-x86/jnidispatch.dll"/>
      </patternset>
      <mapper type="flatten"/>
    </unzip>
    <move file="windows/work/lib/jnidispatch.dll" tofile="windows/work/lib/jnidispatch-4.2.2-win32-x86.dll" />
    <antcall target="make-file-executable">
      <param name="file" value="windows/work/lib/jnidispatch-4.2.2-win32-x86.dll" />
    </antcall>

    <unzip src="../arduino-core/lib/jssc-2.8.0-arduino4.jar" dest="windows/work/lib">
      <patternset>
        <include name="libs/windows/jSSC-2.8_x86.dll"/>
      </patternset>
      <mapper type="flatten"/>
    </unzip>
    <move file="windows/work/lib/jSSC-2.8_x86.dll" tofile="windows/work/lib/jSSC-2.8_x86.dll" />
    <antcall target="make-file-executable">
      <param name="file" value="windows/work/lib/jSSC-2.8_x86.dll" />
    </antcall>
    <unzip src="../arduino-core/lib/jssc-2.8.0-arduino4.jar" dest="windows/work/lib">
      <patternset>
        <include name="libs/windows/jSSC-2.8_x86_64.dll"/>
      </patternset>
      <mapper type="flatten"/>
    </unzip>
    <move file="windows/work/lib/jSSC-2.8_x86_64.dll" tofile="windows/work/lib/jSSC-2.8_x86_64.dll" />
    <antcall target="make-file-executable">
      <param name="file" value="windows/work/lib/jSSC-2.8_x86_64.dll" />
    </antcall>

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

    <delete dir="windows/launcher/launch4j"/>
    <antcall target="download-${launch4j-download-unpack-target-name}" />

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

    <copy todir="windows/work">
      <fileset dir="windows/launcher"
	       includes="application.ico, config.xml, config_debug.xml, arduino.l4j.ini, wrapper-manifest.xml"/>
    </copy>
    <launch4j configFile="windows/work/config.xml" fileVersion="${revision}.0" txtFileVersion="${revision}" productVersion="${revision}.0" txtProductVersion="${revision}"/>
    <launch4j configFile="windows/work/config_debug.xml" fileVersion="${revision}.0" txtFileVersion="${revision}" productVersion="${revision}.0" txtProductVersion="${revision}"/>
    <delete dir="windows/work" includes="application.ico, config.xml, config_debug.xml" />
    <copy file="windows/work/arduino.l4j.ini" tofile="windows/work/arduino_debug.l4j.ini" />

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

    <!-- For JVM within JDK, release file is in parent directory -->
    <property file="${WINDOWS_BUNDLED_JVM}/release" prefix="windows"/>
    <property file="${WINDOWS_BUNDLED_JVM}/../release" prefix="windows"/>

    <fail message="It looks like ${WINDOWS_BUNDLED_JVM} does not contain a Windows JVM">
      <condition>
        <not>
          <equals arg1="${windows.OS_NAME}" arg2="&quot;Windows&quot;"/>
        </not>
      </condition>
    </fail>

    <copy todir="${staging_folder}/work/java" includeemptydirs="true" preservelastmodified="true" overwrite="true" failonerror="true">
      <fileset dir="${WINDOWS_BUNDLED_JVM}" includes="*/**"/>
    </copy>

    <antcall target="portable-${portable}">
      <param name="parentdir" value="${staging_folder}/work" />
    </antcall>
  </target>

  <target name="windows-build-avr-toolchain">
    <antcall target="avr-toolchain-bundle">
      <param name="unpack_target" value="unzip"/>
      <param name="gcc_archive_file" value="avr-gcc-${AVRGCC-VERSION}-i686-w64-mingw32.zip"/>
      <param name="gcc_version" value="${AVRGCC-VERSION}"/>
      <param name="avrdude_archive_file" value="avrdude-${AVRDUDE-VERSION}-i686-w64-mingw32.zip"/>
      <param name="avrdude_version" value="${AVRDUDE-VERSION}"/>
      <param name="arduinoOTA_archive_file" value="arduinoOTA-${arduinoOTA-VERSION}-windows_386.zip"/>
      <param name="arduinoOTA_version" value="${arduinoOTA-VERSION}"/>
    </antcall>
  </target>

  <target name="windows-run" depends="build,start"/>

  <target name="windows-start">
    <exec executable="windows/work/arduino.exe" dir="windows/work" spawn="false" failonerror="true"/>
  </target>

  <target name="windows-dist" depends="build" description="Create .zip files of windows version">
    <zip destfile="windows/arduino-${full-version}.zip" level="9">
      <zipfileset dir="windows/work" prefix="arduino-${version}"/>
    </zip>

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

      windows/arduino-${full-version}.zip
      =======================================================
    </echo>
  </target>


  <!-- - - - - - - - -->
  <!-- Source        -->
  <!-- - - - - - - - -->

   <target name="source-dist" depends="revision-check"
	  description="Build .tar.gz of source code">
    <input message="Enter version number:"
	   addproperty="version"
	   defaultvalue="${revision}" />

    <tar compression="gzip" destfile="arduino-${version}-src.tar.gz">
      <tarfileset dir="../"
		  prefix="arduino-${version}"
		  excludes="**/*.tgz,
			     **/*.bz2,
			     **/build/macosx/,
			     **/build/windows/,
			     **/work/,
			     **/.git/,
			     **/*.class"
		  />
    </tar>

    <echo>
      =======================================================
      Arduino source distribution was built. Grab the archive from

      arduino-${version}-src.tar.gz
      =======================================================
    </echo>
  </target>


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

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

  <target name="avr-toolchain-bundle" unless="light_bundle">
    <!-- Unzip AVR tools -->
    <mkdir dir="${staging_folder}/work/${staging_hardware_folder}/tmp/gcc"/>

    <antcall target="${unpack_target}">
      <param name="archive_file" value="${staging_folder}/${gcc_archive_file}"/>
      <param name="archive_url" value="https://downloads.arduino.cc/tools/${gcc_archive_file}"/>
      <param name="final_folder" value="${staging_folder}/work/${staging_hardware_folder}/tmp/gcc/${gcc_version}/"/>
      <param name="dest_folder" value="${staging_folder}/work/${staging_hardware_folder}/tmp/gcc/"/>
    </antcall>

    <mkdir dir="${staging_folder}/work/${staging_hardware_folder}/tmp/avrdude"/>

    <antcall target="${unpack_target}">
      <param name="archive_file" value="${staging_folder}/${avrdude_archive_file}"/>
      <param name="archive_url" value="https://downloads.arduino.cc/tools/${avrdude_archive_file}"/>
      <param name="final_folder" value="${staging_folder}/work/${staging_hardware_folder}/tmp/avrdude/${avrdude_version}"/>
      <param name="dest_folder" value="${staging_folder}/work/${staging_hardware_folder}/tmp/avrdude/"/>
    </antcall>

    <mkdir dir="${staging_folder}/work/${staging_hardware_folder}/tmp/arduinoOTA"/>

    <antcall target="${unpack_target}">
      <param name="archive_file" value="${staging_folder}/${arduinoOTA_archive_file}"/>
      <param name="archive_url" value="http://downloads.arduino.cc/tools/${arduinoOTA_archive_file}"/>
      <param name="final_folder" value="${staging_folder}/work/${staging_hardware_folder}/tmp/arduinoOTA/${arduinoOTA_version}"/>
      <param name="dest_folder" value="${staging_folder}/work/${staging_hardware_folder}/tmp/arduinoOTA/"/>
    </antcall>

    <move file="${staging_folder}/work/${staging_hardware_folder}/tmp/gcc/avr" tofile="${staging_folder}/work/${staging_hardware_folder}/tools/avr"/>
    <move file="${staging_folder}/work/${staging_hardware_folder}/tmp/avrdude/avrdude" tofile="${staging_folder}/work/${staging_hardware_folder}/tools/avr"/>
    <move file="${staging_folder}/work/${staging_hardware_folder}/tmp/arduinoOTA/arduinoOTA/" tofile="${staging_folder}/work/${staging_hardware_folder}/tools/avr"/>

    <echo append="true" file="${staging_folder}/work/${staging_hardware_folder}/tools/avr/builtin_tools_versions.txt" message="arduino.avrdude=${avrdude_version}${line.separator}"/>
    <echo append="true" file="${staging_folder}/work/${staging_hardware_folder}/tools/avr/builtin_tools_versions.txt" message="arduino.arduinoOTA=${arduinoOTA_version}${line.separator}"/>
    <echo append="true" file="${staging_folder}/work/${staging_hardware_folder}/tools/avr/builtin_tools_versions.txt" message="arduino.avr-gcc=${gcc_version}${line.separator}"/>

    <delete dir="${staging_folder}/work/${staging_hardware_folder}/tmp"/>
  </target>

  <target name="generate-hourly-build-txt" if="hourly">
    <echo file="${staging_folder}/work/${staging_hardware_folder}/../lib/hourlyBuild.txt">${BUILD_DATE}</echo>
  </target>

  <target name="portable-true">
    <mkdir dir="${parentdir}/portable"/>
  </target>
  <target name="portable-false"/>
</project>
