<?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}" /-->

  <!-- Sets properties for macosx/windows/linux depending on current system -->
  <condition property="macosx"><os family="mac" /></condition>
  <condition property="windows"><os family="windows" /></condition>
  <condition property="linux"><os family="unix" /></condition>
  <condition property="linux32"><os family="unix" arch="i386" /></condition>
  <condition property="linux64"><os family="unix" arch="amd64" /></condition>

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

  <!-- Libraries required for running arduino -->
  <fileset dir=".." id="runtime.jars">
    <include name="core/core.jar" />
    <include name="app/pde.jar" />
    <include name="app/lib/commons-codec-1.7.jar" />
    <include name="app/lib/commons-exec-1.1.jar" />
    <include name="app/lib/commons-httpclient-3.1.jar" />
    <include name="app/lib/commons-logging-1.0.4.jar" />
    <include name="app/lib/ecj.jar" />
    <include name="app/lib/jmdns-3.4.1.jar" />
    <include name="app/lib/jna.jar" />
    <include name="app/lib/jsch-0.1.50.jar" />
    <include name="app/lib/RXTXcomm.jar" />
    <include name="app/lib/ant.jar" />
    <include name="app/lib/ant-launcher.jar" />
  </fileset>

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

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

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

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

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

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

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

  <target name="subprojects-test">
    <subant buildpath="../app" target="test"/>
  </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 library folder -->
    <copy todir="${target.path}/libraries">
      <fileset dir="../libraries" />
    </copy>

    <!-- copy hardware folder -->
    <copy todir="${target.path}/hardware">
      <fileset dir="../hardware">
        <exclude name="arduino/sam/system/CMSIS/Device/ATMEL/*/svd/"/>
        <exclude name="arduino/sam/system/CMSIS/Device/ATMEL/*/html/"/>
        <exclude name="arduino/sam/system/CMSIS/CMSIS/Lib/ARM/*M0*"/>
        <exclude name="arduino/sam/system/CMSIS/CMSIS/Lib/ARM/*M4*"/>
        <exclude name="arduino/sam/system/CMSIS/CMSIS/Lib/GCC/*M0*"/>
        <exclude name="arduino/sam/system/CMSIS/CMSIS/Lib/GCC/*M4*"/>
      </fileset>
    </copy>

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

    <!-- Unzip documentation -->
    <unzip dest="${target.path}" src="shared/reference.zip" overwrite="false"/>

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


  <!-- - - - - - - - - -->
  <!-- Revision check  -->
  <!-- - - - - - - - - -->
  <target name="revision-check">
    <!-- figure out the revision 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>
    <echo message="Latest revision detected in shared/revision.txt 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="Revision in Base.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, macosx-check-arm-toolchain" description="Build Mac OS X version">
    <mkdir dir="macosx/work" />

    <!-- assemble the pde -->
    <copy todir="macosx/work/Arduino.app">
      <fileset dir="macosx/template.app" includes="**"/>
    </copy>

