<?xml version="1.0" encoding="UTF-8"?>
<!--
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-->
<project name="Cordova" default="jar">

    <!-- LOAD VERSION -->
    <loadfile property="version" srcFile="../VERSION">
        <filterchain>
            <striplinebreaks/>
        </filterchain>
    </loadfile>

    <!-- check that the version of ant is at least 1.8.0 -->
    <antversion property="thisantversion" atleast="1.8.0" />
    <fail message="The required minimum version of ant is 1.8.0, you have ${ant.version}"
          unless="thisantversion" />

    <!-- The local.properties file is created and updated by the 'android' 
         tool. (For example "sdkdir/tools/android update project -p ." inside
         of this directory where the AndroidManifest.xml file exists. This
         properties file that gets built contains the path to the SDK. It 
         should *NOT* be checked into Version Control Systems since it holds
         data about the local machine. -->
    <available file="local.properties" property="exists.local.properties" />
    <fail message="You need to create the file 'local.properties' by running 'android update project -p .' here."
          unless="exists.local.properties" />
    <loadproperties srcFile="local.properties" />

    <!-- The ant.properties file can be created by you. It is only edited by the
         'android' tool to add properties to it.
         This is the place to change some Ant specific build properties.
         Here are some properties you may want to change/update:

         source.dir
             The name of the source directory. Default is 'src'.
         out.dir
             The name of the output directory. Default is 'bin'.

         For other overridable properties, look at the beginning of the rules
         files in the SDK, at tools/ant/build.xml

         Properties related to the SDK location or the project target should
         be updated using the 'android' tool with the 'update' action.
         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems.

         -->
    <property file="ant.properties" />

    <!-- The project.properties file is created and updated by the 'android'
         tool, as well as ADT.

         This contains project specific properties such as project target, and library
         dependencies. Lower level build properties are stored in ant.properties
         (or in .classpath for Eclipse projects).

         This file is an integral part of the build system for your
         application and should be checked into Version Control Systems. -->
    <loadproperties srcFile="project.properties" />

    <!-- quick check on sdk.dir -->
    <fail
            message="sdk.dir is missing. Make sure to generate local.properties using 'android update project'"
            unless="sdk.dir"
    />

    <!-- version-tag: custom -->
<!-- extension targets. Uncomment the ones where you want to do custom work
     in between standard targets -->
<!--
    <target name="-pre-build">
    </target>
    <target name="-pre-compile">
    </target>

    /* This is typically used for code obfuscation.
       Compiled code location: ${out.classes.absolute.dir}
       If this is not done in place, override ${out.dex.input.absolute.dir} */
    <target name="-post-compile">
    </target>
-->

    <!-- Import the actual build file.

         To customize existing targets, there are two options:
         - Customize only one target:
             - copy/paste the target into this file, *before* the
               <import> task.
             - customize it to your needs.
         - Customize the whole content of build.xml
             - copy/paste the content of the rules files (minus the top node)
               into this file, replacing the <import> task.
             - customize to your needs.

         ***********************
         ****** IMPORTANT ******
         ***********************
         In all cases you must update the value of version-tag below to read 'custom' instead of an integer,
         in order to avoid having your file be overridden by tools such as "android update project"
    -->
    <import file="${sdk.dir}/tools/ant/build.xml" />

    <!-- Build Cordova jar file that includes all native code, and Cordova JS file
         that includes all JavaScript code.
    -->
    <target name="jar" depends="-compile">
      <jar jarfile="cordova-${version}.jar" basedir="bin/classes" excludes="org/apache/cordova/R.class,org/apache/cordova/R$*.class"/>
    </target>

    <!-- tests for Java files -->
    <property name="test.dir" location="test/org/apache/cordova" />

    <path id="test.classpath">
        <!-- requires both junit and cordova -->
        <pathelement location="libs/junit-4.10.jar" />
        <pathelement location="cordova-${version}.jar" />
        <pathelement location="${test.dir}" />
    </path>

    <target name="compile-test">
        <javac srcdir="${test.dir}" >
            <classpath refid="test.classpath" />
        </javac>
    </target>

    <target name="test" depends="jar, compile-test">
        <junit showoutput="true">
            <classpath refid="test.classpath" />
            <formatter type="brief" usefile="false" />
            <batchtest fork="yes">
                <fileset dir="${test.dir}">
                    <include name="*Test.java" />
                    <include name="**/*Test.java" />
                </fileset>
            </batchtest>
        </junit>
    </target>

    <target name="cordova_debug" depends="debug">
    </target>

    <target name="cordova_release" depends="release">
    </target>

</project>
