<!--
 ! ASM: a very small and fast Java bytecode manipulation framework
 ! Copyright (c) 2000,2002,2003 INRIA, France Telecom
 ! All rights reserved.
 !
 ! Redistribution and use in source and binary forms, with or without
 ! modification, are permitted provided that the following conditions
 ! are met:
 ! 1. Redistributions of source code must retain the above copyright
 !    notice, this list of conditions and the following disclaimer.
 ! 2. Redistributions in binary form must reproduce the above copyright
 !    notice, this list of conditions and the following disclaimer in the
 !    documentation and/or other materials provided with the distribution.
 ! 3. Neither the name of the copyright holders nor the names of its
 !    contributors may be used to endorse or promote products derived from
 !    this software without specific prior written permission.
 !
 ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 ! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 ! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 ! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 ! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 ! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 ! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 ! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 ! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
 ! THE POSSIBILITY OF SUCH DAMAGE.
-->

<project name="ASM" default="compile">

  <!-- ==================================== -->
  <!-- ======== PROPERTY DEFINITION ======= -->
  <!-- ==================================== -->

  <property file="build.config"/>
  <property file="build.properties"/>

  <property name="src"                value="${basedir}/src"/>
  <property name="test"               value="${basedir}/test"/>
  <property name="doc"                value="${basedir}/doc"/>
  <property name="jdoc"               value="${basedir}/jdoc"/>
  <property name="web"                value="${basedir}/web"/>
  <property name="examples"           value="${basedir}/examples"/>
  <property name="examples.common"    value="${examples}/common"/>
  <property name="config"             value="${basedir}/config"/>
  <property name="archive"            value="${basedir}/archive"/>

  <property name="out"                value="${basedir}/output"/>
  <property name="out.build"          value="${out}/build"/>
  <property name="out.dist"           value="${out}/dist"/>
  <property name="out.dist.lib"       value="${out.dist}/lib"/>
  <property name="out.dist.doc"       value="${out.dist}/doc"/>
  <property name="out.dist.jdoc"      value="${out.dist.doc}/javadoc"/>
  <property name="out.dist.examples"  value="${out.dist}/examples"/>
  <property name="out.dist.externals" value="${out.dist}/externals"/>
  <property name="out.test"           value="${out}/test"/>
  <property name="out.tmp"            value="${out}/tmp"/>
  <property name="out.zip"            value="${out}/zip"/>

  <target name="properties">
    <condition property="examples.exist">
      <available file="${examples}"/>
    </condition>

    <condition property="web.exist">
      <available file="${web}/build.xml"/>
    </condition>

    <condition property="paths.configured">
      <and>
        <isset property="objectweb.ant.tasks.path"/>
      </and>
    </condition>
  </target>

  <!-- ================================== -->
  <!-- ========  INITIALIZATION   ======= -->
  <!-- ================================== -->

  <target name="check" unless="paths.configured">
    <echo message="The 'build.properties' file must be configured"/>
    <fail/>
  </target>

  <target name="init" depends="properties,check">
    <taskdef name="multipleAnt"
             classname="org.objectweb.util.ant.MultipleAnt"
             classpath="${objectweb.ant.tasks.path}"/>

    <taskdef name="javadocMultipleLink"
             classname="org.objectweb.util.ant.JavadocMultipleLink"
             classpath="${objectweb.ant.tasks.path}"/>

    <taskdef name="multipleCopy"
             classname="org.objectweb.util.ant.MultipleCopy"
             classpath="${objectweb.ant.tasks.path}"/>

    <path id="classpath">
      <pathelement location="${out.build}"/>
    </path>
  </target>

  <!-- =================================== -->
  <!-- ==========    COMPILE    ========== -->
  <!-- =================================== -->

  <target name="compile" depends="init">
    <mkdir dir="${out.build}"/>
    <javac destdir="${out.build}" optimize="on">
      <classpath refid="classpath"/>
      <src path="${src}"/>
      <include name="**/*.java"/>
    </javac>
  </target>

  <!-- =================================== -->
  <!-- ==========      TEST     ========== -->
  <!-- =================================== -->

  <target name="test" depends="compile">
    <ant antfile="${test}/build.xml" target="test" inheritRefs="true"/>
  </target>

  <!-- =================================== -->
  <!-- ==========      DIST     ========== -->
  <!-- =================================== -->

  <target name="dist.init">
    <mkdir dir="${out.dist}"/>
    <mkdir dir="${out.dist.doc}"/>
    <mkdir dir="${out.dist.jdoc}"/>
    <mkdir dir="${out.dist.lib}"/>
  </target>

  <target name="jar" depends="dist.init,compile">
    <!--
    <mkdir dir="${out.tmp}"/>
    <copy toDir="${out.tmp}">
      <fileset dir="${archive}">
        <include name="*.mf"/>
      </fileset>
      <filterset>
        <filter token="@product.version@" value="${product.version}"/>
      </filterset>
    </copy>
    <replace dir="${out.tmp}" token="@product.version@" value="${product.version}"/>
    -->
    <multipleAnt dir="${archive}"/>
  </target>

  <target name="jdoc" depends="init,dist.init">
    <copy todir="${out.dist.doc}"
          preservelastmodified="yes"
          includeEmptyDirs="false">
      <fileset dir="${doc}">
        <include name="**/*"/>
        <exclude name="**/*.fig"/>
      </fileset>
    </copy>
    <multipleAnt dir="${jdoc}"/>
  </target>

  <target name="examples" depends="init,dist.init" if="examples.exist">
    <mkdir dir="${out.dist.examples}"/>
    <copy todir="${out.dist.examples}"
          preservelastmodified="yes"
          includeEmptyDirs="yes">
      <fileset dir="${examples}">
        <exclude name="common"/>
        <exclude name="common/**/*"/>
      </fileset>
    </copy>

    <multipleCopy file="${examples}/common/build.xml"
                  toDir="${out.dist.examples}"
                  notReplace="yes"
                  preservelastmodified="yes">
      <include name="*"/>
      <exclude name="etc"/>
      <exclude name="lib"/>
    </multipleCopy>

    <copy toDir="${out.dist.examples}" preservelastmodified="yes">
      <fileset dir="${examples.common}">
        <include name="**/*"/>
        <exclude name="build.xml"/>
      </fileset>
    </copy>
    <replace dir="${out.dist.examples}/etc" token="@product.version@" value="${product.version}"/>

    <copy todir="${out.dist}">
      <fileset dir=".">
        <include name="externals/*.jar"/>
      </fileset>
    </copy>
  </target>

  <target name="dist" depends="jar,jdoc,examples">
    <zip zipFile="${out.dist}/src.zip" basedir="${src}"/>
  </target>

  <!-- =================================== -->
  <!-- ==========    EXAMPLES   ========== -->
  <!-- =================================== -->

  <target name="example" depends="jar,examples">
    <ant inheritAll="false"
         dir="${out.dist.examples}/${example.name}"
         target="execute"/>
  </target>

  <!-- =================================== -->
  <!-- ==========     ZIP       ========== -->
  <!-- =================================== -->

  <!-- creates zip files of the different distribution (source, binaries) -->

  <target name="zip" depends="dist">
    <mkdir dir="${out.zip}"/>
    <tar destfile="${out.zip}/${product.name}-${product.version}.tar.gz"
         compression="gzip">
      <tarfileset dir="${basedir}" prefix="${product.name}-${product.version}">
        <exclude name="build.config"/>
        <exclude name="config/**"/>
        <exclude name="config"/>
        <exclude name="**/externals/**"/>
        <exclude name="**/externals"/>
        <exclude name="**/lib/**"/>
        <exclude name="**/lib"/>
        <exclude name="web/**"/>
        <exclude name="web"/>
        <exclude name="output/**"/>
        <exclude name="output"/>
        <exclude name="CVSROOT/**"/>
        <exclude name="CVSROOT"/>
      </tarfileset>
    </tar>
    <zip zipFile="${out.zip}/${product.name}-${product.version}-bin.zip">
      <zipfileset dir="${out.dist}" prefix="${product.name}-${product.version}"/>
    </zip>
  </target>

  <!-- =================================== -->
  <!-- ==========      WEB      ========== -->
  <!-- =================================== -->

  <target name="web">
    <ant dir="${web}"/>
  </target>

  <!-- =================================== -->
  <!-- ==========     CLEAN     ========== -->
  <!-- =================================== -->

  <!-- remove all directories -->

  <target name="clean.web" if="web.exist">
    <ant dir="${web}" target="clean"/>
  </target>

  <target name="clean" depends="properties,clean.web">
    <delete dir="${out.build}"/>
    <delete dir="${out.dist}"/>
    <delete dir="${out.tmp}"/>
    <delete dir="${out.zip}"/>
    <delete dir="${out.test}"/>
  </target>

  <!-- ==================================== -->
  <!-- ==========     HELP       ========== -->
  <!-- ==================================== -->

  <target name="help">
    <echo message="The available targets are the following:"/>
    <echo message="  compile: compiles the product into ${out.build}"/>
    <echo message="  dist: creates the product's distributions into ${out.dist}"/>
    <echo message="  zip: creates the product's distributions zip files into ${out.zip}"/>
    <echo message="  clean: removes all generated files."/>
    <echo message="  jar: creates all jars in ${out.dist.lib}"/>
    <echo message="  test: run all tests"/>
    <echo message=""/>
    <echo message="There are some options to run tests:"/>
    <echo message="  -Dtest.group=&lt;group name&gt;  Only a group of test: The default target of"/>
    <echo message="    the xml file is called the test.group contains the xml file name with"/>
    <echo message="    directory ex: ant -Dtest.group=conform/toto test =&gt; calls the default"/>
    <echo message="    target of the file ${test}/conform/toto.xml"/>
    <echo message="  -Dtest.type=&lt;type name&gt;  Only a type of test: conform, deviance, stress,"/>
    <echo message="    thread or perf. The test.type properties contains the directory name of"/>
    <echo message="    the test type ex: ant -Dtest.type=conform test"/>
    <echo message="  -Dtest.name=&lt;test name&gt;  Only a single test. The target &lt;test name&gt; is called"/>
  </target>

</project>