<!--    <rename src="macosx/work/template.app"
	    dest="macosx/work/Arduino.app" />
    <move file="macosx/work/template.app"
	  tofile="macosx/work/Arduino.app" />-->

    <chmod file="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" perm="755" />

    <copy todir="macosx/work/Arduino.app/Contents/Resources/Java" flatten="true">
      <fileset refid="runtime.jars"/>
    </copy>

    <copy todir="macosx/work/Arduino.app/Contents/Resources/Java">
      <fileset dir="shared" includes="lib/**" />
      <fileset file="shared/revisions.txt" />
    </copy>

    <!-- Unzip AVR tools -->
    <!-- <unzip dest="macosx/work/Arduino.app/Contents/Resources/Java/hardware" src="macosx/dist/tools-universal.zip" overwrite="false"/> -->

    <exec executable="unzip">
      <arg value="-q" />
      <arg value="-n" />
      <arg value="-d" />
      <arg value="macosx/work/Arduino.app/Contents/Resources/Java/hardware" />
      <arg value="macosx/dist/tools-universal.zip" />
    </exec>

    <copy todir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/">
      <fileset file="macosx/dist/bossac" />
    </copy>

    <chmod file="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/bossac" perm="+x" />

    <copy todir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/include/avr">
      <fileset file="macosx/dist/eeprom.h" />
    </copy>

    <antcall target="assemble">
      <param name="target.path" value="macosx/work/Arduino.app/Contents/Resources/Java" />
    </antcall>

    <antcall target="macosx-unzip-arm-toolchain" />

    <delete includeEmptyDirs="true" quiet="true">
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools" includes="**/3.4.6/**/*"/>
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools" includes="**/3.4.6"/>
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools" includes="**/man/**/*"/>
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools" includes="**/man"/>
    </delete>
  </target>

  <target name="macosx-run" depends="macosx-build" description="Run Mac OS X version">
    <exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="true"/>
  </target>

  <target name="macosx-debug" depends="macosx-build" description="Run Mac OS X version">
    <exec executable="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" spawn="false"/>
  </target>

  <target name="macosx-check-arm-toolchain-distfile">
    <available file="macosx/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz" property="arm_distfile_available" />
  </target>

  <target name="macosx-get-arm-toolchain" depends="macosx-check-arm-toolchain-distfile" unless="arm_distfile_available">
    <!-- Retrieve ARM toolchain -->
    <get
      src="http://arduino.googlecode.com/files/gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz"
      dest="macosx/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz" verbose="true" />
  </target>

  <target name="macosx-check-arm-toolchain">
    <available file="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/g++_arm_none_eabi"
      property="arm_available" />
  </target>

  <target name="macosx-unzip-arm-toolchain" depends="macosx-get-arm-toolchain, macosx-check-arm-toolchain" unless="arm_available">
    <checksum file="macosx/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz" 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 gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz failed checksum.
      Please remove "macosx/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz" to download it again.
    </fail>

    <!-- ...and unzip on the destination folder -->
    <exec executable="tar" output="/dev/null">
      <arg value="xfz"/>
      <arg value="macosx/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-macos.tar.gz"/>
      <arg value="--directory=macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/"/>
    </exec>
  </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">
      <arg line="../arduino-${version}-${platform}.zip" />
    </exec>

    <!-- Unlock keychain file -->
    <exec executable="security" dir="macosx/work">
      <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; -s &quot;${macosx-sign-id}&quot; -v Arduino.app/" />
    </exec>

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

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

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

      macosx/arduino-${version}-${platform}-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="macosx-build" description="Create a downloadable .zip for the Mac OS X version">
    <!-- The ant copy command does not preserve permissions. -->
    <chmod file="macosx/work/Arduino.app/Contents/MacOS/JavaApplicationStub" perm="+x" />
    <chmod perm="+x">
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin" includes="**/*" />
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/bin" includes="**/*" />
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr-3/bin" includes="**/*" />
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr-4/bin" includes="**/*" />
      <fileset dir="macosx/work/Arduino.app/Contents/Resources/Java/hardware/tools/avr/libexec/gcc/avr/4.3.2/" includes="**/cc1*" />
    </chmod>

    <replace file="macosx/work/Arduino.app/Contents/Info.plist"
             token="VERSION" value="${version}" />
    <replace file="macosx/work/Arduino.app/Contents/Info.plist"
             token="REVISION" value="${revision}" />

    <exec executable="zip" dir="macosx/work">
      <arg line="-q -r ../arduino-${version}-${platform}.zip ." />
    </exec>
    <!-- <exec executable="ditto" dir="macosx/work">
      <arg line="-c -k -rsrc . ../arduino-${version}-macosx.zip" />
    </exec> -->

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

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

  <target name="macosx-dist-old" if="macosx" depends="macosx-build" description="Create a .dmg of the Mac OS X version">
    <!-- now build the dmg -->
    <gunzip src="macosx/template.dmg.gz" dest="macosx/working.dmg" />

    <mkdir dir="macosx/working_dir" />
    <exec executable="hdiutil">
      <arg line="attach macosx/working.dmg -noautoopen -mountpoint macosx/working_dir" />
      <!--<arg line="attach macosx/working.dmg -noautoopen -quiet -mountpoint macosx/working_dir" />-->
    </exec>

    <copy todir="macosx/working_dir">
      <fileset dir="macosx/work" />
    </copy>

    <!-- The ant copy command does not preserve permissions. -->
    <chmod file="macosx/working_dir/Arduino.app/Contents/MacOS/JavaApplicationStub" perm="+x" />
    <chmod perm="+x">
      <fileset dir="macosx/working_dir/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin" includes="**/*" />
      <fileset dir="macosx/working_dir/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr/bin" includes="**/*" />
      <fileset dir="macosx/working_dir/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr-3/bin" includes="**/*" />
      <fileset dir="macosx/working_dir/Arduino.app/Contents/Resources/Java/hardware/tools/avr/avr-4/bin" includes="**/*" />
      <fileset dir="macosx/working_dir/Arduino.app/Contents/Resources/Java/hardware/tools/avr/libexec/gcc/avr/3.4.6/" includes="**/cc1*" />
      <fileset dir="macosx/working_dir/Arduino.app/Contents/Resources/Java/hardware/tools/avr/libexec/gcc/avr/4.3.2/" includes="**/cc1*" />
    </chmod>

    <!-- Pause briefly for the OS to catch up with the DMG changes. 
	 This prevents "hdiutil: couldn't eject "disk3" - Resource busy"
	 errors when ejecting the disk in the next step.
         You may need to set this value higher for your system. -->
    <sleep seconds="3" />

    <exec executable="hdiutil">
      <!--<arg line="detach macosx/working_dir -quiet -force" />-->
      <arg line="detach macosx/working_dir" />
    </exec>

    <delete file="macosx/arduino-*.dmg" />
    <exec executable="hdiutil">
      <arg line="convert macosx/working.dmg -quiet -format UDZO -imagekey zlib-level=9 -o macosx/arduino-${version}.dmg" />
    </exec>

    <!-- Clean up the interim files. -->
    <delete file="macosx/working.dmg" />
    <delete dir="macosx/working_dir" />

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

      macosx/arduino-${version}.dmg
      =======================================================
    </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*.tgz"/>
    </delete>
  </target>

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

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

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

  <target name="linux-build" depends="revision-check, linux-checkos, subprojects-build, linux-check-arm-toolchain" description="Build linux version">
    <mkdir dir="linux/work" />

    <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" flatten="true">
      <fileset refid="runtime.jars" />
    </copy>

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

    <copy todir="linux/work" file="linux/dist/arduino" />
    <chmod perm="755" file="linux/work/arduino" />

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

    <chmod perm="755" file="linux/work/hardware/tools/avrdude" />
    <chmod perm="755" file="linux/work/hardware/tools/bossac" />
    <chmod perm="755" file="linux/work/hardware/tools/bossac64" />
    <chmod perm="755" file="linux/work/hardware/tools/adk2tool" />
    <chmod perm="755" file="linux/work/hardware/tools/adk2install" />

    <copy todir="linux/work" file="linux/dist/arduino" />
    <chmod perm="755" file="linux/work/arduino" />

    <antcall target="linux-unzip-arm-toolchain" />
  </target>

  <target name="linux32-build" depends="linux-build" description="Build linux (32-bit) version">
    <!-- Unzip AVR tools -->
    <exec executable="tar" dir="linux/work/hardware">
      <arg value="-xjf"/>
      <arg value="../../avr_tools_linux32.tar.bz2"/>
    </exec>
  </target>

  <target name="linux64-build" depends="linux-build" description="Build linux (64-bit) version">
    <copy tofile="linux/work/hardware/tools/avrdude" file="linux/dist/tools/avrdude64" overwrite="true" />
    <copy tofile="linux/work/lib/librxtxSerial.so" file="linux/dist/lib/librxtxSerial64.so" overwrite="true" />

    <chmod perm="755" file="linux/work/hardware/tools/avrdude" />

    <!-- Unzip AVR tools -->
    <exec executable="tar" dir="linux/work/hardware">
      <arg value="-xjf"/>
      <arg value="../../avr_tools_linux64.tar.bz2"/>
    </exec>
  </target>

  <target name="linux32-run" depends="linux32-build"
	  description="Run Linux (32-bit) version">
    <exec executable="./linux/work/arduino" spawn="false"/>
  </target>

  <target name="linux64-run" depends="linux64-build"
	  description="Run Linux (64-bit) version">
    <exec executable="./linux/work/arduino" spawn="false"/>
  </target>

  <target name="linux-check-arm-toolchain-distfile">
    <available file="linux/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz" property="arm_distfile_available" />
  </target>

  <target name="linux-get-arm-toolchain" depends="linux-check-arm-toolchain-distfile" unless="arm_distfile_available">
    <!-- Retrieve ARM toolchain -->
    <get
      src="http://arduino.googlecode.com/files/gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz"
      dest="linux/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz"
      verbose="true" />
  </target>

  <target name="linux-check-arm-toolchain">
    <available file="linux/work/hardware/tools/g++_arm_none_eabi" property="arm_available" />
  </target>

  <target name="linux-unzip-arm-toolchain" depends="linux-get-arm-toolchain, linux-check-arm-toolchain" unless="arm_available">
    <checksum file="linux/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz" 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 gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz failed checksum.
      Please remove "linux/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz" to download it again.
    </fail>

    <!-- Unzip toolchain to the destination folder -->
    <exec executable="tar" output="/dev/null" os="Linux">
      <arg value="xfz"/>
      <arg value="linux/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-linux32.tar.gz"/>
      <arg value="--directory=linux/work/hardware/tools"/>
    </exec>
  </target>

  <target name="linux64-get-arm-toolchain" depends="linux-check-arm-toolchain-distfile" unless="arm_distfile_available">
    <antcall target="linux-get-arm-toolchain" />
  </target>

  <target name="linux64-unzip-arm-toolchain" depends="linux-get-arm-toolchain" unless="arm_available">
    <antcall target="linux-unzip-arm-toolchain" />
  </target>

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

    <!--get src="http://dev.processing.org/build/jre-tools-6u18-linux-i586.tgz" 
	 dest="linux/jre.tgz" 
	 usetimestamp="true" />    
    <untar compression="gzip" 
	   dest="linux/work" 
	   src="linux/jre.tgz" 
	   overwrite="false"/-->

<!--
    <tar compression="gzip" basedir="linux/work"
	 destfile="linux/arduino-${version}.tgz" />

    <tar compression="gzip" destfile="linux/arduino-${version}-linux.tgz">
      <tarfileset dir="linux/work"
		  prefix="arduino-${version}"
		  excludes="arduino,
			    hardware/tools/avrdude,
			    java/**"
		  />
      <tarfileset file="linux/work/arduino" filemode="755" prefix="arduino-${version}" />
      <tarfileset file="linux/work/hardware/tools/avrdude" filemode="755"
		  prefix="arduino-${version}/hardware/tools" />
    </tar>
-->
    <move file="linux/work" tofile="linux/arduino-${version}" />

    <exec executable="tar" dir="linux">
      <arg value="-z"/>
      <arg value="-c"/>
      <arg value="-f"/>
      <arg value="arduino-${version}-${platform}.tgz"/>
      <arg value="arduino-${version}"/>
    </exec>

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

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

      build/linux/arduino-${version}-${platform}.tgz
      =======================================================
    </echo>
  </target>

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

  <target name="linux64-dist" depends="linux-dist"
	  description="Build .tar.gz of linux 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="windows-build"
	  depends="revision-check, windows-checkos, 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>

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

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

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

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

    <!-- Unzip AVR tools -->
    <unzip dest="windows/work/hardware" src="windows/avr_tools.zip" overwrite="false"/>

    <copy todir="windows/work/hardware/tools/avr/avr/include/avr">
      <fileset file="windows/eeprom.h" />
    </copy>

    <!-- Copy bossac.exe tool -->
    <copy todir="windows/work/hardware/tools">
      <fileset file="windows/bossac.exe" />
      <fileset file="windows/listComPorts.exe" />
    </copy>
    <chmod perm="755">
      <fileset file="windows/work/hardware/tools/bossac.exe" />
      <fileset file="windows/work/hardware/tools/listComPorts.exe" />
    </chmod>

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

    <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="about.bmp, application.ico, config.xml"/>
    </copy>
    <launch4j configFile="windows/work/config.xml" />
    <delete dir="windows/work"
	    includes="about.bmp, application.ico, config.xml" />

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

    <antcall target="windows-unzip-arm-toolchain" />

    <delete includeEmptyDirs="true" quiet="true">
      <fileset dir="windows/work/hardware/tools/avr/doc" />
    </delete>
  </target>

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

  <target name="windows-check-arm-toolchain-distfile">
    <available file="windows/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz" property="arm_distfile_available" />
  </target>

  <target name="windows-get-arm-toolchain" depends="windows-check-arm-toolchain-distfile" unless="arm_distfile_available">
    <!-- Retrieve ARM toolchain -->
    <get
      src="http://arduino.googlecode.com/files/gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz"
      dest="windows/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz"
      verbose="true" />
  </target>

  <target name="windows-check-arm-toolchain">
    <available file="windows/work/hardware/tools/g++_arm_none_eabi" property="arm_available" />
  </target>

  <target name="windows-unzip-arm-toolchain" depends="windows-get-arm-toolchain, windows-check-arm-toolchain" unless="arm_available">
    <checksum file="windows/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz" 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 gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz failed checksum.
      Please remove "windows/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz" to download it again.
    </fail>

    <!-- Unzip toolchain to the destination folder -->
    <exec executable="tar">
      <arg value="xfz"/>
      <arg value="windows/dist/gcc-arm-none-eabi-4.4.1-2010q1-188-win32.tar.gz"/>
      <arg value="--directory=windows/work/hardware/tools"/>
    </exec>
  </target>

  <target name="windows-dist" depends="windows-build"
	  description="Create .zip files of windows version">

    <!--get src="http://dev.processing.org/build/jre-tools-6u18-windows-i586.zip" 
	 dest="windows/jre.zip" 
	 usetimestamp="true" /-->

    <unzip dest="windows/work" src="windows/jre.zip" overwrite="false"/>

    <!--
    <zip basedir="windows/work" 
	 prefix="arduino-${version}"
	 destfile="windows/arduino-${version}.zip" />
    <zip basedir="windows/work" 
	 prefix="arduino-${version}"
	 destfile="windows/arduino-${version}-expert.zip" 
	 excludes="java/**" />
    -->

    <zip destfile="windows/arduino-${version}-${platform}.zip" level="9">
      <zipfileset dir="windows/work"
		  prefix="arduino-${version}" />
    </zip>

    <zip destfile="windows/arduino-${version}-${platform}-expert.zip" level="9">
      <zipfileset dir="windows/work"
		  prefix="arduino-${version}"
		  excludes="java/**" />
    </zip>

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

      windows/arduino-${version}-${platform}.zip
      windows/arduino-${version}-${platform}-expert.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>

</project>